diff options
author | Tony Cook <tony-cook@bigpond.com> | 2009-04-18 09:12:18 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2009-04-23 17:15:28 -0400 |
commit | 37768adf9a1d49aeac0db1ba3dc28b3274b7b789 (patch) | |
tree | fd68c1ba85729b0f217d9c379a64dab10c58bdb8 /drivers/usb | |
parent | e9b8cffa923e8eb3fe70ea05d3fcfffc90a71a57 (diff) |
USB: fix mos7840 problem with minor numbers
This patch fixes a problem with any mos7840 device where the use of the field "minor" before it is
initialised results in all the devices being overlaid in memory (minor = 0 for all instances)
Contributed by: Phillip Branch
Signed-off-by: Tony Cook <tony-cook@bigpond.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/usb')
-rw-r--r-- | drivers/usb/serial/mos7840.c | 30 |
1 files changed, 19 insertions, 11 deletions
diff --git a/drivers/usb/serial/mos7840.c b/drivers/usb/serial/mos7840.c index 567985b7013e..499b7b82a0ec 100644 --- a/drivers/usb/serial/mos7840.c +++ b/drivers/usb/serial/mos7840.c | |||
@@ -38,7 +38,7 @@ | |||
38 | /* | 38 | /* |
39 | * Version Information | 39 | * Version Information |
40 | */ | 40 | */ |
41 | #define DRIVER_VERSION "1.3.1" | 41 | #define DRIVER_VERSION "1.3.2" |
42 | #define DRIVER_DESC "Moschip 7840/7820 USB Serial Driver" | 42 | #define DRIVER_DESC "Moschip 7840/7820 USB Serial Driver" |
43 | 43 | ||
44 | /* | 44 | /* |
@@ -2484,9 +2484,14 @@ static int mos7840_startup(struct usb_serial *serial) | |||
2484 | mos7840_set_port_private(serial->port[i], mos7840_port); | 2484 | mos7840_set_port_private(serial->port[i], mos7840_port); |
2485 | spin_lock_init(&mos7840_port->pool_lock); | 2485 | spin_lock_init(&mos7840_port->pool_lock); |
2486 | 2486 | ||
2487 | mos7840_port->port_num = ((serial->port[i]->number - | 2487 | /* minor is not initialised until later by |
2488 | (serial->port[i]->serial->minor)) + | 2488 | * usb-serial.c:get_free_serial() and cannot therefore be used |
2489 | 1); | 2489 | * to index device instances */ |
2490 | mos7840_port->port_num = i + 1; | ||
2491 | dbg ("serial->port[i]->number = %d", serial->port[i]->number); | ||
2492 | dbg ("serial->port[i]->serial->minor = %d", serial->port[i]->serial->minor); | ||
2493 | dbg ("mos7840_port->port_num = %d", mos7840_port->port_num); | ||
2494 | dbg ("serial->minor = %d", serial->minor); | ||
2490 | 2495 | ||
2491 | if (mos7840_port->port_num == 1) { | 2496 | if (mos7840_port->port_num == 1) { |
2492 | mos7840_port->SpRegOffset = 0x0; | 2497 | mos7840_port->SpRegOffset = 0x0; |
@@ -2697,13 +2702,16 @@ static void mos7840_shutdown(struct usb_serial *serial) | |||
2697 | 2702 | ||
2698 | for (i = 0; i < serial->num_ports; ++i) { | 2703 | for (i = 0; i < serial->num_ports; ++i) { |
2699 | mos7840_port = mos7840_get_port_private(serial->port[i]); | 2704 | mos7840_port = mos7840_get_port_private(serial->port[i]); |
2700 | spin_lock_irqsave(&mos7840_port->pool_lock, flags); | 2705 | dbg ("mos7840_port %d = %p", i, mos7840_port); |
2701 | mos7840_port->zombie = 1; | 2706 | if (mos7840_port) { |
2702 | spin_unlock_irqrestore(&mos7840_port->pool_lock, flags); | 2707 | spin_lock_irqsave(&mos7840_port->pool_lock, flags); |
2703 | usb_kill_urb(mos7840_port->control_urb); | 2708 | mos7840_port->zombie = 1; |
2704 | kfree(mos7840_port->ctrl_buf); | 2709 | spin_unlock_irqrestore(&mos7840_port->pool_lock, flags); |
2705 | kfree(mos7840_port->dr); | 2710 | usb_kill_urb(mos7840_port->control_urb); |
2706 | kfree(mos7840_port); | 2711 | kfree(mos7840_port->ctrl_buf); |
2712 | kfree(mos7840_port->dr); | ||
2713 | kfree(mos7840_port); | ||
2714 | } | ||
2707 | mos7840_set_port_private(serial->port[i], NULL); | 2715 | mos7840_set_port_private(serial->port[i], NULL); |
2708 | } | 2716 | } |
2709 | 2717 | ||