]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/usb/serial/aircable.c
USB: serial: aircable: use calc_num_endpoints to verify endpoints
[karo-tx-linux.git] / drivers / usb / serial / aircable.c
index 80a9845cd93fba16e50ae7797606b7b9b925c887..569c2200ba42a915902385ed61f71bd8e0f124cc 100644 (file)
  * 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,