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

Commit 95bef012 authored by Oliver Neukum's avatar Oliver Neukum Committed by Greg Kroah-Hartman
Browse files

USB: more serial drivers writing after disconnect



this covers the rest of the obvious cases by using the flags
and locks to guard against disconnect which were introduced
in the earlier patch against mos7720.

Signed-off-by: default avatarOliver Neukum <oneukum@suse.de>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent e33fe4d8
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -217,7 +217,10 @@ static void airprime_close(struct usb_serial_port *port, struct file * filp)
	priv->rts_state = 0;
	priv->dtr_state = 0;

	mutex_lock(&port->serial->disc_mutex);
	if (!port->serial->disconnected)
		airprime_send_setup(port);
	mutex_lock(&port->serial->disc_mutex);

	for (i = 0; i < NUM_READ_URBS; ++i) {
		usb_kill_urb (priv->read_urbp[i]);
+4 −1
Original line number Diff line number Diff line
@@ -348,7 +348,10 @@ static void cp2101_close (struct usb_serial_port *port, struct file * filp)
	usb_kill_urb(port->write_urb);
	usb_kill_urb(port->read_urb);

	mutex_lock(&port->serial->disc_mutex);
	if (!port->serial->disconnected)
		cp2101_set_config_single(port, CP2101_UART, UART_DISABLE);
	mutex_unlock(&port->serial->disc_mutex);
}

/*
+3 −1
Original line number Diff line number Diff line
@@ -1198,7 +1198,8 @@ static void ftdi_close (struct usb_serial_port *port, struct file *filp)

	dbg("%s", __FUNCTION__);

	if (c_cflag & HUPCL){
	mutex_lock(&port->serial->disc_mutex);
	if (c_cflag & HUPCL && !port->serial->disconnected){
		/* Disable flow control */
		if (usb_control_msg(port->serial->dev,
				    usb_sndctrlpipe(port->serial->dev, 0),
@@ -1212,6 +1213,7 @@ static void ftdi_close (struct usb_serial_port *port, struct file *filp)
		/* drop RTS and DTR */
		clear_mctrl(port, TIOCM_DTR | TIOCM_RTS);
	} /* Note change no line if hupcl is off */
	mutex_unlock(&port->serial->disc_mutex);

	/* cancel any scheduled reading */
	cancel_delayed_work(&priv->rx_work);
+12 −5
Original line number Diff line number Diff line
@@ -1020,12 +1020,15 @@ static void garmin_close (struct usb_serial_port *port, struct file * filp)
	if (!serial)
		return;

	mutex_lock(&port->serial->disc_mutex);
	if (!port->serial->disconnected)
		garmin_clear(garmin_data_p);

	/* shutdown our urbs */
	usb_kill_urb (port->read_urb);
	usb_kill_urb (port->write_urb);

	if (!port->serial->disconnected) {
		if (noResponseFromAppLayer(garmin_data_p) ||
		    ((garmin_data_p->flags & CLEAR_HALT_REQUIRED) != 0)) {
			process_resetdev_request(port);
@@ -1033,6 +1036,10 @@ static void garmin_close (struct usb_serial_port *port, struct file * filp)
		} else {
			garmin_data_p->state = STATE_DISCONNECTED;
		}
	} else {
		garmin_data_p->state = STATE_DISCONNECTED;
	}
	mutex_unlock(&port->serial->disc_mutex);
}


+1 −1
Original line number Diff line number Diff line
@@ -362,7 +362,7 @@ static void visor_close (struct usb_serial_port *port, struct file * filp)
			kfree (transfer_buffer);
		}
	}
	mutex_lock(&port->serial->disc_mutex);
	mutex_unlock(&port->serial->disc_mutex);

	if (stats)
		dev_info(&port->dev, "Bytes In = %d  Bytes Out = %d\n",