aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/core/message.c
diff options
context:
space:
mode:
authorAlan Stern <stern@rowland.harvard.edu>2007-07-30 17:05:22 -0400
committerGreg Kroah-Hartman <gregkh@suse.de>2007-10-12 17:55:00 -0400
commitbdd016ba64d909329cb4bacacc8443901c00e112 (patch)
treecf20440d7d613377b5e2b4cec9764f2dc9e04928 /drivers/usb/core/message.c
parent5b653c79c04c6b152b8dc7d18f8c8a7f77f4b235 (diff)
USB: add ep->enable
This patch (as944) adds an explicit "enabled" field to the usb_host_endpoint structure and uses it in place of the current mechanism. This is merely a time-space tradeoff; it makes checking whether URBs may be submitted to an endpoint simpler. The existing mechanism is efficient when converting urb->pipe to an endpoint pointer, but it's not so efficient when urb->ep is used instead. As a side effect, the procedure for enabling an endpoint is now a little more complicated. The ad-hoc inline code in usb.c and hub.c for enabling ep0 is now replaced with calls to usb_enable_endpoint, which is no longer static. Signed-off-by: Alan Stern <stern@rowland.harvard.edu> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/usb/core/message.c')
-rw-r--r--drivers/usb/core/message.c20
1 files changed, 10 insertions, 10 deletions
diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c
index d8f7b089a8f0..0d618647758e 100644
--- a/drivers/usb/core/message.c
+++ b/drivers/usb/core/message.c
@@ -1013,8 +1013,10 @@ void usb_disable_endpoint(struct usb_device *dev, unsigned int epaddr)
1013 ep = dev->ep_in[epnum]; 1013 ep = dev->ep_in[epnum];
1014 dev->ep_in[epnum] = NULL; 1014 dev->ep_in[epnum] = NULL;
1015 } 1015 }
1016 if (ep && dev->bus) 1016 if (ep) {
1017 ep->enabled = 0;
1017 usb_hcd_endpoint_disable(dev, ep); 1018 usb_hcd_endpoint_disable(dev, ep);
1019 }
1018} 1020}
1019 1021
1020/** 1022/**
@@ -1096,23 +1098,21 @@ void usb_disable_device(struct usb_device *dev, int skip_ep0)
1096 * Resets the endpoint toggle, and sets dev->ep_{in,out} pointers. 1098 * Resets the endpoint toggle, and sets dev->ep_{in,out} pointers.
1097 * For control endpoints, both the input and output sides are handled. 1099 * For control endpoints, both the input and output sides are handled.
1098 */ 1100 */
1099static void 1101void usb_enable_endpoint(struct usb_device *dev, struct usb_host_endpoint *ep)
1100usb_enable_endpoint(struct usb_device *dev, struct usb_host_endpoint *ep)
1101{ 1102{
1102 unsigned int epaddr = ep->desc.bEndpointAddress; 1103 int epnum = usb_endpoint_num(&ep->desc);
1103 unsigned int epnum = epaddr & USB_ENDPOINT_NUMBER_MASK; 1104 int is_out = usb_endpoint_dir_out(&ep->desc);
1104 int is_control; 1105 int is_control = usb_endpoint_xfer_control(&ep->desc);
1105 1106
1106 is_control = ((ep->desc.bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) 1107 if (is_out || is_control) {
1107 == USB_ENDPOINT_XFER_CONTROL);
1108 if (usb_endpoint_out(epaddr) || is_control) {
1109 usb_settoggle(dev, epnum, 1, 0); 1108 usb_settoggle(dev, epnum, 1, 0);
1110 dev->ep_out[epnum] = ep; 1109 dev->ep_out[epnum] = ep;
1111 } 1110 }
1112 if (!usb_endpoint_out(epaddr) || is_control) { 1111 if (!is_out || is_control) {
1113 usb_settoggle(dev, epnum, 0, 0); 1112 usb_settoggle(dev, epnum, 0, 0);
1114 dev->ep_in[epnum] = ep; 1113 dev->ep_in[epnum] = ep;
1115 } 1114 }
1115 ep->enabled = 1;
1116} 1116}
1117 1117
1118/* 1118/*