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

Commit 335f8514 authored by Alan Cox's avatar Alan Cox Committed by Linus Torvalds
Browse files

tty: Bring the usb tty port structure into more use



This allows us to clean stuff up, but is probably also going to cause
some app breakage with buggy apps as we now implement proper POSIX behaviour
for USB ports matching all the other ports. This does also mean other apps
that break on USB will now work properly.

Signed-off-by: default avatarAlan Cox <alan@lxorguk.ukuu.org.uk>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 1ec739be
Loading
Loading
Loading
Loading
+2 −4
Original line number Original line Diff line number Diff line
@@ -93,8 +93,7 @@ static int belkin_sa_startup(struct usb_serial *serial);
static void belkin_sa_shutdown(struct usb_serial *serial);
static void belkin_sa_shutdown(struct usb_serial *serial);
static int  belkin_sa_open(struct tty_struct *tty,
static int  belkin_sa_open(struct tty_struct *tty,
			struct usb_serial_port *port, struct file *filp);
			struct usb_serial_port *port, struct file *filp);
static void belkin_sa_close(struct tty_struct *tty,
static void belkin_sa_close(struct usb_serial_port *port);
			struct usb_serial_port *port, struct file *filp);
static void belkin_sa_read_int_callback(struct urb *urb);
static void belkin_sa_read_int_callback(struct urb *urb);
static void belkin_sa_set_termios(struct tty_struct *tty,
static void belkin_sa_set_termios(struct tty_struct *tty,
			struct usb_serial_port *port, struct ktermios * old);
			struct usb_serial_port *port, struct ktermios * old);
@@ -244,8 +243,7 @@ static int belkin_sa_open(struct tty_struct *tty,
} /* belkin_sa_open */
} /* belkin_sa_open */




static void belkin_sa_close(struct tty_struct *tty,
static void belkin_sa_close(struct usb_serial_port *port)
			struct usb_serial_port *port, struct file *filp)
{
{
	dbg("%s port %d", __func__, port->number);
	dbg("%s port %d", __func__, port->number);


+26 −20
Original line number Original line Diff line number Diff line
@@ -262,13 +262,33 @@ error: kfree(priv);
	return r;
	return r;
}
}


static void ch341_close(struct tty_struct *tty, struct usb_serial_port *port,
static int ch341_carrier_raised(struct usb_serial_port *port)
				struct file *filp)
{
	struct ch341_private *priv = usb_get_serial_port_data(port);
	if (priv->line_status & CH341_BIT_DCD)
		return 1;
	return 0;
}

