[PATCH] usb: fix mos7840 problems - 1st patch - 2nd attempt

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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), additionally it adds USB ids for the
mos7840 based ATEN International serial devices.

From: Phillip Branch

Signed-off-by: Tony Cook tony-cook@xxxxxxxxxxx

-----------------

diff -Naur linux-2.6.29/drivers/usb/serial/mos7840.c linux-2.6.29-patch1/drivers/usb/serial/mos7840.c --- linux-2.6.29/drivers/usb/serial/mos7840.c 2009-03-28 14:08:46.000000000 +1030 +++ linux-2.6.29-patch1/drivers/usb/serial/mos7840.c 2009-03-29 23:25:25.000000000 +1030
@@ -38,7 +38,7 @@
/*
 * Version Information
 */
-#define DRIVER_VERSION "1.3.1"
+#define DRIVER_VERSION "1.3.2"
#define DRIVER_DESC "Moschip 7840/7820 USB Serial Driver"

/*
@@ -114,6 +114,7 @@
#define USB_VENDOR_ID_MOSCHIP           0x9710
#define MOSCHIP_DEVICE_ID_7840          0x7840
#define MOSCHIP_DEVICE_ID_7820          0x7820
+
/* The native component can have its vendor/device id's overridden
 * in vendor-specific implementations.  Such devices can be handled
 * by making a change here, in moschip_port_id_table, and in
@@ -123,6 +124,11 @@
#define BANDB_DEVICE_ID_USOPTL4_4       0xAC44
#define BANDB_DEVICE_ID_USOPTL4_2       0xAC42

+/* This driver also supports the ATEN UC2324 device since it is mos7840 based
+ *  - if I knew the device id it would also support the ATEN UC2322 */
+#define USB_VENDOR_ID_ATENINTL        0x0557
+#define ATENINTL_DEVICE_ID_UC2324    0x2011
+
/* Interrupt Routine Defines    */

#define SERIAL_IIR_RLS      0x06
@@ -170,6 +176,7 @@
    {USB_DEVICE(USB_VENDOR_ID_MOSCHIP, MOSCHIP_DEVICE_ID_7820)},
    {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USOPTL4_4)},
    {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USOPTL4_2)},
+    {USB_DEVICE(USB_VENDOR_ID_ATENINTL, ATENINTL_DEVICE_ID_UC2324)},
    {}            /* terminating entry */
};

@@ -178,6 +185,7 @@
    {USB_DEVICE(USB_VENDOR_ID_MOSCHIP, MOSCHIP_DEVICE_ID_7820)},
    {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USOPTL4_4)},
    {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USOPTL4_2)},
+    {USB_DEVICE(USB_VENDOR_ID_ATENINTL, ATENINTL_DEVICE_ID_UC2324)},
    {}            /* terminating entry */
};

@@ -2477,9 +2485,14 @@
        mos7840_set_port_private(serial->port[i], mos7840_port);
        spin_lock_init(&mos7840_port->pool_lock);

-        mos7840_port->port_num = ((serial->port[i]->number -
-                       (serial->port[i]->serial->minor)) +
-                      1);
+        /* minor is not initialised until later by
+         * usb-serial.c:get_free_serial() and cannot therefore be used
+         * to index device instances */
+        mos7840_port->port_num = i + 1;
+        dbg ("serial->port[i]->number = %d", serial->port[i]->number);
+ dbg ("serial->port[i]->serial->minor = %d", serial->port[i]->serial->minor);
+        dbg ("mos7840_port->port_num = %d", mos7840_port->port_num);
+        dbg ("serial->minor = %d", serial->minor);

        if (mos7840_port->port_num == 1) {
            mos7840_port->SpRegOffset = 0x0;
@@ -2690,13 +2703,16 @@

    for (i = 0; i < serial->num_ports; ++i) {
        mos7840_port = mos7840_get_port_private(serial->port[i]);
-        spin_lock_irqsave(&mos7840_port->pool_lock, flags);
-        mos7840_port->zombie = 1;
-        spin_unlock_irqrestore(&mos7840_port->pool_lock, flags);
-        usb_kill_urb(mos7840_port->control_urb);
-        kfree(mos7840_port->ctrl_buf);
-        kfree(mos7840_port->dr);
-        kfree(mos7840_port);
+        dbg ("mos7840_port %d = %p", i, mos7840_port);
+        if (mos7840_port) {
+            spin_lock_irqsave(&mos7840_port->pool_lock, flags);
+            mos7840_port->zombie = 1;
+            spin_unlock_irqrestore(&mos7840_port->pool_lock, flags);
+            usb_kill_urb(mos7840_port->control_urb);
+            kfree(mos7840_port->ctrl_buf);
+            kfree(mos7840_port->dr);
+            kfree(mos7840_port);
+        }
        mos7840_set_port_private(serial->port[i], NULL);
    }


--
Tony Cook
Lewiston 5501
Ph.  +61 (0)8 8524 3418
Mob. +61 (0)4 2885 2512


--
Tony Cook
Lewiston 5501
Ph.  +61 (0)8 8524 3418
Mob. +61 (0)4 2885 2512

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux