All of lore.kernel.org
 help / color / mirror / Atom feed
* cdc-acm: fix abnormal DATA RX issue for Mediatek Preloader.
@ 2018-12-13  3:27 macpaul.lin
  2018-12-18  5:00   ` [v2] " macpaul.lin
                   ` (5 more replies)
  0 siblings, 6 replies; 49+ messages in thread
From: macpaul.lin @ 2018-12-13  3:27 UTC (permalink / raw)
  To: linux-usb, Oliver Neukum, Greg Kroah-Hartman, Johan Hovold, Macpaul Lin
  Cc: wsd_upstream

From: Macpaul Lin <macpaul.lin@mediatek.com>

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

This boot loader also handle firmware updating. 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 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 sended.
Which will be recognized as an incorrect response. This behavior change
also causes the handshake fail.

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>
---
 drivers/usb/class/cdc-acm.c | 9 ++++++++-
 drivers/usb/class/cdc-acm.h | 1 +
 2 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c
index 1b68fed..2f744bb 100644
--- a/drivers/usb/class/cdc-acm.c
+++ b/drivers/usb/class/cdc-acm.c
@@ -1156,6 +1156,10 @@ static int acm_probe(struct usb_interface *intf,
 		goto skip_normal_probe;
 	}
 
+	/* handle active handshake triggered by device */
+	if (quirks == DISABLE_ECHO)
+		acm_tty_driver->init_termios.c_lflag &= ~(ECHO);
+
 	/* normal probing*/
 	if (!buffer) {
 		dev_err(&intf->dev, "Weird descriptor references\n");
@@ -1655,7 +1659,10 @@ static int acm_pre_reset(struct usb_interface *intf)
 	.driver_info = NO_UNION_NORMAL, /* has no union descriptor */
 	},
 	{ USB_DEVICE(0x0e8d, 0x0003), /* FIREFLY, MediaTek Inc; andrey.arapov@gmail.com */
-	.driver_info = NO_UNION_NORMAL, /* has no union descriptor */
+	.driver_info = DISABLE_ECHO, /* DISABLE ECHO in termios flag */
+	},
+	{ USB_DEVICE(0x0e8d, 0x2000), /* FIREFLY, 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] 49+ messages in thread

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

Thread overview: 49+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-12-13  3:27 cdc-acm: fix abnormal DATA RX issue for Mediatek Preloader macpaul.lin
2018-12-18  5:00 ` [PATCH v2] " Macpaul Lin
2018-12-18  5:00   ` [v2] " macpaul.lin
2018-12-18  9:02   ` [PATCH v2] " Johan Hovold
2018-12-18  9:02     ` [v2] " Johan Hovold
2018-12-18 10:41 ` [PATCH v3] " Macpaul Lin
2018-12-18 10:41   ` [v3] " macpaul.lin
2018-12-18 10:54   ` [PATCH v3] " Johan Hovold
2018-12-18 10:54     ` [v3] " Johan Hovold
2018-12-18 11:38 ` [PATCH v4] " Macpaul Lin
2018-12-18 11:38   ` [v4] " macpaul.lin
2018-12-18 11:44   ` [PATCH v4] " Johan Hovold
2018-12-18 11:44     ` [v4] " Johan Hovold
2018-12-18 11:59 ` [PATCH v5] " Macpaul Lin
2018-12-18 11:59   ` [v5] " macpaul.lin
2018-12-18 12:38   ` [PATCH v5] " Johan Hovold
2018-12-18 12:38     ` [v5] " Johan Hovold
2018-12-18 13:37     ` [PATCH v5] " Oliver Neukum
2018-12-18 13:37       ` [v5] " Oliver Neukum
2018-12-18 14:26       ` [PATCH v5] " Macpaul Lin
2018-12-18 14:26         ` [v5] " macpaul.lin
2018-12-18 15:19         ` [PATCH v5] " Macpaul Lin
2018-12-18 15:19           ` [v5] " macpaul.lin
2018-12-18 16:42           ` [PATCH v5] " Lars Melin
2018-12-18 16:42             ` [v5] " Lars Melin
2018-12-18 17:48             ` [PATCH v5] " Macpaul Lin
2018-12-18 17:48               ` [v5] " macpaul.lin
2018-12-19  0:45               ` [PATCH v5] " Lars Melin
2018-12-19  0:45                 ` [v5] " Lars Melin
2018-12-19  2:22               ` [PATCH v5] " Macpaul Lin
2018-12-19  2:22                 ` [v5] " macpaul.lin
2018-12-19  3:16                 ` [PATCH v5] " Macpaul Lin
2018-12-19  3:16                   ` [v5] " macpaul.lin
2018-12-19  3:31                   ` [PATCH v5] " Lars Melin
2018-12-19  3:31                     ` [v5] " Lars Melin
2018-12-19  4:03                     ` [PATCH v5] " Macpaul Lin
2018-12-19  4:03                       ` [v5] " macpaul.lin
2018-12-19  8:56                       ` [PATCH v5] " Oliver Neukum
2018-12-19  8:56                         ` [v5] " Oliver Neukum
2018-12-20 15:19                         ` [PATCH v5] " Greg Kroah-Hartman
2018-12-20 15:19                           ` [v5] " Greg Kroah-Hartman
2018-12-18 15:37 ` [PATCH v6] " Macpaul Lin
2018-12-18 15:37   ` [v6] " macpaul.lin
2018-12-19  4:11 ` [PATCH v7] " Macpaul Lin
2018-12-19  4:11   ` [v7] " macpaul.lin
2018-12-19  9:00   ` [PATCH v7] " Johan Hovold
2018-12-19  9:00     ` [v7] " Johan Hovold
2018-12-20 15:28     ` [PATCH v7] " Oliver Neukum
2018-12-20 15:28       ` [v7] " Oliver Neukum

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.