aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorAlan Stern <stern@rowland.harvard.edu>2008-04-28 11:07:31 -0400
committerGreg Kroah-Hartman <gregkh@suse.de>2008-07-21 18:15:52 -0400
commit4330354f7660828d97834598633054b413f6264d (patch)
tree807426b75086e3e4e2670ef60577e366f3eed843 /drivers
parentf2835219ed5e29ec959a0e635af4339d6174b2a7 (diff)
USB: combine hub_quiesce and hub_stop
This patch (as1083) combines hub_quiesce() and hub_stop() into a single routine. There's no point keeping them separate since they are usually called together. Signed-off-by: Alan Stern <stern@rowland.harvard.edu> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/usb/core/hub.c63
1 files changed, 32 insertions, 31 deletions
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
index 4c629a036aed..e678ed8bd8c2 100644
--- a/drivers/usb/core/hub.c
+++ b/drivers/usb/core/hub.c
@@ -538,19 +538,6 @@ static void hub_power_on(struct usb_hub *hub)
538 msleep(max(pgood_delay, (unsigned) 100)); 538 msleep(max(pgood_delay, (unsigned) 100));
539} 539}
540 540
541static void hub_quiesce(struct usb_hub *hub)
542{
543 /* (nonblocking) khubd and related activity won't re-trigger */
544 hub->quiescing = 1;
545
546 /* (blocking) stop khubd and related activity */
547 usb_kill_urb(hub->urb);
548 if (hub->has_indicators)
549 cancel_delayed_work_sync(&hub->leds);
550 if (hub->tt.hub)
551 cancel_work_sync(&hub->tt.kevent);
552}
553
554static int hub_hub_status(struct usb_hub *hub, 541static int hub_hub_status(struct usb_hub *hub,
555 u16 *status, u16 *change) 542 u16 *status, u16 *change)
556{ 543{
@@ -609,20 +596,6 @@ static void hub_port_logical_disconnect(struct usb_hub *hub, int port1)
609 kick_khubd(hub); 596 kick_khubd(hub);
610} 597}
611 598
612/* caller has locked the hub device */
613static void hub_stop(struct usb_hub *hub)
614{
615 struct usb_device *hdev = hub->hdev;
616 int i;
617
618 /* Disconnect all the children */
619 for (i = 0; i < hdev->maxchild; ++i) {
620 if (hdev->children[i])
621 usb_disconnect(&hdev->children[i]);
622 }
623 hub_quiesce(hub);
624}
625
626enum hub_activation_type { 599enum hub_activation_type {
627 HUB_INIT, HUB_POST_RESET, HUB_RESUME, HUB_RESET_RESUME 600 HUB_INIT, HUB_POST_RESET, HUB_RESUME, HUB_RESET_RESUME
628}; 601};
@@ -732,12 +705,40 @@ static void hub_activate(struct usb_hub *hub, enum hub_activation_type type)
732 kick_khubd(hub); 705 kick_khubd(hub);
733} 706}
734 707
708enum hub_quiescing_type {
709 HUB_DISCONNECT, HUB_PRE_RESET, HUB_SUSPEND
710};
711
712static void hub_quiesce(struct usb_hub *hub, enum hub_quiescing_type type)
713{
714 struct usb_device *hdev = hub->hdev;
715 int i;
716
717 /* khubd and related activity won't re-trigger */
718 hub->quiescing = 1;
719
720 if (type != HUB_SUSPEND) {
721 /* Disconnect all the children */
722 for (i = 0; i < hdev->maxchild; ++i) {
723 if (hdev->children[i])
724 usb_disconnect(&hdev->children[i]);
725 }
726 }
727
728 /* Stop khubd and related activity */
729 usb_kill_urb(hub->urb);
730 if (hub->has_indicators)
731 cancel_delayed_work_sync(&hub->leds);
732 if (hub->tt.hub)
733 cancel_work_sync(&hub->tt.kevent);
734}
735
735/* caller has locked the hub device */ 736/* caller has locked the hub device */
736static int hub_pre_reset(struct usb_interface *intf) 737static int hub_pre_reset(struct usb_interface *intf)
737{ 738{
738 struct usb_hub *hub = usb_get_intfdata(intf); 739 struct usb_hub *hub = usb_get_intfdata(intf);
739 740
740 hub_stop(hub); 741 hub_quiesce(hub, HUB_PRE_RESET);
741 return 0; 742 return 0;
742} 743}
743 744
@@ -1024,7 +1025,7 @@ static void hub_disconnect(struct usb_interface *intf)
1024 1025
1025 /* Disconnect all children and quiesce the hub */ 1026 /* Disconnect all children and quiesce the hub */
1026 hub->error = 0; 1027 hub->error = 0;
1027 hub_stop(hub); 1028 hub_quiesce(hub, HUB_DISCONNECT);
1028 1029
1029 usb_set_intfdata (intf, NULL); 1030 usb_set_intfdata (intf, NULL);
1030 1031
@@ -2167,7 +2168,7 @@ static int hub_suspend(struct usb_interface *intf, pm_message_t msg)
2167 dev_dbg(&intf->dev, "%s\n", __func__); 2168 dev_dbg(&intf->dev, "%s\n", __func__);
2168 2169
2169 /* stop khubd and related activity */ 2170 /* stop khubd and related activity */
2170 hub_quiesce(hub); 2171 hub_quiesce(hub, HUB_SUSPEND);
2171 return 0; 2172 return 0;
2172} 2173}
2173 2174
@@ -2914,7 +2915,7 @@ static void hub_events(void)
2914 /* If the hub has died, clean up after it */ 2915 /* If the hub has died, clean up after it */
2915 if (hdev->state == USB_STATE_NOTATTACHED) { 2916 if (hdev->state == USB_STATE_NOTATTACHED) {
2916 hub->error = -ENODEV; 2917 hub->error = -ENODEV;
2917 hub_stop(hub); 2918 hub_quiesce(hub, HUB_DISCONNECT);
2918 goto loop; 2919 goto loop;
2919 } 2920 }
2920 2921