linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 2/2] isdn/gigaset: drop unused ldisc methods
  2015-07-13 22:37 [PATCH 0/2] Fix long-standing regression in ser_gigaset ISDN driver Tilman Schmidt
@ 2015-07-13 22:37 ` Tilman Schmidt
  2015-07-14 19:03   ` Paul Bolle
  2015-07-13 22:37 ` [PATCH 1/2] isdn/gigaset: reset tty->receive_room when attaching ser_gigaset Tilman Schmidt
  2015-07-16  0:25 ` [PATCH 0/2] Fix long-standing regression in ser_gigaset ISDN driver David Miller
  2 siblings, 1 reply; 9+ messages in thread
From: Tilman Schmidt @ 2015-07-13 22:37 UTC (permalink / raw)
  To: Paul Bolle; +Cc: netdev, David Miller, Hansjoerg Lipp, linux-kernel

The line discipline read and write methods are optional so the dummy
methods in ser_gigaset are unnecessary and can be removed.

Signed-off-by: Tilman Schmidt <tilman@imap.cc>
---
 drivers/isdn/gigaset/ser-gigaset.c |   24 ------------------------
 1 files changed, 0 insertions(+), 24 deletions(-)

diff --git a/drivers/isdn/gigaset/ser-gigaset.c b/drivers/isdn/gigaset/ser-gigaset.c
index 3ac9c41..375be50 100644
--- a/drivers/isdn/gigaset/ser-gigaset.c
+++ b/drivers/isdn/gigaset/ser-gigaset.c
@@ -607,28 +607,6 @@ static int gigaset_tty_hangup(struct tty_struct *tty)
 }
 
 /*
- * Read on the tty.
- * Unused, received data goes only to the Gigaset driver.
- */
-static ssize_t
-gigaset_tty_read(struct tty_struct *tty, struct file *file,
-		 unsigned char __user *buf, size_t count)
-{
-	return -EAGAIN;
-}
-
-/*
- * Write on the tty.
- * Unused, transmit data comes only from the Gigaset driver.
- */
-static ssize_t
-gigaset_tty_write(struct tty_struct *tty, struct file *file,
-		  const unsigned char *buf, size_t count)
-{
-	return -EAGAIN;
-}
-
-/*
  * Ioctl on the tty.
  * Called in process context only.
  * May be re-entered by multiple ioctl calling threads.
@@ -761,8 +739,6 @@ static struct tty_ldisc_ops gigaset_ldisc = {
 	.open		= gigaset_tty_open,
 	.close		= gigaset_tty_close,
 	.hangup		= gigaset_tty_hangup,
-	.read		= gigaset_tty_read,
-	.write		= gigaset_tty_write,
 	.ioctl		= gigaset_tty_ioctl,
 	.receive_buf	= gigaset_tty_receive,
 	.write_wakeup	= gigaset_tty_wakeup,
-- 
1.7.1


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH 0/2] Fix long-standing regression in ser_gigaset ISDN driver
@ 2015-07-13 22:37 Tilman Schmidt
  2015-07-13 22:37 ` [PATCH 2/2] isdn/gigaset: drop unused ldisc methods Tilman Schmidt
                   ` (2 more replies)
  0 siblings, 3 replies; 9+ messages in thread
From: Tilman Schmidt @ 2015-07-13 22:37 UTC (permalink / raw)
  To: Paul Bolle; +Cc: netdev, David Miller, Hansjoerg Lipp, linux-kernel

This series fixes a serious regression in the Gigaset M101 driver
introduced in kernel release 3.10 and removes some unneeded code.

Please also queue up patch 1 of the series for inclusion in the
stable/longterm releases 3.10 and later.

Tilman Schmidt (2):
  isdn/gigaset: reset tty->receive_room when attaching ser_gigaset
  isdn/gigaset: drop unused ldisc methods

 drivers/isdn/gigaset/ser-gigaset.c |   35 ++++++++++-------------------------
 1 files changed, 10 insertions(+), 25 deletions(-)


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 1/2] isdn/gigaset: reset tty->receive_room when attaching ser_gigaset
  2015-07-13 22:37 [PATCH 0/2] Fix long-standing regression in ser_gigaset ISDN driver Tilman Schmidt
  2015-07-13 22:37 ` [PATCH 2/2] isdn/gigaset: drop unused ldisc methods Tilman Schmidt
@ 2015-07-13 22:37 ` Tilman Schmidt
  2015-07-13 23:14   ` Peter Hurley
  2015-07-14 12:50   ` Sergei Shtylyov
  2015-07-16  0:25 ` [PATCH 0/2] Fix long-standing regression in ser_gigaset ISDN driver David Miller
  2 siblings, 2 replies; 9+ messages in thread
From: Tilman Schmidt @ 2015-07-13 22:37 UTC (permalink / raw)
  To: Paul Bolle
  Cc: netdev, David Miller, Peter Hurley, Hansjoerg Lipp, linux-kernel

Commit 79901317ce80 ("n_tty: Don't flush buffer when closing ldisc"),
first merged in kernel release 3.10, caused the following regression
in the Gigaset M101 driver:

Before that commit, when closing the N_TTY line discipline in
preparation to switching to N_GIGASET_M101, receive_room would be
reset to a non-zero value by the call to n_tty_flush_buffer() in
n_tty's close method. With the removal of that call, receive_room
might be left at zero, blocking data reception on the serial line.

The present patch fixes that regression by setting receive_room
to an appropriate value in the ldisc open method.

Fixes: 79901317ce80 ("n_tty: Don't flush buffer when closing ldisc")
Signed-off-by: Tilman Schmidt <tilman@imap.cc>
---
 drivers/isdn/gigaset/ser-gigaset.c |   11 ++++++++++-
 1 files changed, 10 insertions(+), 1 deletions(-)

diff --git a/drivers/isdn/gigaset/ser-gigaset.c b/drivers/isdn/gigaset/ser-gigaset.c
index 8c91fd5..3ac9c41 100644
--- a/drivers/isdn/gigaset/ser-gigaset.c
+++ b/drivers/isdn/gigaset/ser-gigaset.c
@@ -524,9 +524,18 @@ gigaset_tty_open(struct tty_struct *tty)
 	cs->hw.ser->tty = tty;
 	atomic_set(&cs->hw.ser->refcnt, 1);
 	init_completion(&cs->hw.ser->dead_cmp);
-
 	tty->disc_data = cs;
 
+	/* Set the amount of data we're willing to receive per call
+	 * from the hardware driver to half of the input buffer size
+	 * to leave some reserve.
+	 * Note: We don't do flow control towards the hardware driver.
+	 * If more data is received than will fit into the input buffer,
+	 * it will be dropped and an error will be logged. This should
+	 * never happen as the device is slow and the buffer size ample.
+	 */
+	tty->receive_room = RBUFSIZE/2;
+
 	/* OK.. Initialization of the datastructures and the HW is done.. Now
 	 * startup system and notify the LL that we are ready to run
 	 */
