diff options
| author | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2013-06-04 12:18:43 -0700 |
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2013-06-04 12:18:43 -0700 |
| commit | 9d1ca649d928664fff454e439d07d6eb3633bb40 (patch) | |
| tree | 58ae5d121d4b9960184762c86ccbdd4bb07041f1 | |
| parent | 9efefbb8951374b0381d1f8408f4fdf76b82e238 (diff) | |
| download | patches-9d1ca649d928664fff454e439d07d6eb3633bb40.tar.gz | |
delete driver-core-export-subsys_virtual_register.patch and add two
usb-serial patches
| -rw-r--r-- | driver-core-export-subsys_virtual_register.patch | 27 | ||||
| -rw-r--r-- | series | 3 | ||||
| -rw-r--r-- | usb-serial-idr.patch | 210 | ||||
| -rw-r--r-- | usb-serial-ports-add-minor-and-port-number.patch | 1178 |
4 files changed, 1390 insertions, 28 deletions
diff --git a/driver-core-export-subsys_virtual_register.patch b/driver-core-export-subsys_virtual_register.patch deleted file mode 100644 index b7cf60597da66b..00000000000000 --- a/driver-core-export-subsys_virtual_register.patch +++ /dev/null @@ -1,27 +0,0 @@ -From foo@baz Fri May 10 09:10:24 PDT 2013 -Date: Fri, 10 May 2013 09:10:24 -0700 -To: Greg KH <gregkh@linuxfoundation.org> -From: Greg Kroah-Hartman <gregkh@linuxfoundation.org> -Subject: [PATCH] driver core: export subsys_virtual_register - -Modules want to call this function, so it needs to be exported. - -Reported-by: Daniel Mack <zonque@gmail.com> -Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> -Cc: Tejun Heo <tj@kernel.org> -Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> - ---- - drivers/base/bus.c | 1 + - 1 file changed, 1 insertion(+) - ---- a/drivers/base/bus.c -+++ b/drivers/base/bus.c -@@ -1295,6 +1295,7 @@ int subsys_virtual_register(struct bus_t - - return subsys_register(subsys, groups, virtual_dir); - } -+EXPORT_SYMBOL_GPL(subsys_virtual_register); - - int __init buses_init(void) - { @@ -1,5 +1,6 @@ # My specific stuff, at the top to make it easier to work stuff below. -driver-core-export-subsys_virtual_register.patch +usb-serial-ports-add-minor-and-port-number.patch +usb-serial-idr.patch 0001-Simulate-fake-Fn-key-on-PS-2-keyboards-w-o-one-eg.-C.patch devnode_gid.patch 0001-kdbus-interprocess-message-router.patch diff --git a/usb-serial-idr.patch b/usb-serial-idr.patch new file mode 100644 index 00000000000000..91dbc029c50629 --- /dev/null +++ b/usb-serial-idr.patch @@ -0,0 +1,210 @@ +From foo@baz Tue Jun 4 12:06:11 PDT 2013 +Date: Tue, 04 Jun 2013 12:06:11 -0700 +To: Greg KH <gregkh@linuxfoundation.org> +From: Greg Kroah-Hartman <gregkh@linuxfoundation.org> +Subject: [PATCH 2/2] USB: serial: make minor allocation dynamic + +This moves the allocation of minor device numbers from a static array to +be dynamic, using the idr interface. This means that you could +potentially get "gaps" in a minor number range for a single USB serial +device with multiple ports, but all should still work properly. + +Note, we still have the limitation of 255 USB to serial devices in the +system, as that is all we are registering with the TTY layer at this +point in time. + +Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> + +--- + drivers/usb/serial/usb-serial.c | 97 ++++++++++++++++++++-------------------- + include/linux/usb/serial.h | 4 - + 2 files changed, 51 insertions(+), 50 deletions(-) + +--- a/drivers/usb/serial/usb-serial.c ++++ b/drivers/usb/serial/usb-serial.c +@@ -37,6 +37,7 @@ + #include <linux/usb.h> + #include <linux/usb/serial.h> + #include <linux/kfifo.h> ++#include <linux/idr.h> + #include "pl2303.h" + + #define DRIVER_AUTHOR "Greg Kroah-Hartman <gregkh@linuxfoundation.org>" +@@ -49,7 +50,7 @@ + drivers depend on it. + */ + +-static struct usb_serial *serial_table[SERIAL_TTY_MINORS]; ++static DEFINE_IDR(serial_minors); + static DEFINE_MUTEX(table_lock); + static LIST_HEAD(usb_serial_driver_list); + +@@ -60,61 +61,65 @@ static LIST_HEAD(usb_serial_driver_list) + */ + struct usb_serial *usb_serial_get_by_index(unsigned index) + { +- struct usb_serial *serial; ++ struct usb_serial *serial = NULL; ++ struct usb_serial_port *port; + + mutex_lock(&table_lock); +- serial = serial_table[index]; ++ port = idr_find(&serial_minors, index); ++ if (!port) ++ goto exit; + +- if (serial) { +- mutex_lock(&serial->disc_mutex); +- if (serial->disconnected) { +- mutex_unlock(&serial->disc_mutex); +- serial = NULL; +- } else { +- kref_get(&serial->kref); +- } ++ serial = port->serial; ++ mutex_lock(&serial->disc_mutex); ++ if (serial->disconnected) { ++ mutex_unlock(&serial->disc_mutex); ++ serial = NULL; ++ } else { ++ kref_get(&serial->kref); + } + mutex_unlock(&table_lock); ++exit: + return serial; + } + +-static struct usb_serial *get_free_serial(struct usb_serial *serial, +- int num_ports, unsigned int *minor) ++static int get_free_port(struct usb_serial_port *port) + { +- unsigned int i, j; +- int good_spot; +- +- dev_dbg(&serial->interface->dev, "%s %d\n", __func__, num_ports); ++ int i; + +- *minor = 0; + mutex_lock(&table_lock); +- for (i = 0; i < SERIAL_TTY_MINORS; ++i) { +- if (serial_table[i]) +- continue; ++ i = idr_alloc(&serial_minors, port, 0, 0, GFP_KERNEL); ++ if (i < 0) ++ goto exit; ++ port->minor = i; ++exit: ++ mutex_unlock(&table_lock); ++ return i; ++} + +- good_spot = 1; +- for (j = 1; j <= num_ports-1; ++j) +- if ((i+j >= SERIAL_TTY_MINORS) || (serial_table[i+j])) { +- good_spot = 0; +- i += j; +- break; +- } +- if (good_spot == 0) +- continue; ++static int get_free_serial(struct usb_serial *serial, int num_ports, ++ unsigned int *minor) ++{ ++ unsigned int i; ++ unsigned int j; ++ int x; + +- *minor = i; +- j = 0; +- dev_dbg(&serial->interface->dev, "%s - minor base = %d\n", __func__, *minor); +- for (i = *minor; (i < (*minor + num_ports)) && (i < SERIAL_TTY_MINORS); ++i, ++j) { +- serial_table[i] = serial; +- serial->port[j]->minor = i; +- serial->port[j]->port_number = i - *minor; +- } +- mutex_unlock(&table_lock); +- return serial; ++ dev_dbg(&serial->interface->dev, "%s %d\n", __func__, num_ports); ++ ++ *minor = 0xffffffff; ++ for (i = 0; i < num_ports; ++i) { ++ x = get_free_port(serial->port[i]); ++ if (x < 0) ++ goto error; ++ if (*minor == 0xffffffff) ++ *minor = x; ++ serial->port[i]->port_number = i; + } +- mutex_unlock(&table_lock); +- return NULL; ++ return 0; ++error: ++ /* unwind the already allocated minors */ ++ for (j = 0; j < i; ++j) ++ idr_remove(&serial_minors, serial->port[j]->port_number); ++ return x; + } + + static void return_serial(struct usb_serial *serial) +@@ -123,7 +128,7 @@ static void return_serial(struct usb_ser + + mutex_lock(&table_lock); + for (i = 0; i < serial->num_ports; ++i) +- serial_table[serial->minor + i] = NULL; ++ idr_remove(&serial_minors, serial->port[i]->port_number); + mutex_unlock(&table_lock); + } + +@@ -1042,7 +1047,7 @@ static int usb_serial_probe(struct usb_i + */ + serial->disconnected = 1; + +- if (get_free_serial(serial, num_ports, &minor) == NULL) { ++ if (get_free_serial(serial, num_ports, &minor)) { + dev_err(ddev, "No more free serial devices\n"); + goto probe_error; + } +@@ -1226,7 +1231,6 @@ static struct usb_driver usb_serial_driv + + static int __init usb_serial_init(void) + { +- int i; + int result; + + usb_serial_tty_driver = alloc_tty_driver(SERIAL_TTY_MINORS); +@@ -1234,9 +1238,6 @@ static int __init usb_serial_init(void) + return -ENOMEM; + + /* Initialize our global data */ +- for (i = 0; i < SERIAL_TTY_MINORS; ++i) +- serial_table[i] = NULL; +- + result = bus_register(&usb_serial_bus_type); + if (result) { + pr_err("%s - registering bus driver failed\n", __func__); +--- a/include/linux/usb/serial.h ++++ b/include/linux/usb/serial.h +@@ -21,7 +21,7 @@ + + #define SERIAL_TTY_MAJOR 188 /* Nice legal number now */ + #define SERIAL_TTY_MINORS 254 /* loads of devices :) */ +-#define SERIAL_TTY_NO_MINOR 255 /* No minor was assigned */ ++#define SERIAL_TTY_NO_MINOR 0xffffffff /* No minor was assigned */ + + /* The maximum number of ports one device can grab at once */ + #define MAX_NUM_PORTS 8 +@@ -161,13 +161,13 @@ struct usb_serial { + unsigned char disconnected:1; + unsigned char suspending:1; + unsigned char attached:1; +- unsigned char minor; + unsigned char num_ports; + unsigned char num_port_pointers; + char num_interrupt_in; + char num_interrupt_out; + char num_bulk_in; + char num_bulk_out; ++ u32 minor; + struct usb_serial_port *port[MAX_NUM_PORTS]; + struct kref kref; + struct mutex disc_mutex; diff --git a/usb-serial-ports-add-minor-and-port-number.patch b/usb-serial-ports-add-minor-and-port-number.patch new file mode 100644 index 00000000000000..bb2dc17c7f4230 --- /dev/null +++ b/usb-serial-ports-add-minor-and-port-number.patch @@ -0,0 +1,1178 @@ +From foo@baz Tue Jun 4 11:51:13 PDT 2013 +Date: Tue, 04 Jun 2013 11:51:13 -0700 +To: Greg KH <gregkh@linuxfoundation.org> +From: Greg Kroah-Hartman <gregkh@linuxfoundation.org> +Subject: [PATCH 1/2] USB: serial: ports: add minor and port number + +The usb_serial_port structure had the number field, which was the minor +number for the port, which almost no one really cared about. They +really wanted the number of the port within the device, which you had to +subtract from the minor of the parent usb_serial_device structure. To +clean this up, provide the real minor number of the port, and the number +of the port within the serial device separately, as these numbers might +not be related in the future. + +Bonus is that this cleans up a lot of logic in the drivers, and saves +lines overall. + +Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> + +-- + drivers/staging/serqt_usb2/serqt_usb2.c | 21 +++-------- + drivers/usb/serial/ark3116.c | 2 - + drivers/usb/serial/bus.c | 6 +-- + drivers/usb/serial/console.c | 2 - + drivers/usb/serial/cp210x.c | 2 - + drivers/usb/serial/cypress_m8.c | 4 +- + drivers/usb/serial/digi_acceleport.c | 6 --- + drivers/usb/serial/f81232.c | 5 +- + drivers/usb/serial/garmin_gps.c | 6 +-- + drivers/usb/serial/io_edgeport.c | 60 ++++++++++++-------------------- + drivers/usb/serial/io_ti.c | 21 ++++------- + drivers/usb/serial/keyspan.c | 31 +++++++--------- + drivers/usb/serial/metro-usb.c | 4 +- + drivers/usb/serial/mos7720.c | 39 ++++++++++---------- + drivers/usb/serial/mos7840.c | 52 +++++++++------------------ + drivers/usb/serial/opticon.c | 2 - + drivers/usb/serial/pl2303.c | 2 - + drivers/usb/serial/quatech2.c | 7 +-- + drivers/usb/serial/sierra.c | 2 - + drivers/usb/serial/ti_usb_3410_5052.c | 10 ++--- + drivers/usb/serial/usb-serial.c | 7 ++- + drivers/usb/serial/usb_wwan.c | 2 - + drivers/usb/serial/whiteheat.c | 20 +++++----- + drivers/usb/serial/zte_ev.c | 4 +- + include/linux/usb/serial.h | 6 ++- + 25 files changed, 138 insertions(+), 185 deletions(-) + +--- a/drivers/staging/serqt_usb2/serqt_usb2.c ++++ b/drivers/staging/serqt_usb2/serqt_usb2.c +@@ -873,7 +873,7 @@ static int qt_open(struct tty_struct *tt + result = qt_get_device(serial, &port0->DeviceData); + + /* Port specific setups */ +- result = qt_open_channel(serial, port->number, &ChannelData); ++ result = qt_open_channel(serial, port->port_number, &ChannelData); + if (result < 0) { + dev_dbg(&port->dev, "qt_open_channel failed\n"); + return result; +@@ -888,7 +888,7 @@ static int qt_open(struct tty_struct *tt + (SERIAL_MSR_CTS | SERIAL_MSR_DSR | SERIAL_MSR_RI | SERIAL_MSR_CD); + + /* Set Baud rate to default and turn off (default)flow control here */ +- result = qt_setuart(serial, port->number, DEFAULT_DIVISOR, DEFAULT_LCR); ++ result = qt_setuart(serial, port->port_number, DEFAULT_DIVISOR, DEFAULT_LCR); + if (result < 0) { + dev_dbg(&port->dev, "qt_setuart failed\n"); + return result; +@@ -906,7 +906,6 @@ static int qt_open(struct tty_struct *tt + qt_submit_urb_from_open(serial, port); + } + +- dev_dbg(&port->dev, "port number is %d\n", port->number); + dev_dbg(&port->dev, "serial number is %d\n", port->serial->minor); + dev_dbg(&port->dev, + "Bulkin endpoint is %d\n", port->bulk_in_endpointAddress); +@@ -1022,14 +1021,11 @@ static void qt_close(struct usb_serial_p + /* Close uart channel */ + status = qt_close_channel(serial, index); + if (status < 0) +- dev_dbg(&port->dev, +- "%s - port %d qt_close_channel failed.\n", +- __func__, port->number); ++ dev_dbg(&port->dev, "%s - qt_close_channel failed.\n", __func__); + + port0->open_ports--; + +- dev_dbg(&port->dev, "qt_num_open_ports in close%d:in port%d\n", +- port0->open_ports, port->number); ++ dev_dbg(&port->dev, "qt_num_open_ports in close%d\n", port0->open_ports); + + if (port0->open_ports == 0) { + if (serial->port[0]->interrupt_in_urb) { +@@ -1169,8 +1165,7 @@ static int qt_ioctl(struct tty_struct *t + return 0; + } + +- dev_dbg(&port->dev, "%s -No ioctl for that one. port = %d\n", +- __func__, port->number); ++ dev_dbg(&port->dev, "%s -No ioctl for that one.\n", __func__); + return -ENOIOCTLCMD; + } + +@@ -1245,8 +1240,7 @@ static void qt_set_termios(struct tty_st + + /* Now determine flow control */ + if (cflag & CRTSCTS) { +- dev_dbg(&port->dev, "%s - Enabling HW flow control port %d\n", +- __func__, port->number); ++ dev_dbg(&port->dev, "%s - Enabling HW flow control\n", __func__); + + /* Enable RTS/CTS flow control */ + status = BoxSetHW_FlowCtrl(port->serial, index, 1); +@@ -1258,8 +1252,7 @@ static void qt_set_termios(struct tty_st + } else { + /* Disable RTS/CTS flow control */ + dev_dbg(&port->dev, +- "%s - disabling HW flow control port %d\n", +- __func__, port->number); ++ "%s - disabling HW flow control\n", __func__); + + status = BoxSetHW_FlowCtrl(port->serial, index, 0); + if (status < 0) { +--- a/drivers/usb/serial/ark3116.c ++++ b/drivers/usb/serial/ark3116.c +@@ -414,7 +414,7 @@ static int ark3116_ioctl(struct tty_stru + memset(&serstruct, 0, sizeof(serstruct)); + serstruct.type = PORT_16654; + serstruct.line = port->serial->minor; +- serstruct.port = port->number; ++ serstruct.port = port->port_number; + serstruct.custom_divisor = 0; + serstruct.baud_base = 460800; + +--- a/drivers/usb/serial/bus.c ++++ b/drivers/usb/serial/bus.c +@@ -43,7 +43,7 @@ static ssize_t show_port_number(struct d + { + struct usb_serial_port *port = to_usb_serial_port(dev); + +- return sprintf(buf, "%d\n", port->number - port->serial->minor); ++ return sprintf(buf, "%d\n", port->port_number); + } + + static DEVICE_ATTR(port_number, S_IRUGO, show_port_number, NULL); +@@ -80,7 +80,7 @@ static int usb_serial_device_probe(struc + goto exit_with_autopm; + } + +- minor = port->number; ++ minor = port->minor; + tty_register_device(usb_serial_tty_driver, minor, dev); + dev_info(&port->serial->dev->dev, + "%s converter now attached to ttyUSB%d\n", +@@ -106,7 +106,7 @@ static int usb_serial_device_remove(stru + /* make sure suspend/resume doesn't race against port_remove */ + usb_autopm_get_interface(port->serial->interface); + +- minor = port->number; ++ minor = port->minor; + tty_unregister_device(usb_serial_tty_driver, minor); + + device_remove_file(&port->dev, &dev_attr_port_number); +--- a/drivers/usb/serial/console.c ++++ b/drivers/usb/serial/console.c +@@ -210,7 +210,7 @@ static void usb_console_write(struct con + if (count == 0) + return; + +- pr_debug("%s - port %d, %d byte(s)\n", __func__, port->number, count); ++ pr_debug("%s - minor %d, %d byte(s)\n", __func__, port->minor, count); + + if (!port->port.console) { + pr_debug("%s - port not opened\n", __func__); +--- a/drivers/usb/serial/cp210x.c ++++ b/drivers/usb/serial/cp210x.c +@@ -666,8 +666,6 @@ static void cp210x_set_termios(struct tt + unsigned int bits; + unsigned int modem_ctl[4]; + +- dev_dbg(dev, "%s - port %d\n", __func__, port->number); +- + if (!tty) + return; + +--- a/drivers/usb/serial/cypress_m8.c ++++ b/drivers/usb/serial/cypress_m8.c +@@ -423,7 +423,7 @@ static void cypress_set_dead(struct usb_ + spin_unlock_irqrestore(&priv->lock, flags); + + dev_err(&port->dev, "cypress_m8 suspending failing port %d - " +- "interval might be too short\n", port->number); ++ "interval might be too short\n", port->port_number); + } + + +@@ -651,7 +651,7 @@ static int cypress_write(struct tty_stru + { + struct cypress_private *priv = usb_get_serial_port_data(port); + +- dev_dbg(&port->dev, "%s - port %d, %d bytes\n", __func__, port->number, count); ++ dev_dbg(&port->dev, "%s - %d bytes\n", __func__, count); + + /* line control commands, which need to be executed immediately, + are not put into the buffer for obvious reasons. +--- a/drivers/usb/serial/digi_acceleport.c ++++ b/drivers/usb/serial/digi_acceleport.c +@@ -1304,11 +1304,7 @@ static void digi_release(struct usb_seri + + static int digi_port_probe(struct usb_serial_port *port) + { +- unsigned port_num; +- +- port_num = port->number - port->serial->minor; +- +- return digi_port_init(port, port_num); ++ return digi_port_init(port, port->port_number); + } + + static int digi_port_remove(struct usb_serial_port *port) +--- a/drivers/usb/serial/f81232.c ++++ b/drivers/usb/serial/f81232.c +@@ -288,15 +288,14 @@ static int f81232_ioctl(struct tty_struc + struct serial_struct ser; + struct usb_serial_port *port = tty->driver_data; + +- dev_dbg(&port->dev, "%s (%d) cmd = 0x%04x\n", __func__, +- port->number, cmd); ++ dev_dbg(&port->dev, "%s cmd = 0x%04x\n", __func__, cmd); + + switch (cmd) { + case TIOCGSERIAL: + memset(&ser, 0, sizeof ser); + ser.type = PORT_16654; + ser.line = port->serial->minor; +- ser.port = port->number; ++ ser.port = port->port_number; + ser.baud_base = 460800; + + if (copy_to_user((void __user *)arg, &ser, sizeof ser)) +--- a/drivers/usb/serial/garmin_gps.c ++++ b/drivers/usb/serial/garmin_gps.c +@@ -948,9 +948,9 @@ static void garmin_close(struct usb_seri + { + struct garmin_data *garmin_data_p = usb_get_serial_port_data(port); + +- dev_dbg(&port->dev, "%s - port %d - mode=%d state=%d flags=0x%X\n", +- __func__, port->number, garmin_data_p->mode, +- garmin_data_p->state, garmin_data_p->flags); ++ dev_dbg(&port->dev, "%s - mode=%d state=%d flags=0x%X\n", ++ __func__, garmin_data_p->mode, garmin_data_p->state, ++ garmin_data_p->flags); + + garmin_clear(garmin_data_p); + +--- a/drivers/usb/serial/io_edgeport.c ++++ b/drivers/usb/serial/io_edgeport.c +@@ -915,8 +915,8 @@ static int edge_open(struct tty_struct * + return -ENOMEM; + } + +- dev_dbg(dev, "%s(%d) - Initialize TX fifo to %d bytes\n", +- __func__, port->number, edge_port->maxTxCredits); ++ dev_dbg(dev, "%s - Initialize TX fifo to %d bytes\n", ++ __func__, edge_port->maxTxCredits); + + return 0; + } +@@ -1122,9 +1122,8 @@ static int edge_write(struct tty_struct + copySize = min((unsigned int)count, + (edge_port->txCredits - fifo->count)); + +- dev_dbg(&port->dev, "%s(%d) of %d byte(s) Fifo room %d -- will copy %d bytes\n", +- __func__, port->number, count, +- edge_port->txCredits - fifo->count, copySize); ++ dev_dbg(&port->dev, "%s of %d byte(s) Fifo room %d -- will copy %d bytes\n", ++ __func__, count, edge_port->txCredits - fifo->count, copySize); + + /* catch writes of 0 bytes which the tty driver likes to give us, + and when txCredits is empty */ +@@ -1216,9 +1215,8 @@ static void send_more_port_data(struct e + if (edge_port->write_in_progress || + !edge_port->open || + (fifo->count == 0)) { +- dev_dbg(dev, "%s(%d) EXIT - fifo %d, PendingWrite = %d\n", +- __func__, edge_port->port->number, +- fifo->count, edge_port->write_in_progress); ++ dev_dbg(dev, "%s EXIT - fifo %d, PendingWrite = %d\n", ++ __func__, fifo->count, edge_port->write_in_progress); + goto exit_send; + } + +@@ -1230,9 +1228,8 @@ static void send_more_port_data(struct e + * it's better to wait for more credits so we can do a larger write. + */ + if (edge_port->txCredits < EDGE_FW_GET_TX_CREDITS_SEND_THRESHOLD(edge_port->maxTxCredits, EDGE_FW_BULK_MAX_PACKET_SIZE)) { +- dev_dbg(dev, "%s(%d) Not enough credit - fifo %d TxCredit %d\n", +- __func__, edge_port->port->number, fifo->count, +- edge_port->txCredits); ++ dev_dbg(dev, "%s Not enough credit - fifo %d TxCredit %d\n", ++ __func__, fifo->count, edge_port->txCredits); + goto exit_send; + } + +@@ -1256,10 +1253,8 @@ static void send_more_port_data(struct e + edge_port->write_in_progress = false; + goto exit_send; + } +- buffer[0] = IOSP_BUILD_DATA_HDR1(edge_port->port->number +- - edge_port->port->serial->minor, count); +- buffer[1] = IOSP_BUILD_DATA_HDR2(edge_port->port->number +- - edge_port->port->serial->minor, count); ++ buffer[0] = IOSP_BUILD_DATA_HDR1(edge_port->port->port_number, count); ++ buffer[1] = IOSP_BUILD_DATA_HDR2(edge_port->port->port_number, count); + + /* now copy our data */ + bytesleft = fifo->size - fifo->tail; +@@ -1377,8 +1372,7 @@ static int edge_chars_in_buffer(struct t + edge_port->txfifo.count; + spin_unlock_irqrestore(&edge_port->ep_lock, flags); + if (num_chars) { +- dev_dbg(&port->dev, "%s(port %d) - returns %d\n", __func__, +- port->number, num_chars); ++ dev_dbg(&port->dev, "%s - returns %d\n", __func__, num_chars); + } + + return num_chars; +@@ -1576,7 +1570,7 @@ static int get_serial_info(struct edgepo + + tmp.type = PORT_16550A; + tmp.line = edge_port->port->serial->minor; +- tmp.port = edge_port->port->number; ++ tmp.port = edge_port->port->port_number; + tmp.irq = 0; + tmp.flags = ASYNC_SKIP_TEST | ASYNC_AUTO_IRQ; + tmp.xmit_fifo_size = edge_port->maxTxCredits; +@@ -1601,15 +1595,15 @@ static int edge_ioctl(struct tty_struct + DEFINE_WAIT(wait); + struct edgeport_port *edge_port = usb_get_serial_port_data(port); + +- dev_dbg(&port->dev, "%s - port %d, cmd = 0x%x\n", __func__, port->number, cmd); ++ dev_dbg(&port->dev, "%s - cmd = 0x%x\n", __func__, cmd); + + switch (cmd) { + case TIOCSERGETLSR: +- dev_dbg(&port->dev, "%s (%d) TIOCSERGETLSR\n", __func__, port->number); ++ dev_dbg(&port->dev, "%s TIOCSERGETLSR\n", __func__); + return get_lsr_info(edge_port, (unsigned int __user *) arg); + + case TIOCGSERIAL: +- dev_dbg(&port->dev, "%s (%d) TIOCGSERIAL\n", __func__, port->number); ++ dev_dbg(&port->dev, "%s TIOCGSERIAL\n", __func__); + return get_serial_info(edge_port, (struct serial_struct __user *) arg); + } + return -ENOIOCTLCMD; +@@ -2181,9 +2175,8 @@ static int send_iosp_ext_cmd(struct edge + + currentCommand = buffer; + +- MAKE_CMD_EXT_CMD(¤tCommand, &length, +- edge_port->port->number - edge_port->port->serial->minor, +- command, param); ++ MAKE_CMD_EXT_CMD(¤tCommand, &length, edge_port->port->port_number, ++ command, param); + + status = write_cmd_usb(edge_port, buffer, length); + if (status) { +@@ -2266,18 +2259,16 @@ static int send_cmd_write_baud_rate(stru + int cmdLen = 0; + int divisor; + int status; +- unsigned char number = +- edge_port->port->number - edge_port->port->serial->minor; ++ u32 number = edge_port->port->port_number; + + if (edge_serial->is_epic && + !edge_serial->epic_descriptor.Supports.IOSPSetBaudRate) { +- dev_dbg(dev, "SendCmdWriteBaudRate - NOT Setting baud rate for port = %d, baud = %d\n", +- edge_port->port->number, baudRate); ++ dev_dbg(dev, "SendCmdWriteBaudRate - NOT Setting baud rate for port, baud = %d\n", ++ baudRate); + return 0; + } + +- dev_dbg(dev, "%s - port = %d, baud = %d\n", __func__, +- edge_port->port->number, baudRate); ++ dev_dbg(dev, "%s - baud = %d\n", __func__, baudRate); + + status = calc_baud_rate_divisor(dev, baudRate, &divisor); + if (status) { +@@ -2302,7 +2293,7 @@ static int send_cmd_write_baud_rate(stru + + /* Restore original value to disable access to divisor latch */ + MAKE_CMD_WRITE_REG(&currCmd, &cmdLen, number, LCR, +- edge_port->shadowLCR); ++ edge_port->shadowLCR); + + status = write_cmd_usb(edge_port, cmdBuffer, cmdLen); + if (status) { +@@ -2388,9 +2379,8 @@ static int send_cmd_write_uart_register( + currCmd = cmdBuffer; + + /* Build a cmd in the buffer to write the given register */ +- MAKE_CMD_WRITE_REG(&currCmd, &cmdLen, +- edge_port->port->number - edge_port->port->serial->minor, +- regNum, regValue); ++ MAKE_CMD_WRITE_REG(&currCmd, &cmdLen, edge_port->port->port_number, ++ regNum, regValue); + + status = write_cmd_usb(edge_port, cmdBuffer, cmdLen); + if (status) { +@@ -2424,8 +2414,6 @@ static void change_port_settings(struct + __u8 txFlow; + int status; + +- dev_dbg(dev, "%s - port %d\n", __func__, edge_port->port->number); +- + if (!edge_port->open && + !edge_port->openPending) { + dev_dbg(dev, "%s - port not opened\n", __func__); +--- a/drivers/usb/serial/io_ti.c ++++ b/drivers/usb/serial/io_ti.c +@@ -259,7 +259,7 @@ static int send_cmd(struct usb_device *d + /* clear tx/rx buffers and fifo in TI UMP */ + static int purge_port(struct usb_serial_port *port, __u16 mask) + { +- int port_number = port->number - port->serial->minor; ++ int port_number = port->port_number; + + dev_dbg(&port->dev, "%s - port %d, mask %x\n", __func__, port_number, mask); + +@@ -1392,7 +1392,8 @@ stayinbootmode: + + static int ti_do_config(struct edgeport_port *port, int feature, int on) + { +- int port_number = port->port->number - port->port->serial->minor; ++ int port_number = port->port->port_number; ++ + on = !!on; /* 1 or 0 not bitmask */ + return send_cmd(port->port->serial->dev, + feature, (__u8)(UMPM_UART1_PORT + port_number), +@@ -1637,7 +1638,7 @@ static void edge_bulk_in_callback(struct + return; + } + +- port_number = edge_port->port->number - edge_port->port->serial->minor; ++ port_number = edge_port->port->port_number; + + if (edge_port->lsr_event) { + edge_port->lsr_event = 0; +@@ -1730,7 +1731,7 @@ static int edge_open(struct tty_struct * + if (edge_port == NULL) + return -ENODEV; + +- port_number = port->number - port->serial->minor; ++ port_number = port->port_number; + switch (port_number) { + case 0: + edge_port->uart_base = UMPMEM_BASE_UART1; +@@ -1908,7 +1909,7 @@ static void edge_close(struct usb_serial + spin_unlock_irqrestore(&edge_port->ep_lock, flags); + + dev_dbg(&port->dev, "%s - send umpc_close_port\n", __func__); +- port_number = port->number - port->serial->minor; ++ port_number = port->port_number; + send_cmd(serial->dev, UMPC_CLOSE_PORT, + (__u8)(UMPM_UART1_PORT + port_number), 0, NULL, 0); + +@@ -2137,10 +2138,7 @@ static void change_port_settings(struct + int baud; + unsigned cflag; + int status; +- int port_number = edge_port->port->number - +- edge_port->port->serial->minor; +- +- dev_dbg(dev, "%s - port %d\n", __func__, edge_port->port->number); ++ int port_number = edge_port->port->port_number; + + config = kmalloc (sizeof (*config), GFP_KERNEL); + if (!config) { +@@ -2284,7 +2282,6 @@ static void edge_set_termios(struct tty_ + tty->termios.c_cflag, tty->termios.c_iflag); + dev_dbg(&port->dev, "%s - old clfag %08x old iflag %08x\n", __func__, + old_termios->c_cflag, old_termios->c_iflag); +- dev_dbg(&port->dev, "%s - port %d\n", __func__, port->number); + + if (edge_port == NULL) + return; +@@ -2367,7 +2364,7 @@ static int get_serial_info(struct edgepo + + tmp.type = PORT_16550A; + tmp.line = edge_port->port->serial->minor; +- tmp.port = edge_port->port->number; ++ tmp.port = edge_port->port->port_number; + tmp.irq = 0; + tmp.flags = ASYNC_SKIP_TEST | ASYNC_AUTO_IRQ; + tmp.xmit_fifo_size = edge_port->port->bulk_out_size; +@@ -2386,7 +2383,7 @@ static int edge_ioctl(struct tty_struct + struct usb_serial_port *port = tty->driver_data; + struct edgeport_port *edge_port = usb_get_serial_port_data(port); + +- dev_dbg(&port->dev, "%s - port %d, cmd = 0x%x\n", __func__, port->number, cmd); ++ dev_dbg(&port->dev, "%s - cmd = 0x%x\n", __func__, cmd); + + switch (cmd) { + case TIOCGSERIAL: +--- a/drivers/usb/serial/keyspan.c ++++ b/drivers/usb/serial/keyspan.c +@@ -152,7 +152,7 @@ static void keyspan_set_termios(struct t + p_priv = usb_get_serial_port_data(port); + d_details = p_priv->device_details; + cflag = tty->termios.c_cflag; +- device_port = port->number - port->serial->minor; ++ device_port = port->port_number; + + /* Baud rate calculation takes baud rate as an integer + so other rates can be generated if desired. */ +@@ -234,8 +234,8 @@ static int keyspan_write(struct tty_stru + dataOffset = 1; + } + +- dev_dbg(&port->dev, "%s - for port %d (%d chars), flip=%d\n", +- __func__, port->number, count, p_priv->out_flip); ++ dev_dbg(&port->dev, "%s - %d chars, flip=%d\n", __func__, count, ++ p_priv->out_flip); + + for (left = count; left > 0; left -= todo) { + todo = left; +@@ -1050,7 +1050,7 @@ static int keyspan_open(struct tty_struc + /* get the terminal config for the setup message now so we don't + * need to send 2 of them */ + +- device_port = port->number - port->serial->minor; ++ device_port = port->port_number; + if (tty) { + cflag = tty->termios.c_cflag; + /* Baud rate calculation takes baud rate as an integer +@@ -1557,9 +1557,9 @@ static int keyspan_usa26_send_setup(stru + s_priv = usb_get_serial_data(serial); + p_priv = usb_get_serial_port_data(port); + d_details = s_priv->device_details; +- device_port = port->number - port->serial->minor; ++ device_port = port->port_number; + +- outcont_urb = d_details->outcont_endpoints[port->number]; ++ outcont_urb = d_details->outcont_endpoints[device_port]; + this_urb = p_priv->outcont_urb; + + dev_dbg(&port->dev, "%s - endpoint %d\n", __func__, usb_pipeendpoint(this_urb->pipe)); +@@ -1710,7 +1710,7 @@ static int keyspan_usa28_send_setup(stru + s_priv = usb_get_serial_data(serial); + p_priv = usb_get_serial_port_data(port); + d_details = s_priv->device_details; +- device_port = port->number - port->serial->minor; ++ device_port = port->port_number; + + /* only do something if we have a bulk out endpoint */ + this_urb = p_priv->outcont_urb; +@@ -1840,17 +1840,16 @@ static int keyspan_usa49_send_setup(stru + this_urb = s_priv->glocont_urb; + + /* Work out which port within the device is being setup */ +- device_port = port->number - port->serial->minor; ++ device_port = port->port_number; + + /* Make sure we have an urb then send the message */ + if (this_urb == NULL) { +- dev_dbg(&port->dev, "%s - oops no urb for port %d.\n", __func__, port->number); ++ dev_dbg(&port->dev, "%s - oops no urb for port.\n", __func__); + return -1; + } + +- dev_dbg(&port->dev, "%s - endpoint %d port %d (%d)\n", +- __func__, usb_pipeendpoint(this_urb->pipe), +- port->number, device_port); ++ dev_dbg(&port->dev, "%s - endpoint %d (%d)\n", ++ __func__, usb_pipeendpoint(this_urb->pipe), device_port); + + /* Save reset port val for resend. + Don't overwrite resend for open/close condition. */ +@@ -1865,7 +1864,6 @@ static int keyspan_usa49_send_setup(stru + + memset(&msg, 0, sizeof(struct keyspan_usa49_portControlMessage)); + +- /*msg.portNumber = port->number;*/ + msg.portNumber = device_port; + + /* Only set baud rate if it's changed */ +@@ -2155,12 +2153,11 @@ static int keyspan_usa67_send_setup(stru + this_urb = s_priv->glocont_urb; + + /* Work out which port within the device is being setup */ +- device_port = port->number - port->serial->minor; ++ device_port = port->port_number; + + /* Make sure we have an urb then send the message */ + if (this_urb == NULL) { +- dev_dbg(&port->dev, "%s - oops no urb for port %d.\n", __func__, +- port->number); ++ dev_dbg(&port->dev, "%s - oops no urb for port.\n", __func__); + return -1; + } + +@@ -2401,7 +2398,7 @@ static int keyspan_port_probe(struct usb + /* Setup values for the various callback routines */ + cback = &keyspan_callbacks[d_details->msg_format]; + +- port_num = port->number - port->serial->minor; ++ port_num = port->port_number; + + /* Do indat endpoints first, once for each flip */ + endp = d_details->indat_endpoints[port_num]; +--- a/drivers/usb/serial/metro-usb.c ++++ b/drivers/usb/serial/metro-usb.c +@@ -224,8 +224,8 @@ static int metrousb_open(struct tty_stru + result = metrousb_send_unidirectional_cmd(UNI_CMD_OPEN, port); + if (result) { + dev_err(&port->dev, +- "%s - failed to configure device for port number=%d, error code=%d\n", +- __func__, port->number, result); ++ "%s - failed to configure device, error code=%d\n", ++ __func__, result); + goto exit; + } + +--- a/drivers/usb/serial/mos7720.c ++++ b/drivers/usb/serial/mos7720.c +@@ -1036,7 +1036,7 @@ static int mos7720_open(struct tty_struc + * + * 0x08 : SP1/2 Control Reg + */ +- port_number = port->number - port->serial->minor; ++ port_number = port->port_number; + read_mos_reg(serial, port_number, LSR, &data); + + dev_dbg(&port->dev, "SS::%p LSR:%x\n", mos7720_port, data); +@@ -1055,7 +1055,7 @@ static int mos7720_open(struct tty_struc + + write_mos_reg(serial, port_number, SP_CONTROL_REG, 0x00); + read_mos_reg(serial, dummy, SP_CONTROL_REG, &data); +- data = data | (port->number - port->serial->minor + 1); ++ data = data | (port->port_number + 1); + write_mos_reg(serial, dummy, SP_CONTROL_REG, data); + mos7720_port->shadowLCR = 0x83; + write_mos_reg(serial, port_number, LCR, mos7720_port->shadowLCR); +@@ -1136,8 +1136,8 @@ static void mos7720_close(struct usb_ser + usb_kill_urb(port->write_urb); + usb_kill_urb(port->read_urb); + +- write_mos_reg(serial, port->number - port->serial->minor, MCR, 0x00); +- write_mos_reg(serial, port->number - port->serial->minor, IER, 0x00); ++ write_mos_reg(serial, port->port_number, MCR, 0x00); ++ write_mos_reg(serial, port->port_number, IER, 0x00); + + mos7720_port->open = 0; + } +@@ -1161,8 +1161,7 @@ static void mos7720_break(struct tty_str + data = mos7720_port->shadowLCR & ~UART_LCR_SBC; + + mos7720_port->shadowLCR = data; +- write_mos_reg(serial, port->number - port->serial->minor, +- LCR, mos7720_port->shadowLCR); ++ write_mos_reg(serial, port->port_number, LCR, mos7720_port->shadowLCR); + } + + /* +@@ -1293,8 +1292,8 @@ static void mos7720_throttle(struct tty_ + /* if we are implementing RTS/CTS, toggle that line */ + if (tty->termios.c_cflag & CRTSCTS) { + mos7720_port->shadowMCR &= ~UART_MCR_RTS; +- write_mos_reg(port->serial, port->number - port->serial->minor, +- MCR, mos7720_port->shadowMCR); ++ write_mos_reg(port->serial, port->port_number, MCR, ++ mos7720_port->shadowMCR); + if (status != 0) + return; + } +@@ -1325,8 +1324,8 @@ static void mos7720_unthrottle(struct tt + /* if we are implementing RTS/CTS, toggle that line */ + if (tty->termios.c_cflag & CRTSCTS) { + mos7720_port->shadowMCR |= UART_MCR_RTS; +- write_mos_reg(port->serial, port->number - port->serial->minor, +- MCR, mos7720_port->shadowMCR); ++ write_mos_reg(port->serial, port->port_number, MCR, ++ mos7720_port->shadowMCR); + if (status != 0) + return; + } +@@ -1350,7 +1349,7 @@ static int set_higher_rates(struct mosch + * Init Sequence for higher rates + ***********************************************/ + dev_dbg(&port->dev, "Sending Setting Commands ..........\n"); +- port_number = port->number - port->serial->minor; ++ port_number = port->port_number; + + write_mos_reg(serial, port_number, IER, 0x00); + write_mos_reg(serial, port_number, FCR, 0x00); +@@ -1476,7 +1475,7 @@ static int send_cmd_write_baud_rate(stru + port = mos7720_port->port; + serial = port->serial; + +- number = port->number - port->serial->minor; ++ number = port->port_number; + dev_dbg(&port->dev, "%s - baud = %d\n", __func__, baudrate); + + /* Calculate the Divisor */ +@@ -1527,7 +1526,7 @@ static void change_port_settings(struct + + port = mos7720_port->port; + serial = port->serial; +- port_number = port->number - port->serial->minor; ++ port_number = port->port_number; + + if (!mos7720_port->open) { + dev_dbg(&port->dev, "%s - port not opened\n", __func__); +@@ -1618,7 +1617,7 @@ static void change_port_settings(struct + mos7720_port->shadowMCR |= (UART_MCR_XONANY); + /* To set hardware flow control to the specified * + * serial port, in SP1/2_CONTROL_REG */ +- if (port->number) ++ if (port->port_number) + write_mos_reg(serial, dummy, SP_CONTROL_REG, 0x01); + else + write_mos_reg(serial, dummy, SP_CONTROL_REG, 0x02); +@@ -1720,7 +1719,7 @@ static int get_lsr_info(struct tty_struc + struct usb_serial_port *port = tty->driver_data; + unsigned int result = 0; + unsigned char data = 0; +- int port_number = port->number - port->serial->minor; ++ int port_number = port->port_number; + int count; + + count = mos7720_chars_in_buffer(tty); +@@ -1782,8 +1781,8 @@ static int mos7720_tiocmset(struct tty_s + mcr &= ~UART_MCR_LOOP; + + mos7720_port->shadowMCR = mcr; +- write_mos_reg(port->serial, port->number - port->serial->minor, +- MCR, mos7720_port->shadowMCR); ++ write_mos_reg(port->serial, port->port_number, MCR, ++ mos7720_port->shadowMCR); + + return 0; + } +@@ -1827,8 +1826,8 @@ static int set_modem_info(struct moschip + } + + mos7720_port->shadowMCR = mcr; +- write_mos_reg(port->serial, port->number - port->serial->minor, +- MCR, mos7720_port->shadowMCR); ++ write_mos_reg(port->serial, port->port_number, MCR, ++ mos7720_port->shadowMCR); + + return 0; + } +@@ -1845,7 +1844,7 @@ static int get_serial_info(struct moschi + + tmp.type = PORT_16550A; + tmp.line = mos7720_port->port->serial->minor; +- tmp.port = mos7720_port->port->number; ++ tmp.port = mos7720_port->port->port_number; + tmp.irq = 0; + tmp.flags = ASYNC_SKIP_TEST | ASYNC_AUTO_IRQ; + tmp.xmit_fifo_size = NUM_URBS * URB_TRANSFER_BUFFER_SIZE; +--- a/drivers/usb/serial/mos7840.c ++++ b/drivers/usb/serial/mos7840.c +@@ -303,15 +303,12 @@ static int mos7840_set_uart_reg(struct u + /* For the UART control registers, the application number need + to be Or'ed */ + if (port->serial->num_ports == 4) { +- val |= (((__u16) port->number - +- (__u16) (port->serial->minor)) + 1) << 8; ++ val |= ((__u16)port->port_number + 1) << 8; + } else { +- if (((__u16) port->number - (__u16) (port->serial->minor)) == 0) { +- val |= (((__u16) port->number - +- (__u16) (port->serial->minor)) + 1) << 8; ++ if (port->port_number == 0) { ++ val |= ((__u16)port->port_number + 1) << 8; + } else { +- val |= (((__u16) port->number - +- (__u16) (port->serial->minor)) + 2) << 8; ++ val |= ((__u16)port->port_number + 2) << 8; + } + } + dev_dbg(&port->dev, "%s application number is %x\n", __func__, val); +@@ -340,16 +337,12 @@ static int mos7840_get_uart_reg(struct u + + /* Wval is same as application number */ + if (port->serial->num_ports == 4) { +- Wval = +- (((__u16) port->number - (__u16) (port->serial->minor)) + +- 1) << 8; ++ Wval = ((__u16)port->port_number + 1) << 8; + } else { +- if (((__u16) port->number - (__u16) (port->serial->minor)) == 0) { +- Wval = (((__u16) port->number - +- (__u16) (port->serial->minor)) + 1) << 8; ++ if (port->port_number == 0) { ++ Wval = ((__u16)port->port_number + 1) << 8; + } else { +- Wval = (((__u16) port->number - +- (__u16) (port->serial->minor)) + 2) << 8; ++ Wval = ((__u16)port->port_number + 2) << 8; + } + } + dev_dbg(&port->dev, "%s application number is %x\n", __func__, Wval); +@@ -631,9 +624,7 @@ static void mos7840_interrupt_callback(s + + for (i = 0; i < serial->num_ports; i++) { + mos7840_port = mos7840_get_port_private(serial->port[i]); +- wval = +- (((__u16) serial->port[i]->number - +- (__u16) (serial->minor)) + 1) << 8; ++ wval = ((__u16)serial->port[i]->port_number + 1) << 8; + if (mos7840_port->open) { + if (sp[i] & 0x01) { + dev_dbg(&urb->dev->dev, "SP%d No Interrupt !!!\n", i); +@@ -1065,8 +1056,8 @@ static int mos7840_open(struct tty_struc + * (can't set it up in mos7840_startup as the * + * structures were not set up at that time.) */ + +- dev_dbg(&port->dev, "port number is %d\n", port->number); +- dev_dbg(&port->dev, "serial number is %d\n", port->serial->minor); ++ dev_dbg(&port->dev, "port number is %d\n", port->port_number); ++ dev_dbg(&port->dev, "minor number is %d\n", port->serial->minor); + dev_dbg(&port->dev, "Bulkin endpoint is %d\n", port->bulk_in_endpointAddress); + dev_dbg(&port->dev, "BulkOut endpoint is %d\n", port->bulk_out_endpointAddress); + dev_dbg(&port->dev, "Interrupt endpoint is %d\n", port->interrupt_in_endpointAddress); +@@ -1074,9 +1065,7 @@ static int mos7840_open(struct tty_struc + mos7840_port->read_urb = port->read_urb; + + /* set up our bulk in urb */ +- if ((serial->num_ports == 2) +- && ((((__u16)port->number - +- (__u16)(port->serial->minor)) % 2) != 0)) { ++ if ((serial->num_ports == 2) && (((__u16)port->port_number % 2) != 0)) { + usb_fill_bulk_urb(mos7840_port->read_urb, + serial->dev, + usb_rcvbulkpipe(serial->dev, +@@ -1199,7 +1188,7 @@ static void mos7840_close(struct usb_ser + mos7840_port->read_urb_busy = false; + + port0->open_ports--; +- dev_dbg(&port->dev, "%s in close%d:in port%d\n", __func__, port0->open_ports, port->number); ++ dev_dbg(&port->dev, "%s in close%d\n", __func__, port0->open_ports); + if (port0->open_ports == 0) { + if (serial->port[0]->interrupt_in_urb) { + dev_dbg(&port->dev, "Shutdown interrupt_in_urb\n"); +@@ -1435,9 +1424,7 @@ static int mos7840_write(struct tty_stru + memcpy(urb->transfer_buffer, current_position, transfer_size); + + /* fill urb with data and submit */ +- if ((serial->num_ports == 2) +- && ((((__u16)port->number - +- (__u16)(port->serial->minor)) % 2) != 0)) { ++ if ((serial->num_ports == 2) && (((__u16)port->port_number % 2) != 0)) { + usb_fill_bulk_urb(urb, + serial->dev, + usb_sndbulkpipe(serial->dev, +@@ -1732,10 +1719,9 @@ static int mos7840_send_cmd_write_baud_r + if (mos7840_serial_paranoia_check(port->serial, __func__)) + return -1; + +- number = mos7840_port->port->number - mos7840_port->port->serial->minor; ++ number = mos7840_port->port->port_number; + +- dev_dbg(&port->dev, "%s - port = %d, baud = %d\n", __func__, +- mos7840_port->port->number, baudRate); ++ dev_dbg(&port->dev, "%s - baud = %d\n", __func__, baudRate); + /* reset clk_uart_sel in spregOffset */ + if (baudRate > 115200) { + #ifdef HW_flow_control +@@ -2016,7 +2002,6 @@ static void mos7840_set_termios(struct t + tty->termios.c_cflag, RELEVANT_IFLAG(tty->termios.c_iflag)); + dev_dbg(&port->dev, "%s - old clfag %08x old iflag %08x\n", __func__, + old_termios->c_cflag, RELEVANT_IFLAG(old_termios->c_iflag)); +- dev_dbg(&port->dev, "%s - port %d\n", __func__, port->number); + + /* change the port settings to the new ones specified */ + +@@ -2084,7 +2069,7 @@ static int mos7840_get_serial_info(struc + + tmp.type = PORT_16550A; + tmp.line = mos7840_port->port->serial->minor; +- tmp.port = mos7840_port->port->number; ++ tmp.port = mos7840_port->port->port_number; + tmp.irq = 0; + tmp.flags = ASYNC_SKIP_TEST | ASYNC_AUTO_IRQ; + tmp.xmit_fifo_size = NUM_URBS * URB_TRANSFER_BUFFER_SIZE; +@@ -2221,7 +2206,7 @@ static int mos7840_port_probe(struct usb + /* we set up the pointers to the endpoints in the mos7840_open * + * function, as the structures aren't created yet. */ + +- pnum = port->number - serial->minor; ++ pnum = port->port_number; + + dev_dbg(&port->dev, "mos7840_startup: configuring port %d\n", pnum); + mos7840_port = kzalloc(sizeof(struct moschip_port), GFP_KERNEL); +@@ -2242,7 +2227,6 @@ static int mos7840_port_probe(struct usb + * usb-serial.c:get_free_serial() and cannot therefore be used + * to index device instances */ + mos7840_port->port_num = pnum + 1; +- dev_dbg(&port->dev, "port->number = %d\n", port->number); + dev_dbg(&port->dev, "port->serial->minor = %d\n", port->serial->minor); + dev_dbg(&port->dev, "mos7840_port->port_num = %d\n", mos7840_port->port_num); + dev_dbg(&port->dev, "serial->minor = %d\n", serial->minor); +--- a/drivers/usb/serial/opticon.c ++++ b/drivers/usb/serial/opticon.c +@@ -367,7 +367,7 @@ static int opticon_ioctl(struct tty_stru + { + struct usb_serial_port *port = tty->driver_data; + +- dev_dbg(&port->dev, "%s - port %d, cmd = 0x%x\n", __func__, port->number, cmd); ++ dev_dbg(&port->dev, "%s - cmd = 0x%x\n", __func__, cmd); + + switch (cmd) { + case TIOCGSERIAL: +--- a/drivers/usb/serial/pl2303.c ++++ b/drivers/usb/serial/pl2303.c +@@ -642,7 +642,7 @@ static int pl2303_ioctl(struct tty_struc + memset(&ser, 0, sizeof ser); + ser.type = PORT_16654; + ser.line = port->serial->minor; +- ser.port = port->number; ++ ser.port = port->port_number; + ser.baud_base = 460800; + + if (copy_to_user((void __user *)arg, &ser, sizeof ser)) +--- a/drivers/usb/serial/quatech2.c ++++ b/drivers/usb/serial/quatech2.c +@@ -343,7 +343,7 @@ static int qt2_open(struct tty_struct *t + int status; + unsigned long flags; + +- device_port = (u16) (port->number - port->serial->minor); ++ device_port = port->port_number; + + serial = port->serial; + +@@ -388,9 +388,8 @@ static int qt2_open(struct tty_struct *t + status = qt2_set_port_config(serial->dev, device_port, + DEFAULT_BAUD_RATE, UART_LCR_WLEN8); + if (status < 0) { +- dev_err(&port->dev, +- "%s - initial setup failed for port %i (%i)\n", +- __func__, port->number, device_port); ++ dev_err(&port->dev, "%s - initial setup failed (%i)\n", ++ __func__, device_port); + return status; + } + +--- a/drivers/usb/serial/sierra.c ++++ b/drivers/usb/serial/sierra.c +@@ -914,7 +914,7 @@ static int sierra_port_probe(struct usb_ + /* This is really the usb-serial port number of the interface + * rather than the interface number. + */ +- ifnum = port->number - serial->minor; ++ ifnum = port->port_number; + himemoryp = &typeA_interface_list; + } + +--- a/drivers/usb/serial/ti_usb_3410_5052.c ++++ b/drivers/usb/serial/ti_usb_3410_5052.c +@@ -476,7 +476,7 @@ static int ti_open(struct tty_struct *tt + if (mutex_lock_interruptible(&tdev->td_open_close_lock)) + return -ERESTARTSYS; + +- port_number = port->number - port->serial->minor; ++ port_number = port->port_number; + + tport->tp_msr = 0; + tport->tp_shadow_mcr |= (TI_MCR_RTS | TI_MCR_DTR); +@@ -618,7 +618,7 @@ static void ti_close(struct usb_serial_p + kfifo_reset_out(&tport->write_fifo); + spin_unlock_irqrestore(&tport->tp_lock, flags); + +- port_number = port->number - port->serial->minor; ++ port_number = port->port_number; + + dev_dbg(&port->dev, "%s - sending TI_CLOSE_PORT\n", __func__); + status = ti_command_out_sync(tdev, TI_CLOSE_PORT, +@@ -776,7 +776,7 @@ static void ti_set_termios(struct tty_st + tcflag_t cflag, iflag; + int baud; + int status; +- int port_number = port->number - port->serial->minor; ++ int port_number = port->port_number; + unsigned int mcr; + + cflag = tty->termios.c_cflag; +@@ -1262,7 +1262,7 @@ static int ti_get_lsr(struct ti_port *tp + int size, status; + struct ti_device *tdev = tport->tp_tdev; + struct usb_serial_port *port = tport->tp_port; +- int port_number = port->number - port->serial->minor; ++ int port_number = port->port_number; + struct ti_port_status *data; + + size = sizeof(struct ti_port_status); +@@ -1309,7 +1309,7 @@ static int ti_get_serial_info(struct ti_ + + ret_serial.type = PORT_16550A; + ret_serial.line = port->serial->minor; +- ret_serial.port = port->number - port->serial->minor; ++ ret_serial.port = port->port_number; + ret_serial.flags = tport->tp_flags; + ret_serial.xmit_fifo_size = TI_WRITE_BUF_SIZE; + ret_serial.baud_base = tport->tp_tdev->td_is_3410 ? 921600 : 460800; +--- a/drivers/usb/serial/usb-serial.c ++++ b/drivers/usb/serial/usb-serial.c +@@ -105,9 +105,10 @@ static struct usb_serial *get_free_seria + *minor = i; + j = 0; + dev_dbg(&serial->interface->dev, "%s - minor base = %d\n", __func__, *minor); +- for (i = *minor; (i < (*minor + num_ports)) && (i < SERIAL_TTY_MINORS); ++i) { ++ for (i = *minor; (i < (*minor + num_ports)) && (i < SERIAL_TTY_MINORS); ++i, ++j) { + serial_table[i] = serial; +- serial->port[j++]->number = i; ++ serial->port[j]->minor = i; ++ serial->port[j]->port_number = i - *minor; + } + mutex_unlock(&table_lock); + return serial; +@@ -1050,7 +1051,7 @@ static int usb_serial_probe(struct usb_i + /* register all of the individual ports with the driver core */ + for (i = 0; i < num_ports; ++i) { + port = serial->port[i]; +- dev_set_name(&port->dev, "ttyUSB%d", port->number); ++ dev_set_name(&port->dev, "ttyUSB%d", port->minor); + dev_dbg(ddev, "registering %s", dev_name(&port->dev)); + device_enable_async_suspend(&port->dev); + +--- a/drivers/usb/serial/usb_wwan.c ++++ b/drivers/usb/serial/usb_wwan.c +@@ -125,7 +125,7 @@ static int get_serial_info(struct usb_se + + memset(&tmp, 0, sizeof(tmp)); + tmp.line = port->serial->minor; +- tmp.port = port->number; ++ tmp.port = port->port_number; + tmp.baud_base = tty_get_baud_rate(port->port.tty); + tmp.close_delay = port->port.close_delay / 10; + tmp.closing_wait = port->port.closing_wait == ASYNC_CLOSING_WAIT_NONE ? +--- a/drivers/usb/serial/whiteheat.c ++++ b/drivers/usb/serial/whiteheat.c +@@ -462,7 +462,7 @@ static int whiteheat_ioctl(struct tty_st + memset(&serstruct, 0, sizeof(serstruct)); + serstruct.type = PORT_16654; + serstruct.line = port->serial->minor; +- serstruct.port = port->number; ++ serstruct.port = port->port_number; + serstruct.flags = ASYNC_SKIP_TEST | ASYNC_AUTO_IRQ; + serstruct.xmit_fifo_size = kfifo_size(&port->write_fifo); + serstruct.custom_divisor = 0; +@@ -626,7 +626,7 @@ static int firm_open(struct usb_serial_p + { + struct whiteheat_simple open_command; + +- open_command.port = port->number - port->serial->minor + 1; ++ open_command.port = port->port_number + 1; + return firm_send_command(port, WHITEHEAT_OPEN, + (__u8 *)&open_command, sizeof(open_command)); + } +@@ -636,7 +636,7 @@ static int firm_close(struct usb_serial_ + { + struct whiteheat_simple close_command; + +- close_command.port = port->number - port->serial->minor + 1; ++ close_command.port = port->port_number + 1; + return firm_send_command(port, WHITEHEAT_CLOSE, + (__u8 *)&close_command, sizeof(close_command)); + } +@@ -649,7 +649,7 @@ static void firm_setup_port(struct tty_s + struct whiteheat_port_settings port_settings; + unsigned int cflag = tty->termios.c_cflag; + +- port_settings.port = port->number + 1; ++ port_settings.port = port->port_number + 1; + + /* get the byte size */ + switch (cflag & CSIZE) { +@@ -726,7 +726,7 @@ static int firm_set_rts(struct usb_seria + { + struct whiteheat_set_rdb rts_command; + +- rts_command.port = port->number - port->serial->minor + 1; ++ rts_command.port = port->port_number + 1; + rts_command.state = onoff; + return firm_send_command(port, WHITEHEAT_SET_RTS, + (__u8 *)&rts_command, sizeof(rts_command)); +@@ -737,7 +737,7 @@ static int firm_set_dtr(struct usb_seria + { + struct whiteheat_set_rdb dtr_command; + +- dtr_command.port = port->number - port->serial->minor + 1; ++ dtr_command.port = port->port_number + 1; + dtr_command.state = onoff; + return firm_send_command(port, WHITEHEAT_SET_DTR, + (__u8 *)&dtr_command, sizeof(dtr_command)); +@@ -748,7 +748,7 @@ static int firm_set_break(struct usb_ser + { + struct whiteheat_set_rdb break_command; + +- break_command.port = port->number - port->serial->minor + 1; ++ break_command.port = port->port_number + 1; + break_command.state = onoff; + return firm_send_command(port, WHITEHEAT_SET_BREAK, + (__u8 *)&break_command, sizeof(break_command)); +@@ -759,7 +759,7 @@ static int firm_purge(struct usb_serial_ + { + struct whiteheat_purge purge_command; + +- purge_command.port = port->number - port->serial->minor + 1; ++ purge_command.port = port->port_number + 1; + purge_command.what = rxtx; + return firm_send_command(port, WHITEHEAT_PURGE, + (__u8 *)&purge_command, sizeof(purge_command)); +@@ -770,7 +770,7 @@ static int firm_get_dtr_rts(struct usb_s + { + struct whiteheat_simple get_dr_command; + +- get_dr_command.port = port->number - port->serial->minor + 1; ++ get_dr_command.port = port->port_number + 1; + return firm_send_command(port, WHITEHEAT_GET_DTR_RTS, + (__u8 *)&get_dr_command, sizeof(get_dr_command)); + } +@@ -780,7 +780,7 @@ static int firm_report_tx_done(struct us + { + struct whiteheat_simple close_command; + +- close_command.port = port->number - port->serial->minor + 1; ++ close_command.port = port->port_number + 1; + return firm_send_command(port, WHITEHEAT_REPORT_TX_DONE, + (__u8 *)&close_command, sizeof(close_command)); + } +--- a/drivers/usb/serial/zte_ev.c ++++ b/drivers/usb/serial/zte_ev.c +@@ -41,7 +41,7 @@ static int zte_ev_usb_serial_open(struct + int len; + unsigned char *buf; + +- if (port->number != 0) ++ if (port->port_number != 0) + return -ENODEV; + + buf = kmalloc(MAX_SETUP_DATA_SIZE, GFP_KERNEL); +@@ -166,7 +166,7 @@ static void zte_ev_usb_serial_close(stru + int len; + unsigned char *buf; + +- if (port->number != 0) ++ if (port->port_number != 0) + return; + + buf = kmalloc(MAX_SETUP_DATA_SIZE, GFP_KERNEL); +--- a/include/linux/usb/serial.h ++++ b/include/linux/usb/serial.h +@@ -37,7 +37,8 @@ + * @serial: pointer back to the struct usb_serial owner of this port. + * @port: pointer to the corresponding tty_port for this port. + * @lock: spinlock to grab when updating portions of this structure. +- * @number: the number of the port (the minor number). ++ * @minor: the minor number of the port ++ * @port_number: the port number of this struct usb_serial_device (starts at 0) + * @interrupt_in_buffer: pointer to the interrupt in buffer for this port. + * @interrupt_in_urb: pointer to the interrupt in struct urb for this port. + * @interrupt_in_endpointAddress: endpoint address for the interrupt in pipe +@@ -80,7 +81,8 @@ struct usb_serial_port { + struct usb_serial *serial; + struct tty_port port; + spinlock_t lock; +- unsigned char number; ++ u32 minor; ++ u8 port_number; + + unsigned char *interrupt_in_buffer; + struct urb *interrupt_in_urb; |
