* The f81534_calc_num_ports() will run to "new style" with checking
  * F81534_PORT_UNAVAILABLE section.
  */
-static int f81534_calc_num_ports(struct usb_serial *serial)
+static int f81534_calc_num_ports(struct usb_serial *serial,
+                                       struct usb_serial_endpoints *epds)
 {
        u8 setting[F81534_CUSTOM_DATA_SIZE];
        u8 setting_idx;
 
 /* Function prototypes for an ipaq */
 static int  ipaq_open(struct tty_struct *tty,
                        struct usb_serial_port *port);
-static int  ipaq_calc_num_ports(struct usb_serial *serial);
+static int ipaq_calc_num_ports(struct usb_serial *serial,
+                                       struct usb_serial_endpoints *epds);
 static int  ipaq_startup(struct usb_serial *serial);
 
 static const struct usb_device_id ipaq_id_table[] = {
        return usb_serial_generic_open(tty, port);
 }
 
-static int ipaq_calc_num_ports(struct usb_serial *serial)
+static int ipaq_calc_num_ports(struct usb_serial *serial,
+                                       struct usb_serial_endpoints *epds)
 {
        /*
         * some devices have 3 endpoints, the 3rd of which
 
                tty_port_tty_wakeup(&mos7720_port->port->port);
 }
 
-static int mos77xx_calc_num_ports(struct usb_serial *serial)
+static int mos77xx_calc_num_ports(struct usb_serial *serial,
+                                       struct usb_serial_endpoints *epds)
 {
        u16 product = le16_to_cpu(serial->dev->descriptor.idProduct);
        if (product == MOSCHIP_DEVICE_ID_7715)
 
        return 0;
 }
 
-static int mos7840_calc_num_ports(struct usb_serial *serial)
+static int mos7840_calc_num_ports(struct usb_serial *serial,
+                                       struct usb_serial_endpoints *epds)
 {
        int device_type = (unsigned long)usb_get_serial_data(serial);
        int mos7840_num_ports;
 
  * Determine how many ports this device has dynamically.  It will be
  * called after the probe() callback is called, but before attach().
  */
-static int mxuport_calc_num_ports(struct usb_serial *serial)
+static int mxuport_calc_num_ports(struct usb_serial *serial,
+                                       struct usb_serial_endpoints *epds)
 {
        unsigned long features = (unsigned long)usb_get_serial_data(serial);
 
 
        return status;
 }
 
-static int qt2_calc_num_ports(struct usb_serial *serial)
+static int qt2_calc_num_ports(struct usb_serial *serial,
+                                       struct usb_serial_endpoints *epds)
 {
        struct qt2_device_detail d;
        int i;
 
                        USB_CTRL_SET_TIMEOUT);          /* int timeout       */
 }
 
-static int sierra_calc_num_ports(struct usb_serial *serial)
+static int sierra_calc_num_ports(struct usb_serial *serial,
+                                       struct usb_serial_endpoints *epds)
 {
        int num_ports = 0;
        u8 ifnum, numendpoints;
 
        .shutdown               = serial_port_shutdown,
 };
 
-struct usb_serial_endpoints {
-       unsigned char num_bulk_in;
-       unsigned char num_bulk_out;
-       unsigned char num_interrupt_in;
-       unsigned char num_interrupt_out;
-       struct usb_endpoint_descriptor *bulk_in[MAX_NUM_PORTS];
-       struct usb_endpoint_descriptor *bulk_out[MAX_NUM_PORTS];
-       struct usb_endpoint_descriptor *interrupt_in[MAX_NUM_PORTS];
-       struct usb_endpoint_descriptor *interrupt_out[MAX_NUM_PORTS];
-};
-
 static void find_endpoints(struct usb_serial *serial,
                                        struct usb_serial_endpoints *epds)
 {
 #endif
        if (!num_ports) {
                /* if this device type has a calc_num_ports function, call it */
-               if (type->calc_num_ports)
-                       num_ports = type->calc_num_ports(serial);
+               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;
        }
 
 static void visor_close(struct usb_serial_port *port);
 static int  visor_probe(struct usb_serial *serial,
                                        const struct usb_device_id *id);
-static int  visor_calc_num_ports(struct usb_serial *serial);
+static int  visor_calc_num_ports(struct usb_serial *serial,
+                                       struct usb_serial_endpoints *epds);
 static void visor_read_int_callback(struct urb *urb);
 static int  clie_3_5_startup(struct usb_serial *serial);
 static int  treo_attach(struct usb_serial *serial);
        return retval;
 }
 
-static int visor_calc_num_ports(struct usb_serial *serial)
+static int visor_calc_num_ports(struct usb_serial *serial,
+                                       struct usb_serial_endpoints *epds)
 {
        int num_ports = (int)(long)(usb_get_serial_data(serial));
 
 
        serial->private = data;
 }
 
+struct usb_serial_endpoints {
+       unsigned char num_bulk_in;
+       unsigned char num_bulk_out;
+       unsigned char num_interrupt_in;
+       unsigned char num_interrupt_out;
+       struct usb_endpoint_descriptor *bulk_in[MAX_NUM_PORTS];
+       struct usb_endpoint_descriptor *bulk_out[MAX_NUM_PORTS];
+       struct usb_endpoint_descriptor *interrupt_in[MAX_NUM_PORTS];
+       struct usb_endpoint_descriptor *interrupt_out[MAX_NUM_PORTS];
+};
+
 /**
  * usb_serial_driver - describes a usb serial driver
  * @description: pointer to a string that describes this driver.  This string
  *     (0 = end-point size)
  * @bulk_out_size: bytes to allocate for bulk-out buffer (0 = end-point size)
  * @calc_num_ports: pointer to a function to determine how many ports this
- *     device has dynamically.  It will be called after the probe()
- *     callback is called, but before attach()
+ *     device has dynamically. It can also be used to verify the number of
+ *     endpoints or to modify the port-endpoint mapping. It will be called
+ *     after the probe() callback is called, but before attach().
  * @probe: pointer to the driver's probe function.
  *     This will be called when the device is inserted into the system,
  *     but before the device has been fully initialized by the usb_serial
 
        int (*probe)(struct usb_serial *serial, const struct usb_device_id *id);
        int (*attach)(struct usb_serial *serial);
-       int (*calc_num_ports) (struct usb_serial *serial);
+       int (*calc_num_ports)(struct usb_serial *serial,
+                       struct usb_serial_endpoints *epds);
 
        void (*disconnect)(struct usb_serial *serial);
        void (*release)(struct usb_serial *serial);