-- 
1.7.1


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PATCH 1/2] isdn/gigaset: reset tty->receive_room when attaching ser_gigaset
  2015-07-13 22:37 ` [PATCH 1/2] isdn/gigaset: reset tty->receive_room when attaching ser_gigaset Tilman Schmidt
@ 2015-07-13 23:14   ` Peter Hurley
  2015-07-13 23:58     ` Tilman Schmidt
  2015-07-14 12:50   ` Sergei Shtylyov
  1 sibling, 1 reply; 9+ messages in thread
From: Peter Hurley @ 2015-07-13 23:14 UTC (permalink / raw)
  To: Tilman Schmidt, Paul Bolle
  Cc: netdev, David Miller, Hansjoerg Lipp, linux-kernel

On 07/13/2015 06:37 PM, Tilman Schmidt wrote:
> Commit 79901317ce80 ("n_tty: Don't flush buffer when closing ldisc"),
> first merged in kernel release 3.10, caused the following regression
> in the Gigaset M101 driver:
> 
> Before that commit, when closing the N_TTY line discipline in
> preparation to switching to N_GIGASET_M101, receive_room would be
> reset to a non-zero value by the call to n_tty_flush_buffer() in
> n_tty's close method. With the removal of that call, receive_room
> might be left at zero, blocking data reception on the serial line.

