aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/core/hub.c
diff options
context:
space:
mode:
authorAlan Stern <stern@rowland.harvard.edu>2008-04-14 12:17:56 -0400
committerGreg Kroah-Hartman <gregkh@suse.de>2008-04-25 00:16:53 -0400
commite872154921a6b5256a3c412dd69158ac0b135176 (patch)
tree65c1ef7054d7c5ed3a94799e09db8036a7f9574c /drivers/usb/core/hub.c
parent5f47493cdf90b8afe5353e59de30e449e775ea8b (diff)
USB: don't explicitly reenable root-hub status interrupts
This patch (as1069b) changes the way OHCI root-hub status-change interrupts are enabled. Currently a special HCD method, hub_irq_enable(), is called when the hub driver is finished using a root hub. This approach turns out to be subject to races, resulting in unnecessary polling. The patch does away with the method entirely. Instead, the driver automatically enables the RHSC interrupt when no more status changes are present. This scheme is safe with controllers using level-triggered semantics for their interrupt flags. Signed-off-by: Alan Stern <stern@rowland.harvard.edu> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/usb/core/hub.c')
-rw-r--r--drivers/usb/core/hub.c9
1 files changed, 0 insertions, 9 deletions
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
index 1e23e360ea91..5a338a5d4fe7 100644
--- a/drivers/usb/core/hub.c
+++ b/drivers/usb/core/hub.c
@@ -2001,8 +2001,6 @@ int usb_port_resume(struct usb_device *udev)
2001 } 2001 }
2002 2002
2003 clear_bit(port1, hub->busy_bits); 2003 clear_bit(port1, hub->busy_bits);
2004 if (!hub->hdev->parent && !hub->busy_bits[0])
2005 usb_enable_root_hub_irq(hub->hdev->bus);
2006 2004
2007 if (status == 0) 2005 if (status == 0)
2008 status = finish_port_resume(udev); 2006 status = finish_port_resume(udev);
@@ -2918,11 +2916,6 @@ static void hub_events(void)
2918 2916
2919 hub->activating = 0; 2917 hub->activating = 0;
2920 2918
2921 /* If this is a root hub, tell the HCD it's okay to
2922 * re-enable port-change interrupts now. */
2923 if (!hdev->parent && !hub->busy_bits[0])
2924 usb_enable_root_hub_irq(hdev->bus);
2925
2926loop_autopm: 2919loop_autopm:
2927 /* Allow autosuspend if we're not going to run again */ 2920 /* Allow autosuspend if we're not going to run again */
2928 if (list_empty(&hub->event_list)) 2921 if (list_empty(&hub->event_list))
@@ -3148,8 +3141,6 @@ int usb_reset_device(struct usb_device *udev)
3148 break; 3141 break;
3149 } 3142 }
3150 clear_bit(port1, parent_hub->busy_bits); 3143 clear_bit(port1, parent_hub->busy_bits);
3151 if (!parent_hdev->parent && !parent_hub->busy_bits[0])
3152 usb_enable_root_hub_irq(parent_hdev->bus);
3153 3144
3154 if (ret < 0) 3145 if (ret < 0)
3155 goto re_enumerate; 3146 goto re_enumerate;