diff options
| author | Simon Arlott <simon@fire.lp0.eu> | 2010-09-01 13:37:12 -0400 |
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@suse.de> | 2010-09-03 20:33:41 -0400 |
| commit | 902ffc3c707c1d459ea57428a619a807cbe412f9 (patch) | |
| tree | d4566411d58755e4872b9426063b10749b2c470e /drivers | |
| parent | 870408c8291015872a7a0b583673a9e56b3e73f4 (diff) | |
USB: cxacru: Use a bulk/int URB to access the command endpoint
The command endpoint is either a bulk or interrupt endpoint, but using
the wrong type of transfer causes an error if CONFIG_USB_DEBUG is
enabled after commit f661c6f8c67bd55e93348f160d590ff9edf08904, which
checks for this mismatch.
Detect which type of endpoint it is and use a bulk/int URB as
appropriate. There are other function calls specifying a bulk pipe,
but usb_clear_halt doesn't use the pipe type (only the endpoint) and
usb_bulk_msg auto-detects interrupt transfers.
Signed-off-by: Simon Arlott <simon@fire.lp0.eu>
Cc: stable <stable@kernel.org> [.34 and newer]
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/usb/atm/cxacru.c | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/drivers/usb/atm/cxacru.c b/drivers/usb/atm/cxacru.c index 593fc5e2d2e6..5af23cc5ea9f 100644 --- a/drivers/usb/atm/cxacru.c +++ b/drivers/usb/atm/cxacru.c | |||
| @@ -1127,6 +1127,7 @@ static int cxacru_bind(struct usbatm_data *usbatm_instance, | |||
| 1127 | { | 1127 | { |
| 1128 | struct cxacru_data *instance; | 1128 | struct cxacru_data *instance; |
| 1129 | struct usb_device *usb_dev = interface_to_usbdev(intf); | 1129 | struct usb_device *usb_dev = interface_to_usbdev(intf); |
| 1130 | struct usb_host_endpoint *cmd_ep = usb_dev->ep_in[CXACRU_EP_CMD]; | ||
| 1130 | int ret; | 1131 | int ret; |
| 1131 | 1132 | ||
| 1132 | /* instance init */ | 1133 | /* instance init */ |
| @@ -1171,15 +1172,34 @@ static int cxacru_bind(struct usbatm_data *usbatm_instance, | |||
| 1171 | goto fail; | 1172 | goto fail; |
| 1172 | } | 1173 | } |
| 1173 | 1174 | ||
| 1174 | usb_fill_int_urb(instance->rcv_urb, | 1175 | if (!cmd_ep) { |
| 1176 | dbg("cxacru_bind: no command endpoint"); | ||
| 1177 | ret = -ENODEV; | ||
| 1178 | goto fail; | ||
| 1179 | } | ||
| 1180 | |||
| 1181 | if ((cmd_ep->desc.bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) | ||
| 1182 | == USB_ENDPOINT_XFER_INT) { | ||
| 1183 | usb_fill_int_urb(instance->rcv_urb, | ||
| 1175 | usb_dev, usb_rcvintpipe(usb_dev, CXACRU_EP_CMD), | 1184 | usb_dev, usb_rcvintpipe(usb_dev, CXACRU_EP_CMD), |
| 1176 | instance->rcv_buf, PAGE_SIZE, | 1185 | instance->rcv_buf, PAGE_SIZE, |
| 1177 | cxacru_blocking_completion, &instance->rcv_done, 1); | 1186 | cxacru_blocking_completion, &instance->rcv_done, 1); |
| 1178 | 1187 | ||
| 1179 | usb_fill_int_urb(instance->snd_urb, | 1188 | usb_fill_int_urb(instance->snd_urb, |
| 1180 | usb_dev, usb_sndintpipe(usb_dev, CXACRU_EP_CMD), | 1189 | usb_dev, usb_sndintpipe(usb_dev, CXACRU_EP_CMD), |
| 1181 | instance->snd_buf, PAGE_SIZE, | 1190 | instance->snd_buf, PAGE_SIZE, |
| 1182 | cxacru_blocking_completion, &instance->snd_done, 4); | 1191 | cxacru_blocking_completion, &instance->snd_done, 4); |
| 1192 | } else { | ||
| 1193 | usb_fill_bulk_urb(instance->rcv_urb, | ||
| 1194 | usb_dev, usb_rcvbulkpipe(usb_dev, CXACRU_EP_CMD), | ||
| 1195 | instance->rcv_buf, PAGE_SIZE, | ||
| 1196 | cxacru_blocking_completion, &instance->rcv_done); | ||
| 1197 | |||
| 1198 | usb_fill_bulk_urb(instance->snd_urb, | ||
| 1199 | usb_dev, usb_sndbulkpipe(usb_dev, CXACRU_EP_CMD), | ||
| 1200 | instance->snd_buf, PAGE_SIZE, | ||
| 1201 | cxacru_blocking_completion, &instance->snd_done); | ||
| 1202 | } | ||
| 1183 | 1203 | ||
| 1184 | mutex_init(&instance->cm_serialize); | 1204 | mutex_init(&instance->cm_serialize); |
| 1185 | 1205 | ||
