Received: by 2002:a05:6a11:4021:0:0:0:0 with SMTP id ky33csp4158637pxb; Mon, 27 Sep 2021 10:34:51 -0700 (PDT) X-Google-Smtp-Source: ABdhPJw3LHOzZF9iIKIO+7dVsE1XsxO0OubLe3ClxApu5TpYs1FjNlwMtOZHh28OQi1yUyV+cZX1 X-Received: by 2002:a17:902:ed83:b0:13d:fb02:83ef with SMTP id e3-20020a170902ed8300b0013dfb0283efmr1002158plj.17.1632764091566; Mon, 27 Sep 2021 10:34:51 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1632764091; cv=none; d=google.com; s=arc-20160816; b=RmSxcteSW0nXe/CzhCgGRqMoVllyASae3CN7LShtr90UGGmh+MBzm/gnjQRANidV8V fnJvhDHNlw9vLa50ntxZdIIES/Fmm4MhyS6b7Qyjc84V6zOXQkRXrj6SnPJ/Utypg6BD AGfEnblBpYxKl2ez3/LJIGUk3qukqnjTiOvsu0pgBJxKLVVDQ8CYc2+V0gsYZIS21pzv OnMQEMZe1iTzMuP5TRgEOGr2496USl4uocMFl3wdIkYvrwCXn0C6Yb3ZdO436YD8fPKl ZS+xzEXsM34J0Hp+3zxs57OorfmanymTOp+lJCriCq2rQSu5NFfphIc48K4CQyLaxG/d y0jw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=RbzH+IxUs5XO7wBSi6mMX+5YD0AZx85AhILDzDyixTk=; b=pNDJPiGEXIQBRByDfR34Yct3XC1uKho40WzdvQN+LOi+x0OJXWLnEodXUwKNRR1ofW BKI7D8Sa1+re7l6uuyjS6ALABBC1b++rSw0tXRQbGyXq1/sIy6+9yfEf1MmQL8v56hOl UtkKjcWeXSeaNov61QDwZYRzNAmRBnD02DraTHRbjVx9WwRuc9vTPZMyZ7PerVlb7CuT R9ZcSTx2TjDoDYsawGR0O1BTJomiakFb5VZTdl4zkLUrLr0+o+JA1CNWnjjUpOJHTZYT DdDXbMSq0OXxoHNgtfTtVxGoS0arZK51Fc5frGwj0wUwa118U/vt2yj0AWjQu5t1f5rd iYiA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=1GJQg78L; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id w25si20684139pgl.448.2021.09.27.10.34.35; Mon, 27 Sep 2021 10:34:51 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=1GJQg78L; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S238556AbhI0Rd0 (ORCPT + 99 others); Mon, 27 Sep 2021 13:33:26 -0400 Received: from mail.kernel.org ([198.145.29.99]:43266 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S237660AbhI0R3Z (ORCPT ); Mon, 27 Sep 2021 13:29:25 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 5E1D561526; Mon, 27 Sep 2021 17:17:53 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1632763073; bh=HJjcwAA+K5FQX3s9ms8zLgeTMkxVXwkqUdg6mYMWS5s=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=1GJQg78LPiD0lDMGOqcZM9/+FJHMLf4ONgfsJ/n0p2cc1uNJ+rfkKWeruzSVDrU9x p+aGtpRDjvyvFfzgbMe8KMdXySRMLZIMk4u8dmf7QPROZMwqQ0N/U+FT7mPyXu6Yhp ngxqA1yQZJsFkC1AAmiSWYRIQ0SsE8oEIMhx2SSs= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Malte Di Donato , Johan Hovold Subject: [PATCH 5.14 156/162] USB: serial: cp210x: fix dropped characters with CP2102 Date: Mon, 27 Sep 2021 19:03:22 +0200 Message-Id: <20210927170238.825142576@linuxfoundation.org> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20210927170233.453060397@linuxfoundation.org> References: <20210927170233.453060397@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Johan Hovold commit c32dfec6c1c36bbbcd5d33e949d99aeb215877ec upstream. Some CP2102 do not support event-insertion mode but return no error when attempting to enable it. This means that any event escape characters in the input stream will not be escaped by the device and consequently regular data may be interpreted as escape sequences and be removed from the stream by the driver. The reporter's device has batch number DCL00X etched into it and as discovered by the SHA2017 Badge team, counterfeit devices with that marking can be detected by sending malformed vendor requests. [1][2] Tests confirm that the possibly counterfeit CP2102 returns a single byte in response to a malformed two-byte part-number request, while an original CP2102 returns two bytes. Assume that every CP2102 that behaves this way also does not support event-insertion mode (e.g. cannot report parity errors). [1] https://mobile.twitter.com/sha2017badge/status/1167902087289532418 [2] https://hackaday.com/2017/08/14/hands-on-with-the-shacamp-2017-badge/#comment-3903376 Reported-by: Malte Di Donato Tested-by: Malte Di Donato Fixes: a7207e9835a4 ("USB: serial: cp210x: add support for line-status events") Cc: stable@vger.kernel.org # 5.9 Link: https://lore.kernel.org/r/20210922113100.20888-1-johan@kernel.org Signed-off-by: Johan Hovold Signed-off-by: Greg Kroah-Hartman --- drivers/usb/serial/cp210x.c | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) --- a/drivers/usb/serial/cp210x.c +++ b/drivers/usb/serial/cp210x.c @@ -259,6 +259,7 @@ struct cp210x_serial_private { speed_t max_speed; bool use_actual_rate; bool no_flow_control; + bool no_event_mode; }; enum cp210x_event_state { @@ -1113,12 +1114,16 @@ static void cp210x_change_speed(struct t static void cp210x_enable_event_mode(struct usb_serial_port *port) { + struct cp210x_serial_private *priv = usb_get_serial_data(port->serial); struct cp210x_port_private *port_priv = usb_get_serial_port_data(port); int ret; if (port_priv->event_mode) return; + if (priv->no_event_mode) + return; + port_priv->event_state = ES_DATA; port_priv->event_mode = true; @@ -2098,6 +2103,33 @@ static void cp210x_init_max_speed(struct priv->use_actual_rate = use_actual_rate; } +static void cp2102_determine_quirks(struct usb_serial *serial) +{ + struct cp210x_serial_private *priv = usb_get_serial_data(serial); + u8 *buf; + int ret; + + buf = kmalloc(2, GFP_KERNEL); + if (!buf) + return; + /* + * Some (possibly counterfeit) CP2102 do not support event-insertion + * mode and respond differently to malformed vendor requests. + * Specifically, they return one instead of two bytes when sent a + * two-byte part-number request. + */ + ret = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0), + CP210X_VENDOR_SPECIFIC, REQTYPE_DEVICE_TO_HOST, + CP210X_GET_PARTNUM, 0, buf, 2, USB_CTRL_GET_TIMEOUT); + if (ret == 1) { + dev_dbg(&serial->interface->dev, + "device does not support event-insertion mode\n"); + priv->no_event_mode = true; + } + + kfree(buf); +} + static int cp210x_get_fw_version(struct usb_serial *serial, u16 value) { struct cp210x_serial_private *priv = usb_get_serial_data(serial); @@ -2123,6 +2155,9 @@ static void cp210x_determine_quirks(stru int ret; switch (priv->partnum) { + case CP210X_PARTNUM_CP2102: + cp2102_determine_quirks(serial); + break; case CP210X_PARTNUM_CP2102N_QFN28: case CP210X_PARTNUM_CP2102N_QFN24: case CP210X_PARTNUM_CP2102N_QFN20: