linux-usb.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [v7] cdc-acm: fix abnormal DATA RX issue for Mediatek Preloader.
@ 2018-12-19  4:11 macpaul.lin
  0 siblings, 0 replies; 3+ messages in thread
From: macpaul.lin @ 2018-12-19  4:11 UTC (permalink / raw)
  To: Johan Hovold, Oliver Neukum, Greg Kroah-Hartman, Andrey Arapov,
	linux-usb, stable, Lars Melin
  Cc: Mediatek WSD Upstream, Macpaul Lin

Mediatek Preloader is a proprietary embedded boot loader for loading
Little Kernel and Linux into device DRAM.

This boot loader also handle firmware update. Mediatek Preloader will be
enumerated as a virtual COM port when the device is connected to Windows
or Linux OS via CDC-ACM class driver. When the USB enumeration has been
done, Mediatek Preloader will send out handshake command "READY" to PC
actively instead of waiting command from the download tool.

Since Linux 4.12, the commit "tty: reset termios state on device
registration" (93857edd9829e144acb6c7e72d593f6e01aead66) causes Mediatek
Preloader receiving some abnoraml command like "READYXX" as it sent.
This will be recognized as an incorrect response. The behavior change
also causes the download handshake fail. This change only affects
subsequent connects if the reconnected device happens to get the same minor
number.

By disabling the ECHO termios flag could avoid this problem. However, it
cannot be done by user space configuration when download tool open
/dev/ttyACM0. This is because the device running Mediatek Preloader will
send handshake command "READY" immediately once the CDC-ACM driver is
ready.

This patch wants to fix above problem by introducing "DISABLE_ECHO"
property in driver_info. When Mediatek Preloader is connected, the
CDC-ACM driver could disable ECHO flag in termios to avoid the problem.

Signed-off-by: Macpaul Lin <macpaul.lin@mediatek.com>
Cc: stable@vger.kernel.org
---
Changes for v2:
 - Move quirks testing of DISABLE_ECHO flag into acm_tty_install().
 - Change quirks testing into bitwise comparison.
Changes for v3:
 - Replace quirks testing from init_termios to tty->termios.
 - Remove parenthesis for ECHO flag.
Changes for v4:
 - Drop quirks varible to simplify the patch.
 - Move termios operation right after the driver_data has been installed.
 - Write general style comment for suppressing initial echoing. 
Changes for v5:
 - Fix: termios operation right abover the driver_data has been installed.
 - Update commit comment about this patch affects the reconnected device
   which get the same minor numbers.
Changes for v6:
 - Update VID/PID:0x0e8d/0x0003 as Mediatek Inc BROM.
 - Update VID/PID:0x0e8d/0x2000 as Mediatek Inc Preloader.
Changes for v7:
 - Keep VID/PID:0x0e8d/0x0003 unchanged because of 2 different UNION
   descriptor implementated in Mediatek Inc BROM (MT6589/MT6765).

 drivers/usb/class/cdc-acm.c | 10 ++++++++++
 drivers/usb/class/cdc-acm.h |  1 +
 2 files changed, 11 insertions(+)

diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c
index 1b68fed..ed8c62b 100644
--- a/drivers/usb/class/cdc-acm.c
+++ b/drivers/usb/class/cdc-acm.c
@@ -581,6 +581,13 @@ static int acm_tty_install(struct tty_driver *driver, struct tty_struct *tty)
 	if (retval)
 		goto error_init_termios;
 
+	/*
+	 * Suppress initial echoing for some devices which might send data
+	 * immediately after acm driver has been installed.
+	 */
+	if (acm->quirks & DISABLE_ECHO)
+		tty->termios.c_lflag &= ~ECHO;
+
 	tty->driver_data = acm;
 
 	return 0;
@@ -1657,6 +1664,9 @@ static int acm_pre_reset(struct usb_interface *intf)
 	{ USB_DEVICE(0x0e8d, 0x0003), /* FIREFLY, MediaTek Inc; andrey.arapov@gmail.com */
 	.driver_info = NO_UNION_NORMAL, /* has no union descriptor */
 	},
+	{ USB_DEVICE(0x0e8d, 0x2000), /* MediaTek Inc Preloader */
+	.driver_info = DISABLE_ECHO, /* DISABLE ECHO in termios flag */
+	},
 	{ USB_DEVICE(0x0e8d, 0x3329), /* MediaTek Inc GPS */
 	.driver_info = NO_UNION_NORMAL, /* has no union descriptor */
 	},
diff --git a/drivers/usb/class/cdc-acm.h b/drivers/usb/class/cdc-acm.h
index ca06b20..515aad0 100644
--- a/drivers/usb/class/cdc-acm.h
+++ b/drivers/usb/class/cdc-acm.h
@@ -140,3 +140,4 @@ struct acm {
 #define QUIRK_CONTROL_LINE_STATE	BIT(6)
 #define CLEAR_HALT_CONDITIONS		BIT(7)
 #define SEND_ZERO_PACKET		BIT(8)
+#define DISABLE_ECHO			BIT(9)

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

* [v7] cdc-acm: fix abnormal DATA RX issue for Mediatek Preloader.
@ 2018-12-19  9:00 Johan Hovold
  0 siblings, 0 replies; 3+ messages in thread
From: Johan Hovold @ 2018-12-19  9:00 UTC (permalink / raw)
  To: Macpaul Lin
  Cc: Johan Hovold, Oliver Neukum, Greg Kroah-Hartman, Andrey Arapov,
	linux-usb, stable, Lars Melin, Mediatek WSD Upstream

On Wed, Dec 19, 2018 at 12:11:03PM +0800, Macpaul Lin wrote:
> Mediatek Preloader is a proprietary embedded boot loader for loading
> Little Kernel and Linux into device DRAM.
> 
> This boot loader also handle firmware update. Mediatek Preloader will be
> enumerated as a virtual COM port when the device is connected to Windows
> or Linux OS via CDC-ACM class driver. When the USB enumeration has been
> done, Mediatek Preloader will send out handshake command "READY" to PC
> actively instead of waiting command from the download tool.
> 
> Since Linux 4.12, the commit "tty: reset termios state on device
> registration" (93857edd9829e144acb6c7e72d593f6e01aead66) causes Mediatek
> Preloader receiving some abnoraml command like "READYXX" as it sent.
> This will be recognized as an incorrect response. The behavior change
> also causes the download handshake fail. This change only affects
> subsequent connects if the reconnected device happens to get the same minor
> number.
> 
> By disabling the ECHO termios flag could avoid this problem. However, it
> cannot be done by user space configuration when download tool open
> /dev/ttyACM0. This is because the device running Mediatek Preloader will
> send handshake command "READY" immediately once the CDC-ACM driver is
> ready.
> 
> This patch wants to fix above problem by introducing "DISABLE_ECHO"
> property in driver_info. When Mediatek Preloader is connected, the
> CDC-ACM driver could disable ECHO flag in termios to avoid the problem.
> 
> Signed-off-by: Macpaul Lin <macpaul.lin@mediatek.com>
> Cc: stable@vger.kernel.org
> ---
> Changes for v2:
>  - Move quirks testing of DISABLE_ECHO flag into acm_tty_install().
>  - Change quirks testing into bitwise comparison.
> Changes for v3:
>  - Replace quirks testing from init_termios to tty->termios.
>  - Remove parenthesis for ECHO flag.
> Changes for v4:
>  - Drop quirks varible to simplify the patch.
>  - Move termios operation right after the driver_data has been installed.
>  - Write general style comment for suppressing initial echoing. 
> Changes for v5:
>  - Fix: termios operation right abover the driver_data has been installed.
>  - Update commit comment about this patch affects the reconnected device
>    which get the same minor numbers.
> Changes for v6:
>  - Update VID/PID:0x0e8d/0x0003 as Mediatek Inc BROM.
>  - Update VID/PID:0x0e8d/0x2000 as Mediatek Inc Preloader.
> Changes for v7:
>  - Keep VID/PID:0x0e8d/0x0003 unchanged because of 2 different UNION
>    descriptor implementated in Mediatek Inc BROM (MT6589/MT6765).

Reviewed-by: Johan Hovold <johan@kernel.org>

Johan

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

* [v7] cdc-acm: fix abnormal DATA RX issue for Mediatek Preloader.
@ 2018-12-20 15:28 Oliver Neukum
  0 siblings, 0 replies; 3+ messages in thread
From: Oliver Neukum @ 2018-12-20 15:28 UTC (permalink / raw)
  To: Johan Hovold, Macpaul Lin
  Cc: Andrey Arapov, Lars Melin, Greg Kroah-Hartman,
	Mediatek WSD Upstream, linux-usb, stable

On Mi, 2018-12-19 at 10:00 +0100, Johan Hovold wrote:
> On Wed, Dec 19, 2018 at 12:11:03PM +0800, Macpaul Lin wrote:
> > Mediatek Preloader is a proprietary embedded boot loader for loading
> > Little Kernel and Linux into device DRAM.
> > 
> > This boot loader also handle firmware update. Mediatek Preloader will be
> > enumerated as a virtual COM port when the device is connected to Windows
> > or Linux OS via CDC-ACM class driver. When the USB enumeration has been
> > done, Mediatek Preloader will send out handshake command "READY" to PC
> > actively instead of waiting command from the download tool.
> > 
> > Since Linux 4.12, the commit "tty: reset termios state on device
> > registration" (93857edd9829e144acb6c7e72d593f6e01aead66) causes Mediatek
> > Preloader receiving some abnoraml command like "READYXX" as it sent.
> > This will be recognized as an incorrect response. The behavior change
> > also causes the download handshake fail. This change only affects
> > subsequent connects if the reconnected device happens to get the same minor
> > number.
> > 
> > By disabling the ECHO termios flag could avoid this problem. However, it
> > cannot be done by user space configuration when download tool open
> > /dev/ttyACM0. This is because the device running Mediatek Preloader will
> > send handshake command "READY" immediately once the CDC-ACM driver is
> > ready.
> > 
> > This patch wants to fix above problem by introducing "DISABLE_ECHO"
> > property in driver_info. When Mediatek Preloader is connected, the
> > CDC-ACM driver could disable ECHO flag in termios to avoid the problem.
> > 
> > Signed-off-by: Macpaul Lin <macpaul.lin@mediatek.com>
> > Cc: stable@vger.kernel.org
> > ---
> > Changes for v2:
> >  - Move quirks testing of DISABLE_ECHO flag into acm_tty_install().
> >  - Change quirks testing into bitwise comparison.
> > Changes for v3:
> >  - Replace quirks testing from init_termios to tty->termios.
> >  - Remove parenthesis for ECHO flag.
> > Changes for v4:
> >  - Drop quirks varible to simplify the patch.
> >  - Move termios operation right after the driver_data has been installed.
> >  - Write general style comment for suppressing initial echoing. 
> > Changes for v5:
> >  - Fix: termios operation right abover the driver_data has been installed.
> >  - Update commit comment about this patch affects the reconnected device
> >    which get the same minor numbers.
> > Changes for v6:
> >  - Update VID/PID:0x0e8d/0x0003 as Mediatek Inc BROM.
> >  - Update VID/PID:0x0e8d/0x2000 as Mediatek Inc Preloader.
> > Changes for v7:
> >  - Keep VID/PID:0x0e8d/0x0003 unchanged because of 2 different UNION
> >    descriptor implementated in Mediatek Inc BROM (MT6589/MT6765).
> 
> Reviewed-by: Johan Hovold <johan@kernel.org>
Acked-by: Oliver Neukum <oneukum@suse.com>

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

end of thread, other threads:[~2018-12-20 15:28 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-12-20 15:28 [v7] cdc-acm: fix abnormal DATA RX issue for Mediatek Preloader Oliver Neukum
  -- strict thread matches above, loose matches on Subject: below --
2018-12-19  9:00 Johan Hovold
2018-12-19  4:11 macpaul.lin

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).