aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/usb/core/hcd.c104
1 files changed, 55 insertions, 49 deletions
diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c
index 9223f2869674..6368562d73ca 100644
--- a/drivers/usb/core/hcd.c
+++ b/drivers/usb/core/hcd.c
@@ -823,18 +823,17 @@ static void usb_deregister_bus (struct usb_bus *bus)
823 823
824/** 824/**
825 * register_root_hub - called by usb_add_hcd() to register a root hub 825 * register_root_hub - called by usb_add_hcd() to register a root hub
826 * @usb_dev: the usb root hub device to be registered.
827 * @hcd: host controller for this root hub 826 * @hcd: host controller for this root hub
828 * 827 *
829 * This function registers the root hub with the USB subsystem. It sets up 828 * This function registers the root hub with the USB subsystem. It sets up
830 * the device properly in the device tree and stores the root_hub pointer 829 * the device properly in the device tree and then calls usb_new_device()
831 * in the bus structure, then calls usb_new_device() to register the usb 830 * to register the usb device. It also assigns the root hub's USB address
832 * device. It also assigns the root hub's USB address (always 1). 831 * (always 1).
833 */ 832 */
834static int register_root_hub (struct usb_device *usb_dev, 833static int register_root_hub(struct usb_hcd *hcd)
835 struct usb_hcd *hcd)
836{ 834{
837 struct device *parent_dev = hcd->self.controller; 835 struct device *parent_dev = hcd->self.controller;
836 struct usb_device *usb_dev = hcd->self.root_hub;
838 const int devnum = 1; 837 const int devnum = 1;
839 int retval; 838 int retval;
840 839
@@ -846,12 +845,10 @@ static int register_root_hub (struct usb_device *usb_dev,
846 usb_set_device_state(usb_dev, USB_STATE_ADDRESS); 845 usb_set_device_state(usb_dev, USB_STATE_ADDRESS);
847 846
848 mutex_lock(&usb_bus_list_lock); 847 mutex_lock(&usb_bus_list_lock);
849 usb_dev->bus->root_hub = usb_dev;
850 848
851 usb_dev->ep0.desc.wMaxPacketSize = __constant_cpu_to_le16(64); 849 usb_dev->ep0.desc.wMaxPacketSize = __constant_cpu_to_le16(64);
852 retval = usb_get_device_descriptor(usb_dev, USB_DT_DEVICE_SIZE); 850 retval = usb_get_device_descriptor(usb_dev, USB_DT_DEVICE_SIZE);
853 if (retval != sizeof usb_dev->descriptor) { 851 if (retval != sizeof usb_dev->descriptor) {
854 usb_dev->bus->root_hub = NULL;
855 mutex_unlock(&usb_bus_list_lock); 852 mutex_unlock(&usb_bus_list_lock);
856 dev_dbg (parent_dev, "can't read %s device descriptor %d\n", 853 dev_dbg (parent_dev, "can't read %s device descriptor %d\n",
857 usb_dev->dev.bus_id, retval); 854 usb_dev->dev.bus_id, retval);
@@ -860,7 +857,6 @@ static int register_root_hub (struct usb_device *usb_dev,
860 857
861 retval = usb_new_device (usb_dev); 858 retval = usb_new_device (usb_dev);
862 if (retval) { 859 if (retval) {
863 usb_dev->bus->root_hub = NULL;
864 dev_err (parent_dev, "can't register root hub for %s, %d\n", 860 dev_err (parent_dev, "can't register root hub for %s, %d\n",
865 usb_dev->dev.bus_id, retval); 861 usb_dev->dev.bus_id, retval);
866 } 862 }
@@ -1772,12 +1768,10 @@ int usb_add_hcd(struct usb_hcd *hcd,
1772 1768
1773 set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); 1769 set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
1774 1770
1775 /* till now HC has been in an indeterminate state ... */ 1771 /* HC is in reset state, but accessible. Now do the one-time init,
1776 if (hcd->driver->reset && (retval = hcd->driver->reset(hcd)) < 0) { 1772 * bottom up so that hcds can customize the root hubs before khubd
1777 dev_err(hcd->self.controller, "can't reset\n"); 1773 * starts talking to them. (Note, bus id is assigned early too.)
1778 return retval; 1774 */
1779 }
1780
1781 if ((retval = hcd_buffer_create(hcd)) != 0) { 1775 if ((retval = hcd_buffer_create(hcd)) != 0) {
1782 dev_dbg(hcd->self.controller, "pool alloc failed\n"); 1776 dev_dbg(hcd->self.controller, "pool alloc failed\n");
1783 return retval; 1777 return retval;
@@ -1786,6 +1780,42 @@ int usb_add_hcd(struct usb_hcd *hcd,
1786 if ((retval = usb_register_bus(&hcd->self)) < 0) 1780 if ((retval = usb_register_bus(&hcd->self)) < 0)
1787 goto err_register_bus; 1781 goto err_register_bus;
1788 1782
1783 if ((rhdev = usb_alloc_dev(NULL, &hcd->self, 0)) == NULL) {
1784 dev_err(hcd->self.controller, "unable to allocate root hub\n");
1785 retval = -ENOMEM;
1786 goto err_allocate_root_hub;
1787 }
1788 rhdev->speed = (hcd->driver->flags & HCD_USB2) ? USB_SPEED_HIGH :
1789 USB_SPEED_FULL;
1790 hcd->self.root_hub = rhdev;
1791
1792 /* "reset" is misnamed; its role is now one-time init. the controller
1793 * should already have been reset (and boot firmware kicked off etc).
1794 */
1795 if (hcd->driver->reset && (retval = hcd->driver->reset(hcd)) < 0) {
1796 dev_err(hcd->self.controller, "can't setup\n");
1797 goto err_hcd_driver_setup;
1798 }
1799
1800 /* wakeup flag init is in transition; for now we can't rely on PCI to
1801 * initialize these bits properly, so we let reset() override it.
1802 * This init should _precede_ the reset() once PCI behaves.
1803 */
1804 device_init_wakeup(&rhdev->dev,
1805 device_can_wakeup(hcd->self.controller));
1806
1807 // ... all these hcd->*_wakeup flags will vanish
1808 hcd->can_wakeup = device_can_wakeup(hcd->self.controller);
1809
1810 /* hcd->driver->reset() reported can_wakeup, probably with
1811 * assistance from board's boot firmware.
1812 * NOTE: normal devices won't enable wakeup by default.
1813 */
1814 if (hcd->can_wakeup)
1815 dev_dbg(hcd->self.controller, "supports USB remote wakeup\n");
1816 hcd->remote_wakeup = hcd->can_wakeup;
1817
1818 /* enable irqs just before we start the controller */
1789 if (hcd->driver->irq) { 1819 if (hcd->driver->irq) {
1790 char buf[8], *bufp = buf; 1820 char buf[8], *bufp = buf;
1791 1821
@@ -1817,56 +1847,32 @@ int usb_add_hcd(struct usb_hcd *hcd,
1817 (unsigned long long)hcd->rsrc_start); 1847 (unsigned long long)hcd->rsrc_start);
1818 } 1848 }
1819 1849
1820 /* Allocate the root hub before calling hcd->driver->start(),
1821 * but don't register it until afterward so that the hardware
1822 * is running.
1823 */
1824 if ((rhdev = usb_alloc_dev(NULL, &hcd->self, 0)) == NULL) {
1825 dev_err(hcd->self.controller, "unable to allocate root hub\n");
1826 retval = -ENOMEM;
1827 goto err_allocate_root_hub;
1828 }
1829
1830 /* Although in principle hcd->driver->start() might need to use rhdev,
1831 * none of the current drivers do.
1832 */
1833 if ((retval = hcd->driver->start(hcd)) < 0) { 1850 if ((retval = hcd->driver->start(hcd)) < 0) {
1834 dev_err(hcd->self.controller, "startup error %d\n", retval); 1851 dev_err(hcd->self.controller, "startup error %d\n", retval);
1835 goto err_hcd_driver_start; 1852 goto err_hcd_driver_start;
1836 } 1853 }
1837 1854
1838 /* hcd->driver->start() reported can_wakeup, probably with 1855 /* starting here, usbcore will pay attention to this root hub */
1839 * assistance from board's boot firmware.
1840 * NOTE: normal devices won't enable wakeup by default.
1841 */
1842 if (hcd->can_wakeup)
1843 dev_dbg(hcd->self.controller, "supports USB remote wakeup\n");
1844 hcd->remote_wakeup = hcd->can_wakeup;
1845
1846 rhdev->speed = (hcd->driver->flags & HCD_USB2) ? USB_SPEED_HIGH :
1847 USB_SPEED_FULL;
1848 rhdev->bus_mA = min(500u, hcd->power_budget); 1856 rhdev->bus_mA = min(500u, hcd->power_budget);
1849 if ((retval = register_root_hub(rhdev, hcd)) != 0) 1857 if ((retval = register_root_hub(hcd)) != 0)
1850 goto err_register_root_hub; 1858 goto err_register_root_hub;
1851 1859
1852 if (hcd->uses_new_polling && hcd->poll_rh) 1860 if (hcd->uses_new_polling && hcd->poll_rh)
1853 usb_hcd_poll_rh_status(hcd); 1861 usb_hcd_poll_rh_status(hcd);
1854 return retval; 1862 return retval;
1855 1863
1856 err_register_root_hub: 1864err_register_root_hub:
1857 hcd->driver->stop(hcd); 1865 hcd->driver->stop(hcd);
1858 1866err_hcd_driver_start:
1859 err_hcd_driver_start:
1860 usb_put_dev(rhdev);
1861
1862 err_allocate_root_hub:
1863 if (hcd->irq >= 0) 1867 if (hcd->irq >= 0)
1864 free_irq(irqnum, hcd); 1868 free_irq(irqnum, hcd);
1865 1869err_request_irq:
1866 err_request_irq: 1870err_hcd_driver_setup:
1871 hcd->self.root_hub = NULL;
1872 usb_put_dev(rhdev);
1873err_allocate_root_hub:
1867 usb_deregister_bus(&hcd->self); 1874 usb_deregister_bus(&hcd->self);
1868 1875err_register_bus:
1869 err_register_bus:
1870 hcd_buffer_destroy(hcd); 1876 hcd_buffer_destroy(hcd);
1871 return retval; 1877 return retval;
1872} 1878}