diff options
Diffstat (limited to 'drivers/usb/core/hub.c')
-rw-r--r-- | drivers/usb/core/hub.c | 58 |
1 files changed, 33 insertions, 25 deletions
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index 06af970e1064..0cec6caf6e9b 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c | |||
@@ -1658,12 +1658,12 @@ static inline void announce_device(struct usb_device *udev) { } | |||
1658 | #endif | 1658 | #endif |
1659 | 1659 | ||
1660 | /** | 1660 | /** |
1661 | * usb_configure_device_otg - FIXME (usbcore-internal) | 1661 | * usb_enumerate_device_otg - FIXME (usbcore-internal) |
1662 | * @udev: newly addressed device (in ADDRESS state) | 1662 | * @udev: newly addressed device (in ADDRESS state) |
1663 | * | 1663 | * |
1664 | * Do configuration for On-The-Go devices | 1664 | * Finish enumeration for On-The-Go devices |
1665 | */ | 1665 | */ |
1666 | static int usb_configure_device_otg(struct usb_device *udev) | 1666 | static int usb_enumerate_device_otg(struct usb_device *udev) |
1667 | { | 1667 | { |
1668 | int err = 0; | 1668 | int err = 0; |
1669 | 1669 | ||
@@ -1734,7 +1734,7 @@ fail: | |||
1734 | 1734 | ||
1735 | 1735 | ||
1736 | /** | 1736 | /** |
1737 | * usb_configure_device - Detect and probe device intfs/otg (usbcore-internal) | 1737 | * usb_enumerate_device - Read device configs/intfs/otg (usbcore-internal) |
1738 | * @udev: newly addressed device (in ADDRESS state) | 1738 | * @udev: newly addressed device (in ADDRESS state) |
1739 | * | 1739 | * |
1740 | * This is only called by usb_new_device() and usb_authorize_device() | 1740 | * This is only called by usb_new_device() and usb_authorize_device() |
@@ -1745,7 +1745,7 @@ fail: | |||
1745 | * the string descriptors, as they will be errored out by the device | 1745 | * the string descriptors, as they will be errored out by the device |
1746 | * until it has been authorized. | 1746 | * until it has been authorized. |
1747 | */ | 1747 | */ |
1748 | static int usb_configure_device(struct usb_device *udev) | 1748 | static int usb_enumerate_device(struct usb_device *udev) |
1749 | { | 1749 | { |
1750 | int err; | 1750 | int err; |
1751 | 1751 | ||
@@ -1769,7 +1769,7 @@ static int usb_configure_device(struct usb_device *udev) | |||
1769 | udev->descriptor.iManufacturer); | 1769 | udev->descriptor.iManufacturer); |
1770 | udev->serial = usb_cache_string(udev, udev->descriptor.iSerialNumber); | 1770 | udev->serial = usb_cache_string(udev, udev->descriptor.iSerialNumber); |
1771 | } | 1771 | } |
1772 | err = usb_configure_device_otg(udev); | 1772 | err = usb_enumerate_device_otg(udev); |
1773 | fail: | 1773 | fail: |
1774 | return err; | 1774 | return err; |
1775 | } | 1775 | } |
@@ -1779,8 +1779,8 @@ fail: | |||
1779 | * usb_new_device - perform initial device setup (usbcore-internal) | 1779 | * usb_new_device - perform initial device setup (usbcore-internal) |
1780 | * @udev: newly addressed device (in ADDRESS state) | 1780 | * @udev: newly addressed device (in ADDRESS state) |
1781 | * | 1781 | * |
1782 | * This is called with devices which have been enumerated, but not yet | 1782 | * This is called with devices which have been detected but not fully |
1783 | * configured. The device descriptor is available, but not descriptors | 1783 | * enumerated. The device descriptor is available, but not descriptors |
1784 | * for any device configuration. The caller must have locked either | 1784 | * for any device configuration. The caller must have locked either |
1785 | * the parent hub (if udev is a normal device) or else the | 1785 | * the parent hub (if udev is a normal device) or else the |
1786 | * usb_bus_list_lock (if udev is a root hub). The parent's pointer to | 1786 | * usb_bus_list_lock (if udev is a root hub). The parent's pointer to |
@@ -1803,8 +1803,8 @@ int usb_new_device(struct usb_device *udev) | |||
1803 | if (udev->parent) | 1803 | if (udev->parent) |
1804 | usb_autoresume_device(udev->parent); | 1804 | usb_autoresume_device(udev->parent); |
1805 | 1805 | ||
1806 | usb_detect_quirks(udev); /* Determine quirks */ | 1806 | usb_detect_quirks(udev); |
1807 | err = usb_configure_device(udev); /* detect & probe dev/intfs */ | 1807 | err = usb_enumerate_device(udev); /* Read descriptors */ |
1808 | if (err < 0) | 1808 | if (err < 0) |
1809 | goto fail; | 1809 | goto fail; |
1810 | dev_dbg(&udev->dev, "udev %d, busnum %d, minor = %d\n", | 1810 | dev_dbg(&udev->dev, "udev %d, busnum %d, minor = %d\n", |
@@ -1849,21 +1849,23 @@ fail: | |||
1849 | */ | 1849 | */ |
1850 | int usb_deauthorize_device(struct usb_device *usb_dev) | 1850 | int usb_deauthorize_device(struct usb_device *usb_dev) |
1851 | { | 1851 | { |
1852 | unsigned cnt; | ||
1853 | usb_lock_device(usb_dev); | 1852 | usb_lock_device(usb_dev); |
1854 | if (usb_dev->authorized == 0) | 1853 | if (usb_dev->authorized == 0) |
1855 | goto out_unauthorized; | 1854 | goto out_unauthorized; |
1855 | |||
1856 | usb_dev->authorized = 0; | 1856 | usb_dev->authorized = 0; |
1857 | usb_set_configuration(usb_dev, -1); | 1857 | usb_set_configuration(usb_dev, -1); |
1858 | |||
1859 | kfree(usb_dev->product); | ||
1858 | usb_dev->product = kstrdup("n/a (unauthorized)", GFP_KERNEL); | 1860 | usb_dev->product = kstrdup("n/a (unauthorized)", GFP_KERNEL); |
1861 | kfree(usb_dev->manufacturer); | ||
1859 | usb_dev->manufacturer = kstrdup("n/a (unauthorized)", GFP_KERNEL); | 1862 | usb_dev->manufacturer = kstrdup("n/a (unauthorized)", GFP_KERNEL); |
1863 | kfree(usb_dev->serial); | ||
1860 | usb_dev->serial = kstrdup("n/a (unauthorized)", GFP_KERNEL); | 1864 | usb_dev->serial = kstrdup("n/a (unauthorized)", GFP_KERNEL); |
1861 | kfree(usb_dev->config); | 1865 | |
1862 | usb_dev->config = NULL; | 1866 | usb_destroy_configuration(usb_dev); |
1863 | for (cnt = 0; cnt < usb_dev->descriptor.bNumConfigurations; cnt++) | ||
1864 | kfree(usb_dev->rawdescriptors[cnt]); | ||
1865 | usb_dev->descriptor.bNumConfigurations = 0; | 1867 | usb_dev->descriptor.bNumConfigurations = 0; |
1866 | kfree(usb_dev->rawdescriptors); | 1868 | |
1867 | out_unauthorized: | 1869 | out_unauthorized: |
1868 | usb_unlock_device(usb_dev); | 1870 | usb_unlock_device(usb_dev); |
1869 | return 0; | 1871 | return 0; |
@@ -1873,15 +1875,11 @@ out_unauthorized: | |||
1873 | int usb_authorize_device(struct usb_device *usb_dev) | 1875 | int usb_authorize_device(struct usb_device *usb_dev) |
1874 | { | 1876 | { |
1875 | int result = 0, c; | 1877 | int result = 0, c; |
1878 | |||
1876 | usb_lock_device(usb_dev); | 1879 | usb_lock_device(usb_dev); |
1877 | if (usb_dev->authorized == 1) | 1880 | if (usb_dev->authorized == 1) |
1878 | goto out_authorized; | 1881 | goto out_authorized; |
1879 | kfree(usb_dev->product); | 1882 | |
1880 | usb_dev->product = NULL; | ||
1881 | kfree(usb_dev->manufacturer); | ||
1882 | usb_dev->manufacturer = NULL; | ||
1883 | kfree(usb_dev->serial); | ||
1884 | usb_dev->serial = NULL; | ||
1885 | result = usb_autoresume_device(usb_dev); | 1883 | result = usb_autoresume_device(usb_dev); |
1886 | if (result < 0) { | 1884 | if (result < 0) { |
1887 | dev_err(&usb_dev->dev, | 1885 | dev_err(&usb_dev->dev, |
@@ -1894,10 +1892,18 @@ int usb_authorize_device(struct usb_device *usb_dev) | |||
1894 | "authorization: %d\n", result); | 1892 | "authorization: %d\n", result); |
1895 | goto error_device_descriptor; | 1893 | goto error_device_descriptor; |
1896 | } | 1894 | } |
1895 | |||
1896 | kfree(usb_dev->product); | ||
1897 | usb_dev->product = NULL; | ||
1898 | kfree(usb_dev->manufacturer); | ||
1899 | usb_dev->manufacturer = NULL; | ||
1900 | kfree(usb_dev->serial); | ||
1901 | usb_dev->serial = NULL; | ||
1902 | |||
1897 | usb_dev->authorized = 1; | 1903 | usb_dev->authorized = 1; |
1898 | result = usb_configure_device(usb_dev); | 1904 | result = usb_enumerate_device(usb_dev); |
1899 | if (result < 0) | 1905 | if (result < 0) |
1900 | goto error_configure; | 1906 | goto error_enumerate; |
1901 | /* Choose and set the configuration. This registers the interfaces | 1907 | /* Choose and set the configuration. This registers the interfaces |
1902 | * with the driver core and lets interface drivers bind to them. | 1908 | * with the driver core and lets interface drivers bind to them. |
1903 | */ | 1909 | */ |
@@ -1912,8 +1918,10 @@ int usb_authorize_device(struct usb_device *usb_dev) | |||
1912 | } | 1918 | } |
1913 | } | 1919 | } |
1914 | dev_info(&usb_dev->dev, "authorized to connect\n"); | 1920 | dev_info(&usb_dev->dev, "authorized to connect\n"); |
1915 | error_configure: | 1921 | |
1922 | error_enumerate: | ||
1916 | error_device_descriptor: | 1923 | error_device_descriptor: |
1924 | usb_autosuspend_device(usb_dev); | ||
1917 | error_autoresume: | 1925 | error_autoresume: |
1918 | out_authorized: | 1926 | out_authorized: |
1919 | usb_unlock_device(usb_dev); // complements locktree | 1927 | usb_unlock_device(usb_dev); // complements locktree |