diff options
Diffstat (limited to 'drivers/usb')
37 files changed, 118 insertions, 331 deletions
diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c index 20dc2add27b..15b36e2efa8 100644 --- a/drivers/usb/class/cdc-acm.c +++ b/drivers/usb/class/cdc-acm.c @@ -410,20 +410,12 @@ static int acm_submit_read_urbs(struct acm *acm, gfp_t mem_flags)  static void acm_process_read_urb(struct acm *acm, struct urb *urb)  { -	struct tty_struct *tty; -  	if (!urb->actual_length)  		return; -	tty = tty_port_tty_get(&acm->port); -	if (!tty) -		return; -  	tty_insert_flip_string(&acm->port, urb->transfer_buffer,  			urb->actual_length); -	tty_flip_buffer_push(tty); - -	tty_kref_put(tty); +	tty_flip_buffer_push(&acm->port);  }  static void acm_read_bulk_callback(struct urb *urb) diff --git a/drivers/usb/gadget/u_serial.c b/drivers/usb/gadget/u_serial.c index 3560799d530..ca4fc3d3e7f 100644 --- a/drivers/usb/gadget/u_serial.c +++ b/drivers/usb/gadget/u_serial.c @@ -551,8 +551,8 @@ static void gs_rx_push(unsigned long _port)  	/* Push from tty to ldisc; without low_latency set this is handled by  	 * a workqueue, so we won't get callbacks and can hold port_lock  	 */ -	if (tty && do_push) -		tty_flip_buffer_push(tty); +	if (do_push) +		tty_flip_buffer_push(&port->port);  	/* We want our data queue to become empty ASAP, keeping data diff --git a/drivers/usb/serial/aircable.c b/drivers/usb/serial/aircable.c index 3bb1f8f11fc..6e320cec397 100644 --- a/drivers/usb/serial/aircable.c +++ b/drivers/usb/serial/aircable.c @@ -140,16 +140,11 @@ static void aircable_process_read_urb(struct urb *urb)  {  	struct usb_serial_port *port = urb->context;  	char *data = (char *)urb->transfer_buffer; -	struct tty_struct *tty;  	int has_headers;  	int count;  	int len;  	int i; -	tty = tty_port_tty_get(&port->port); -	if (!tty) -		return; -  	has_headers = (urb->actual_length > 2 && data[0] == RX_HEADER_0);  	count = 0; @@ -160,8 +155,7 @@ static void aircable_process_read_urb(struct urb *urb)  	}  	if (count) -		tty_flip_buffer_push(tty); -	tty_kref_put(tty); +		tty_flip_buffer_push(&port->port);  }  static struct usb_serial_driver aircable_device = { diff --git a/drivers/usb/serial/ark3116.c b/drivers/usb/serial/ark3116.c index 1614feb6a76..cbd904b8fba 100644 --- a/drivers/usb/serial/ark3116.c +++ b/drivers/usb/serial/ark3116.c @@ -674,7 +674,6 @@ static void ark3116_process_read_urb(struct urb *urb)  {  	struct usb_serial_port *port = urb->context;  	struct ark3116_private *priv = usb_get_serial_port_data(port); -	struct tty_struct *tty;  	unsigned char *data = urb->transfer_buffer;  	char tty_flag = TTY_NORMAL;  	unsigned long flags; @@ -689,10 +688,6 @@ static void ark3116_process_read_urb(struct urb *urb)  	if (!urb->actual_length)  		return; -	tty = tty_port_tty_get(&port->port); -	if (!tty) -		return; -  	if (lsr & UART_LSR_BRK_ERROR_BITS) {  		if (lsr & UART_LSR_BI)  			tty_flag = TTY_BREAK; @@ -707,8 +702,7 @@ static void ark3116_process_read_urb(struct urb *urb)  	}  	tty_insert_flip_string_fixed_flag(&port->port, data, tty_flag,  							urb->actual_length); -	tty_flip_buffer_push(tty); -	tty_kref_put(tty); +	tty_flip_buffer_push(&port->port);  }  static struct usb_serial_driver ark3116_device = { diff --git a/drivers/usb/serial/belkin_sa.c b/drivers/usb/serial/belkin_sa.c index 7ba2c0bdcec..84217e78ded 100644 --- a/drivers/usb/serial/belkin_sa.c +++ b/drivers/usb/serial/belkin_sa.c @@ -242,7 +242,6 @@ static void belkin_sa_process_read_urb(struct urb *urb)  {  	struct usb_serial_port *port = urb->context;  	struct belkin_sa_private *priv = usb_get_serial_port_data(port); -	struct tty_struct *tty;  	unsigned char *data = urb->transfer_buffer;  	unsigned long flags;  	unsigned char status; @@ -259,10 +258,6 @@ static void belkin_sa_process_read_urb(struct urb *urb)  	if (!urb->actual_length)  		return; -	tty = tty_port_tty_get(&port->port); -	if (!tty) -		return; -  	if (status & BELKIN_SA_LSR_ERR) {  		/* Break takes precedence over parity, which takes precedence  		 * over framing errors. */ @@ -281,8 +276,7 @@ static void belkin_sa_process_read_urb(struct urb *urb)  	tty_insert_flip_string_fixed_flag(&port->port, data, tty_flag,  							urb->actual_length); -	tty_flip_buffer_push(tty); -	tty_kref_put(tty); +	tty_flip_buffer_push(&port->port);  }  static void belkin_sa_set_termios(struct tty_struct *tty, diff --git a/drivers/usb/serial/cyberjack.c b/drivers/usb/serial/cyberjack.c index e6976a97447..629bd289450 100644 --- a/drivers/usb/serial/cyberjack.c +++ b/drivers/usb/serial/cyberjack.c @@ -324,7 +324,6 @@ static void cyberjack_read_bulk_callback(struct urb *urb)  	struct usb_serial_port *port = urb->context;  	struct cyberjack_private *priv = usb_get_serial_port_data(port);  	struct device *dev = &port->dev; -	struct tty_struct *tty;  	unsigned char *data = urb->transfer_buffer;  	short todo;  	int result; @@ -337,16 +336,10 @@ static void cyberjack_read_bulk_callback(struct urb *urb)  		return;  	} -	tty = tty_port_tty_get(&port->port); -	if (!tty) { -		dev_dbg(dev, "%s - ignoring since device not open\n", __func__); -		return; -	}  	if (urb->actual_length) {  		tty_insert_flip_string(&port->port, data, urb->actual_length); -		tty_flip_buffer_push(tty); +		tty_flip_buffer_push(&port->port);  	} -	tty_kref_put(tty);  	spin_lock(&priv->lock); diff --git a/drivers/usb/serial/cypress_m8.c b/drivers/usb/serial/cypress_m8.c index ac14e3eb95e..8efa19d0e9f 100644 --- a/drivers/usb/serial/cypress_m8.c +++ b/drivers/usb/serial/cypress_m8.c @@ -1214,10 +1214,10 @@ static void cypress_read_int_callback(struct urb *urb)  		spin_unlock_irqrestore(&priv->lock, flags);  	/* process read if there is data other than line status */ -	if (tty && bytes > i) { +	if (bytes > i) {  		tty_insert_flip_string_fixed_flag(&port->port, data + i,  				tty_flag, bytes - i); -		tty_flip_buffer_push(tty); +		tty_flip_buffer_push(&port->port);  	}  	spin_lock_irqsave(&priv->lock, flags); diff --git a/drivers/usb/serial/digi_acceleport.c b/drivers/usb/serial/digi_acceleport.c index b5fa738512c..ebe45fa0ed5 100644 --- a/drivers/usb/serial/digi_acceleport.c +++ b/drivers/usb/serial/digi_acceleport.c @@ -1399,9 +1399,7 @@ static void digi_read_bulk_callback(struct urb *urb)  static int digi_read_inb_callback(struct urb *urb)  { -  	struct usb_serial_port *port = urb->context; -	struct tty_struct *tty;  	struct digi_port *priv = usb_get_serial_port_data(port);  	int opcode = ((unsigned char *)urb->transfer_buffer)[0];  	int len = ((unsigned char *)urb->transfer_buffer)[1]; @@ -1425,7 +1423,6 @@ static int digi_read_inb_callback(struct urb *urb)  		return -1;  	} -	tty = tty_port_tty_get(&port->port);  	spin_lock(&priv->dp_port_lock);  	/* check for throttle; if set, do not resubmit read urb */ @@ -1435,7 +1432,7 @@ static int digi_read_inb_callback(struct urb *urb)  		priv->dp_throttle_restart = 1;  	/* receive data */ -	if (tty && opcode == DIGI_CMD_RECEIVE_DATA) { +	if (opcode == DIGI_CMD_RECEIVE_DATA) {  		/* get flag from port_status */  		flag = 0; @@ -1457,11 +1454,10 @@ static int digi_read_inb_callback(struct urb *urb)  		if (len > 0) {  			tty_insert_flip_string_fixed_flag(&port->port, data,  					flag, len); -			tty_flip_buffer_push(tty); +			tty_flip_buffer_push(&port->port);  		}  	}  	spin_unlock(&priv->dp_port_lock); -	tty_kref_put(tty);  	if (opcode == DIGI_CMD_RECEIVE_DISABLE)  		dev_dbg(&port->dev, "%s: got RECEIVE_DISABLE\n", __func__); diff --git a/drivers/usb/serial/f81232.c b/drivers/usb/serial/f81232.c index 6b880c33d25..b1b2dc64b50 100644 --- a/drivers/usb/serial/f81232.c +++ b/drivers/usb/serial/f81232.c @@ -100,7 +100,6 @@ static void f81232_process_read_urb(struct urb *urb)  {  	struct usb_serial_port *port = urb->context;  	struct f81232_private *priv = usb_get_serial_port_data(port); -	struct tty_struct *tty;  	unsigned char *data = urb->transfer_buffer;  	char tty_flag = TTY_NORMAL;  	unsigned long flags; @@ -117,10 +116,6 @@ static void f81232_process_read_urb(struct urb *urb)  	if (!urb->actual_length)  		return; -	tty = tty_port_tty_get(&port->port); -	if (!tty) -		return; -  	/* break takes precedence over parity, */  	/* which takes precedence over framing errors */  	if (line_status & UART_BREAK_ERROR) @@ -145,8 +140,7 @@ static void f81232_process_read_urb(struct urb *urb)  							urb->actual_length);  	} -	tty_flip_buffer_push(tty); -	tty_kref_put(tty); +	tty_flip_buffer_push(&port->port);  }  static int set_control_lines(struct usb_device *dev, u8 value) diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c index eb59ba3789a..a96083b7fab 100644 --- a/drivers/usb/serial/ftdi_sio.c +++ b/drivers/usb/serial/ftdi_sio.c @@ -2040,25 +2040,19 @@ static int ftdi_process_packet(struct usb_serial_port *port,  static void ftdi_process_read_urb(struct urb *urb)  {  	struct usb_serial_port *port = urb->context; -	struct tty_struct *tty;  	struct ftdi_private *priv = usb_get_serial_port_data(port);  	char *data = (char *)urb->transfer_buffer;  	int i;  	int len;  	int count = 0; -	tty = tty_port_tty_get(&port->port); -	if (!tty) -		return; -  	for (i = 0; i < urb->actual_length; i += priv->max_packet_size) {  		len = min_t(int, urb->actual_length - i, priv->max_packet_size);  		count += ftdi_process_packet(port, priv, &data[i], len);  	}  	if (count) -		tty_flip_buffer_push(tty); -	tty_kref_put(tty); +		tty_flip_buffer_push(&port->port);  }  static void ftdi_break_ctl(struct tty_struct *tty, int break_state) diff --git a/drivers/usb/serial/garmin_gps.c b/drivers/usb/serial/garmin_gps.c index 498b5f0da63..1a07b12ef34 100644 --- a/drivers/usb/serial/garmin_gps.c +++ b/drivers/usb/serial/garmin_gps.c @@ -252,14 +252,11 @@ static inline int isAbortTrfCmnd(const unsigned char *buf)  static void send_to_tty(struct usb_serial_port *port,  			char *data, unsigned int actual_length)  { -	struct tty_struct *tty = tty_port_tty_get(&port->port); - -	if (tty && actual_length) { +	if (actual_length) {  		usb_serial_debug_data(&port->dev, __func__, actual_length, data);  		tty_insert_flip_string(&port->port, data, actual_length); -		tty_flip_buffer_push(tty); +		tty_flip_buffer_push(&port->port);  	} -	tty_kref_put(tty);  } diff --git a/drivers/usb/serial/generic.c b/drivers/usb/serial/generic.c index 3780f6a501b..4c5c23f1cae 100644 --- a/drivers/usb/serial/generic.c +++ b/drivers/usb/serial/generic.c @@ -313,17 +313,12 @@ EXPORT_SYMBOL_GPL(usb_serial_generic_submit_read_urbs);  void usb_serial_generic_process_read_urb(struct urb *urb)  {  	struct usb_serial_port *port = urb->context; -	struct tty_struct *tty;  	char *ch = (char *)urb->transfer_buffer;  	int i;  	if (!urb->actual_length)  		return; -	tty = tty_port_tty_get(&port->port); -	if (!tty) -		return; -  	/* The per character mucking around with sysrq path it too slow for  	   stuff like 3G modems, so shortcircuit it in the 99.9999999% of cases  	   where the USB serial is not a console anyway */ @@ -335,8 +330,7 @@ void usb_serial_generic_process_read_urb(struct urb *urb)  				tty_insert_flip_char(&port->port, *ch, TTY_NORMAL);  		}  	} -	tty_flip_buffer_push(tty); -	tty_kref_put(tty); +	tty_flip_buffer_push(&port->port);  }  EXPORT_SYMBOL_GPL(usb_serial_generic_process_read_urb); diff --git a/drivers/usb/serial/io_edgeport.c b/drivers/usb/serial/io_edgeport.c index f96b91da964..b00e5cbf741 100644 --- a/drivers/usb/serial/io_edgeport.c +++ b/drivers/usb/serial/io_edgeport.c @@ -232,8 +232,8 @@ static void  process_rcvd_data(struct edgeport_serial *edge_serial,  				unsigned char *buffer, __u16 bufferLength);  static void process_rcvd_status(struct edgeport_serial *edge_serial,  				__u8 byte2, __u8 byte3); -static void edge_tty_recv(struct usb_serial_port *port, struct tty_struct *tty, -				unsigned char *data, int length); +static void edge_tty_recv(struct usb_serial_port *port, unsigned char *data, +		int length);  static void handle_new_msr(struct edgeport_port *edge_port, __u8 newMsr);  static void handle_new_lsr(struct edgeport_port *edge_port, __u8 lsrData,  				__u8 lsr, __u8 data); @@ -1752,7 +1752,6 @@ static void process_rcvd_data(struct edgeport_serial *edge_serial,  	struct device *dev = &edge_serial->serial->dev->dev;  	struct usb_serial_port *port;  	struct edgeport_port *edge_port; -	struct tty_struct *tty;  	__u16 lastBufferLength;  	__u16 rxLen; @@ -1860,14 +1859,11 @@ static void process_rcvd_data(struct edgeport_serial *edge_serial,  							edge_serial->rxPort];  				edge_port = usb_get_serial_port_data(port);  				if (edge_port->open) { -					tty = tty_port_tty_get( -						&edge_port->port->port); -					if (tty) { -						dev_dbg(dev, "%s - Sending %d bytes to TTY for port %d\n", -							__func__, rxLen, edge_serial->rxPort); -						edge_tty_recv(edge_port->port, tty, buffer, rxLen); -						tty_kref_put(tty); -					} +					dev_dbg(dev, "%s - Sending %d bytes to TTY for port %d\n", +						__func__, rxLen, +						edge_serial->rxPort); +					edge_tty_recv(edge_port->port, buffer, +							rxLen);  					edge_port->icount.rx += rxLen;  				}  				buffer += rxLen; @@ -2017,8 +2013,8 @@ static void process_rcvd_status(struct edgeport_serial *edge_serial,   * edge_tty_recv   *	this function passes data on to the tty flip buffer   *****************************************************************************/ -static void edge_tty_recv(struct usb_serial_port *port, struct tty_struct *tty, -					unsigned char *data, int length) +static void edge_tty_recv(struct usb_serial_port *port, unsigned char *data, +		int length)  {  	int cnt; @@ -2030,7 +2026,7 @@ static void edge_tty_recv(struct usb_serial_port *port, struct tty_struct *tty,  	data += cnt;  	length -= cnt; -	tty_flip_buffer_push(tty); +	tty_flip_buffer_push(&port->port);  } @@ -2086,14 +2082,9 @@ static void handle_new_lsr(struct edgeport_port *edge_port, __u8 lsrData,  	}  	/* Place LSR data byte into Rx buffer */ -	if (lsrData) { -		struct tty_struct *tty = -				tty_port_tty_get(&edge_port->port->port); -		if (tty) { -			edge_tty_recv(edge_port->port, tty, &data, 1); -			tty_kref_put(tty); -		} -	} +	if (lsrData) +		edge_tty_recv(edge_port->port, &data, 1); +  	/* update input line counters */  	icount = &edge_port->icount;  	if (newLsr & LSR_BREAK) diff --git a/drivers/usb/serial/io_ti.c b/drivers/usb/serial/io_ti.c index 1286a0b2e2b..d6485be49eb 100644 --- a/drivers/usb/serial/io_ti.c +++ b/drivers/usb/serial/io_ti.c @@ -201,8 +201,8 @@ static int closing_wait = EDGE_CLOSING_WAIT;  static bool ignore_cpu_rev;  static int default_uart_mode;		/* RS232 */ -static void edge_tty_recv(struct usb_serial_port *port, struct tty_struct *tty, -			  unsigned char *data, int length); +static void edge_tty_recv(struct usb_serial_port *port, unsigned char *data, +		int length);  static void stop_read(struct edgeport_port *edge_port);  static int restart_read(struct edgeport_port *edge_port); @@ -1540,7 +1540,6 @@ static void handle_new_lsr(struct edgeport_port *edge_port, int lsr_data,  	struct async_icount *icount;  	__u8 new_lsr = (__u8)(lsr & (__u8)(LSR_OVER_ERR | LSR_PAR_ERR |  						LSR_FRM_ERR | LSR_BREAK)); -	struct tty_struct *tty;  	dev_dbg(&edge_port->port->dev, "%s - %02x\n", __func__, new_lsr); @@ -1554,13 +1553,8 @@ static void handle_new_lsr(struct edgeport_port *edge_port, int lsr_data,  		new_lsr &= (__u8)(LSR_OVER_ERR | LSR_BREAK);  	/* Place LSR data byte into Rx buffer */ -	if (lsr_data) { -		tty = tty_port_tty_get(&edge_port->port->port); -		if (tty) { -			edge_tty_recv(edge_port->port, tty, &data, 1); -			tty_kref_put(tty); -		} -	} +	if (lsr_data) +		edge_tty_recv(edge_port->port, &data, 1);  	/* update input line counters */  	icount = &edge_port->icount; @@ -1676,7 +1670,6 @@ static void edge_bulk_in_callback(struct urb *urb)  	struct edgeport_port *edge_port = urb->context;  	struct device *dev = &edge_port->port->dev;  	unsigned char *data = urb->transfer_buffer; -	struct tty_struct *tty;  	int retval = 0;  	int port_number;  	int status = urb->status; @@ -1715,18 +1708,16 @@ static void edge_bulk_in_callback(struct urb *urb)  		++data;  	} -	tty = tty_port_tty_get(&edge_port->port->port); -	if (tty && urb->actual_length) { +	if (urb->actual_length) {  		usb_serial_debug_data(dev, __func__, urb->actual_length, data);  		if (edge_port->close_pending)  			dev_dbg(dev, "%s - close pending, dropping data on the floor\n",  								__func__);  		else -			edge_tty_recv(edge_port->port, tty, data, +			edge_tty_recv(edge_port->port, data,  					urb->actual_length);  		edge_port->icount.rx += urb->actual_length;  	} -	tty_kref_put(tty);  exit:  	/* continue read unless stopped */ @@ -1741,8 +1732,8 @@ exit:  		dev_err(dev, "%s - usb_submit_urb failed with result %d\n", __func__, retval);  } -static void edge_tty_recv(struct usb_serial_port *port, struct tty_struct *tty, -					unsigned char *data, int length) +static void edge_tty_recv(struct usb_serial_port *port, unsigned char *data, +		int length)  {  	int queued; @@ -1750,7 +1741,7 @@ static void edge_tty_recv(struct usb_serial_port *port, struct tty_struct *tty,  	if (queued < length)  		dev_err(&port->dev, "%s - dropping data, %d bytes lost\n",  			__func__, length - queued); -	tty_flip_buffer_push(tty); +	tty_flip_buffer_push(&port->port);  }  static void edge_bulk_out_callback(struct urb *urb) diff --git a/drivers/usb/serial/ir-usb.c b/drivers/usb/serial/ir-usb.c index 171dae1f4a6..716930ab1bb 100644 --- a/drivers/usb/serial/ir-usb.c +++ b/drivers/usb/serial/ir-usb.c @@ -287,7 +287,6 @@ static void ir_process_read_urb(struct urb *urb)  {  	struct usb_serial_port *port = urb->context;  	unsigned char *data = urb->transfer_buffer; -	struct tty_struct *tty;  	if (!urb->actual_length)  		return; @@ -302,12 +301,8 @@ static void ir_process_read_urb(struct urb *urb)  	if (urb->actual_length == 1)  		return; -	tty = tty_port_tty_get(&port->port); -	if (!tty) -		return;  	tty_insert_flip_string(&port->port, data + 1, urb->actual_length - 1); -	tty_flip_buffer_push(tty); -	tty_kref_put(tty); +	tty_flip_buffer_push(&port->port);  }  static void ir_set_termios_callback(struct urb *urb) diff --git a/drivers/usb/serial/iuu_phoenix.c b/drivers/usb/serial/iuu_phoenix.c index dd0d910730c..ff77027160a 100644 --- a/drivers/usb/serial/iuu_phoenix.c +++ b/drivers/usb/serial/iuu_phoenix.c @@ -581,7 +581,6 @@ static void read_buf_callback(struct urb *urb)  {  	struct usb_serial_port *port = urb->context;  	unsigned char *data = urb->transfer_buffer; -	struct tty_struct *tty;  	int status = urb->status;  	if (status) { @@ -592,14 +591,12 @@ static void read_buf_callback(struct urb *urb)  	}  	dev_dbg(&port->dev, "%s - %i chars to write\n", __func__, urb->actual_length); -	tty = tty_port_tty_get(&port->port);  	if (data == NULL)  		dev_dbg(&port->dev, "%s - data is NULL !!!\n", __func__); -	if (tty && urb->actual_length && data) { +	if (urb->actual_length && data) {  		tty_insert_flip_string(&port->port, data, urb->actual_length); -		tty_flip_buffer_push(tty); +		tty_flip_buffer_push(&port->port);  	} -	tty_kref_put(tty);  	iuu_led_activity_on(urb);  } diff --git a/drivers/usb/serial/keyspan.c b/drivers/usb/serial/keyspan.c index 14a219ba4ee..f6d7f68fa43 100644 --- a/drivers/usb/serial/keyspan.c +++ b/drivers/usb/serial/keyspan.c @@ -291,7 +291,6 @@ static void	usa26_indat_callback(struct urb *urb)  	int			i, err;  	int			endpoint;  	struct usb_serial_port	*port; -	struct tty_struct	*tty;  	unsigned char 		*data = urb->transfer_buffer;  	int status = urb->status; @@ -304,8 +303,7 @@ static void	usa26_indat_callback(struct urb *urb)  	}  	port =  urb->context; -	tty = tty_port_tty_get(&port->port); -	if (tty && urb->actual_length) { +	if (urb->actual_length) {  		/* 0x80 bit is error flag */  		if ((data[0] & 0x80) == 0) {  			/* no errors on individual bytes, only @@ -332,9 +330,8 @@ static void	usa26_indat_callback(struct urb *urb)  						flag);  			}  		} -		tty_flip_buffer_push(tty); +		tty_flip_buffer_push(&port->port);  	} -	tty_kref_put(tty);  	/* Resubmit urb so we continue receiving */  	err = usb_submit_urb(urb, GFP_ATOMIC); @@ -447,7 +444,6 @@ static void usa28_indat_callback(struct urb *urb)  {  	int                     err;  	struct usb_serial_port  *port; -	struct tty_struct       *tty;  	unsigned char           *data;  	struct keyspan_port_private             *p_priv;  	int status = urb->status; @@ -470,13 +466,11 @@ static void usa28_indat_callback(struct urb *urb)  		p_priv = usb_get_serial_port_data(port);  		data = urb->transfer_buffer; -		tty = tty_port_tty_get(&port->port); -		if (tty && urb->actual_length) { +		if (urb->actual_length) {  			tty_insert_flip_string(&port->port, data,  					urb->actual_length); -			tty_flip_buffer_push(tty); +			tty_flip_buffer_push(&port->port);  		} -		tty_kref_put(tty);  		/* Resubmit urb so we continue receiving */  		err = usb_submit_urb(urb, GFP_ATOMIC); @@ -671,7 +665,6 @@ static void	usa49_indat_callback(struct urb *urb)  	int			i, err;  	int			endpoint;  	struct usb_serial_port	*port; -	struct tty_struct	*tty;  	unsigned char 		*data = urb->transfer_buffer;  	int status = urb->status; @@ -684,8 +677,7 @@ static void	usa49_indat_callback(struct urb *urb)  	}  	port =  urb->context; -	tty = tty_port_tty_get(&port->port); -	if (tty && urb->actual_length) { +	if (urb->actual_length) {  		/* 0x80 bit is error flag */  		if ((data[0] & 0x80) == 0) {  			/* no error on any byte */ @@ -706,9 +698,8 @@ static void	usa49_indat_callback(struct urb *urb)  						flag);  			}  		} -		tty_flip_buffer_push(tty); +		tty_flip_buffer_push(&port->port);  	} -	tty_kref_put(tty);  	/* Resubmit urb so we continue receiving */  	err = usb_submit_urb(urb, GFP_ATOMIC); @@ -721,7 +712,6 @@ static void usa49wg_indat_callback(struct urb *urb)  	int			i, len, x, err;  	struct usb_serial	*serial;  	struct usb_serial_port	*port; -	struct tty_struct	*tty;  	unsigned char 		*data = urb->transfer_buffer;  	int status = urb->status; @@ -746,7 +736,6 @@ static void usa49wg_indat_callback(struct urb *urb)  				return;  			}  			port = serial->port[data[i++]]; -			tty = tty_port_tty_get(&port->port);  			len = data[i++];  			/* 0x80 bit is error flag */ @@ -774,8 +763,7 @@ static void usa49wg_indat_callback(struct urb *urb)  					i += 2;  				}  			} -			tty_flip_buffer_push(tty); -			tty_kref_put(tty); +			tty_flip_buffer_push(&port->port);  		}  	} @@ -796,7 +784,6 @@ static void usa90_indat_callback(struct urb *urb)  	int			endpoint;  	struct usb_serial_port	*port;  	struct keyspan_port_private	 	*p_priv; -	struct tty_struct	*tty;  	unsigned char 		*data = urb->transfer_buffer;  	int status = urb->status; @@ -812,7 +799,6 @@ static void usa90_indat_callback(struct urb *urb)  	p_priv = usb_get_serial_port_data(port);  	if (urb->actual_length) { -		tty = tty_port_tty_get(&port->port);  		/* if current mode is DMA, looks like usa28 format  		   otherwise looks like usa26 data format */ @@ -848,8 +834,7 @@ static void usa90_indat_callback(struct urb *urb)  				}  			}  		} -		tty_flip_buffer_push(tty); -		tty_kref_put(tty); +		tty_flip_buffer_push(&port->port);  	}  	/* Resubmit urb so we continue receiving */ diff --git a/drivers/usb/serial/keyspan_pda.c b/drivers/usb/serial/keyspan_pda.c index 334b1a295c6..3b17d5d13dc 100644 --- a/drivers/usb/serial/keyspan_pda.c +++ b/drivers/usb/serial/keyspan_pda.c @@ -138,7 +138,6 @@ static void keyspan_pda_request_unthrottle(struct work_struct *work)  static void keyspan_pda_rx_interrupt(struct urb *urb)  {  	struct usb_serial_port *port = urb->context; -	struct tty_struct *tty;  	unsigned char *data = urb->transfer_buffer;  	int retval;  	int status = urb->status; @@ -163,14 +162,12 @@ static void keyspan_pda_rx_interrupt(struct urb *urb)  	/* see if the message is data or a status interrupt */  	switch (data[0]) {  	case 0: -		tty = tty_port_tty_get(&port->port);  		 /* rest of message is rx data */ -		if (tty && urb->actual_length) { +		if (urb->actual_length) {  			tty_insert_flip_string(&port->port, data + 1,  						urb->actual_length - 1); -			tty_flip_buffer_push(tty); +			tty_flip_buffer_push(&port->port);  		} -		tty_kref_put(tty);  		break;  	case 1:  		/* status interrupt */ diff --git a/drivers/usb/serial/kl5kusb105.c b/drivers/usb/serial/kl5kusb105.c index 8ee0825ad70..769d910ae0a 100644 --- a/drivers/usb/serial/kl5kusb105.c +++ b/drivers/usb/serial/kl5kusb105.c @@ -389,7 +389,6 @@ static void klsi_105_process_read_urb(struct urb *urb)  {  	struct usb_serial_port *port = urb->context;  	unsigned char *data = urb->transfer_buffer; -	struct tty_struct *tty;  	unsigned len;  	/* empty urbs seem to happen, we ignore them */ @@ -401,10 +400,6 @@ static void klsi_105_process_read_urb(struct urb *urb)  		return;  	} -	tty = tty_port_tty_get(&port->port); -	if (!tty) -		return; -  	len = get_unaligned_le16(data);  	if (len > urb->actual_length - KLSI_HDR_LEN) {  		dev_dbg(&port->dev, "%s - packet length mismatch\n", __func__); @@ -412,8 +407,7 @@ static void klsi_105_process_read_urb(struct urb *urb)  	}  	tty_insert_flip_string(&port->port, data + KLSI_HDR_LEN, len); -	tty_flip_buffer_push(tty); -	tty_kref_put(tty); +	tty_flip_buffer_push(&port->port);  }  static void klsi_105_set_termios(struct tty_struct *tty, diff --git a/drivers/usb/serial/kobil_sct.c b/drivers/usb/serial/kobil_sct.c index 135c8b4b26f..903d938e174 100644 --- a/drivers/usb/serial/kobil_sct.c +++ b/drivers/usb/serial/kobil_sct.c @@ -324,7 +324,6 @@ static void kobil_read_int_callback(struct urb *urb)  {  	int result;  	struct usb_serial_port *port = urb->context; -	struct tty_struct *tty;  	unsigned char *data = urb->transfer_buffer;  	int status = urb->status; @@ -333,8 +332,7 @@ static void kobil_read_int_callback(struct urb *urb)  		return;  	} -	tty = tty_port_tty_get(&port->port); -	if (tty && urb->actual_length) { +	if (urb->actual_length) {  		/* BEGIN DEBUG */  		/* @@ -354,9 +352,8 @@ static void kobil_read_int_callback(struct urb *urb)  		/* END DEBUG */  		tty_insert_flip_string(&port->port, data, urb->actual_length); -		tty_flip_buffer_push(tty); +		tty_flip_buffer_push(&port->port);  	} -	tty_kref_put(tty);  	result = usb_submit_urb(port->interrupt_in_urb, GFP_ATOMIC);  	dev_dbg(&port->dev, "%s - Send read URB returns: %i\n", __func__, result); diff --git a/drivers/usb/serial/mct_u232.c b/drivers/usb/serial/mct_u232.c index ba20bb037b2..f42528e05d7 100644 --- a/drivers/usb/serial/mct_u232.c +++ b/drivers/usb/serial/mct_u232.c @@ -531,7 +531,6 @@ static void mct_u232_read_int_callback(struct urb *urb)  {  	struct usb_serial_port *port = urb->context;  	struct mct_u232_private *priv = usb_get_serial_port_data(port); -	struct tty_struct *tty;  	unsigned char *data = urb->transfer_buffer;  	int retval;  	int status = urb->status; @@ -561,13 +560,9 @@ static void mct_u232_read_int_callback(struct urb *urb)  	 */  	if (urb->transfer_buffer_length > 2) {  		if (urb->actual_length) { -			tty = tty_port_tty_get(&port->port); -			if (tty) { -				tty_insert_flip_string(&port->port, data, -						urb->actual_length); -				tty_flip_buffer_push(tty); -			} -			tty_kref_put(tty); +			tty_insert_flip_string(&port->port, data, +					urb->actual_length); +			tty_flip_buffer_push(&port->port);  		}  		goto exit;  	} diff --git a/drivers/usb/serial/metro-usb.c b/drivers/usb/serial/metro-usb.c index 6264f3974ea..bf3c7a23553 100644 --- a/drivers/usb/serial/metro-usb.c +++ b/drivers/usb/serial/metro-usb.c @@ -95,7 +95,6 @@ static void metrousb_read_int_callback(struct urb *urb)  {  	struct usb_serial_port *port = urb->context;  	struct metrousb_private *metro_priv = usb_get_serial_port_data(port); -	struct tty_struct *tty;  	unsigned char *data = urb->transfer_buffer;  	int throttled = 0;  	int result = 0; @@ -124,15 +123,13 @@ static void metrousb_read_int_callback(struct urb *urb)  	/* Set the data read from the usb port into the serial port buffer. */ -	tty = tty_port_tty_get(&port->port); -	if (tty && urb->actual_length) { +	if (urb->actual_length) {  		/* Loop through the data copying each byte to the tty layer. */  		tty_insert_flip_string(&port->port, data, urb->actual_length);  		/* Force the data to the tty layer. */ -		tty_flip_buffer_push(tty); +		tty_flip_buffer_push(&port->port);  	} -	tty_kref_put(tty);  	/* Set any port variables. */  	spin_lock_irqsave(&metro_priv->lock, flags); diff --git a/drivers/usb/serial/mos7720.c b/drivers/usb/serial/mos7720.c index 22818fb765e..e0ebec3b5d6 100644 --- a/drivers/usb/serial/mos7720.c +++ b/drivers/usb/serial/mos7720.c @@ -899,7 +899,6 @@ static void mos7720_bulk_in_callback(struct urb *urb)  	int retval;  	unsigned char *data ;  	struct usb_serial_port *port; -	struct tty_struct *tty;  	int status = urb->status;  	if (status) { @@ -913,12 +912,10 @@ static void mos7720_bulk_in_callback(struct urb *urb)  	data = urb->transfer_buffer; -	tty = tty_port_tty_get(&port->port); -	if (tty && urb->actual_length) { +	if (urb->actual_length) {  		tty_insert_flip_string(&port->port, data, urb->actual_length); -		tty_flip_buffer_push(tty); +		tty_flip_buffer_push(&port->port);  	} -	tty_kref_put(tty);  	if (port->read_urb->status != -EINPROGRESS) {  		retval = usb_submit_urb(port->read_urb, GFP_ATOMIC); diff --git a/drivers/usb/serial/mos7840.c b/drivers/usb/serial/mos7840.c index 3ddd7a1f7ff..809fb329eca 100644 --- a/drivers/usb/serial/mos7840.c +++ b/drivers/usb/serial/mos7840.c @@ -744,7 +744,6 @@ static void mos7840_bulk_in_callback(struct urb *urb)  	struct usb_serial *serial;  	struct usb_serial_port *port;  	struct moschip_port *mos7840_port; -	struct tty_struct *tty;  	int status = urb->status;  	mos7840_port = urb->context; @@ -774,12 +773,8 @@ static void mos7840_bulk_in_callback(struct urb *urb)  	if (urb->actual_length) {  		struct tty_port *tport = &mos7840_port->port->port; -		tty = tty_port_tty_get(tport); -		if (tty) { -			tty_insert_flip_string(tport, data, urb->actual_length); -			tty_flip_buffer_push(tty); -			tty_kref_put(tty); -		} +		tty_insert_flip_string(tport, data, urb->actual_length); +		tty_flip_buffer_push(tport);  		mos7840_port->icount.rx += urb->actual_length;  		smp_wmb();  		dev_dbg(&port->dev, "mos7840_port->icount.rx is %d:\n", mos7840_port->icount.rx); diff --git a/drivers/usb/serial/navman.c b/drivers/usb/serial/navman.c index 0d96a1a7b9e..38725fc8c2c 100644 --- a/drivers/usb/serial/navman.c +++ b/drivers/usb/serial/navman.c @@ -32,7 +32,6 @@ static void navman_read_int_callback(struct urb *urb)  {  	struct usb_serial_port *port = urb->context;  	unsigned char *data = urb->transfer_buffer; -	struct tty_struct *tty;  	int status = urb->status;  	int result; @@ -55,12 +54,10 @@ static void navman_read_int_callback(struct urb *urb)  	usb_serial_debug_data(&port->dev, __func__, urb->actual_length, data); -	tty = tty_port_tty_get(&port->port); -	if (tty && urb->actual_length) { +	if (urb->actual_length) {  		tty_insert_flip_string(&port->port, data, urb->actual_length); -		tty_flip_buffer_push(tty); +		tty_flip_buffer_push(&port->port);  	} -	tty_kref_put(tty);  exit:  	result = usb_submit_urb(urb, GFP_ATOMIC); diff --git a/drivers/usb/serial/omninet.c b/drivers/usb/serial/omninet.c index 338191bae5a..1e1cafe287e 100644 --- a/drivers/usb/serial/omninet.c +++ b/drivers/usb/serial/omninet.c @@ -174,14 +174,9 @@ static void omninet_read_bulk_callback(struct urb *urb)  	}  	if (urb->actual_length && header->oh_len) { -		struct tty_struct *tty = tty_port_tty_get(&port->port); -		if (tty) { -			tty_insert_flip_string(&port->port, -					data + OMNINET_DATAOFFSET, -					header->oh_len); -			tty_flip_buffer_push(tty); -			tty_kref_put(tty); -		} +		tty_insert_flip_string(&port->port, data + OMNINET_DATAOFFSET, +				header->oh_len); +		tty_flip_buffer_push(&port->port);  	}  	/* Continue trying to always read  */ diff --git a/drivers/usb/serial/opticon.c b/drivers/usb/serial/opticon.c index d3b74e50aff..e13e1a4d3e1 100644 --- a/drivers/usb/serial/opticon.c +++ b/drivers/usb/serial/opticon.c @@ -51,15 +51,8 @@ struct opticon_private {  static void opticon_process_data_packet(struct usb_serial_port *port,  					const unsigned char *buf, size_t len)  { -	struct tty_struct *tty; - -	tty = tty_port_tty_get(&port->port); -	if (!tty) -		return; -  	tty_insert_flip_string(&port->port, buf, len); -	tty_flip_buffer_push(tty); -	tty_kref_put(tty); +	tty_flip_buffer_push(&port->port);  }  static void opticon_process_status_packet(struct usb_serial_port *port, diff --git a/drivers/usb/serial/oti6858.c b/drivers/usb/serial/oti6858.c index 7a53fe9f3af..a958fd41b5b 100644 --- a/drivers/usb/serial/oti6858.c +++ b/drivers/usb/serial/oti6858.c @@ -820,7 +820,6 @@ static void oti6858_read_bulk_callback(struct urb *urb)  {  	struct usb_serial_port *port =  urb->context;  	struct oti6858_private *priv = usb_get_serial_port_data(port); -	struct tty_struct *tty;  	unsigned char *data = urb->transfer_buffer;  	unsigned long flags;  	int status = urb->status; @@ -835,12 +834,10 @@ static void oti6858_read_bulk_callback(struct urb *urb)  		return;  	} -	tty = tty_port_tty_get(&port->port); -	if (tty != NULL && urb->actual_length > 0) { +	if (urb->actual_length > 0) {  		tty_insert_flip_string(&port->port, data, urb->actual_length); -		tty_flip_buffer_push(tty); +		tty_flip_buffer_push(&port->port);  	} -	tty_kref_put(tty);  	/* schedule the interrupt urb */  	result = usb_submit_urb(port->interrupt_in_urb, GFP_ATOMIC); diff --git a/drivers/usb/serial/pl2303.c b/drivers/usb/serial/pl2303.c index 00047f3c729..54adc9125e5 100644 --- a/drivers/usb/serial/pl2303.c +++ b/drivers/usb/serial/pl2303.c @@ -772,7 +772,6 @@ static void pl2303_process_read_urb(struct urb *urb)  {  	struct usb_serial_port *port = urb->context;  	struct pl2303_private *priv = usb_get_serial_port_data(port); -	struct tty_struct *tty;  	unsigned char *data = urb->transfer_buffer;  	char tty_flag = TTY_NORMAL;  	unsigned long flags; @@ -789,10 +788,6 @@ static void pl2303_process_read_urb(struct urb *urb)  	if (!urb->actual_length)  		return; -	tty = tty_port_tty_get(&port->port); -	if (!tty) -		return; -  	/* break takes precedence over parity, */  	/* which takes precedence over framing errors */  	if (line_status & UART_BREAK_ERROR) @@ -817,8 +812,7 @@ static void pl2303_process_read_urb(struct urb *urb)  							urb->actual_length);  	} -	tty_flip_buffer_push(tty); -	tty_kref_put(tty); +	tty_flip_buffer_push(&port->port);  }  /* All of the device info needed for the PL2303 SIO serial converter */ diff --git a/drivers/usb/serial/quatech2.c b/drivers/usb/serial/quatech2.c index 5dccc4f957d..6850745808c 100644 --- a/drivers/usb/serial/quatech2.c +++ b/drivers/usb/serial/quatech2.c @@ -609,7 +609,6 @@ void qt2_process_read_urb(struct urb *urb)  	struct qt2_serial_private *serial_priv;  	struct usb_serial_port *port;  	struct qt2_port_private *port_priv; -	struct tty_struct *tty;  	bool escapeflag;  	unsigned char *ch;  	int i; @@ -620,15 +619,11 @@ void qt2_process_read_urb(struct urb *urb)  		return;  	ch = urb->transfer_buffer; -	tty = NULL;  	serial = urb->context;  	serial_priv = usb_get_serial_data(serial);  	port = serial->port[serial_priv->current_port];  	port_priv = usb_get_serial_port_data(port); -	if (port_priv->is_open) -		tty = tty_port_tty_get(&port->port); -  	for (i = 0; i < urb->actual_length; i++) {  		ch = (unsigned char *)urb->transfer_buffer + i;  		if ((i <= (len - 3)) && @@ -666,10 +661,7 @@ void qt2_process_read_urb(struct urb *urb)  						 __func__);  					break;  				} -				if (tty) { -					tty_flip_buffer_push(tty); -					tty_kref_put(tty); -				} +				tty_flip_buffer_push(&port->port);  				newport = *(ch + 3); @@ -683,10 +675,6 @@ void qt2_process_read_urb(struct urb *urb)  				serial_priv->current_port = newport;  				port = serial->port[serial_priv->current_port];  				port_priv = usb_get_serial_port_data(port); -				if (port_priv->is_open) -					tty = tty_port_tty_get(&port->port); -				else -					tty = NULL;  				i += 3;  				escapeflag = true;  				break; @@ -716,10 +704,7 @@ void qt2_process_read_urb(struct urb *urb)  		tty_insert_flip_string(&port->port, ch, 1);  	} -	if (tty) { -		tty_flip_buffer_push(tty); -		tty_kref_put(tty); -	} +	tty_flip_buffer_push(&port->port);  }  static void qt2_write_bulk_callback(struct urb *urb) diff --git a/drivers/usb/serial/safe_serial.c b/drivers/usb/serial/safe_serial.c index ad12e9e2c7e..21cd7bf2a8c 100644 --- a/drivers/usb/serial/safe_serial.c +++ b/drivers/usb/serial/safe_serial.c @@ -207,38 +207,31 @@ static void safe_process_read_urb(struct urb *urb)  	unsigned char *data = urb->transfer_buffer;  	unsigned char length = urb->actual_length;  	int actual_length; -	struct tty_struct *tty;  	__u16 fcs;  	if (!length)  		return; -	tty = tty_port_tty_get(&port->port); -	if (!tty) -		return; -  	if (!safe)  		goto out;  	fcs = fcs_compute10(data, length, CRC10_INITFCS);  	if (fcs) {  		dev_err(&port->dev, "%s - bad CRC %x\n", __func__, fcs); -		goto err; +		return;  	}  	actual_length = data[length - 2] >> 2;  	if (actual_length > (length - 2)) {  		dev_err(&port->dev, "%s - inconsistent lengths %d:%d\n",  				__func__, actual_length, length); -		goto err; +		return;  	}  	dev_info(&urb->dev->dev, "%s - actual: %d\n", __func__, actual_length);  	length = actual_length;  out:  	tty_insert_flip_string(&port->port, data, length); -	tty_flip_buffer_push(tty); -err: -	tty_kref_put(tty); +	tty_flip_buffer_push(&port->port);  }  static int safe_prepare_write_buffer(struct usb_serial_port *port, diff --git a/drivers/usb/serial/sierra.c b/drivers/usb/serial/sierra.c index 64e53fda149..70aee8d59f2 100644 --- a/drivers/usb/serial/sierra.c +++ b/drivers/usb/serial/sierra.c @@ -569,7 +569,6 @@ static void sierra_indat_callback(struct urb *urb)  	int err;  	int endpoint;  	struct usb_serial_port *port; -	struct tty_struct *tty;  	unsigned char *data = urb->transfer_buffer;  	int status = urb->status; @@ -581,16 +580,12 @@ static void sierra_indat_callback(struct urb *urb)  			" endpoint %02x\n", __func__, status, endpoint);  	} else {  		if (urb->actual_length) { -			tty = tty_port_tty_get(&port->port); -			if (tty) { -				tty_insert_flip_string(&port->port, data, -					urb->actual_length); -				tty_flip_buffer_push(tty); +			tty_insert_flip_string(&port->port, data, +				urb->actual_length); +			tty_flip_buffer_push(&port->port); -				tty_kref_put(tty); -				usb_serial_debug_data(&port->dev, __func__, -						      urb->actual_length, data); -			} +			usb_serial_debug_data(&port->dev, __func__, +					      urb->actual_length, data);  		} else {  			dev_dbg(&port->dev, "%s: empty read urb"  				" received\n", __func__); diff --git a/drivers/usb/serial/spcp8x5.c b/drivers/usb/serial/spcp8x5.c index 04e37315272..91ff8e3bddb 100644 --- a/drivers/usb/serial/spcp8x5.c +++ b/drivers/usb/serial/spcp8x5.c @@ -462,7 +462,6 @@ static void spcp8x5_process_read_urb(struct urb *urb)  {  	struct usb_serial_port *port = urb->context;  	struct spcp8x5_private *priv = usb_get_serial_port_data(port); -	struct tty_struct *tty;  	unsigned char *data = urb->transfer_buffer;  	unsigned long flags;  	u8 status; @@ -481,9 +480,6 @@ static void spcp8x5_process_read_urb(struct urb *urb)  	if (!urb->actual_length)  		return; -	tty = tty_port_tty_get(&port->port); -	if (!tty) -		return;  	if (status & UART_STATE_TRANSIENT_MASK) {  		/* break takes precedence over parity, which takes precedence @@ -500,15 +496,19 @@ static void spcp8x5_process_read_urb(struct urb *urb)  		if (status & UART_OVERRUN_ERROR)  			tty_insert_flip_char(&port->port, 0, TTY_OVERRUN); -		if (status & UART_DCD) -			usb_serial_handle_dcd_change(port, tty, -				   priv->line_status & MSR_STATUS_LINE_DCD); +		if (status & UART_DCD) { +			struct tty_struct *tty = tty_port_tty_get(&port->port); +			if (tty) { +				usb_serial_handle_dcd_change(port, tty, +				       priv->line_status & MSR_STATUS_LINE_DCD); +				tty_kref_put(tty); +			} +		}  	}  	tty_insert_flip_string_fixed_flag(&port->port, data, tty_flag,  							urb->actual_length); -	tty_flip_buffer_push(tty); -	tty_kref_put(tty); +	tty_flip_buffer_push(&port->port);  }  static int spcp8x5_wait_modem_info(struct usb_serial_port *port, diff --git a/drivers/usb/serial/ssu100.c b/drivers/usb/serial/ssu100.c index 38713156e95..58bc7e79352 100644 --- a/drivers/usb/serial/ssu100.c +++ b/drivers/usb/serial/ssu100.c @@ -582,7 +582,7 @@ static void ssu100_update_lsr(struct usb_serial_port *port, u8 lsr,  } -static int ssu100_process_packet(struct urb *urb) +static void ssu100_process_read_urb(struct urb *urb)  {  	struct usb_serial_port *port = urb->context;  	char *packet = (char *)urb->transfer_buffer; @@ -609,7 +609,7 @@ static int ssu100_process_packet(struct urb *urb)  		ch = packet;  	if (!len) -		return 0;	/* status only */ +		return;	/* status only */  	if (port->port.console && port->sysrq) {  		for (i = 0; i < len; i++, ch++) { @@ -619,24 +619,7 @@ static int ssu100_process_packet(struct urb *urb)  	} else  		tty_insert_flip_string_fixed_flag(&port->port, ch, flag, len); -	return len; -} - -static void ssu100_process_read_urb(struct urb *urb) -{ -	struct usb_serial_port *port = urb->context; -	struct tty_struct *tty; -	int count; - -	tty = tty_port_tty_get(&port->port); -	if (!tty) -		return; - -	count = ssu100_process_packet(urb); - -	if (count) -		tty_flip_buffer_push(tty); -	tty_kref_put(tty); +	tty_flip_buffer_push(&port->port);  }  static struct usb_serial_driver ssu100_device = { diff --git a/drivers/usb/serial/symbolserial.c b/drivers/usb/serial/symbolserial.c index 2ffa6ae3b5e..be05e6caf9a 100644 --- a/drivers/usb/serial/symbolserial.c +++ b/drivers/usb/serial/symbolserial.c @@ -48,7 +48,6 @@ static void symbol_int_callback(struct urb *urb)  	unsigned char *data = urb->transfer_buffer;  	struct usb_serial_port *port = priv->port;  	int status = urb->status; -	struct tty_struct *tty;  	int result;  	int data_length; @@ -82,13 +81,8 @@ static void symbol_int_callback(struct urb *urb)  		 * we pretty much just ignore the size and send everything  		 * else to the tty layer.  		 */ -		tty = tty_port_tty_get(&port->port); -		if (tty) { -			tty_insert_flip_string(&port->port, &data[1], -					data_length); -			tty_flip_buffer_push(tty); -			tty_kref_put(tty); -		} +		tty_insert_flip_string(&port->port, &data[1], data_length); +		tty_flip_buffer_push(&port->port);  	} else {  		dev_dbg(&priv->udev->dev,  			"Improper amount of data received from the device, " diff --git a/drivers/usb/serial/ti_usb_3410_5052.c b/drivers/usb/serial/ti_usb_3410_5052.c index 05077e3c763..39cb9b807c3 100644 --- a/drivers/usb/serial/ti_usb_3410_5052.c +++ b/drivers/usb/serial/ti_usb_3410_5052.c @@ -121,8 +121,8 @@ static void ti_interrupt_callback(struct urb *urb);  static void ti_bulk_in_callback(struct urb *urb);  static void ti_bulk_out_callback(struct urb *urb); -static void ti_recv(struct usb_serial_port *port, struct tty_struct *tty, -	unsigned char *data, int length); +static void ti_recv(struct usb_serial_port *port, unsigned char *data, +		int length);  static void ti_send(struct ti_port *tport);  static int ti_set_mcr(struct ti_port *tport, unsigned int mcr);  static int ti_get_lsr(struct ti_port *tport); @@ -1118,7 +1118,6 @@ static void ti_bulk_in_callback(struct urb *urb)  	struct device *dev = &urb->dev->dev;  	int status = urb->status;  	int retval = 0; -	struct tty_struct *tty;  	switch (status) {  	case 0: @@ -1145,23 +1144,18 @@ static void ti_bulk_in_callback(struct urb *urb)  		return;  	} -	tty = tty_port_tty_get(&port->port); -	if (tty) { -		if (urb->actual_length) { -			usb_serial_debug_data(dev, __func__, urb->actual_length, -					      urb->transfer_buffer); +	if (urb->actual_length) { +		usb_serial_debug_data(dev, __func__, urb->actual_length, +				      urb->transfer_buffer); -			if (!tport->tp_is_open) -				dev_dbg(dev, "%s - port closed, dropping data\n", -					__func__); -			else -				ti_recv(port, tty, urb->transfer_buffer, -						urb->actual_length); -			spin_lock(&tport->tp_lock); -			tport->tp_icount.rx += urb->actual_length; -			spin_unlock(&tport->tp_lock); -		} -		tty_kref_put(tty); +		if (!tport->tp_is_open) +			dev_dbg(dev, "%s - port closed, dropping data\n", +				__func__); +		else +			ti_recv(port, urb->transfer_buffer, urb->actual_length); +		spin_lock(&tport->tp_lock); +		tport->tp_icount.rx += urb->actual_length; +		spin_unlock(&tport->tp_lock);  	}  exit: @@ -1209,8 +1203,8 @@ static void ti_bulk_out_callback(struct urb *urb)  } -static void ti_recv(struct usb_serial_port *port, struct tty_struct *tty, -	unsigned char *data, int length) +static void ti_recv(struct usb_serial_port *port, unsigned char *data, +		int length)  {  	int cnt; @@ -1222,11 +1216,10 @@ static void ti_recv(struct usb_serial_port *port, struct tty_struct *tty,  			if (cnt == 0)  				break;  		} -		tty_flip_buffer_push(tty); +		tty_flip_buffer_push(&port->port);  		data += cnt;  		length -= cnt;  	} while (length > 0); -  } diff --git a/drivers/usb/serial/usb_wwan.c b/drivers/usb/serial/usb_wwan.c index 293b460030c..a547c91e3c0 100644 --- a/drivers/usb/serial/usb_wwan.c +++ b/drivers/usb/serial/usb_wwan.c @@ -275,7 +275,6 @@ static void usb_wwan_indat_callback(struct urb *urb)  	int err;  	int endpoint;  	struct usb_serial_port *port; -	struct tty_struct *tty;  	struct device *dev;  	unsigned char *data = urb->transfer_buffer;  	int status = urb->status; @@ -288,16 +287,12 @@ static void usb_wwan_indat_callback(struct urb *urb)  		dev_dbg(dev, "%s: nonzero status: %d on endpoint %02x.\n",  			__func__, status, endpoint);  	} else { -		tty = tty_port_tty_get(&port->port); -		if (tty) { -			if (urb->actual_length) { -				tty_insert_flip_string(&port->port, data, -						urb->actual_length); -				tty_flip_buffer_push(tty); -			} else -				dev_dbg(dev, "%s: empty read urb received\n", __func__); -			tty_kref_put(tty); -		} +		if (urb->actual_length) { +			tty_insert_flip_string(&port->port, data, +					urb->actual_length); +			tty_flip_buffer_push(&port->port); +		} else +			dev_dbg(dev, "%s: empty read urb received\n", __func__);  		/* Resubmit urb so we continue receiving */  		err = usb_submit_urb(urb, GFP_ATOMIC);  |