cdc-acm: fix abnormal DATA RX issue for Mediatek Preloader.
Quoted 37 lines · On Thu, Dec 13, 2018 at 11:27:56AM +0800, [email protected] wrote:
From: Macpaul Lin <[email protected]>
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 indriver_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 <[email protected]>--- drivers/usb/class/cdc-acm.c | 9 ++++++++- drivers/usb/class/cdc-acm.h | 1 + 2 files changed, 9 insertions(+), 1 deletion(-)drivers/usb/class/cdc-acm.c +0
-0
drivers/usb/class/cdc-acm.c static int acm_probe(struct usb_interface *intf, · line 1161
Quoted 6 lines
drivers/usb/class/cdc-acm.c +3
-0@@ -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 );
You cannot change the driver init_termios like this as that will affect all cdc-acm devices that are probed later. If this is at all needed, this will have to be done at tty install time.
Note that 93857edd9829 ("tty: reset termios state on device registration") only makes sure that you get the default terminal setting whenever you plug in a device (rather than reuse settings from a previously connected device which happened to be assigned the same minor number). Specifically, it should not change any behaviour for the first time a cdc-acm device is plugged in.
From just a quick look, it seems you need to prevent your download tool from sending "XX" before disabling ECHO. Why wouldn't that work?
Thanks,
Johan