Use the calc_num_ports rather than probe callback to determine which
interface to bind to.

This allows us to remove some duplicate code.

Signed-off-by: Johan Hovold <[email protected]>
---
 drivers/usb/serial/aircable.c | 36 ++++++++----------------------------
 1 file changed, 8 insertions(+), 28 deletions(-)

diff --git a/drivers/usb/serial/aircable.c b/drivers/usb/serial/aircable.c
index 80a9845cd93f..569c2200ba42 100644
--- a/drivers/usb/serial/aircable.c
+++ b/drivers/usb/serial/aircable.c
@@ -29,12 +29,6 @@
  * is any other control code, I will simply check for the first
  * one.
  *
- * The driver registers himself with the USB-serial core and the USB Core. I 
had
- * to implement a probe function against USB-serial, because other way, the
- * driver was attaching himself to both interfaces. I have tried with different
- * configurations of usb_serial_driver with out exit, only the probe function
- * could handle this correctly.
- *
  * I have taken some info from a Greg Kroah-Hartman article:
  * http://www.linuxjournal.com/article/6573
  * And from Linux Device Driver Kit CD, which is a great work, the authors 
taken
@@ -93,30 +87,17 @@ static int aircable_prepare_write_buffer(struct 
usb_serial_port *port,
        return count + HCI_HEADER_LENGTH;
 }
 
-static int aircable_probe(struct usb_serial *serial,
-                         const struct usb_device_id *id)
+static int aircable_calc_num_ports(struct usb_serial *serial,
+                                       struct usb_serial_endpoints *epds)
 {
-       struct usb_host_interface *iface_desc = serial->interface->
-                                                               cur_altsetting;
-       struct usb_endpoint_descriptor *endpoint;
-       int num_bulk_out = 0;
-       int i;
-
-       for (i = 0; i < iface_desc->desc.bNumEndpoints; i++) {
-               endpoint = &iface_desc->endpoint[i].desc;
-               if (usb_endpoint_is_bulk_out(endpoint)) {
-                       dev_dbg(&serial->dev->dev,
-                               "found bulk out on endpoint %d\n", i);
-                       ++num_bulk_out;
-               }
-       }
-
-       if (num_bulk_out == 0) {
-               dev_dbg(&serial->dev->dev, "Invalid interface, discarding\n");
+       /* Ignore the first interface, which has no bulk endpoints. */
+       if (epds->num_bulk_out == 0) {
+               dev_dbg(&serial->interface->dev,
+                       "ignoring interface with no bulk-out endpoints\n");
                return -ENODEV;
        }
 
-       return 0;
+       return 1;
 }
 
 static int aircable_process_packet(struct usb_serial_port *port,
@@ -164,9 +145,8 @@ static struct usb_serial_driver aircable_device = {
                .name =         "aircable",
        },
        .id_table =             id_table,
-       .num_ports =            1,
        .bulk_out_size =        HCI_COMPLETE_FRAME,
-       .probe =                aircable_probe,
+       .calc_num_ports =       aircable_calc_num_ports,
        .process_read_urb =     aircable_process_read_urb,
        .prepare_write_buffer = aircable_prepare_write_buffer,
        .throttle =             usb_serial_generic_throttle,
-- 
2.12.0

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to