From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1758739AbcIXNsq (ORCPT ); Sat, 24 Sep 2016 09:48:46 -0400 Received: from smtp35.i.mail.ru ([94.100.177.95]:47585 "EHLO smtp35.i.mail.ru" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1757302AbcIXNso (ORCPT ); Sat, 24 Sep 2016 09:48:44 -0400 From: Stas Sergeev To: stsp@list.ru Cc: Caylan Van Larson , Alan Cox , Johan Hovold , Greg Kroah-Hartman , linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH] mos7840: fix chars_in_buffer() return value Date: Sat, 24 Sep 2016 16:48:32 +0300 Message-Id: <1474724912-29021-1-git-send-email-stsp@list.ru> X-Mailer: git-send-email 2.7.4 Authentication-Results: smtp35.i.mail.ru; auth=pass smtp.auth=stsp@list.ru smtp.mailfrom=stsp@list.ru X-Mailru-Sender: 93A3050EDC2B741E47B042B830B848C5367AFE1C7C0CCE9F7D04C0A96F01A80D8043C3842ED5CA1AF8D9167951636F18 X-Mras: OK Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The TIOCOUTQ ioctl calls chars_in_buffer(), and some apps depend on a correct behaviour of that. mos7840 implements it wrongly: if you write just one char, TIOCOUTQ will return 32. This patch should fix it by accounting the number of chars actually written. This patch, unfortunately, misses the Tesed-by tag. The reported didn't test it, and I don't have the hardware in question. Signed-off-by: Stas Sergeev Reported-by: Caylan Van Larson CC: Caylan Van Larson CC: Alan Cox CC: Johan Hovold CC: Greg Kroah-Hartman CC: linux-usb@vger.kernel.org CC: linux-kernel@vger.kernel.org --- drivers/usb/serial/mos7840.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/drivers/usb/serial/mos7840.c b/drivers/usb/serial/mos7840.c index ed378fb..2a1eb07 100644 --- a/drivers/usb/serial/mos7840.c +++ b/drivers/usb/serial/mos7840.c @@ -234,7 +234,7 @@ struct moschip_port { spinlock_t pool_lock; struct urb *write_urb_pool[NUM_URBS]; - char busy[NUM_URBS]; + int busy[NUM_URBS]; bool read_urb_busy; /* For device(s) with LED indicator */ @@ -1139,8 +1139,7 @@ static int mos7840_chars_in_buffer(struct tty_struct *tty) spin_lock_irqsave(&mos7840_port->pool_lock, flags); for (i = 0; i < NUM_URBS; ++i) { if (mos7840_port->busy[i]) { - struct urb *urb = mos7840_port->write_urb_pool[i]; - chars += urb->transfer_buffer_length; + chars += mos7840_port->busy[i]; } } spin_unlock_irqrestore(&mos7840_port->pool_lock, flags); @@ -1323,10 +1322,11 @@ static int mos7840_write(struct tty_struct *tty, struct usb_serial_port *port, /* try to find a free urb in the list */ urb = NULL; + transfer_size = min(count, URB_TRANSFER_BUFFER_SIZE); spin_lock_irqsave(&mos7840_port->pool_lock, flags); for (i = 0; i < NUM_URBS; ++i) { if (!mos7840_port->busy[i]) { - mos7840_port->busy[i] = 1; + mos7840_port->busy[i] = transfer_size; urb = mos7840_port->write_urb_pool[i]; dev_dbg(&port->dev, "URB:%d\n", i); break; @@ -1345,7 +1345,6 @@ static int mos7840_write(struct tty_struct *tty, struct usb_serial_port *port, if (!urb->transfer_buffer) goto exit; } - transfer_size = min(count, URB_TRANSFER_BUFFER_SIZE); memcpy(urb->transfer_buffer, current_position, transfer_size); -- 2.7.4