diff options
| author | David S. Miller <davem@davemloft.net> | 2010-03-22 20:05:26 -0700 | 
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2010-03-22 20:05:26 -0700 | 
| commit | 91c030b4d6445ebe9fbddb86d584441f300df15c (patch) | |
| tree | e8a48e3ad9e0448c690268175e555fa651983546 /drivers/usb/serial/generic.c | |
| parent | 7c3456fdb503071787f7f972de1069b9cacd16f0 (diff) | |
| parent | ae6be51ed01d6c4aaf249a207b4434bc7785853b (diff) | |
Merge branch 'master' of /home/davem/src/GIT/linux-2.6/
Diffstat (limited to 'drivers/usb/serial/generic.c')
| -rw-r--r-- | drivers/usb/serial/generic.c | 49 | 
1 files changed, 27 insertions, 22 deletions
| diff --git a/drivers/usb/serial/generic.c b/drivers/usb/serial/generic.c index 89fac36684c5..f804acb138ec 100644 --- a/drivers/usb/serial/generic.c +++ b/drivers/usb/serial/generic.c @@ -130,7 +130,7 @@ int usb_serial_generic_open(struct tty_struct *tty, struct usb_serial_port *port  	spin_unlock_irqrestore(&port->lock, flags);  	/* if we have a bulk endpoint, start reading from it */ -	if (serial->num_bulk_in) { +	if (port->bulk_in_size) {  		/* Start reading from the device */  		usb_fill_bulk_urb(port->read_urb, serial->dev,  				   usb_rcvbulkpipe(serial->dev, @@ -159,10 +159,10 @@ static void generic_cleanup(struct usb_serial_port *port)  	dbg("%s - port %d", __func__, port->number);  	if (serial->dev) { -		/* shutdown any bulk reads that might be going on */ -		if (serial->num_bulk_out) +		/* shutdown any bulk transfers that might be going on */ +		if (port->bulk_out_size)  			usb_kill_urb(port->write_urb); -		if (serial->num_bulk_in) +		if (port->bulk_in_size)  			usb_kill_urb(port->read_urb);  	}  } @@ -333,15 +333,15 @@ int usb_serial_generic_write(struct tty_struct *tty,  	dbg("%s - port %d", __func__, port->number); +	/* only do something if we have a bulk out endpoint */ +	if (!port->bulk_out_size) +		return -ENODEV; +  	if (count == 0) {  		dbg("%s - write request of 0 bytes", __func__);  		return 0;  	} -	/* only do something if we have a bulk out endpoint */ -	if (!serial->num_bulk_out) -		return 0; -  	if (serial->type->max_in_flight_urbs)  		return usb_serial_multi_urb_write(tty, port,  						  buf, count); @@ -364,14 +364,19 @@ int usb_serial_generic_write_room(struct tty_struct *tty)  	int room = 0;  	dbg("%s - port %d", __func__, port->number); + +	if (!port->bulk_out_size) +		return 0; +  	spin_lock_irqsave(&port->lock, flags);  	if (serial->type->max_in_flight_urbs) {  		if (port->urbs_in_flight < serial->type->max_in_flight_urbs)  			room = port->bulk_out_size *  				(serial->type->max_in_flight_urbs -  				 port->urbs_in_flight); -	} else if (serial->num_bulk_out) +	} else {  		room = kfifo_avail(&port->write_fifo); +	}  	spin_unlock_irqrestore(&port->lock, flags);  	dbg("%s - returns %d", __func__, room); @@ -382,15 +387,18 @@ int usb_serial_generic_chars_in_buffer(struct tty_struct *tty)  {  	struct usb_serial_port *port = tty->driver_data;  	struct usb_serial *serial = port->serial; -	int chars = 0;  	unsigned long flags; +	int chars;  	dbg("%s - port %d", __func__, port->number); +	if (!port->bulk_out_size) +		return 0; +  	spin_lock_irqsave(&port->lock, flags);  	if (serial->type->max_in_flight_urbs)  		chars = port->tx_bytes_flight; -	else if (serial->num_bulk_out) +	else  		chars = kfifo_len(&port->write_fifo);  	spin_unlock_irqrestore(&port->lock, flags); @@ -415,11 +423,13 @@ void usb_serial_generic_resubmit_read_urb(struct usb_serial_port *port,  			   ((serial->type->read_bulk_callback) ?  			     serial->type->read_bulk_callback :  			     usb_serial_generic_read_bulk_callback), port); +  	result = usb_submit_urb(urb, mem_flags); -	if (result) +	if (result && result != -EPERM) {  		dev_err(&port->dev,  			"%s - failed resubmitting read urb, error %d\n",  							__func__, result); +	}  }  EXPORT_SYMBOL_GPL(usb_serial_generic_resubmit_read_urb); @@ -498,23 +508,18 @@ void usb_serial_generic_write_bulk_callback(struct urb *urb)  		if (port->urbs_in_flight < 0)  			port->urbs_in_flight = 0;  		spin_unlock_irqrestore(&port->lock, flags); - -		if (status) { -			dbg("%s - nonzero multi-urb write bulk status " -				"received: %d", __func__, status); -			return; -		}  	} else {  		port->write_urb_busy = 0; -		if (status) { -			dbg("%s - nonzero multi-urb write bulk status " -				"received: %d", __func__, status); +		if (status)  			kfifo_reset_out(&port->write_fifo); -		} else +		else  			usb_serial_generic_write_start(port);  	} +	if (status) +		dbg("%s - non-zero urb status: %d", __func__, status); +  	usb_serial_port_softint(port);  }  EXPORT_SYMBOL_GPL(usb_serial_generic_write_bulk_callback); | 
