| From 49214536bdb00376f6e0b1db454848f1e064d84a Mon Sep 17 00:00:00 2001 |
| From: Johan Hovold <johan@kernel.org> |
| Date: Tue, 10 Dec 2019 12:26:01 +0100 |
| Subject: [PATCH] USB: serial: io_edgeport: fix epic endpoint lookup |
| |
| commit 7c5a2df3367a2c4984f1300261345817d95b71f8 upstream. |
| |
| Make sure to use the current alternate setting when looking up the |
| endpoints on epic devices to avoid binding to an invalid interface. |
| |
| Failing to do so could cause the driver to misbehave or trigger a WARN() |
| in usb_submit_urb() that kernels with panic_on_warn set would choke on. |
| |
| Fixes: 6e8cf7751f9f ("USB: add EPIC support to the io_edgeport driver") |
| Cc: stable <stable@vger.kernel.org> # 2.6.21 |
| Signed-off-by: Johan Hovold <johan@kernel.org> |
| Link: https://lore.kernel.org/r/20191210112601.3561-5-johan@kernel.org |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/usb/serial/io_edgeport.c b/drivers/usb/serial/io_edgeport.c |
| index 48a439298a68..9690a5f4b9d6 100644 |
| --- a/drivers/usb/serial/io_edgeport.c |
| +++ b/drivers/usb/serial/io_edgeport.c |
| @@ -2901,16 +2901,18 @@ static int edge_startup(struct usb_serial *serial) |
| response = 0; |
| |
| if (edge_serial->is_epic) { |
| + struct usb_host_interface *alt; |
| + |
| + alt = serial->interface->cur_altsetting; |
| + |
| /* EPIC thing, set up our interrupt polling now and our read |
| * urb, so that the device knows it really is connected. */ |
| interrupt_in_found = bulk_in_found = bulk_out_found = false; |
| - for (i = 0; i < serial->interface->altsetting[0] |
| - .desc.bNumEndpoints; ++i) { |
| + for (i = 0; i < alt->desc.bNumEndpoints; ++i) { |
| struct usb_endpoint_descriptor *endpoint; |
| int buffer_size; |
| |
| - endpoint = &serial->interface->altsetting[0]. |
| - endpoint[i].desc; |
| + endpoint = &alt->endpoint[i].desc; |
| buffer_size = usb_endpoint_maxp(endpoint); |
| if (!interrupt_in_found && |
| (usb_endpoint_is_int_in(endpoint))) { |
| -- |
| 2.7.4 |
| |