USB: serial: add calc_num_ports callback to generic driver
authorJohan Hovold <johan@kernel.org>
Thu, 16 Mar 2017 16:13:32 +0000 (17:13 +0100)
committerJohan Hovold <johan@kernel.org>
Tue, 28 Mar 2017 08:54:39 +0000 (10:54 +0200)
Add a calc_num_ports callback to the generic driver and verify that the
device has the required endpoints there instead of in core.

Note that the generic driver num_ports field was never used.

Signed-off-by: Johan Hovold <johan@kernel.org>
drivers/usb/serial/generic.c
drivers/usb/serial/usb-serial.c
include/linux/usb/serial.h

index 8c76004..2d3599f 100644 (file)
@@ -48,14 +48,28 @@ static int usb_serial_generic_probe(struct usb_serial *serial,
        return 0;
 }
 
-struct usb_serial_driver usb_serial_generic_device = {
+static int usb_serial_generic_calc_num_ports(struct usb_serial *serial,
+                                       struct usb_serial_endpoints *epds)
+{
+       struct device *dev = &serial->interface->dev;
+       int num_ports = epds->num_bulk_out;
+
+       if (num_ports == 0) {
+               dev_err(dev, "Generic device with no bulk out, not allowed.\n");
+               return -ENODEV;
+       }
+
+       return num_ports;
+}
+
+static struct usb_serial_driver usb_serial_generic_device = {
        .driver = {
                .owner =        THIS_MODULE,
                .name =         "generic",
        },
        .id_table =             generic_device_ids,
-       .num_ports =            1,
        .probe =                usb_serial_generic_probe,
+       .calc_num_ports =       usb_serial_generic_calc_num_ports,
        .throttle =             usb_serial_generic_throttle,
        .unthrottle =           usb_serial_generic_unthrottle,
        .resume =               usb_serial_generic_resume,
index f8ae09e..101eb10 100644 (file)
@@ -850,28 +850,17 @@ static int usb_serial_probe(struct usb_interface *interface,
                retval = -ENODEV;
                goto err_free_epds;
        }
-#ifdef CONFIG_USB_SERIAL_GENERIC
-       if (type == &usb_serial_generic_device) {
-               num_ports = epds->num_bulk_out;
-               if (num_ports == 0) {
-                       dev_err(ddev, "Generic device with no bulk out, not allowed.\n");
-                       retval = -EIO;
+
+       if (type->calc_num_ports) {
+               retval = type->calc_num_ports(serial, epds);
+               if (retval < 0)
                        goto err_free_epds;
-               }
-       }
-#endif
-       if (!num_ports) {
-               /* if this device type has a calc_num_ports function, call it */
-               if (type->calc_num_ports) {
-                       retval = type->calc_num_ports(serial, epds);
-                       if (retval < 0)
-                               goto err_free_epds;
-                       num_ports = retval;
-               }
-               if (!num_ports)
-                       num_ports = type->num_ports;
+               num_ports = retval;
        }
 
+       if (!num_ports)
+               num_ports = type->num_ports;
+
        if (num_ports > MAX_NUM_PORTS) {
                dev_warn(ddev, "too many ports requested: %d\n", num_ports);
                num_ports = MAX_NUM_PORTS;
index da52881..e2f0ab0 100644 (file)
@@ -379,7 +379,6 @@ extern void usb_serial_handle_dcd_change(struct usb_serial_port *usb_port,
 extern int usb_serial_bus_register(struct usb_serial_driver *device);
 extern void usb_serial_bus_deregister(struct usb_serial_driver *device);
 
-extern struct usb_serial_driver usb_serial_generic_device;
 extern struct bus_type usb_serial_bus_type;
 extern struct tty_driver *usb_serial_tty_driver;