From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8F51DC7EE2D for ; Sun, 7 May 2023 00:39:41 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230320AbjEGAjJ (ORCPT ); Sat, 6 May 2023 20:39:09 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58932 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232455AbjEGAiZ (ORCPT ); Sat, 6 May 2023 20:38:25 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 131C83C10; Sat, 6 May 2023 17:36:51 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 1C654614FC; Sun, 7 May 2023 00:36:27 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 9A77BC433EF; Sun, 7 May 2023 00:36:25 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1683419786; bh=/iUXaNDT7alYUMx3eEkk5Db82StVg7wrmF8S1M+pKgw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Qv8xU7xeI1zWJ1X1Y+QfdjZDXb2NrVi2GLUgvWxaGxyXFXdR8V6+s1H6HRJGj2bec aEu6czi/Yc7oAVyocZ6IIO/lPB+DgWBliYhoceKdmgMv9znpciMLkK0wS+7c9MUVEr T+yuJpzysIBew67QZeJfIfV1z31F0AablIm+5GXtwBqvKBRrzY46UJyHkwfyq5lj4G lvRtVe/yxyKzgITsQV61ootNR1o9JLOMtTRESIE9ccy2rh1duDVXSe5ffMKLLzD5KJ O1YLvBX3UoV2GVNMvyx+oCLo5LPbGqaef4RqkrhU1puMImh6i9mhHD6CYSTUuJky1e iyWs0go64hgYw== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Frank Wang , Heikki Krogerus , Greg Kroah-Hartman , Sasha Levin , linux@roeck-us.net, linux-usb@vger.kernel.org Subject: [PATCH AUTOSEL 5.4 7/9] usb: typec: tcpm: fix multiple times discover svids error Date: Sat, 6 May 2023 20:36:07 -0400 Message-Id: <20230507003609.4079746-7-sashal@kernel.org> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230507003609.4079746-1-sashal@kernel.org> References: <20230507003609.4079746-1-sashal@kernel.org> MIME-Version: 1.0 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: stable@vger.kernel.org From: Frank Wang [ Upstream commit dac3b192107b978198e89ec0f77375738352e0c8 ] PD3.0 Spec 6.4.4.3.2 say that only Responder supports 12 or more SVIDs, the Discover SVIDs Command Shall be executed multiple times until a Discover SVIDs VDO is returned ending either with a SVID value of 0x0000 in the last part of the last VDO or with a VDO containing two SVIDs with values of 0x0000. In the current implementation, if the last VDO does not find that the Discover SVIDs Command would be executed multiple times even if the Responder SVIDs are less than 12, and we found some odd dockers just meet this case. So fix it. Acked-by: Heikki Krogerus Signed-off-by: Frank Wang Link: https://lore.kernel.org/r/20230316081149.24519-1-frank.wang@rock-chips.com Signed-off-by: Greg Kroah-Hartman Signed-off-by: Sasha Levin --- drivers/usb/typec/tcpm/tcpm.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/drivers/usb/typec/tcpm/tcpm.c b/drivers/usb/typec/tcpm/tcpm.c index fb18264b702e6..b259a4a28f81a 100644 --- a/drivers/usb/typec/tcpm/tcpm.c +++ b/drivers/usb/typec/tcpm/tcpm.c @@ -1018,7 +1018,21 @@ static bool svdm_consume_svids(struct tcpm_port *port, const __le32 *payload, pmdata->svids[pmdata->nsvids++] = svid; tcpm_log(port, "SVID %d: 0x%x", pmdata->nsvids, svid); } - return true; + + /* + * PD3.0 Spec 6.4.4.3.2: The SVIDs are returned 2 per VDO (see Table + * 6-43), and can be returned maximum 6 VDOs per response (see Figure + * 6-19). If the Respondersupports 12 or more SVID then the Discover + * SVIDs Command Shall be executed multiple times until a Discover + * SVIDs VDO is returned ending either with a SVID value of 0x0000 in + * the last part of the last VDO or with a VDO containing two SVIDs + * with values of 0x0000. + * + * However, some odd dockers support SVIDs less than 12 but without + * 0x0000 in the last VDO, so we need to break the Discover SVIDs + * request and return false here. + */ + return cnt == 7; abort: tcpm_log(port, "SVID_DISCOVERY_MAX(%d) too low!", SVID_DISCOVERY_MAX); return false; -- 2.39.2