diff options
author | David Vrabel <david.vrabel@csr.com> | 2009-04-08 13:36:33 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2009-04-17 13:50:28 -0400 |
commit | 8db324ec4322a15cf8819b8a7f0eff5aa98b2ff6 (patch) | |
tree | 9e42bb8c488576828566c1857687ac4b569a8cd1 /drivers/usb | |
parent | f720af91ec2c67e9a1abbd935570f4b4e1f0dd54 (diff) |
WUSB: disconnect all devices when stopping a WUSB HCD
Make sure all WUSB devices are disconnected when stopping a WUSB HCD so
that we don't leak the devices' wusb_dev structures.
Signed-off-by: David Vrabel <david.vrabel@csr.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/usb')
-rw-r--r-- | drivers/usb/wusbcore/devconnect.c | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/drivers/usb/wusbcore/devconnect.c b/drivers/usb/wusbcore/devconnect.c index 386eaa22d215..63f200e4efb1 100644 --- a/drivers/usb/wusbcore/devconnect.c +++ b/drivers/usb/wusbcore/devconnect.c | |||
@@ -396,7 +396,8 @@ static void __wusbhc_dev_disconnect(struct wusbhc *wusbhc, | |||
396 | 396 | ||
397 | /* After a device disconnects, change the GTK (see [WUSB] | 397 | /* After a device disconnects, change the GTK (see [WUSB] |
398 | * section 6.2.11.2). */ | 398 | * section 6.2.11.2). */ |
399 | wusbhc_gtk_rekey(wusbhc); | 399 | if (wusbhc->active) |
400 | wusbhc_gtk_rekey(wusbhc); | ||
400 | 401 | ||
401 | /* The Wireless USB part has forgotten about the device already; now | 402 | /* The Wireless USB part has forgotten about the device already; now |
402 | * khubd's timer will pick up the disconnection and remove the USB | 403 | * khubd's timer will pick up the disconnection and remove the USB |
@@ -1084,15 +1085,21 @@ error_mmcie_set: | |||
1084 | * wusbhc_devconnect_stop - stop managing connected devices | 1085 | * wusbhc_devconnect_stop - stop managing connected devices |
1085 | * @wusbhc: the WUSB HC | 1086 | * @wusbhc: the WUSB HC |
1086 | * | 1087 | * |
1087 | * Removes the Host Info IE and stops the keep alives. | 1088 | * Disconnects any devices still connected, stops the keep alives and |
1088 | * | 1089 | * removes the Host Info IE. |
1089 | * FIXME: should this disconnect all devices? | ||
1090 | */ | 1090 | */ |
1091 | void wusbhc_devconnect_stop(struct wusbhc *wusbhc) | 1091 | void wusbhc_devconnect_stop(struct wusbhc *wusbhc) |
1092 | { | 1092 | { |
1093 | cancel_delayed_work_sync(&wusbhc->keep_alive_timer); | 1093 | int i; |
1094 | WARN_ON(!list_empty(&wusbhc->cack_list)); | ||
1095 | 1094 | ||
1095 | mutex_lock(&wusbhc->mutex); | ||
1096 | for (i = 0; i < wusbhc->ports_max; i++) { | ||
1097 | if (wusbhc->port[i].wusb_dev) | ||
1098 | __wusbhc_dev_disconnect(wusbhc, &wusbhc->port[i]); | ||
1099 | } | ||
1100 | mutex_unlock(&wusbhc->mutex); | ||
1101 | |||
1102 | cancel_delayed_work_sync(&wusbhc->keep_alive_timer); | ||
1096 | wusbhc_mmcie_rm(wusbhc, &wusbhc->wuie_host_info->hdr); | 1103 | wusbhc_mmcie_rm(wusbhc, &wusbhc->wuie_host_info->hdr); |
1097 | kfree(wusbhc->wuie_host_info); | 1104 | kfree(wusbhc->wuie_host_info); |
1098 | wusbhc->wuie_host_info = NULL; | 1105 | wusbhc->wuie_host_info = NULL; |