Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+7 −0
Original line number Original line Diff line number Diff line
@@ -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
		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)
	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)




	dbg("%s -- %x", __FUNCTION__, result);
	dbg("%s -- %x", __FUNCTION__, result);
	spin_unlock_irqrestore(&edge_port->ep_lock, flags);


	return result;
	return result;
}
}