diff options
author | Alan Stern <stern@rowland.harvard.edu> | 2007-07-30 17:05:22 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2007-10-12 17:55:00 -0400 |
commit | bdd016ba64d909329cb4bacacc8443901c00e112 (patch) | |
tree | cf20440d7d613377b5e2b4cec9764f2dc9e04928 /drivers/usb/core/message.c | |
parent | 5b653c79c04c6b152b8dc7d18f8c8a7f77f4b235 (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.c | 20 |
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 | */ |
1099 | static void | 1101 | void usb_enable_endpoint(struct usb_device *dev, struct usb_host_endpoint *ep) |
1100 | usb_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 | /* |