That commit didn't cause the problem; it was a bug all along.

For example, if the tty had first been hooked up to some other line
discipline which consumed most of tty->receive_room, _then_
switched to N_GIGASET_M101 line discipline, the same problem would
have occurred.

Non-flow controlling line disciplines _must_ set tty->receive_room
on line discipline open because they are declaring that every
input they can accept that much data.

Regards,
Peter Hurley

> The present patch fixes that regression by setting receive_room
> to an appropriate value in the ldisc open method.
> 
> Fixes: 79901317ce80 ("n_tty: Don't flush buffer when closing ldisc")
> Signed-off-by: Tilman Schmidt <tilman@imap.cc>
> ---
>  drivers/isdn/gigaset/ser-gigaset.c |   11 ++++++++++-
>  1 files changed, 10 insertions(+), 1 deletions(-)
> 
> diff --git a/drivers/isdn/gigaset/ser-gigaset.c b/drivers/isdn/gigaset/ser-gigaset.c
> index 8c91fd5..3ac9c41 100644
> --- a/drivers/isdn/gigaset/ser-gigaset.c
> +++ b/drivers/isdn/gigaset/ser-gigaset.c
> @@ -524,9 +524,18 @@ gigaset_tty_open(struct tty_struct *tty)
>  	cs->hw.ser->tty = tty;
>  	atomic_set(&cs->hw.ser->refcnt, 1);
>  	init_completion(&cs->hw.ser->dead_cmp);
> -
>  	tty->disc_data = cs;
>  
> +	/* Set the amount of data we're willing to receive per call
> +	 * from the hardware driver to half of the input buffer size
> +	 * to leave some reserve.
> +	 * Note: We don't do flow control towards the hardware driver.
> +	 * If more data is received than will fit into the input buffer,
> +	 * it will be dropped and an error will be logged. This should
> +	 * never happen as the device is slow and the buffer size ample.
> +	 */
> +	tty->receive_room = RBUFSIZE/2;
> +
>  	/* OK.. Initialization of the datastructures and the HW is done.. Now
>  	 * startup system and notify the LL that we are ready to run
>  	 */
> 


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 1/2] isdn/gigaset: reset tty->receive_room when attaching ser_gigaset
  2015-07-13 23:14   ` Peter Hurley
@ 2015-07-13 23:58     ` Tilman Schmidt
  2015-07-14 19:01       ` Paul Bolle
  0 siblings, 1 reply; 9+ messages in thread
From: Tilman Schmidt @ 2015-07-13 23:58 UTC (permalink / raw)
  To: Peter Hurley, Paul Bolle
  Cc: netdev, David Miller, Hansjoerg Lipp, linux-kernel

Am 14.07.2015 um 01:14 schrieb Peter Hurley:
> On 07/13/2015 06:37 PM, Tilman Schmidt wrote:
>> Commit 79901317ce80 ("n_tty: Don't flush buffer when closing ldisc"),
>> first merged in kernel release 3.10, caused the following regression
>> in the Gigaset M101 driver:
>>
>> Before that commit, when closing the N_TTY line discipline in
>> preparation to switching to N_GIGASET_M101, receive_room would be
>> reset to a non-zero value by the call to n_tty_flush_buffer() in
>> n_tty's close method. With the removal of that call, receive_room
>> might be left at zero, blocking data reception on the serial line.
> 
> That commit didn't cause the problem; it was a bug all along.

Sure. That's why it is correctly fixed in the Gigaset driver.
But before that commit the bug was never actually triggered.
So that commit defines the point in the commit history from
which the fix is needed, and therefore needs to be mentioned
in order to decide which stable releases will need the fix.

> Non-flow controlling line disciplines _must_ set tty->receive_room
> on line discipline open because they are declaring that every
> input they can accept that much data.

I have submitted a corresponding fix to the line discipline
documentation separately.

Thanks,
Tilman

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 1/2] isdn/gigaset: reset tty->receive_room when attaching ser_gigaset
  2015-07-13 22:37 ` [PATCH 1/2] isdn/gigaset: reset tty->receive_room when attaching ser_gigaset Tilman Schmidt
  2015-07-13 23:14   ` Peter Hurley
@ 2015-07-14 12:50   ` Sergei Shtylyov
  1 sibling, 0 replies; 9+ messages in thread
