diff options
Diffstat (limited to 'drivers/usb')
-rw-r--r-- | drivers/usb/core/message.c | 398 |
1 files changed, 204 insertions, 194 deletions
diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c index 58b8e1c6b9a6..fefb92296e8f 100644 --- a/drivers/usb/core/message.c +++ b/drivers/usb/core/message.c | |||
@@ -39,7 +39,7 @@ static void usb_api_blocking_completion(struct urb *urb) | |||
39 | * own interruptible routines. | 39 | * own interruptible routines. |
40 | */ | 40 | */ |
41 | static int usb_start_wait_urb(struct urb *urb, int timeout, int *actual_length) | 41 | static int usb_start_wait_urb(struct urb *urb, int timeout, int *actual_length) |
42 | { | 42 | { |
43 | struct api_context ctx; | 43 | struct api_context ctx; |
44 | unsigned long expire; | 44 | unsigned long expire; |
45 | int retval; | 45 | int retval; |
@@ -74,9 +74,9 @@ out: | |||
74 | } | 74 | } |
75 | 75 | ||
76 | /*-------------------------------------------------------------------*/ | 76 | /*-------------------------------------------------------------------*/ |
77 | // returns status (negative) or length (positive) | 77 | /* returns status (negative) or length (positive) */ |
78 | static int usb_internal_control_msg(struct usb_device *usb_dev, | 78 | static int usb_internal_control_msg(struct usb_device *usb_dev, |
79 | unsigned int pipe, | 79 | unsigned int pipe, |
80 | struct usb_ctrlrequest *cmd, | 80 | struct usb_ctrlrequest *cmd, |
81 | void *data, int len, int timeout) | 81 | void *data, int len, int timeout) |
82 | { | 82 | { |
@@ -87,7 +87,7 @@ static int usb_internal_control_msg(struct usb_device *usb_dev, | |||
87 | urb = usb_alloc_urb(0, GFP_NOIO); | 87 | urb = usb_alloc_urb(0, GFP_NOIO); |
88 | if (!urb) | 88 | if (!urb) |
89 | return -ENOMEM; | 89 | return -ENOMEM; |
90 | 90 | ||
91 | usb_fill_control_urb(urb, usb_dev, pipe, (unsigned char *)cmd, data, | 91 | usb_fill_control_urb(urb, usb_dev, pipe, (unsigned char *)cmd, data, |
92 | len, usb_api_blocking_completion, NULL); | 92 | len, usb_api_blocking_completion, NULL); |
93 | 93 | ||
@@ -99,47 +99,51 @@ static int usb_internal_control_msg(struct usb_device *usb_dev, | |||
99 | } | 99 | } |
100 | 100 | ||
101 | /** | 101 | /** |
102 | * usb_control_msg - Builds a control urb, sends it off and waits for completion | 102 | * usb_control_msg - Builds a control urb, sends it off and waits for completion |
103 | * @dev: pointer to the usb device to send the message to | 103 | * @dev: pointer to the usb device to send the message to |
104 | * @pipe: endpoint "pipe" to send the message to | 104 | * @pipe: endpoint "pipe" to send the message to |
105 | * @request: USB message request value | 105 | * @request: USB message request value |
106 | * @requesttype: USB message request type value | 106 | * @requesttype: USB message request type value |
107 | * @value: USB message value | 107 | * @value: USB message value |
108 | * @index: USB message index value | 108 | * @index: USB message index value |
109 | * @data: pointer to the data to send | 109 | * @data: pointer to the data to send |
110 | * @size: length in bytes of the data to send | 110 | * @size: length in bytes of the data to send |
111 | * @timeout: time in msecs to wait for the message to complete before | 111 | * @timeout: time in msecs to wait for the message to complete before timing |
112 | * timing out (if 0 the wait is forever) | 112 | * out (if 0 the wait is forever) |
113 | * Context: !in_interrupt () | 113 | * |
114 | * | 114 | * Context: !in_interrupt () |
115 | * This function sends a simple control message to a specified endpoint | 115 | * |
116 | * and waits for the message to complete, or timeout. | 116 | * This function sends a simple control message to a specified endpoint and |
117 | * | 117 | * waits for the message to complete, or timeout. |
118 | * If successful, it returns the number of bytes transferred, otherwise a negative error number. | 118 | * |
119 | * | 119 | * If successful, it returns the number of bytes transferred, otherwise a |
120 | * Don't use this function from within an interrupt context, like a | 120 | * negative error number. |
121 | * bottom half handler. If you need an asynchronous message, or need to send | 121 | * |
122 | * a message from within interrupt context, use usb_submit_urb() | 122 | * Don't use this function from within an interrupt context, like a bottom half |
123 | * If a thread in your driver uses this call, make sure your disconnect() | 123 | * handler. If you need an asynchronous message, or need to send a message |
124 | * method can wait for it to complete. Since you don't have a handle on | 124 | * from within interrupt context, use usb_submit_urb(). |
125 | * the URB used, you can't cancel the request. | 125 | * If a thread in your driver uses this call, make sure your disconnect() |
126 | * method can wait for it to complete. Since you don't have a handle on the | ||
127 | * URB used, you can't cancel the request. | ||
126 | */ | 128 | */ |
127 | int usb_control_msg(struct usb_device *dev, unsigned int pipe, __u8 request, __u8 requesttype, | 129 | int usb_control_msg(struct usb_device *dev, unsigned int pipe, __u8 request, |
128 | __u16 value, __u16 index, void *data, __u16 size, int timeout) | 130 | __u8 requesttype, __u16 value, __u16 index, void *data, |
131 | __u16 size, int timeout) | ||
129 | { | 132 | { |
130 | struct usb_ctrlrequest *dr = kmalloc(sizeof(struct usb_ctrlrequest), GFP_NOIO); | 133 | struct usb_ctrlrequest *dr; |
131 | int ret; | 134 | int ret; |
132 | 135 | ||
136 | dr = kmalloc(sizeof(struct usb_ctrlrequest), GFP_NOIO); | ||
133 | if (!dr) | 137 | if (!dr) |
134 | return -ENOMEM; | 138 | return -ENOMEM; |
135 | 139 | ||
136 | dr->bRequestType= requesttype; | 140 | dr->bRequestType = requesttype; |
137 | dr->bRequest = request; | 141 | dr->bRequest = request; |
138 | dr->wValue = cpu_to_le16p(&value); | 142 | dr->wValue = cpu_to_le16p(&value); |
139 | dr->wIndex = cpu_to_le16p(&index); | 143 | dr->wIndex = cpu_to_le16p(&index); |
140 | dr->wLength = cpu_to_le16p(&size); | 144 | dr->wLength = cpu_to_le16p(&size); |
141 | 145 | ||
142 | //dbg("usb_control_msg"); | 146 | /* dbg("usb_control_msg"); */ |
143 | 147 | ||
144 | ret = usb_internal_control_msg(dev, pipe, dr, data, size, timeout); | 148 | ret = usb_internal_control_msg(dev, pipe, dr, data, size, timeout); |
145 | 149 | ||
@@ -155,9 +159,11 @@ EXPORT_SYMBOL_GPL(usb_control_msg); | |||
155 | * @pipe: endpoint "pipe" to send the message to | 159 | * @pipe: endpoint "pipe" to send the message to |
156 | * @data: pointer to the data to send | 160 | * @data: pointer to the data to send |
157 | * @len: length in bytes of the data to send | 161 | * @len: length in bytes of the data to send |
158 | * @actual_length: pointer to a location to put the actual length transferred in bytes | 162 | * @actual_length: pointer to a location to put the actual length transferred |
163 | * in bytes | ||
159 | * @timeout: time in msecs to wait for the message to complete before | 164 | * @timeout: time in msecs to wait for the message to complete before |
160 | * timing out (if 0 the wait is forever) | 165 | * timing out (if 0 the wait is forever) |
166 | * | ||
161 | * Context: !in_interrupt () | 167 | * Context: !in_interrupt () |
162 | * | 168 | * |
163 | * This function sends a simple interrupt message to a specified endpoint and | 169 | * This function sends a simple interrupt message to a specified endpoint and |
@@ -181,38 +187,38 @@ int usb_interrupt_msg(struct usb_device *usb_dev, unsigned int pipe, | |||
181 | EXPORT_SYMBOL_GPL(usb_interrupt_msg); | 187 | EXPORT_SYMBOL_GPL(usb_interrupt_msg); |
182 | 188 | ||
183 | /** | 189 | /** |
184 | * usb_bulk_msg - Builds a bulk urb, sends it off and waits for completion | 190 | * usb_bulk_msg - Builds a bulk urb, sends it off and waits for completion |
185 | * @usb_dev: pointer to the usb device to send the message to | 191 | * @usb_dev: pointer to the usb device to send the message to |
186 | * @pipe: endpoint "pipe" to send the message to | 192 | * @pipe: endpoint "pipe" to send the message to |
187 | * @data: pointer to the data to send | 193 | * @data: pointer to the data to send |
188 | * @len: length in bytes of the data to send | 194 | * @len: length in bytes of the data to send |
189 | * @actual_length: pointer to a location to put the actual length transferred in bytes | 195 | * @actual_length: pointer to a location to put the actual length transferred |
190 | * @timeout: time in msecs to wait for the message to complete before | 196 | * in bytes |
191 | * timing out (if 0 the wait is forever) | 197 | * @timeout: time in msecs to wait for the message to complete before |
192 | * Context: !in_interrupt () | 198 | * timing out (if 0 the wait is forever) |
193 | * | 199 | * |
194 | * This function sends a simple bulk message to a specified endpoint | 200 | * Context: !in_interrupt () |
195 | * and waits for the message to complete, or timeout. | 201 | * |
196 | * | 202 | * This function sends a simple bulk message to a specified endpoint |
197 | * If successful, it returns 0, otherwise a negative error number. | 203 | * and waits for the message to complete, or timeout. |
198 | * The number of actual bytes transferred will be stored in the | 204 | * |
199 | * actual_length paramater. | 205 | * If successful, it returns 0, otherwise a negative error number. The number |
200 | * | 206 | * of actual bytes transferred will be stored in the actual_length paramater. |
201 | * Don't use this function from within an interrupt context, like a | 207 | * |
202 | * bottom half handler. If you need an asynchronous message, or need to | 208 | * Don't use this function from within an interrupt context, like a bottom half |
203 | * send a message from within interrupt context, use usb_submit_urb() | 209 | * handler. If you need an asynchronous message, or need to send a message |
204 | * If a thread in your driver uses this call, make sure your disconnect() | 210 | * from within interrupt context, use usb_submit_urb() If a thread in your |
205 | * method can wait for it to complete. Since you don't have a handle on | 211 | * driver uses this call, make sure your disconnect() method can wait for it to |
206 | * the URB used, you can't cancel the request. | 212 | * complete. Since you don't have a handle on the URB used, you can't cancel |
207 | * | 213 | * the request. |
208 | * Because there is no usb_interrupt_msg() and no USBDEVFS_INTERRUPT | 214 | * |
209 | * ioctl, users are forced to abuse this routine by using it to submit | 215 | * Because there is no usb_interrupt_msg() and no USBDEVFS_INTERRUPT ioctl, |
210 | * URBs for interrupt endpoints. We will take the liberty of creating | 216 | * users are forced to abuse this routine by using it to submit URBs for |
211 | * an interrupt URB (with the default interval) if the target is an | 217 | * interrupt endpoints. We will take the liberty of creating an interrupt URB |
212 | * interrupt endpoint. | 218 | * (with the default interval) if the target is an interrupt endpoint. |
213 | */ | 219 | */ |
214 | int usb_bulk_msg(struct usb_device *usb_dev, unsigned int pipe, | 220 | int usb_bulk_msg(struct usb_device *usb_dev, unsigned int pipe, |
215 | void *data, int len, int *actual_length, int timeout) | 221 | void *data, int len, int *actual_length, int timeout) |
216 | { | 222 | { |
217 | struct urb *urb; | 223 | struct urb *urb; |
218 | struct usb_host_endpoint *ep; | 224 | struct usb_host_endpoint *ep; |
@@ -242,26 +248,26 @@ EXPORT_SYMBOL_GPL(usb_bulk_msg); | |||
242 | 248 | ||
243 | /*-------------------------------------------------------------------*/ | 249 | /*-------------------------------------------------------------------*/ |
244 | 250 | ||
245 | static void sg_clean (struct usb_sg_request *io) | 251 | static void sg_clean(struct usb_sg_request *io) |
246 | { | 252 | { |
247 | if (io->urbs) { | 253 | if (io->urbs) { |
248 | while (io->entries--) | 254 | while (io->entries--) |
249 | usb_free_urb (io->urbs [io->entries]); | 255 | usb_free_urb(io->urbs [io->entries]); |
250 | kfree (io->urbs); | 256 | kfree(io->urbs); |
251 | io->urbs = NULL; | 257 | io->urbs = NULL; |
252 | } | 258 | } |
253 | if (io->dev->dev.dma_mask != NULL) | 259 | if (io->dev->dev.dma_mask != NULL) |
254 | usb_buffer_unmap_sg (io->dev, usb_pipein(io->pipe), | 260 | usb_buffer_unmap_sg(io->dev, usb_pipein(io->pipe), |
255 | io->sg, io->nents); | 261 | io->sg, io->nents); |
256 | io->dev = NULL; | 262 | io->dev = NULL; |
257 | } | 263 | } |
258 | 264 | ||
259 | static void sg_complete (struct urb *urb) | 265 | static void sg_complete(struct urb *urb) |
260 | { | 266 | { |
261 | struct usb_sg_request *io = urb->context; | 267 | struct usb_sg_request *io = urb->context; |
262 | int status = urb->status; | 268 | int status = urb->status; |
263 | 269 | ||
264 | spin_lock (&io->lock); | 270 | spin_lock(&io->lock); |
265 | 271 | ||
266 | /* In 2.5 we require hcds' endpoint queues not to progress after fault | 272 | /* In 2.5 we require hcds' endpoint queues not to progress after fault |
267 | * reports, until the completion callback (this!) returns. That lets | 273 | * reports, until the completion callback (this!) returns. That lets |
@@ -277,13 +283,13 @@ static void sg_complete (struct urb *urb) | |||
277 | && (io->status != -ECONNRESET | 283 | && (io->status != -ECONNRESET |
278 | || status != -ECONNRESET) | 284 | || status != -ECONNRESET) |
279 | && urb->actual_length) { | 285 | && urb->actual_length) { |
280 | dev_err (io->dev->bus->controller, | 286 | dev_err(io->dev->bus->controller, |
281 | "dev %s ep%d%s scatterlist error %d/%d\n", | 287 | "dev %s ep%d%s scatterlist error %d/%d\n", |
282 | io->dev->devpath, | 288 | io->dev->devpath, |
283 | usb_endpoint_num(&urb->ep->desc), | 289 | usb_endpoint_num(&urb->ep->desc), |
284 | usb_urb_dir_in(urb) ? "in" : "out", | 290 | usb_urb_dir_in(urb) ? "in" : "out", |
285 | status, io->status); | 291 | status, io->status); |
286 | // BUG (); | 292 | /* BUG (); */ |
287 | } | 293 | } |
288 | 294 | ||
289 | if (io->status == 0 && status && status != -ECONNRESET) { | 295 | if (io->status == 0 && status && status != -ECONNRESET) { |
@@ -295,22 +301,22 @@ static void sg_complete (struct urb *urb) | |||
295 | * unlink pending urbs so they won't rx/tx bad data. | 301 | * unlink pending urbs so they won't rx/tx bad data. |
296 | * careful: unlink can sometimes be synchronous... | 302 | * careful: unlink can sometimes be synchronous... |
297 | */ | 303 | */ |
298 | spin_unlock (&io->lock); | 304 | spin_unlock(&io->lock); |
299 | for (i = 0, found = 0; i < io->entries; i++) { | 305 | for (i = 0, found = 0; i < io->entries; i++) { |
300 | if (!io->urbs [i] || !io->urbs [i]->dev) | 306 | if (!io->urbs [i] || !io->urbs [i]->dev) |
301 | continue; | 307 | continue; |
302 | if (found) { | 308 | if (found) { |
303 | retval = usb_unlink_urb (io->urbs [i]); | 309 | retval = usb_unlink_urb(io->urbs [i]); |
304 | if (retval != -EINPROGRESS && | 310 | if (retval != -EINPROGRESS && |
305 | retval != -ENODEV && | 311 | retval != -ENODEV && |
306 | retval != -EBUSY) | 312 | retval != -EBUSY) |
307 | dev_err (&io->dev->dev, | 313 | dev_err(&io->dev->dev, |
308 | "%s, unlink --> %d\n", | 314 | "%s, unlink --> %d\n", |
309 | __FUNCTION__, retval); | 315 | __FUNCTION__, retval); |
310 | } else if (urb == io->urbs [i]) | 316 | } else if (urb == io->urbs [i]) |
311 | found = 1; | 317 | found = 1; |
312 | } | 318 | } |
313 | spin_lock (&io->lock); | 319 | spin_lock(&io->lock); |
314 | } | 320 | } |
315 | urb->dev = NULL; | 321 | urb->dev = NULL; |
316 | 322 | ||
@@ -318,9 +324,9 @@ static void sg_complete (struct urb *urb) | |||
318 | io->bytes += urb->actual_length; | 324 | io->bytes += urb->actual_length; |
319 | io->count--; | 325 | io->count--; |
320 | if (!io->count) | 326 | if (!io->count) |
321 | complete (&io->complete); | 327 | complete(&io->complete); |
322 | 328 | ||
323 | spin_unlock (&io->lock); | 329 | spin_unlock(&io->lock); |
324 | } | 330 | } |
325 | 331 | ||
326 | 332 | ||
@@ -349,28 +355,21 @@ static void sg_complete (struct urb *urb) | |||
349 | * The request may be canceled with usb_sg_cancel(), either before or after | 355 | * The request may be canceled with usb_sg_cancel(), either before or after |
350 | * usb_sg_wait() is called. | 356 | * usb_sg_wait() is called. |
351 | */ | 357 | */ |
352 | int usb_sg_init ( | 358 | int usb_sg_init(struct usb_sg_request *io, struct usb_device *dev, |
353 | struct usb_sg_request *io, | 359 | unsigned pipe, unsigned period, struct scatterlist *sg, |
354 | struct usb_device *dev, | 360 | int nents, size_t length, gfp_t mem_flags) |
355 | unsigned pipe, | ||
356 | unsigned period, | ||
357 | struct scatterlist *sg, | ||
358 | int nents, | ||
359 | size_t length, | ||
360 | gfp_t mem_flags | ||
361 | ) | ||
362 | { | 361 | { |
363 | int i; | 362 | int i; |
364 | int urb_flags; | 363 | int urb_flags; |
365 | int dma; | 364 | int dma; |
366 | 365 | ||
367 | if (!io || !dev || !sg | 366 | if (!io || !dev || !sg |
368 | || usb_pipecontrol (pipe) | 367 | || usb_pipecontrol(pipe) |
369 | || usb_pipeisoc (pipe) | 368 | || usb_pipeisoc(pipe) |
370 | || nents <= 0) | 369 | || nents <= 0) |
371 | return -EINVAL; | 370 | return -EINVAL; |
372 | 371 | ||
373 | spin_lock_init (&io->lock); | 372 | spin_lock_init(&io->lock); |
374 | io->dev = dev; | 373 | io->dev = dev; |
375 | io->pipe = pipe; | 374 | io->pipe = pipe; |
376 | io->sg = sg; | 375 | io->sg = sg; |
@@ -382,7 +381,7 @@ int usb_sg_init ( | |||
382 | dma = (dev->dev.dma_mask != NULL); | 381 | dma = (dev->dev.dma_mask != NULL); |
383 | if (dma) | 382 | if (dma) |
384 | io->entries = usb_buffer_map_sg(dev, usb_pipein(pipe), | 383 | io->entries = usb_buffer_map_sg(dev, usb_pipein(pipe), |
385 | sg, nents); | 384 | sg, nents); |
386 | else | 385 | else |
387 | io->entries = nents; | 386 | io->entries = nents; |
388 | 387 | ||
@@ -391,30 +390,30 @@ int usb_sg_init ( | |||
391 | return io->entries; | 390 | return io->entries; |
392 | 391 | ||
393 | io->count = io->entries; | 392 | io->count = io->entries; |
394 | io->urbs = kmalloc (io->entries * sizeof *io->urbs, mem_flags); | 393 | io->urbs = kmalloc(io->entries * sizeof *io->urbs, mem_flags); |
395 | if (!io->urbs) | 394 | if (!io->urbs) |
396 | goto nomem; | 395 | goto nomem; |
397 | 396 | ||
398 | urb_flags = URB_NO_TRANSFER_DMA_MAP | URB_NO_INTERRUPT; | 397 | urb_flags = URB_NO_TRANSFER_DMA_MAP | URB_NO_INTERRUPT; |
399 | if (usb_pipein (pipe)) | 398 | if (usb_pipein(pipe)) |
400 | urb_flags |= URB_SHORT_NOT_OK; | 399 | urb_flags |= URB_SHORT_NOT_OK; |
401 | 400 | ||
402 | for (i = 0; i < io->entries; i++) { | 401 | for (i = 0; i < io->entries; i++) { |
403 | unsigned len; | 402 | unsigned len; |
404 | 403 | ||
405 | io->urbs [i] = usb_alloc_urb (0, mem_flags); | 404 | io->urbs[i] = usb_alloc_urb(0, mem_flags); |
406 | if (!io->urbs [i]) { | 405 | if (!io->urbs[i]) { |
407 | io->entries = i; | 406 | io->entries = i; |
408 | goto nomem; | 407 | goto nomem; |
409 | } | 408 | } |
410 | 409 | ||
411 | io->urbs [i]->dev = NULL; | 410 | io->urbs[i]->dev = NULL; |
412 | io->urbs [i]->pipe = pipe; | 411 | io->urbs[i]->pipe = pipe; |
413 | io->urbs [i]->interval = period; | 412 | io->urbs[i]->interval = period; |
414 | io->urbs [i]->transfer_flags = urb_flags; | 413 | io->urbs[i]->transfer_flags = urb_flags; |
415 | 414 | ||
416 | io->urbs [i]->complete = sg_complete; | 415 | io->urbs[i]->complete = sg_complete; |
417 | io->urbs [i]->context = io; | 416 | io->urbs[i]->context = io; |
418 | 417 | ||
419 | /* | 418 | /* |
420 | * Some systems need to revert to PIO when DMA is temporarily | 419 | * Some systems need to revert to PIO when DMA is temporarily |
@@ -433,8 +432,8 @@ int usb_sg_init ( | |||
433 | * to prevent stale pointers and to help spot bugs. | 432 | * to prevent stale pointers and to help spot bugs. |
434 | */ | 433 | */ |
435 | if (dma) { | 434 | if (dma) { |
436 | io->urbs [i]->transfer_dma = sg_dma_address (sg + i); | 435 | io->urbs[i]->transfer_dma = sg_dma_address(sg + i); |
437 | len = sg_dma_len (sg + i); | 436 | len = sg_dma_len(sg + i); |
438 | #if defined(CONFIG_HIGHMEM) || defined(CONFIG_GART_IOMMU) | 437 | #if defined(CONFIG_HIGHMEM) || defined(CONFIG_GART_IOMMU) |
439 | io->urbs[i]->transfer_buffer = NULL; | 438 | io->urbs[i]->transfer_buffer = NULL; |
440 | #else | 439 | #else |
@@ -442,28 +441,28 @@ int usb_sg_init ( | |||
442 | #endif | 441 | #endif |
443 | } else { | 442 | } else { |
444 | /* hc may use _only_ transfer_buffer */ | 443 | /* hc may use _only_ transfer_buffer */ |
445 | io->urbs [i]->transfer_buffer = sg_virt(&sg[i]); | 444 | io->urbs[i]->transfer_buffer = sg_virt(&sg[i]); |
446 | len = sg [i].length; | 445 | len = sg[i].length; |
447 | } | 446 | } |
448 | 447 | ||
449 | if (length) { | 448 | if (length) { |
450 | len = min_t (unsigned, len, length); | 449 | len = min_t(unsigned, len, length); |
451 | length -= len; | 450 | length -= len; |
452 | if (length == 0) | 451 | if (length == 0) |
453 | io->entries = i + 1; | 452 | io->entries = i + 1; |
454 | } | 453 | } |
455 | io->urbs [i]->transfer_buffer_length = len; | 454 | io->urbs[i]->transfer_buffer_length = len; |
456 | } | 455 | } |
457 | io->urbs [--i]->transfer_flags &= ~URB_NO_INTERRUPT; | 456 | io->urbs[--i]->transfer_flags &= ~URB_NO_INTERRUPT; |
458 | 457 | ||
459 | /* transaction state */ | 458 | /* transaction state */ |
460 | io->status = 0; | 459 | io->status = 0; |
461 | io->bytes = 0; | 460 | io->bytes = 0; |
462 | init_completion (&io->complete); | 461 | init_completion(&io->complete); |
463 | return 0; | 462 | return 0; |
464 | 463 | ||
465 | nomem: | 464 | nomem: |
466 | sg_clean (io); | 465 | sg_clean(io); |
467 | return -ENOMEM; | 466 | return -ENOMEM; |
468 | } | 467 | } |
469 | EXPORT_SYMBOL_GPL(usb_sg_init); | 468 | EXPORT_SYMBOL_GPL(usb_sg_init); |
@@ -507,31 +506,32 @@ EXPORT_SYMBOL_GPL(usb_sg_init); | |||
507 | * speed interrupt endpoints, which allow at most one packet per millisecond, | 506 | * speed interrupt endpoints, which allow at most one packet per millisecond, |
508 | * of at most 8 or 64 bytes (respectively). | 507 | * of at most 8 or 64 bytes (respectively). |
509 | */ | 508 | */ |
510 | void usb_sg_wait (struct usb_sg_request *io) | 509 | void usb_sg_wait(struct usb_sg_request *io) |
511 | { | 510 | { |
512 | int i, entries = io->entries; | 511 | int i; |
512 | int entries = io->entries; | ||
513 | 513 | ||
514 | /* queue the urbs. */ | 514 | /* queue the urbs. */ |
515 | spin_lock_irq (&io->lock); | 515 | spin_lock_irq(&io->lock); |
516 | i = 0; | 516 | i = 0; |
517 | while (i < entries && !io->status) { | 517 | while (i < entries && !io->status) { |
518 | int retval; | 518 | int retval; |
519 | 519 | ||
520 | io->urbs [i]->dev = io->dev; | 520 | io->urbs[i]->dev = io->dev; |
521 | retval = usb_submit_urb (io->urbs [i], GFP_ATOMIC); | 521 | retval = usb_submit_urb(io->urbs [i], GFP_ATOMIC); |
522 | 522 | ||
523 | /* after we submit, let completions or cancelations fire; | 523 | /* after we submit, let completions or cancelations fire; |
524 | * we handshake using io->status. | 524 | * we handshake using io->status. |
525 | */ | 525 | */ |
526 | spin_unlock_irq (&io->lock); | 526 | spin_unlock_irq(&io->lock); |
527 | switch (retval) { | 527 | switch (retval) { |
528 | /* maybe we retrying will recover */ | 528 | /* maybe we retrying will recover */ |
529 | case -ENXIO: // hc didn't queue this one | 529 | case -ENXIO: /* hc didn't queue this one */ |
530 | case -EAGAIN: | 530 | case -EAGAIN: |
531 | case -ENOMEM: | 531 | case -ENOMEM: |
532 | io->urbs[i]->dev = NULL; | 532 | io->urbs[i]->dev = NULL; |
533 | retval = 0; | 533 | retval = 0; |
534 | yield (); | 534 | yield(); |
535 | break; | 535 | break; |
536 | 536 | ||
537 | /* no error? continue immediately. | 537 | /* no error? continue immediately. |
@@ -542,33 +542,33 @@ void usb_sg_wait (struct usb_sg_request *io) | |||
542 | */ | 542 | */ |
543 | case 0: | 543 | case 0: |
544 | ++i; | 544 | ++i; |
545 | cpu_relax (); | 545 | cpu_relax(); |
546 | break; | 546 | break; |
547 | 547 | ||
548 | /* fail any uncompleted urbs */ | 548 | /* fail any uncompleted urbs */ |
549 | default: | 549 | default: |
550 | io->urbs [i]->dev = NULL; | 550 | io->urbs[i]->dev = NULL; |
551 | io->urbs [i]->status = retval; | 551 | io->urbs[i]->status = retval; |
552 | dev_dbg (&io->dev->dev, "%s, submit --> %d\n", | 552 | dev_dbg(&io->dev->dev, "%s, submit --> %d\n", |
553 | __FUNCTION__, retval); | 553 | __FUNCTION__, retval); |
554 | usb_sg_cancel (io); | 554 | usb_sg_cancel(io); |
555 | } | 555 | } |
556 | spin_lock_irq (&io->lock); | 556 | spin_lock_irq(&io->lock); |
557 | if (retval && (io->status == 0 || io->status == -ECONNRESET)) | 557 | if (retval && (io->status == 0 || io->status == -ECONNRESET)) |
558 | io->status = retval; | 558 | io->status = retval; |
559 | } | 559 | } |
560 | io->count -= entries - i; | 560 | io->count -= entries - i; |
561 | if (io->count == 0) | 561 | if (io->count == 0) |
562 | complete (&io->complete); | 562 | complete(&io->complete); |
563 | spin_unlock_irq (&io->lock); | 563 | spin_unlock_irq(&io->lock); |
564 | 564 | ||
565 | /* OK, yes, this could be packaged as non-blocking. | 565 | /* OK, yes, this could be packaged as non-blocking. |
566 | * So could the submit loop above ... but it's easier to | 566 | * So could the submit loop above ... but it's easier to |
567 | * solve neither problem than to solve both! | 567 | * solve neither problem than to solve both! |
568 | */ | 568 | */ |
569 | wait_for_completion (&io->complete); | 569 | wait_for_completion(&io->complete); |
570 | 570 | ||
571 | sg_clean (io); | 571 | sg_clean(io); |
572 | } | 572 | } |
573 | EXPORT_SYMBOL_GPL(usb_sg_wait); | 573 | EXPORT_SYMBOL_GPL(usb_sg_wait); |
574 | 574 | ||
@@ -580,31 +580,31 @@ EXPORT_SYMBOL_GPL(usb_sg_wait); | |||
580 | * It can also prevents one initialized by usb_sg_init() from starting, | 580 | * It can also prevents one initialized by usb_sg_init() from starting, |
581 | * so that call just frees resources allocated to the request. | 581 | * so that call just frees resources allocated to the request. |
582 | */ | 582 | */ |
583 | void usb_sg_cancel (struct usb_sg_request *io) | 583 | void usb_sg_cancel(struct usb_sg_request *io) |
584 | { | 584 | { |
585 | unsigned long flags; | 585 | unsigned long flags; |
586 | 586 | ||
587 | spin_lock_irqsave (&io->lock, flags); | 587 | spin_lock_irqsave(&io->lock, flags); |
588 | 588 | ||
589 | /* shut everything down, if it didn't already */ | 589 | /* shut everything down, if it didn't already */ |
590 | if (!io->status) { | 590 | if (!io->status) { |
591 | int i; | 591 | int i; |
592 | 592 | ||
593 | io->status = -ECONNRESET; | 593 | io->status = -ECONNRESET; |
594 | spin_unlock (&io->lock); | 594 | spin_unlock(&io->lock); |
595 | for (i = 0; i < io->entries; i++) { | 595 | for (i = 0; i < io->entries; i++) { |
596 | int retval; | 596 | int retval; |
597 | 597 | ||
598 | if (!io->urbs [i]->dev) | 598 | if (!io->urbs [i]->dev) |
599 | continue; | 599 | continue; |
600 | retval = usb_unlink_urb (io->urbs [i]); | 600 | retval = usb_unlink_urb(io->urbs [i]); |
601 | if (retval != -EINPROGRESS && retval != -EBUSY) | 601 | if (retval != -EINPROGRESS && retval != -EBUSY) |
602 | dev_warn (&io->dev->dev, "%s, unlink --> %d\n", | 602 | dev_warn(&io->dev->dev, "%s, unlink --> %d\n", |
603 | __FUNCTION__, retval); | 603 | __FUNCTION__, retval); |
604 | } | 604 | } |
605 | spin_lock (&io->lock); | 605 | spin_lock(&io->lock); |
606 | } | 606 | } |
607 | spin_unlock_irqrestore (&io->lock, flags); | 607 | spin_unlock_irqrestore(&io->lock, flags); |
608 | } | 608 | } |
609 | EXPORT_SYMBOL_GPL(usb_sg_cancel); | 609 | EXPORT_SYMBOL_GPL(usb_sg_cancel); |
610 | 610 | ||
@@ -632,12 +632,13 @@ EXPORT_SYMBOL_GPL(usb_sg_cancel); | |||
632 | * Returns the number of bytes received on success, or else the status code | 632 | * Returns the number of bytes received on success, or else the status code |
633 | * returned by the underlying usb_control_msg() call. | 633 | * returned by the underlying usb_control_msg() call. |
634 | */ | 634 | */ |
635 | int usb_get_descriptor(struct usb_device *dev, unsigned char type, unsigned char index, void *buf, int size) | 635 | int usb_get_descriptor(struct usb_device *dev, unsigned char type, |
636 | unsigned char index, void *buf, int size) | ||
636 | { | 637 | { |
637 | int i; | 638 | int i; |
638 | int result; | 639 | int result; |
639 | 640 | ||
640 | memset(buf,0,size); // Make sure we parse really received data | 641 | memset(buf, 0, size); /* Make sure we parse really received data */ |
641 | 642 | ||
642 | for (i = 0; i < 3; ++i) { | 643 | for (i = 0; i < 3; ++i) { |
643 | /* retry on length 0 or error; some devices are flakey */ | 644 | /* retry on length 0 or error; some devices are flakey */ |
@@ -712,7 +713,7 @@ static void usb_try_string_workarounds(unsigned char *buf, int *length) | |||
712 | } | 713 | } |
713 | 714 | ||
714 | static int usb_string_sub(struct usb_device *dev, unsigned int langid, | 715 | static int usb_string_sub(struct usb_device *dev, unsigned int langid, |
715 | unsigned int index, unsigned char *buf) | 716 | unsigned int index, unsigned char *buf) |
716 | { | 717 | { |
717 | int rc; | 718 | int rc; |
718 | 719 | ||
@@ -755,7 +756,7 @@ static int usb_string_sub(struct usb_device *dev, unsigned int langid, | |||
755 | * @buf: where to put the string | 756 | * @buf: where to put the string |
756 | * @size: how big is "buf"? | 757 | * @size: how big is "buf"? |
757 | * Context: !in_interrupt () | 758 | * Context: !in_interrupt () |
758 | * | 759 | * |
759 | * This converts the UTF-16LE encoded strings returned by devices, from | 760 | * This converts the UTF-16LE encoded strings returned by devices, from |
760 | * usb_get_string_descriptor(), to null-terminated ISO-8859-1 encoded ones | 761 | * usb_get_string_descriptor(), to null-terminated ISO-8859-1 encoded ones |
761 | * that are more usable in most kernel contexts. Note that all characters | 762 | * that are more usable in most kernel contexts. Note that all characters |
@@ -791,23 +792,23 @@ int usb_string(struct usb_device *dev, int index, char *buf, size_t size) | |||
791 | if (!dev->have_langid) { | 792 | if (!dev->have_langid) { |
792 | err = usb_string_sub(dev, 0, 0, tbuf); | 793 | err = usb_string_sub(dev, 0, 0, tbuf); |
793 | if (err < 0) { | 794 | if (err < 0) { |
794 | dev_err (&dev->dev, | 795 | dev_err(&dev->dev, |
795 | "string descriptor 0 read error: %d\n", | 796 | "string descriptor 0 read error: %d\n", |
796 | err); | 797 | err); |
797 | goto errout; | 798 | goto errout; |
798 | } else if (err < 4) { | 799 | } else if (err < 4) { |
799 | dev_err (&dev->dev, "string descriptor 0 too short\n"); | 800 | dev_err(&dev->dev, "string descriptor 0 too short\n"); |
800 | err = -EINVAL; | 801 | err = -EINVAL; |
801 | goto errout; | 802 | goto errout; |
802 | } else { | 803 | } else { |
803 | dev->have_langid = 1; | 804 | dev->have_langid = 1; |
804 | dev->string_langid = tbuf[2] | (tbuf[3]<< 8); | 805 | dev->string_langid = tbuf[2] | (tbuf[3] << 8); |
805 | /* always use the first langid listed */ | 806 | /* always use the first langid listed */ |
806 | dev_dbg (&dev->dev, "default language 0x%04x\n", | 807 | dev_dbg(&dev->dev, "default language 0x%04x\n", |
807 | dev->string_langid); | 808 | dev->string_langid); |
808 | } | 809 | } |
809 | } | 810 | } |
810 | 811 | ||
811 | err = usb_string_sub(dev, dev->string_langid, index, tbuf); | 812 | err = usb_string_sub(dev, dev->string_langid, index, tbuf); |
812 | if (err < 0) | 813 | if (err < 0) |
813 | goto errout; | 814 | goto errout; |
@@ -825,7 +826,9 @@ int usb_string(struct usb_device *dev, int index, char *buf, size_t size) | |||
825 | err = idx; | 826 | err = idx; |
826 | 827 | ||
827 | if (tbuf[1] != USB_DT_STRING) | 828 | if (tbuf[1] != USB_DT_STRING) |
828 | dev_dbg(&dev->dev, "wrong descriptor type %02x for string %d (\"%s\")\n", tbuf[1], index, buf); | 829 | dev_dbg(&dev->dev, |
830 | "wrong descriptor type %02x for string %d (\"%s\")\n", | ||
831 | tbuf[1], index, buf); | ||
829 | 832 | ||
830 | errout: | 833 | errout: |
831 | kfree(tbuf); | 834 | kfree(tbuf); |
@@ -847,9 +850,15 @@ char *usb_cache_string(struct usb_device *udev, int index) | |||
847 | char *smallbuf = NULL; | 850 | char *smallbuf = NULL; |
848 | int len; | 851 | int len; |
849 | 852 | ||
850 | if (index > 0 && (buf = kmalloc(256, GFP_KERNEL)) != NULL) { | 853 | if (index <= 0) |
851 | if ((len = usb_string(udev, index, buf, 256)) > 0) { | 854 | return NULL; |
852 | if ((smallbuf = kmalloc(++len, GFP_KERNEL)) == NULL) | 855 | |
856 | buf = kmalloc(256, GFP_KERNEL); | ||
857 | if (buf) { | ||
858 | len = usb_string(udev, index, buf, 256); | ||
859 | if (len > 0) { | ||
860 | smallbuf = kmalloc(++len, GFP_KERNEL); | ||
861 | if (!smallbuf) | ||
853 | return buf; | 862 | return buf; |
854 | memcpy(smallbuf, buf, len); | 863 | memcpy(smallbuf, buf, len); |
855 | } | 864 | } |
@@ -888,7 +897,7 @@ int usb_get_device_descriptor(struct usb_device *dev, unsigned int size) | |||
888 | return -ENOMEM; | 897 | return -ENOMEM; |
889 | 898 | ||
890 | ret = usb_get_descriptor(dev, USB_DT_DEVICE, 0, desc, size); | 899 | ret = usb_get_descriptor(dev, USB_DT_DEVICE, 0, desc, size); |
891 | if (ret >= 0) | 900 | if (ret >= 0) |
892 | memcpy(&dev->descriptor, desc, size); | 901 | memcpy(&dev->descriptor, desc, size); |
893 | kfree(desc); | 902 | kfree(desc); |
894 | return ret; | 903 | return ret; |
@@ -961,8 +970,8 @@ int usb_clear_halt(struct usb_device *dev, int pipe) | |||
961 | { | 970 | { |
962 | int result; | 971 | int result; |
963 | int endp = usb_pipeendpoint(pipe); | 972 | int endp = usb_pipeendpoint(pipe); |
964 | 973 | ||
965 | if (usb_pipein (pipe)) | 974 | if (usb_pipein(pipe)) |
966 | endp |= USB_DIR_IN; | 975 | endp |= USB_DIR_IN; |
967 | 976 | ||
968 | /* we don't care if it wasn't halted first. in fact some devices | 977 | /* we don't care if it wasn't halted first. in fact some devices |
@@ -1045,7 +1054,7 @@ void usb_disable_interface(struct usb_device *dev, struct usb_interface *intf) | |||
1045 | } | 1054 | } |
1046 | } | 1055 | } |
1047 | 1056 | ||
1048 | /* | 1057 | /** |
1049 | * usb_disable_device - Disable all the endpoints for a USB device | 1058 | * usb_disable_device - Disable all the endpoints for a USB device |
1050 | * @dev: the device whose endpoints are being disabled | 1059 | * @dev: the device whose endpoints are being disabled |
1051 | * @skip_ep0: 0 to disable endpoint 0, 1 to skip it. | 1060 | * @skip_ep0: 0 to disable endpoint 0, 1 to skip it. |
@@ -1060,7 +1069,7 @@ void usb_disable_device(struct usb_device *dev, int skip_ep0) | |||
1060 | int i; | 1069 | int i; |
1061 | 1070 | ||
1062 | dev_dbg(&dev->dev, "%s nuking %s URBs\n", __FUNCTION__, | 1071 | dev_dbg(&dev->dev, "%s nuking %s URBs\n", __FUNCTION__, |
1063 | skip_ep0 ? "non-ep0" : "all"); | 1072 | skip_ep0 ? "non-ep0" : "all"); |
1064 | for (i = skip_ep0; i < 16; ++i) { | 1073 | for (i = skip_ep0; i < 16; ++i) { |
1065 | usb_disable_endpoint(dev, i); | 1074 | usb_disable_endpoint(dev, i); |
1066 | usb_disable_endpoint(dev, i + USB_DIR_IN); | 1075 | usb_disable_endpoint(dev, i + USB_DIR_IN); |
@@ -1078,17 +1087,17 @@ void usb_disable_device(struct usb_device *dev, int skip_ep0) | |||
1078 | interface = dev->actconfig->interface[i]; | 1087 | interface = dev->actconfig->interface[i]; |
1079 | if (!device_is_registered(&interface->dev)) | 1088 | if (!device_is_registered(&interface->dev)) |
1080 | continue; | 1089 | continue; |
1081 | dev_dbg (&dev->dev, "unregistering interface %s\n", | 1090 | dev_dbg(&dev->dev, "unregistering interface %s\n", |
1082 | interface->dev.bus_id); | 1091 | interface->dev.bus_id); |
1083 | usb_remove_sysfs_intf_files(interface); | 1092 | usb_remove_sysfs_intf_files(interface); |
1084 | device_del (&interface->dev); | 1093 | device_del(&interface->dev); |
1085 | } | 1094 | } |
1086 | 1095 | ||
1087 | /* Now that the interfaces are unbound, nobody should | 1096 | /* Now that the interfaces are unbound, nobody should |
1088 | * try to access them. | 1097 | * try to access them. |
1089 | */ | 1098 | */ |
1090 | for (i = 0; i < dev->actconfig->desc.bNumInterfaces; i++) { | 1099 | for (i = 0; i < dev->actconfig->desc.bNumInterfaces; i++) { |
1091 | put_device (&dev->actconfig->interface[i]->dev); | 1100 | put_device(&dev->actconfig->interface[i]->dev); |
1092 | dev->actconfig->interface[i] = NULL; | 1101 | dev->actconfig->interface[i] = NULL; |
1093 | } | 1102 | } |
1094 | dev->actconfig = NULL; | 1103 | dev->actconfig = NULL; |
@@ -1097,8 +1106,7 @@ void usb_disable_device(struct usb_device *dev, int skip_ep0) | |||
1097 | } | 1106 | } |
1098 | } | 1107 | } |
1099 | 1108 | ||
1100 | 1109 | /** | |
1101 | /* | ||
1102 | * usb_enable_endpoint - Enable an endpoint for USB communications | 1110 | * usb_enable_endpoint - Enable an endpoint for USB communications |
1103 | * @dev: the device whose interface is being enabled | 1111 | * @dev: the device whose interface is being enabled |
1104 | * @ep: the endpoint | 1112 | * @ep: the endpoint |
@@ -1123,7 +1131,7 @@ void usb_enable_endpoint(struct usb_device *dev, struct usb_host_endpoint *ep) | |||
1123 | ep->enabled = 1; | 1131 | ep->enabled = 1; |
1124 | } | 1132 | } |
1125 | 1133 | ||
1126 | /* | 1134 | /** |
1127 | * usb_enable_interface - Enable all the endpoints for an interface | 1135 | * usb_enable_interface - Enable all the endpoints for an interface |
1128 | * @dev: the device whose interface is being enabled | 1136 | * @dev: the device whose interface is being enabled |
1129 | * @intf: pointer to the interface descriptor | 1137 | * @intf: pointer to the interface descriptor |
@@ -1179,6 +1187,8 @@ int usb_set_interface(struct usb_device *dev, int interface, int alternate) | |||
1179 | struct usb_host_interface *alt; | 1187 | struct usb_host_interface *alt; |
1180 | int ret; | 1188 | int ret; |
1181 | int manual = 0; | 1189 | int manual = 0; |
1190 | unsigned int epaddr; | ||
1191 | unsigned int pipe; | ||
1182 | 1192 | ||
1183 | if (dev->state == USB_STATE_SUSPENDED) | 1193 | if (dev->state == USB_STATE_SUSPENDED) |
1184 | return -EHOSTUNREACH; | 1194 | return -EHOSTUNREACH; |
@@ -1233,11 +1243,11 @@ int usb_set_interface(struct usb_device *dev, int interface, int alternate) | |||
1233 | int i; | 1243 | int i; |
1234 | 1244 | ||
1235 | for (i = 0; i < alt->desc.bNumEndpoints; i++) { | 1245 | for (i = 0; i < alt->desc.bNumEndpoints; i++) { |
1236 | unsigned int epaddr = | 1246 | epaddr = alt->endpoint[i].desc.bEndpointAddress; |
1237 | alt->endpoint[i].desc.bEndpointAddress; | 1247 | pipe = __create_pipe(dev, |
1238 | unsigned int pipe = | 1248 | USB_ENDPOINT_NUMBER_MASK & epaddr) | |
1239 | __create_pipe(dev, USB_ENDPOINT_NUMBER_MASK & epaddr) | 1249 | (usb_endpoint_out(epaddr) ? |
1240 | | (usb_endpoint_out(epaddr) ? USB_DIR_OUT : USB_DIR_IN); | 1250 | USB_DIR_OUT : USB_DIR_IN); |
1241 | 1251 | ||
1242 | usb_clear_halt(dev, pipe); | 1252 | usb_clear_halt(dev, pipe); |
1243 | } | 1253 | } |
@@ -1366,7 +1376,8 @@ static int usb_if_uevent(struct device *dev, struct kobj_uevent_env *env) | |||
1366 | return -ENOMEM; | 1376 | return -ENOMEM; |
1367 | 1377 | ||
1368 | if (add_uevent_var(env, | 1378 | if (add_uevent_var(env, |
1369 | "MODALIAS=usb:v%04Xp%04Xd%04Xdc%02Xdsc%02Xdp%02Xic%02Xisc%02Xip%02X", | 1379 | "MODALIAS=usb:" |
1380 | "v%04Xp%04Xd%04Xdc%02Xdsc%02Xdp%02Xic%02Xisc%02Xip%02X", | ||
1370 | le16_to_cpu(usb_dev->descriptor.idVendor), | 1381 | le16_to_cpu(usb_dev->descriptor.idVendor), |
1371 | le16_to_cpu(usb_dev->descriptor.idProduct), | 1382 | le16_to_cpu(usb_dev->descriptor.idProduct), |
1372 | le16_to_cpu(usb_dev->descriptor.bcdDevice), | 1383 | le16_to_cpu(usb_dev->descriptor.bcdDevice), |
@@ -1396,8 +1407,8 @@ struct device_type usb_if_device_type = { | |||
1396 | }; | 1407 | }; |
1397 | 1408 | ||
1398 | static struct usb_interface_assoc_descriptor *find_iad(struct usb_device *dev, | 1409 | static struct usb_interface_assoc_descriptor *find_iad(struct usb_device *dev, |
1399 | struct usb_host_config *config, | 1410 | struct usb_host_config *config, |
1400 | u8 inum) | 1411 | u8 inum) |
1401 | { | 1412 | { |
1402 | struct usb_interface_assoc_descriptor *retval = NULL; | 1413 | struct usb_interface_assoc_descriptor *retval = NULL; |
1403 | struct usb_interface_assoc_descriptor *intf_assoc; | 1414 | struct usb_interface_assoc_descriptor *intf_assoc; |
@@ -1424,7 +1435,6 @@ static struct usb_interface_assoc_descriptor *find_iad(struct usb_device *dev, | |||
1424 | return retval; | 1435 | return retval; |
1425 | } | 1436 | } |
1426 | 1437 | ||
1427 | |||
1428 | /* | 1438 | /* |
1429 | * usb_set_configuration - Makes a particular device setting be current | 1439 | * usb_set_configuration - Makes a particular device setting be current |
1430 | * @dev: the device whose configuration is being updated | 1440 | * @dev: the device whose configuration is being updated |
@@ -1542,12 +1552,12 @@ free_interfaces: | |||
1542 | * getting rid of old interfaces means unbinding their drivers. | 1552 | * getting rid of old interfaces means unbinding their drivers. |
1543 | */ | 1553 | */ |
1544 | if (dev->state != USB_STATE_ADDRESS) | 1554 | if (dev->state != USB_STATE_ADDRESS) |
1545 | usb_disable_device (dev, 1); // Skip ep0 | 1555 | usb_disable_device(dev, 1); /* Skip ep0 */ |
1546 | |||
1547 | if ((ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), | ||
1548 | USB_REQ_SET_CONFIGURATION, 0, configuration, 0, | ||
1549 | NULL, 0, USB_CTRL_SET_TIMEOUT)) < 0) { | ||
1550 | 1556 | ||
1557 | ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), | ||
1558 | USB_REQ_SET_CONFIGURATION, 0, configuration, 0, | ||
1559 | NULL, 0, USB_CTRL_SET_TIMEOUT); | ||
1560 | if (ret < 0) { | ||
1551 | /* All the old state is gone, so what else can we do? | 1561 | /* All the old state is gone, so what else can we do? |
1552 | * The device is probably useless now anyway. | 1562 | * The device is probably useless now anyway. |
1553 | */ | 1563 | */ |
@@ -1594,11 +1604,11 @@ free_interfaces: | |||
1594 | intf->dev.bus = &usb_bus_type; | 1604 | intf->dev.bus = &usb_bus_type; |
1595 | intf->dev.type = &usb_if_device_type; | 1605 | intf->dev.type = &usb_if_device_type; |
1596 | intf->dev.dma_mask = dev->dev.dma_mask; | 1606 | intf->dev.dma_mask = dev->dev.dma_mask; |
1597 | device_initialize (&intf->dev); | 1607 | device_initialize(&intf->dev); |
1598 | mark_quiesced(intf); | 1608 | mark_quiesced(intf); |
1599 | sprintf (&intf->dev.bus_id[0], "%d-%s:%d.%d", | 1609 | sprintf(&intf->dev.bus_id[0], "%d-%s:%d.%d", |
1600 | dev->bus->busnum, dev->devpath, | 1610 | dev->bus->busnum, dev->devpath, |
1601 | configuration, alt->desc.bInterfaceNumber); | 1611 | configuration, alt->desc.bInterfaceNumber); |
1602 | } | 1612 | } |
1603 | kfree(new_interfaces); | 1613 | kfree(new_interfaces); |
1604 | 1614 | ||
@@ -1614,11 +1624,11 @@ free_interfaces: | |||
1614 | for (i = 0; i < nintf; ++i) { | 1624 | for (i = 0; i < nintf; ++i) { |
1615 | struct usb_interface *intf = cp->interface[i]; | 1625 | struct usb_interface *intf = cp->interface[i]; |
1616 | 1626 | ||
1617 | dev_dbg (&dev->dev, | 1627 | dev_dbg(&dev->dev, |
1618 | "adding %s (config #%d, interface %d)\n", | 1628 | "adding %s (config #%d, interface %d)\n", |
1619 | intf->dev.bus_id, configuration, | 1629 | intf->dev.bus_id, configuration, |
1620 | intf->cur_altsetting->desc.bInterfaceNumber); | 1630 | intf->cur_altsetting->desc.bInterfaceNumber); |
1621 | ret = device_add (&intf->dev); | 1631 | ret = device_add(&intf->dev); |
1622 | if (ret != 0) { | 1632 | if (ret != 0) { |
1623 | dev_err(&dev->dev, "device_add(%s) --> %d\n", | 1633 | dev_err(&dev->dev, "device_add(%s) --> %d\n", |
1624 | intf->dev.bus_id, ret); | 1634 | intf->dev.bus_id, ret); |