diff options
-rw-r--r-- | drivers/staging/greybus/es2.c | 93 |
1 files changed, 38 insertions, 55 deletions
diff --git a/drivers/staging/greybus/es2.c b/drivers/staging/greybus/es2.c index c6c078642e92..69123b7ee94b 100644 --- a/drivers/staging/greybus/es2.c +++ b/drivers/staging/greybus/es2.c @@ -114,7 +114,7 @@ struct es2_ap_dev { struct usb_interface *usb_intf; struct gb_host_device *hd; - struct es2_cport_in cport_in[NUM_BULKS]; + struct es2_cport_in cport_in; __u8 cport_out_endpoint; struct urb *cport_out_urb[NUM_CPORT_OUT_URB]; bool cport_out_urb_busy[NUM_CPORT_OUT_URB]; @@ -920,7 +920,6 @@ static int check_urb_status(struct urb *urb) static void es2_destroy(struct es2_ap_dev *es2) { struct usb_device *udev; - int bulk_in; int i; debugfs_remove(es2->apb_log_enable_dentry); @@ -948,18 +947,10 @@ static void es2_destroy(struct es2_ap_dev *es2) es2->arpc_buffer[i] = NULL; } - for (bulk_in = 0; bulk_in < NUM_BULKS; bulk_in++) { - struct es2_cport_in *cport_in = &es2->cport_in[bulk_in]; - - for (i = 0; i < NUM_CPORT_IN_URB; ++i) { - struct urb *urb = cport_in->urb[i]; - - if (!urb) - break; - usb_free_urb(urb); - kfree(cport_in->buffer[i]); - cport_in->buffer[i] = NULL; - } + for (i = 0; i < NUM_CPORT_IN_URB; ++i) { + usb_free_urb(es2->cport_in.urb[i]); + kfree(es2->cport_in.buffer[i]); + es2->cport_in.buffer[i] = NULL; } /* release reserved CDSI0 and CDSI1 cports */ @@ -1412,11 +1403,12 @@ static int ap_probe(struct usb_interface *interface, struct usb_device *udev; struct usb_host_interface *iface_desc; struct usb_endpoint_descriptor *endpoint; - int bulk_in = 0; int retval; int i; int num_cports; bool bulk_out_found = false; + bool bulk_in_found = false; + bool arpc_in_found = false; udev = usb_get_dev(interface_to_usbdev(interface)); @@ -1460,13 +1452,15 @@ static int ap_probe(struct usb_interface *interface, endpoint = &iface_desc->endpoint[i].desc; if (usb_endpoint_is_bulk_in(endpoint)) { - if (bulk_in < NUM_BULKS) - es2->cport_in[bulk_in].endpoint = + if (!bulk_in_found) { + es2->cport_in.endpoint = endpoint->bEndpointAddress; - else + bulk_in_found = true; + } else if (!arpc_in_found) { es2->arpc_endpoint_in = endpoint->bEndpointAddress; - bulk_in++; + arpc_in_found = true; + } } else if (usb_endpoint_is_bulk_out(endpoint) && (!bulk_out_found)) { es2->cport_out_endpoint = endpoint->bEndpointAddress; @@ -1477,41 +1471,36 @@ static int ap_probe(struct usb_interface *interface, endpoint->bEndpointAddress); } } - if (bulk_in != NUM_BULKS_IN || !bulk_out_found) { + if (!bulk_in_found || !arpc_in_found || !bulk_out_found) { dev_err(&udev->dev, "Not enough endpoints found in device, aborting!\n"); retval = -ENODEV; goto error; } /* Allocate buffers for our cport in messages */ - for (bulk_in = 0; bulk_in < NUM_BULKS; bulk_in++) { - struct es2_cport_in *cport_in = &es2->cport_in[bulk_in]; - - for (i = 0; i < NUM_CPORT_IN_URB; ++i) { - struct urb *urb; - u8 *buffer; + for (i = 0; i < NUM_CPORT_IN_URB; ++i) { + struct urb *urb; + u8 *buffer; - urb = usb_alloc_urb(0, GFP_KERNEL); - if (!urb) { - retval = -ENOMEM; - goto error; - } - cport_in->urb[i] = urb; + urb = usb_alloc_urb(0, GFP_KERNEL); + if (!urb) { + retval = -ENOMEM; + goto error; + } + es2->cport_in.urb[i] = urb; - buffer = kmalloc(ES2_GBUF_MSG_SIZE_MAX, GFP_KERNEL); - if (!buffer) { - retval = -ENOMEM; - goto error; - } + buffer = kmalloc(ES2_GBUF_MSG_SIZE_MAX, GFP_KERNEL); + if (!buffer) { + retval = -ENOMEM; + goto error; + } - usb_fill_bulk_urb(urb, udev, - usb_rcvbulkpipe(udev, - cport_in->endpoint), - buffer, ES2_GBUF_MSG_SIZE_MAX, - cport_in_callback, hd); + usb_fill_bulk_urb(urb, udev, + usb_rcvbulkpipe(udev, es2->cport_in.endpoint), + buffer, ES2_GBUF_MSG_SIZE_MAX, + cport_in_callback, hd); - cport_in->buffer[i] = buffer; - } + es2->cport_in.buffer[i] = buffer; } /* Allocate buffers for ARPC in messages */ @@ -1571,17 +1560,13 @@ static int ap_probe(struct usb_interface *interface, if (retval) goto err_disable_arpc_in; - for (i = 0; i < NUM_BULKS; ++i) { - retval = es2_cport_in_enable(es2, &es2->cport_in[i]); - if (retval) - goto err_disable_cport_in; - } + retval = es2_cport_in_enable(es2, &es2->cport_in); + if (retval) + goto err_hd_del; return 0; -err_disable_cport_in: - for (--i; i >= 0; --i) - es2_cport_in_disable(es2, &es2->cport_in[i]); +err_hd_del: gb_hd_del(hd); err_disable_arpc_in: es2_arpc_in_disable(es2); @@ -1594,12 +1579,10 @@ error: static void ap_disconnect(struct usb_interface *interface) { struct es2_ap_dev *es2 = usb_get_intfdata(interface); - int i; gb_hd_del(es2->hd); - for (i = 0; i < NUM_BULKS; ++i) - es2_cport_in_disable(es2, &es2->cport_in[i]); + es2_cport_in_disable(es2, &es2->cport_in); es2_arpc_in_disable(es2); es2_destroy(es2); |