diff options
Diffstat (limited to 'drivers/usb/serial/generic.c')
| -rw-r--r-- | drivers/usb/serial/generic.c | 15 | 
1 files changed, 10 insertions, 5 deletions
diff --git a/drivers/usb/serial/generic.c b/drivers/usb/serial/generic.c index a817ced82835..ca92f67747cc 100644 --- a/drivers/usb/serial/generic.c +++ b/drivers/usb/serial/generic.c @@ -208,18 +208,23 @@ retry:  	urb->transfer_buffer_length = count;  	usb_serial_debug_data(debug, &port->dev, __func__, count,  						urb->transfer_buffer); +	spin_lock_irqsave(&port->lock, flags); +	port->tx_bytes += count; +	spin_unlock_irqrestore(&port->lock, flags); + +	clear_bit(i, &port->write_urbs_free);  	result = usb_submit_urb(urb, GFP_ATOMIC);  	if (result) {  		dev_err(&port->dev, "%s - error submitting urb: %d\n",  						__func__, result); +		set_bit(i, &port->write_urbs_free); +		spin_lock_irqsave(&port->lock, flags); +		port->tx_bytes -= count; +		spin_unlock_irqrestore(&port->lock, flags); +  		clear_bit_unlock(USB_SERIAL_WRITE_BUSY, &port->flags);  		return result;  	} -	clear_bit(i, &port->write_urbs_free); - -	spin_lock_irqsave(&port->lock, flags); -	port->tx_bytes += count; -	spin_unlock_irqrestore(&port->lock, flags);  	/* Try sending off another urb, unless in irq context (in which case  	 * there will be no free urb). */  | 
