aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/core
diff options
context:
space:
mode:
authorSarah Sharp <sarah.a.sharp@linux.intel.com>2010-10-15 11:55:24 -0400
committerSarah Sharp <sarah.a.sharp@linux.intel.com>2011-03-13 21:07:14 -0400
commitd673bfcbfffdeb56064a6b1ee047b85590bed76c (patch)
tree50a4efa53b8ca6815ca25292136e7990425f0d36 /drivers/usb/core
parent23e0d1066f429ab44305e96fbff13f1793886277 (diff)
usb: Change usb_hcd->bandwidth_mutex to a pointer.
Change the bandwith_mutex in struct usb_hcd to a pointer. This will allow the pointer to be shared across usb_hcds for the upcoming work to split the xHCI driver roothub into a USB 2.0/1.1 and a USB 3.0 bus. Signed-off-by: Sarah Sharp <sarah.a.sharp@linux.intel.com>
Diffstat (limited to 'drivers/usb/core')
-rw-r--r--drivers/usb/core/hcd.c11
-rw-r--r--drivers/usb/core/hub.c8
-rw-r--r--drivers/usb/core/message.c22
3 files changed, 25 insertions, 16 deletions
diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c
index 40c7a46ba7d3..3ba27118adc5 100644
--- a/drivers/usb/core/hcd.c
+++ b/drivers/usb/core/hcd.c
@@ -2191,6 +2191,15 @@ struct usb_hcd *usb_create_hcd (const struct hc_driver *driver,
2191 dev_dbg (dev, "hcd alloc failed\n"); 2191 dev_dbg (dev, "hcd alloc failed\n");
2192 return NULL; 2192 return NULL;
2193 } 2193 }
2194 hcd->bandwidth_mutex = kmalloc(sizeof(*hcd->bandwidth_mutex),
2195 GFP_KERNEL);
2196 if (!hcd->bandwidth_mutex) {
2197 kfree(hcd);
2198 dev_dbg(dev, "hcd bandwidth mutex alloc failed\n");
2199 return NULL;
2200 }
2201 mutex_init(hcd->bandwidth_mutex);
2202
2194 dev_set_drvdata(dev, hcd); 2203 dev_set_drvdata(dev, hcd);
2195 kref_init(&hcd->kref); 2204 kref_init(&hcd->kref);
2196 2205
@@ -2205,7 +2214,6 @@ struct usb_hcd *usb_create_hcd (const struct hc_driver *driver,
2205#ifdef CONFIG_USB_SUSPEND 2214#ifdef CONFIG_USB_SUSPEND
2206 INIT_WORK(&hcd->wakeup_work, hcd_resume_work); 2215 INIT_WORK(&hcd->wakeup_work, hcd_resume_work);
2207#endif 2216#endif
2208 mutex_init(&hcd->bandwidth_mutex);
2209 2217
2210 hcd->driver = driver; 2218 hcd->driver = driver;
2211 hcd->product_desc = (driver->product_desc) ? driver->product_desc : 2219 hcd->product_desc = (driver->product_desc) ? driver->product_desc :
@@ -2218,6 +2226,7 @@ static void hcd_release (struct kref *kref)
2218{ 2226{
2219 struct usb_hcd *hcd = container_of (kref, struct usb_hcd, kref); 2227 struct usb_hcd *hcd = container_of (kref, struct usb_hcd, kref);
2220 2228
2229 kfree(hcd->bandwidth_mutex);
2221 kfree(hcd); 2230 kfree(hcd);
2222} 2231}
2223 2232
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
index 0eb27006f846..825d803720b3 100644
--- a/drivers/usb/core/hub.c
+++ b/drivers/usb/core/hub.c
@@ -3776,13 +3776,13 @@ static int usb_reset_and_verify_device(struct usb_device *udev)
3776 if (!udev->actconfig) 3776 if (!udev->actconfig)
3777 goto done; 3777 goto done;
3778 3778
3779 mutex_lock(&hcd->bandwidth_mutex); 3779 mutex_lock(hcd->bandwidth_mutex);
3780 ret = usb_hcd_alloc_bandwidth(udev, udev->actconfig, NULL, NULL); 3780 ret = usb_hcd_alloc_bandwidth(udev, udev->actconfig, NULL, NULL);
3781 if (ret < 0) { 3781 if (ret < 0) {
3782 dev_warn(&udev->dev, 3782 dev_warn(&udev->dev,
3783 "Busted HC? Not enough HCD resources for " 3783 "Busted HC? Not enough HCD resources for "
3784 "old configuration.\n"); 3784 "old configuration.\n");
3785 mutex_unlock(&hcd->bandwidth_mutex); 3785 mutex_unlock(hcd->bandwidth_mutex);
3786 goto re_enumerate; 3786 goto re_enumerate;
3787 } 3787 }
3788 ret = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), 3788 ret = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
@@ -3793,10 +3793,10 @@ static int usb_reset_and_verify_device(struct usb_device *udev)
3793 dev_err(&udev->dev, 3793 dev_err(&udev->dev,
3794 "can't restore configuration #%d (error=%d)\n", 3794 "can't restore configuration #%d (error=%d)\n",
3795 udev->actconfig->desc.bConfigurationValue, ret); 3795 udev->actconfig->desc.bConfigurationValue, ret);
3796 mutex_unlock(&hcd->bandwidth_mutex); 3796 mutex_unlock(hcd->bandwidth_mutex);
3797 goto re_enumerate; 3797 goto re_enumerate;
3798 } 3798 }
3799 mutex_unlock(&hcd->bandwidth_mutex); 3799 mutex_unlock(hcd->bandwidth_mutex);
3800 usb_set_device_state(udev, USB_STATE_CONFIGURED); 3800 usb_set_device_state(udev, USB_STATE_CONFIGURED);
3801 3801
3802 /* Put interfaces back into the same altsettings as before. 3802 /* Put interfaces back into the same altsettings as before.
diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c
index 832487423826..5701e857392b 100644
--- a/drivers/usb/core/message.c
+++ b/drivers/usb/core/message.c
@@ -1284,12 +1284,12 @@ int usb_set_interface(struct usb_device *dev, int interface, int alternate)
1284 /* Make sure we have enough bandwidth for this alternate interface. 1284 /* Make sure we have enough bandwidth for this alternate interface.
1285 * Remove the current alt setting and add the new alt setting. 1285 * Remove the current alt setting and add the new alt setting.
1286 */ 1286 */
1287 mutex_lock(&hcd->bandwidth_mutex); 1287 mutex_lock(hcd->bandwidth_mutex);
1288 ret = usb_hcd_alloc_bandwidth(dev, NULL, iface->cur_altsetting, alt); 1288 ret = usb_hcd_alloc_bandwidth(dev, NULL, iface->cur_altsetting, alt);
1289 if (ret < 0) { 1289 if (ret < 0) {
1290 dev_info(&dev->dev, "Not enough bandwidth for altsetting %d\n", 1290 dev_info(&dev->dev, "Not enough bandwidth for altsetting %d\n",
1291 alternate); 1291 alternate);
1292 mutex_unlock(&hcd->bandwidth_mutex); 1292 mutex_unlock(hcd->bandwidth_mutex);
1293 return ret; 1293 return ret;
1294 } 1294 }
1295 1295
@@ -1311,10 +1311,10 @@ int usb_set_interface(struct usb_device *dev, int interface, int alternate)
1311 } else if (ret < 0) { 1311 } else if (ret < 0) {
1312 /* Re-instate the old alt setting */ 1312 /* Re-instate the old alt setting */
1313 usb_hcd_alloc_bandwidth(dev, NULL, alt, iface->cur_altsetting); 1313 usb_hcd_alloc_bandwidth(dev, NULL, alt, iface->cur_altsetting);
1314 mutex_unlock(&hcd->bandwidth_mutex); 1314 mutex_unlock(hcd->bandwidth_mutex);
1315 return ret; 1315 return ret;
1316 } 1316 }
1317 mutex_unlock(&hcd->bandwidth_mutex); 1317 mutex_unlock(hcd->bandwidth_mutex);
1318 1318
1319 /* FIXME drivers shouldn't need to replicate/bugfix the logic here 1319 /* FIXME drivers shouldn't need to replicate/bugfix the logic here
1320 * when they implement async or easily-killable versions of this or 1320 * when they implement async or easily-killable versions of this or
@@ -1413,7 +1413,7 @@ int usb_reset_configuration(struct usb_device *dev)
1413 1413
1414 config = dev->actconfig; 1414 config = dev->actconfig;
1415 retval = 0; 1415 retval = 0;
1416 mutex_lock(&hcd->bandwidth_mutex); 1416 mutex_lock(hcd->bandwidth_mutex);
1417 /* Make sure we have enough bandwidth for each alternate setting 0 */ 1417 /* Make sure we have enough bandwidth for each alternate setting 0 */
1418 for (i = 0; i < config->desc.bNumInterfaces; i++) { 1418 for (i = 0; i < config->desc.bNumInterfaces; i++) {
1419 struct usb_interface *intf = config->interface[i]; 1419 struct usb_interface *intf = config->interface[i];
@@ -1442,7 +1442,7 @@ reset_old_alts:
1442 usb_hcd_alloc_bandwidth(dev, NULL, 1442 usb_hcd_alloc_bandwidth(dev, NULL,
1443 alt, intf->cur_altsetting); 1443 alt, intf->cur_altsetting);
1444 } 1444 }
1445 mutex_unlock(&hcd->bandwidth_mutex); 1445 mutex_unlock(hcd->bandwidth_mutex);
1446 return retval; 1446 return retval;
1447 } 1447 }
1448 retval = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), 1448 retval = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
@@ -1451,7 +1451,7 @@ reset_old_alts:
1451 NULL, 0, USB_CTRL_SET_TIMEOUT); 1451 NULL, 0, USB_CTRL_SET_TIMEOUT);
1452 if (retval < 0) 1452 if (retval < 0)
1453 goto reset_old_alts; 1453 goto reset_old_alts;
1454 mutex_unlock(&hcd->bandwidth_mutex); 1454 mutex_unlock(hcd->bandwidth_mutex);
1455 1455
1456 /* re-init hc/hcd interface/endpoint state */ 1456 /* re-init hc/hcd interface/endpoint state */
1457 for (i = 0; i < config->desc.bNumInterfaces; i++) { 1457 for (i = 0; i < config->desc.bNumInterfaces; i++) {
@@ -1739,10 +1739,10 @@ free_interfaces:
1739 * host controller will not allow submissions to dropped endpoints. If 1739 * host controller will not allow submissions to dropped endpoints. If
1740 * this call fails, the device state is unchanged. 1740 * this call fails, the device state is unchanged.
1741 */ 1741 */
1742 mutex_lock(&hcd->bandwidth_mutex); 1742 mutex_lock(hcd->bandwidth_mutex);
1743 ret = usb_hcd_alloc_bandwidth(dev, cp, NULL, NULL); 1743 ret = usb_hcd_alloc_bandwidth(dev, cp, NULL, NULL);
1744 if (ret < 0) { 1744 if (ret < 0) {
1745 mutex_unlock(&hcd->bandwidth_mutex); 1745 mutex_unlock(hcd->bandwidth_mutex);
1746 usb_autosuspend_device(dev); 1746 usb_autosuspend_device(dev);
1747 goto free_interfaces; 1747 goto free_interfaces;
1748 } 1748 }
@@ -1761,11 +1761,11 @@ free_interfaces:
1761 if (!cp) { 1761 if (!cp) {
1762 usb_set_device_state(dev, USB_STATE_ADDRESS); 1762 usb_set_device_state(dev, USB_STATE_ADDRESS);
1763 usb_hcd_alloc_bandwidth(dev, NULL, NULL, NULL); 1763 usb_hcd_alloc_bandwidth(dev, NULL, NULL, NULL);
1764 mutex_unlock(&hcd->bandwidth_mutex); 1764 mutex_unlock(hcd->bandwidth_mutex);
1765 usb_autosuspend_device(dev); 1765 usb_autosuspend_device(dev);
1766 goto free_interfaces; 1766 goto free_interfaces;
1767 } 1767 }
1768 mutex_unlock(&hcd->bandwidth_mutex); 1768 mutex_unlock(hcd->bandwidth_mutex);
1769 usb_set_device_state(dev, USB_STATE_CONFIGURED); 1769 usb_set_device_state(dev, USB_STATE_CONFIGURED);
1770 1770
1771 /* Initialize the new interface structures and the 1771 /* Initialize the new interface structures and the