static void ch341_dtr_rts(struct usb_serial_port *port, int on)
{
{
	struct ch341_private *priv = usb_get_serial_port_data(port);
	struct ch341_private *priv = usb_get_serial_port_data(port);
	unsigned long flags;
	unsigned long flags;
	unsigned int c_cflag;


	dbg("%s - port %d", __func__, port->number);
	/* drop DTR and RTS */
	spin_lock_irqsave(&priv->lock, flags);
	if (on)
		priv->line_control |= CH341_BIT_RTS | CH341_BIT_DTR;
	else
		priv->line_control &= ~(CH341_BIT_RTS | CH341_BIT_DTR);
	spin_unlock_irqrestore(&priv->lock, flags);
	ch341_set_handshake(port->serial->dev, priv->line_control);
	wake_up_interruptible(&priv->delta_msr_wait);
}

static void ch341_close(struct usb_serial_port *port)
{
	dbg("%s - port %d", __func__, port->number);
	dbg("%s - port %d", __func__, port->number);


	/* shutdown our urbs */
	/* shutdown our urbs */
@@ -276,18 +296,6 @@ static void ch341_close(struct tty_struct *tty, struct usb_serial_port *port,
	usb_kill_urb(port->write_urb);
	usb_kill_urb(port->write_urb);
	usb_kill_urb(port->read_urb);
	usb_kill_urb(port->read_urb);
	usb_kill_urb(port->interrupt_in_urb);
	usb_kill_urb(port->interrupt_in_urb);

	if (tty) {
		c_cflag = tty->termios->c_cflag;
		if (c_cflag & HUPCL) {
			/* drop DTR and RTS */
			spin_lock_irqsave(&priv->lock, flags);
			priv->line_control = 0;
			spin_unlock_irqrestore(&priv->lock, flags);
			ch341_set_handshake(port->serial->dev, 0);
		}
	}
	wake_up_interruptible(&priv->delta_msr_wait);
}
}




@@ -302,7 +310,6 @@ static int ch341_open(struct tty_struct *tty, struct usb_serial_port *port,
	dbg("ch341_open()");
	dbg("ch341_open()");


	priv->baud_rate = DEFAULT_BAUD_RATE;
	priv->baud_rate = DEFAULT_BAUD_RATE;
	priv->line_control = CH341_BIT_RTS | CH341_BIT_DTR;


	r = ch341_configure(serial->dev, priv);
	r = ch341_configure(serial->dev, priv);
	if (r)
	if (r)
@@ -322,7 +329,7 @@ static int ch341_open(struct tty_struct *tty, struct usb_serial_port *port,
	if (r) {
	if (r) {
		dev_err(&port->dev, "%s - failed submitting interrupt urb,"
		dev_err(&port->dev, "%s - failed submitting interrupt urb,"
			" error %d\n", __func__, r);
			" error %d\n", __func__, r);
		ch341_close(tty, port, NULL);
		ch341_close(port);
		return -EPROTO;
		return -EPROTO;
	}
	}


@@ -343,9 +350,6 @@ static void ch341_set_termios(struct tty_struct *tty,


	dbg("ch341_set_termios()");
	dbg("ch341_set_termios()");


	if (!tty || !tty->termios)
		return;

	baud_rate = tty_get_baud_rate(tty);
	baud_rate = tty_get_baud_rate(tty);


	priv->baud_rate = baud_rate;
	priv->baud_rate = baud_rate;
@@ -568,6 +572,8 @@ static struct usb_serial_driver ch341_device = {
	.usb_driver        = &ch341_driver,
	.usb_driver        = &ch341_driver,
	.num_ports         = 1,
	.num_ports         = 1,
	.open              = ch341_open,
	.open              = ch341_open,
	.dtr_rts	   = ch341_dtr_rts,
	.carrier_raised	   = ch341_carrier_raised,
	.close             = ch341_close,
	.close             = ch341_close,
	.ioctl             = ch341_ioctl,
	.ioctl             = ch341_ioctl,
	.set_termios       = ch341_set_termios,
	.set_termios       = ch341_set_termios,
+4 −2
Original line number Original line Diff line number Diff line
@@ -169,7 +169,9 @@ static int usb_console_setup(struct console *co, char *options)
			kfree(tty);
			kfree(tty);
		}
		}
	}
	}

	/* So we know not to kill the hardware on a hangup on this
	   port. We have also bumped the use count by one so it won't go
	   idle */
	port->console = 1;
	port->console = 1;
	retval = 0;
	retval = 0;


+2 −4
Original line number Original line Diff line number Diff line
@@ -36,8 +36,7 @@
static int cp2101_open(struct tty_struct *, struct usb_serial_port *,
static int cp2101_open(struct tty_struct *, struct usb_serial_port *,
							struct file *);
							struct file *);
static void cp2101_cleanup(struct usb_serial_port *);
static void cp2101_cleanup(struct usb_serial_port *);
static void cp2101_close(struct tty_struct *, struct usb_serial_port *,
static void cp2101_close(struct usb_serial_port *);
							struct file*);
static void cp2101_get_termios(struct tty_struct *,
static void cp2101_get_termios(struct tty_struct *,
	struct usb_serial_port *port);
	struct usb_serial_port *port);
static void cp2101_get_termios_port(struct usb_serial_port *port,
static void cp2101_get_termios_port(struct usb_serial_port *port,
@@ -398,8 +397,7 @@ static void cp2101_cleanup(struct usb_serial_port *port)
	}
	}
}
}


static void cp2101_close(struct tty_struct *tty, struct usb_serial_port *port,
static void cp2101_close(struct usb_serial_port *port)
					struct file *filp)
{
{
	dbg("%s - port %d", __func__, port->number);
	dbg("%s - port %d", __func__, port->number);


+2 −4
Original line number Original line Diff line number Diff line
@@ -61,8 +61,7 @@ static int cyberjack_startup(struct usb_serial *serial);
static void cyberjack_shutdown(struct usb_serial *serial);
static void cyberjack_shutdown(struct usb_serial *serial);
static int  cyberjack_open(struct tty_struct *tty,
static int  cyberjack_open(struct tty_struct *tty,
			struct usb_serial_port *port, struct file *filp);
			struct usb_serial_port *port, struct file *filp);
static void cyberjack_close(struct tty_struct *tty,
static void cyberjack_close(struct usb_serial_port *port);
			struct usb_serial_port *port, struct file *filp);
static int cyberjack_write(struct tty_struct *tty,
static int cyberjack_write(struct tty_struct *tty,
	struct usb_serial_port *port, const unsigned char *buf, int count);
	struct usb_serial_port *port, const unsigned char *buf, int count);
static int cyberjack_write_room(struct tty_struct *tty);
static int cyberjack_write_room(struct tty_struct *tty);
@@ -185,8 +184,7 @@ static int cyberjack_open(struct tty_struct *tty,
	return result;
	return result;
}
}


static void cyberjack_close(struct tty_struct *tty,
static void cyberjack_close(struct usb_serial_port *port)
			struct usb_serial_port *port, struct file *filp)
{
{
	dbg("%s - port %d", __func__, port->number);
	dbg("%s - port %d", __func__, port->number);


Loading