Commit 3d71fe0b authored by Alan Cox's avatar Alan Cox Committed by Greg Kroah-Hartman

USB: io_ti: lock mcr and msr shadows properly

Signed-off-by: default avatarAlan Cox <alan@redhat.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 04ca89d4
...@@ -2559,9 +2559,11 @@ static int edge_tiocmset (struct usb_serial_port *port, struct file *file, unsig ...@@ -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); struct edgeport_port *edge_port = usb_get_serial_port_data(port);
unsigned int mcr; unsigned int mcr;
unsigned long flags;
dbg("%s - port %d", __FUNCTION__, port->number); dbg("%s - port %d", __FUNCTION__, port->number);
spin_lock_irqsave(&edge_port->ep_lock, flags);
mcr = edge_port->shadow_mcr; mcr = edge_port->shadow_mcr;
if (set & TIOCM_RTS) if (set & TIOCM_RTS)
mcr |= MCR_RTS; mcr |= MCR_RTS;
...@@ -2578,6 +2580,7 @@ static int edge_tiocmset (struct usb_serial_port *port, struct file *file, unsig ...@@ -2578,6 +2580,7 @@ static int edge_tiocmset (struct usb_serial_port *port, struct file *file, unsig
mcr &= ~MCR_LOOPBACK; mcr &= ~MCR_LOOPBACK;
edge_port->shadow_mcr = mcr; edge_port->shadow_mcr = mcr;
spin_unlock_irqrestore(&edge_port->ep_lock, flags);
TIRestoreMCR (edge_port, mcr); TIRestoreMCR (edge_port, mcr);
...@@ -2590,9 +2593,12 @@ static int edge_tiocmget(struct usb_serial_port *port, struct file *file) ...@@ -2590,9 +2593,12 @@ static int edge_tiocmget(struct usb_serial_port *port, struct file *file)
unsigned int result = 0; unsigned int result = 0;
unsigned int msr; unsigned int msr;
unsigned int mcr; unsigned int mcr;
unsigned long flags;
dbg("%s - port %d", __FUNCTION__, port->number); dbg("%s - port %d", __FUNCTION__, port->number);
spin_lock_irqsave(&edge_port->ep_lock, flags);
msr = edge_port->shadow_msr; msr = edge_port->shadow_msr;
mcr = edge_port->shadow_mcr; mcr = edge_port->shadow_mcr;
result = ((mcr & MCR_DTR) ? TIOCM_DTR: 0) /* 0x002 */ result = ((mcr & MCR_DTR) ? TIOCM_DTR: 0) /* 0x002 */
...@@ -2604,6 +2610,7 @@ static int edge_tiocmget(struct usb_serial_port *port, struct file *file) ...@@ -2604,6 +2610,7 @@ static int edge_tiocmget(struct usb_serial_port *port, struct file *file)
dbg("%s -- %x", __FUNCTION__, result); dbg("%s -- %x", __FUNCTION__, result);
spin_unlock_irqrestore(&edge_port->ep_lock, flags);
return result; return result;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment