summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohan Hovold <johan@kernel.org>2017-03-16 17:13:40 +0100
committerJohan Hovold <johan@kernel.org>2017-03-28 11:00:09 +0200
commit204cc473bc896134870fda21cd279774b3ead024 (patch)
tree55b1f4a471cff134afc698e74b5705b40aaf0193
parentUSB: serial: ipaq: use calc_num_endpoints to verify endpoints (diff)
downloadlinux-204cc473bc896134870fda21cd279774b3ead024.tar.xz
linux-204cc473bc896134870fda21cd279774b3ead024.zip
USB: serial: ipaq: always register a single port
Use the calc_num_ports callback to ignore unused endpoints. The driver binds to any interface with at least one bulk-in and one bulk-out endpoint, but some devices can have three or more endpoints of which only either the first or second pair of endpoints is needed. This avoids allocating resources for unused endpoints, and specifically a port is no longer registered for the unused first endpoint pair when there are more than three endpoints. Signed-off-by: Johan Hovold <johan@kernel.org>
-rw-r--r--drivers/usb/serial/ipaq.c41
1 files changed, 15 insertions, 26 deletions
diff --git a/drivers/usb/serial/ipaq.c b/drivers/usb/serial/ipaq.c
index c638571f0175..cde0dcdce9c4 100644
--- a/drivers/usb/serial/ipaq.c
+++ b/drivers/usb/serial/ipaq.c
@@ -555,39 +555,32 @@ static int ipaq_calc_num_ports(struct usb_serial *serial,
struct usb_serial_endpoints *epds)
{
/*
- * some devices have 3 endpoints, the 3rd of which
- * must be ignored as it would make the core
- * create a second port which oopses when used
+ * Some of the devices in ipaq_id_table[] are composite, and we
+ * shouldn't bind to all the interfaces. This test will rule out
+ * some obviously invalid possibilities.
*/
- int ipaq_num_ports = 1;
-
- dev_dbg(&serial->dev->dev, "%s - numberofendpoints: %d\n", __func__,
- (int)serial->interface->cur_altsetting->desc.bNumEndpoints);
+ if (epds->num_bulk_in == 0 || epds->num_bulk_out == 0)
+ return -ENODEV;
/*
- * a few devices have 4 endpoints, seemingly Yakuma devices,
- * and we need the second pair, so let them have 2 ports
- *
- * TODO: can we drop port 1 ?
+ * A few devices have four endpoints, seemingly Yakuma devices, and
+ * we need the second pair.
*/
- if (serial->interface->cur_altsetting->desc.bNumEndpoints > 3) {
- ipaq_num_ports = 2;
+ if (epds->num_bulk_in > 1 && epds->num_bulk_out > 1) {
+ epds->bulk_in[0] = epds->bulk_in[1];
+ epds->bulk_out[0] = epds->bulk_out[1];
}
/*
- * Some of the devices in ipaq_id_table[] are composite, and we
- * shouldn't bind to all the interfaces. This test will rule out
- * some obviously invalid possibilities.
+ * Other devices have 3 endpoints, but we only use the first bulk in
+ * and out endpoints.
*/
- if (epds->num_bulk_in < ipaq_num_ports ||
- epds->num_bulk_out < ipaq_num_ports) {
- return -ENODEV;
- }
+ epds->num_bulk_in = 1;
+ epds->num_bulk_out = 1;
- return ipaq_num_ports;
+ return 1;
}
-
static int ipaq_startup(struct usb_serial *serial)
{
if (serial->dev->actconfig->desc.bConfigurationValue != 1) {
@@ -601,10 +594,6 @@ static int ipaq_startup(struct usb_serial *serial)
return -ENODEV;
}
- dev_dbg(&serial->dev->dev,
- "%s - iPAQ module configured for %d ports\n", __func__,
- serial->num_ports);
-
return usb_reset_configuration(serial->dev);
}