diff options
Diffstat (limited to 'drivers/usb/usb-skeleton.c')
-rw-r--r-- | drivers/usb/usb-skeleton.c | 59 |
1 files changed, 25 insertions, 34 deletions
diff --git a/drivers/usb/usb-skeleton.c b/drivers/usb/usb-skeleton.c index 5133a0792eb0..bb0bd732e29a 100644 --- a/drivers/usb/usb-skeleton.c +++ b/drivers/usb/usb-skeleton.c | |||
@@ -491,16 +491,14 @@ static int skel_probe(struct usb_interface *interface, | |||
491 | const struct usb_device_id *id) | 491 | const struct usb_device_id *id) |
492 | { | 492 | { |
493 | struct usb_skel *dev; | 493 | struct usb_skel *dev; |
494 | struct usb_host_interface *iface_desc; | 494 | struct usb_endpoint_descriptor *bulk_in, *bulk_out; |
495 | struct usb_endpoint_descriptor *endpoint; | 495 | int retval; |
496 | size_t buffer_size; | ||
497 | int i; | ||
498 | int retval = -ENOMEM; | ||
499 | 496 | ||
500 | /* allocate memory for our device state and initialize it */ | 497 | /* allocate memory for our device state and initialize it */ |
501 | dev = kzalloc(sizeof(*dev), GFP_KERNEL); | 498 | dev = kzalloc(sizeof(*dev), GFP_KERNEL); |
502 | if (!dev) | 499 | if (!dev) |
503 | goto error; | 500 | return -ENOMEM; |
501 | |||
504 | kref_init(&dev->kref); | 502 | kref_init(&dev->kref); |
505 | sema_init(&dev->limit_sem, WRITES_IN_FLIGHT); | 503 | sema_init(&dev->limit_sem, WRITES_IN_FLIGHT); |
506 | mutex_init(&dev->io_mutex); | 504 | mutex_init(&dev->io_mutex); |
@@ -513,36 +511,29 @@ static int skel_probe(struct usb_interface *interface, | |||
513 | 511 | ||
514 | /* set up the endpoint information */ | 512 | /* set up the endpoint information */ |
515 | /* use only the first bulk-in and bulk-out endpoints */ | 513 | /* use only the first bulk-in and bulk-out endpoints */ |
516 | iface_desc = interface->cur_altsetting; | 514 | retval = usb_find_common_endpoints(interface->cur_altsetting, |
517 | for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) { | 515 | &bulk_in, &bulk_out, NULL, NULL); |
518 | endpoint = &iface_desc->endpoint[i].desc; | 516 | if (retval) { |
519 | |||
520 | if (!dev->bulk_in_endpointAddr && | ||
521 | usb_endpoint_is_bulk_in(endpoint)) { | ||
522 | /* we found a bulk in endpoint */ | ||
523 | buffer_size = usb_endpoint_maxp(endpoint); | ||
524 | dev->bulk_in_size = buffer_size; | ||
525 | dev->bulk_in_endpointAddr = endpoint->bEndpointAddress; | ||
526 | dev->bulk_in_buffer = kmalloc(buffer_size, GFP_KERNEL); | ||
527 | if (!dev->bulk_in_buffer) | ||
528 | goto error; | ||
529 | dev->bulk_in_urb = usb_alloc_urb(0, GFP_KERNEL); | ||
530 | if (!dev->bulk_in_urb) | ||
531 | goto error; | ||
532 | } | ||
533 | |||
534 | if (!dev->bulk_out_endpointAddr && | ||
535 | usb_endpoint_is_bulk_out(endpoint)) { | ||
536 | /* we found a bulk out endpoint */ | ||
537 | dev->bulk_out_endpointAddr = endpoint->bEndpointAddress; | ||
538 | } | ||
539 | } | ||
540 | if (!(dev->bulk_in_endpointAddr && dev->bulk_out_endpointAddr)) { | ||
541 | dev_err(&interface->dev, | 517 | dev_err(&interface->dev, |
542 | "Could not find both bulk-in and bulk-out endpoints\n"); | 518 | "Could not find both bulk-in and bulk-out endpoints\n"); |
543 | goto error; | 519 | goto error; |
544 | } | 520 | } |
545 | 521 | ||
522 | dev->bulk_in_size = usb_endpoint_maxp(bulk_in); | ||
523 | dev->bulk_in_endpointAddr = bulk_in->bEndpointAddress; | ||
524 | dev->bulk_in_buffer = kmalloc(dev->bulk_in_size, GFP_KERNEL); | ||
525 | if (!dev->bulk_in_buffer) { | ||
526 | retval = -ENOMEM; | ||
527 | goto error; | ||
528 | } | ||
529 | dev->bulk_in_urb = usb_alloc_urb(0, GFP_KERNEL); | ||
530 | if (!dev->bulk_in_urb) { | ||
531 | retval = -ENOMEM; | ||
532 | goto error; | ||
533 | } | ||
534 | |||
535 | dev->bulk_out_endpointAddr = bulk_out->bEndpointAddress; | ||
536 | |||
546 | /* save our data pointer in this interface device */ | 537 | /* save our data pointer in this interface device */ |
547 | usb_set_intfdata(interface, dev); | 538 | usb_set_intfdata(interface, dev); |
548 | 539 | ||
@@ -563,9 +554,9 @@ static int skel_probe(struct usb_interface *interface, | |||
563 | return 0; | 554 | return 0; |
564 | 555 | ||
565 | error: | 556 | error: |
566 | if (dev) | 557 | /* this frees allocated memory */ |
567 | /* this frees allocated memory */ | 558 | kref_put(&dev->kref, skel_delete); |
568 | kref_put(&dev->kref, skel_delete); | 559 | |
569 | return retval; | 560 | return retval; |
570 | } | 561 | } |
571 | 562 | ||