From: Sergei Shtylyov @ 2015-07-14 12:50 UTC (permalink / raw)
  To: Tilman Schmidt, Paul Bolle
  Cc: netdev, David Miller, Peter Hurley, Hansjoerg Lipp, linux-kernel

Hello.

On 7/14/2015 1:37 AM, Tilman Schmidt wrote:

> Commit 79901317ce80 ("n_tty: Don't flush buffer when closing ldisc"),
> first merged in kernel release 3.10, caused the following regression
> in the Gigaset M101 driver:

> Before that commit, when closing the N_TTY line discipline in
> preparation to switching to N_GIGASET_M101, receive_room would be
> reset to a non-zero value by the call to n_tty_flush_buffer() in
> n_tty's close method. With the removal of that call, receive_room
> might be left at zero, blocking data reception on the serial line.

> The present patch fixes that regression by setting receive_room
> to an appropriate value in the ldisc open method.

> Fixes: 79901317ce80 ("n_tty: Don't flush buffer when closing ldisc")
> Signed-off-by: Tilman Schmidt <tilman@imap.cc>
> ---
>   drivers/isdn/gigaset/ser-gigaset.c |   11 ++++++++++-
>   1 files changed, 10 insertions(+), 1 deletions(-)

> diff --git a/drivers/isdn/gigaset/ser-gigaset.c b/drivers/isdn/gigaset/ser-gigaset.c
> index 8c91fd5..3ac9c41 100644
> --- a/drivers/isdn/gigaset/ser-gigaset.c
> +++ b/drivers/isdn/gigaset/ser-gigaset.c
> @@ -524,9 +524,18 @@ gigaset_tty_open(struct tty_struct *tty)
>   	cs->hw.ser->tty = tty;
>   	atomic_set(&cs->hw.ser->refcnt, 1);
>   	init_completion(&cs->hw.ser->dead_cmp);
> -

    Unrelated change?

>   	tty->disc_data = cs;
>
> +	/* Set the amount of data we're willing to receive per call
> +	 * from the hardware driver to half of the input buffer size
> +	 * to leave some reserve.
> +	 * Note: We don't do flow control towards the hardware driver.
> +	 * If more data is received than will fit into the input buffer,
> +	 * it will be dropped and an error will be logged. This should
> +	 * never happen as the device is slow and the buffer size ample.
> +	 */
> +	tty->receive_room = RBUFSIZE/2;

    The general kernel coding style is to surround operators with spaces.

[...]

MBR, Sergei


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 1/2] isdn/gigaset: reset tty->receive_room when attaching ser_gigaset
  2015-07-13 23:58     ` Tilman Schmidt
@ 2015-07-14 19:01       ` Paul Bolle
  0 siblings, 0 replies; 9+ messages in thread
From: Paul Bolle @ 2015-07-14 19:01 UTC (permalink / raw)
  To: Tilman Schmidt, Peter Hurley
  Cc: netdev, David Miller, Hansjoerg Lipp, linux-kernel

On di, 2015-07-14 at 01:58 +0200, Tilman Schmidt wrote:
> Am 14.07.2015 um 01:14 schrieb Peter Hurley:
> > That commit didn't cause the problem; it was a bug all along.
> 
> Sure. That's why it is correctly fixed in the Gigaset driver.
> But before that commit the bug was never actually triggered.
> So that commit defines the point in the commit history from
> which the fix is needed, and therefore needs to be mentioned
> in order to decide which stable releases will need the fix.

