aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb
diff options
context:
space:
mode:
authorInaky Perez-Gonzalez <inaky@linux.intel.com>2008-04-08 16:24:46 -0400
committerGreg Kroah-Hartman <gregkh@suse.de>2008-04-25 00:16:59 -0400
commitfc721f5194dc98c8108fb155a4fbae1cd746cf41 (patch)
tree12170e62de774ef771d300074f25e63d30ca0a6e /drivers/usb
parent6c529cdca914ba2a08a4bba54f11dedc2d3a7c17 (diff)
wusb: make ep0_reinit available for modules
We need to be able to call ep0_reinit() [renamed to usb_ep0_reinit()] from the WUSB security code. The reason is that when we authenticate the device, it's address changes (from having bit 7 set to having it cleared). Thus, we need to signal the USB stack to reinitialize EP0, so the status with the previous address kept at the HCD layer is cleared and properly reinitialized. Signed-off-by: Inaky Perez-Gonzalez <inaky@linux.intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/usb')
-rw-r--r--drivers/usb/core/hub.c11
-rw-r--r--drivers/usb/core/hub.h1
2 files changed, 7 insertions, 5 deletions
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
index 1815034ccb7a..830c851384bf 100644
--- a/drivers/usb/core/hub.c
+++ b/drivers/usb/core/hub.c
@@ -2211,12 +2211,13 @@ static int hub_port_debounce(struct usb_hub *hub, int port1)
2211 return portstatus; 2211 return portstatus;
2212} 2212}
2213 2213
2214static void ep0_reinit(struct usb_device *udev) 2214void usb_ep0_reinit(struct usb_device *udev)
2215{ 2215{
2216 usb_disable_endpoint(udev, 0 + USB_DIR_IN); 2216 usb_disable_endpoint(udev, 0 + USB_DIR_IN);
2217 usb_disable_endpoint(udev, 0 + USB_DIR_OUT); 2217 usb_disable_endpoint(udev, 0 + USB_DIR_OUT);
2218 usb_enable_endpoint(udev, &udev->ep0); 2218 usb_enable_endpoint(udev, &udev->ep0);
2219} 2219}
2220EXPORT_SYMBOL_GPL(usb_ep0_reinit);
2220 2221
2221#define usb_sndaddr0pipe() (PIPE_CONTROL << 30) 2222#define usb_sndaddr0pipe() (PIPE_CONTROL << 30)
2222#define usb_rcvaddr0pipe() ((PIPE_CONTROL << 30) | USB_DIR_IN) 2223#define usb_rcvaddr0pipe() ((PIPE_CONTROL << 30) | USB_DIR_IN)
@@ -2237,7 +2238,7 @@ static int hub_set_address(struct usb_device *udev, int devnum)
2237 if (retval == 0) { 2238 if (retval == 0) {
2238 udev->devnum = devnum; /* Device now using proper address */ 2239 udev->devnum = devnum; /* Device now using proper address */
2239 usb_set_device_state(udev, USB_STATE_ADDRESS); 2240 usb_set_device_state(udev, USB_STATE_ADDRESS);
2240 ep0_reinit(udev); 2241 usb_ep0_reinit(udev);
2241 } 2242 }
2242 return retval; 2243 return retval;
2243} 2244}
@@ -2473,7 +2474,7 @@ hub_port_init (struct usb_hub *hub, struct usb_device *udev, int port1,
2473 } 2474 }
2474 dev_dbg(&udev->dev, "ep0 maxpacket = %d\n", i); 2475 dev_dbg(&udev->dev, "ep0 maxpacket = %d\n", i);
2475 udev->ep0.desc.wMaxPacketSize = cpu_to_le16(i); 2476 udev->ep0.desc.wMaxPacketSize = cpu_to_le16(i);
2476 ep0_reinit(udev); 2477 usb_ep0_reinit(udev);
2477 } 2478 }
2478 2479
2479 retval = usb_get_device_descriptor(udev, USB_DT_DEVICE_SIZE); 2480 retval = usb_get_device_descriptor(udev, USB_DT_DEVICE_SIZE);
@@ -2729,7 +2730,7 @@ static void hub_port_connect_change(struct usb_hub *hub, int port1,
2729loop_disable: 2730loop_disable:
2730 hub_port_disable(hub, port1, 1); 2731 hub_port_disable(hub, port1, 1);
2731loop: 2732loop:
2732 ep0_reinit(udev); 2733 usb_ep0_reinit(udev);
2733 release_address(udev); 2734 release_address(udev);
2734 usb_put_dev(udev); 2735 usb_put_dev(udev);
2735 if ((status == -ENOTCONN) || (status == -ENOTSUPP)) 2736 if ((status == -ENOTCONN) || (status == -ENOTSUPP))
@@ -3164,7 +3165,7 @@ int usb_reset_device(struct usb_device *udev)
3164 3165
3165 /* ep0 maxpacket size may change; let the HCD know about it. 3166 /* ep0 maxpacket size may change; let the HCD know about it.
3166 * Other endpoints will be handled by re-enumeration. */ 3167 * Other endpoints will be handled by re-enumeration. */
3167 ep0_reinit(udev); 3168 usb_ep0_reinit(udev);
3168 ret = hub_port_init(parent_hub, udev, port1, i); 3169 ret = hub_port_init(parent_hub, udev, port1, i);
3169 if (ret >= 0 || ret == -ENOTCONN || ret == -ENODEV) 3170 if (ret >= 0 || ret == -ENOTCONN || ret == -ENODEV)
3170 break; 3171 break;
diff --git a/drivers/usb/core/hub.h b/drivers/usb/core/hub.h
index d672cd81a3e4..2a116ce53c9b 100644
--- a/drivers/usb/core/hub.h
+++ b/drivers/usb/core/hub.h
@@ -195,5 +195,6 @@ struct usb_tt_clear {
195}; 195};
196 196
197extern void usb_hub_tt_clear_buffer(struct usb_device *dev, int pipe); 197extern void usb_hub_tt_clear_buffer(struct usb_device *dev, int pipe);
198extern void usb_ep0_reinit(struct usb_device *);
198 199
199#endif /* __LINUX_HUB_H */ 200#endif /* __LINUX_HUB_H */