Browse Source

USB: serial: add calc_num_ports callback to generic driver

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>
Johan Hovold 8 years ago
parent
commit
a794499b26
3 changed files with 24 additions and 22 deletions
  1. 16 2
      drivers/usb/serial/generic.c
  2. 8 19
      drivers/usb/serial/usb-serial.c
  3. 0 1
      include/linux/usb/serial.h

+ 16 - 2
drivers/usb/serial/generic.c

@@ -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,

+ 8 - 19
drivers/usb/serial/usb-serial.c

@@ -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;

+ 0 - 1
include/linux/usb/serial.h

@@ -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;