USB: io_ti: lock mcr and msr shadows properly
authorAlan Cox <alan@lxorguk.ukuu.org.uk>
Wed, 20 Feb 2008 21:38:32 +0000 (21:38 +0000)
committerGreg Kroah-Hartman <gregkh@suse.de>
Fri, 25 Apr 2008 04:16:39 +0000 (21:16 -0700)
Signed-off-by: Alan Cox <alan@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/usb/serial/io_ti.c

index 63e044a..39d71fd 100644 (file)
@@ -2559,9 +2559,11 @@ static int edge_tiocmset (struct usb_serial_port *port, struct file *file, unsig
 {
        struct edgeport_port *edge_port = usb_get_serial_port_data(port);
        unsigned int mcr;
+       unsigned long flags;
 
        dbg("%s - port %d", __FUNCTION__, port->number);
 
+       spin_lock_irqsave(&edge_port->ep_lock, flags);
        mcr = edge_port->shadow_mcr;
        if (set & TIOCM_RTS)
                mcr |= MCR_RTS;
@@ -2578,6 +2580,7 @@ static int edge_tiocmset (struct usb_serial_port *port, struct file *file, unsig
                mcr &= ~MCR_LOOPBACK;
 
        edge_port->shadow_mcr = mcr;
+       spin_unlock_irqrestore(&edge_port->ep_lock, flags);
 
        TIRestoreMCR (edge_port, mcr);
 
@@ -2590,9 +2593,12 @@ static int edge_tiocmget(struct usb_serial_port *port, struct file *file)
        unsigned int result = 0;
        unsigned int msr;
        unsigned int mcr;
+       unsigned long flags;
 
        dbg("%s - port %d", __FUNCTION__, port->number);
 
+       spin_lock_irqsave(&edge_port->ep_lock, flags);
+
        msr = edge_port->shadow_msr;
        mcr = edge_port->shadow_mcr;
        result = ((mcr & MCR_DTR)       ? TIOCM_DTR: 0)   /* 0x002 */
@@ -2604,6 +2610,7 @@ static int edge_tiocmget(struct usb_serial_port *port, struct file *file)
 
 
        dbg("%s -- %x", __FUNCTION__, result);
+       spin_unlock_irqrestore(&edge_port->ep_lock, flags);
 
        return result;
 }