lkml.org 
[lkml]   [2009]   [Dec]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[15/18] USB: fix mos7840 problem with minor numbers
    2.6.27-stable review patch.  If anyone has any objections, please let us know.

    ------------------
    From: Tony Cook <tony-cook@bigpond.com>
    commit 37768adf9a1d49aeac0db1ba3dc28b3274b7b789 upstream

    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

    Backported to .27 by Christoph Biedl <linux-kernel.bfrz@manchmal.in-ulm.de>

    Signed-off-by: Tony Cook <tony-cook@bigpond.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>


    ---
    drivers/usb/serial/mos7840.c | 21 ++++++++++++++-------
    1 file changed, 14 insertions(+), 7 deletions(-)
    --- a/drivers/usb/serial/mos7840.c
    +++ b/drivers/usb/serial/mos7840.c
    @@ -2453,9 +2453,14 @@ static int mos7840_startup(struct usb_se
    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;
    @@ -2666,10 +2671,12 @@ static void mos7840_disconnect(struct us

    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);
    + 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);
    + }
    }

    dbg("%s\n", "Thank u ::");



    \
     
     \ /
      Last update: 2009-12-17 01:59    [from the cache]
    ©2003-2011 Jasper Spaans