Yes, this seems a classic example of a bugfix that reveals another bug.
So the Fixes: tag, which does sound a bit awkward, really is
appropriate.

For ser-gigaset about the only line discipline change that will be
triggered, in practice, is from N_TTY to N_GIGASET_M101. Until commit
79901317ce80 ("n_tty: Don't flush buffer when closing ldisc") that
change would set receive_room to N_TTY_BUF_SIZE (ie, 4096). This patch
will set receive_room for ser-gigaset to RBUFSIZE/2 (ie, again 4096). So
we're back at the pre v3.10 behavior.

I'm really thankful that Tilman managed to bisect this and subsequently
saw how it could be properly fixed. I hope to forward this patch in a
few weeks so that it might finally be fixed in v4.3.

Applied.


Paul Bolle

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 2/2] isdn/gigaset: drop unused ldisc methods
  2015-07-13 22:37 ` [PATCH 2/2] isdn/gigaset: drop unused ldisc methods Tilman Schmidt
@ 2015-07-14 19:03   ` Paul Bolle
  0 siblings, 0 replies; 9+ messages in thread
From: Paul Bolle @ 2015-07-14 19:03 UTC (permalink / raw)
  To: Tilman Schmidt; +Cc: netdev, David Miller, Hansjoerg Lipp, linux-kernel

On di, 2015-07-14 at 00:37 +0200, Tilman Schmidt wrote:
> The line discipline read and write methods are optional so the dummy
> methods in ser_gigaset are unnecessary and can be removed.
> 
> Signed-off-by: Tilman Schmidt <tilman@imap.cc>

Applied.

I hope to forward this in a few weeks so that it might be in time for
v4.3.

Thanks,


Paul Bolle

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 0/2] Fix long-standing regression in ser_gigaset ISDN driver
  2015-07-13 22:37 [PATCH 0/2] Fix long-standing regression in ser_gigaset ISDN driver Tilman Schmidt
  2015-07-13 22:37 ` [PATCH 2/2] isdn/gigaset: drop unused ldisc methods Tilman Schmidt
  2015-07-13 22:37 ` [PATCH 1/2] isdn/gigaset: reset tty->receive_room when attaching ser_gigaset Tilman Schmidt
@ 2015-07-16  0:25 ` David Miller
  2 siblings, 0 replies; 9+ messages in thread
From: David Miller @ 2015-07-16  0:25 UTC (permalink / raw)
  To: tilman; +Cc: pebolle, netdev, hjlipp, linux-kernel

From: Tilman Schmidt <tilman@imap.cc>
Date: Tue, 14 Jul 2015 00:37:13 +0200 (CEST)

> This series fixes a serious regression in the Gigaset M101 driver
> introduced in kernel release 3.10 and removes some unneeded code.
> 
> Please also queue up patch 1 of the series for inclusion in the
> stable/longterm releases 3.10 and later.

Series applied and patch #1 queued up for -stable, thanks.

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2015-07-16  0:25 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-07-13 22:37 [PATCH 0/2] Fix long-standing regression in ser_gigaset ISDN driver Tilman Schmidt
2015-07-13 22:37 ` [PATCH 2/2] isdn/gigaset: drop unused ldisc methods Tilman Schmidt
2015-07-14 19:03   ` Paul Bolle
2015-07-13 22:37 ` [PATCH 1/2] isdn/gigaset: reset tty->receive_room when attaching ser_gigaset Tilman Schmidt
2015-07-13 23:14   ` Peter Hurley
2015-07-13 23:58     ` Tilman Schmidt
2015-07-14 19:01       ` Paul Bolle
2015-07-14 12:50   ` Sergei Shtylyov
2015-07-16  0:25 ` [PATCH 0/2] Fix long-standing regression in ser_gigaset ISDN driver David Miller

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).