Received: by 2002:ab2:5c0e:0:b0:1ef:a325:1205 with SMTP id i14csp266521lqk; Thu, 14 Mar 2024 02:29:13 -0700 (PDT) X-Forwarded-Encrypted: i=3; AJvYcCX6K9Bq9TqyMDuMzGM+BTcEKmp+CpopEuEMnipmlifry5PcM9EVCsnZjE4qdP/t5fp7OZPHHmk2VLvIZsJ8pHQ0v+76F1bNR/Q8TGWFdA== X-Google-Smtp-Source: AGHT+IFJIzOaYMGCXJulNa9aR3opx8DvrWORJBUIPv4jXhYOnd0QGgJsgcBJpRSQZ70las6t5M4j X-Received: by 2002:a05:622a:452:b0:430:974c:cd56 with SMTP id o18-20020a05622a045200b00430974ccd56mr1244215qtx.24.1710408553590; Thu, 14 Mar 2024 02:29:13 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1710408553; cv=pass; d=google.com; s=arc-20160816; b=yh2B2O2obhTuqJO8Ei3zdzKqY0y91tybER06uVVWl9xlRApTvt3dbxzYSBfhDIvy2B s8IfN9r8Hoj5hrhBNjjL7oZmdIuEe6B1FC/ChPjKTkETjGqJ7yjpUdKqcgL+IPuUwZd0 wihXPdH0SC/FPWO56/fZPgfiokClAkI4BKHoIxhhNLMIcJHA1rJHTLNftcEf/N8xzHpR 1SDO4Bup0xvbXyvmTbFgbwMUX02Pade1b9OdGOeTb0v9p21KD2S2LfWcGZVL2NZ83S/a 2q5XS2GkqG5Pwkyn92wb7ajdvJGWXCGVWL7rcQmwotu4kn+OUWFvxKAXOvt7J1VE9OE0 06VA== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=reply-to:cc:to:content-transfer-encoding:mime-version :list-unsubscribe:list-subscribe:list-id:precedence:subject:date :from:dkim-signature:message-id; bh=FyfHeqW2YFBA7U+iW7diKDLmxIlxNYlbSHhsCUa405I=; fh=OaL65AkYiOxZ6qI1zxM3FDGOPapB2BL3WpZrXnQBIpY=; b=hZNYtQHtqcVFgGlaqwveEsa4WL3q41RIDWfB43ct7uyGKUl+IGQ2SQKJ2jQDy8Iup1 Z5OzR5FPlpmnS3OrIJJ+Gp9Kix4S+5Y5GKa8leiY+wFlgqPIBGEXGKg8438LthflpXy5 AzC7Oth9bCXWlxgXk6HuCh5j9Y1fL5ehnPU/PaPzG+P/xG0sSC2i4Wa66ziMLQ0hptRt E+CMY0/JNE+QREhQZD292WG2HYjyO4ZFJqKWJAekR6W3EcnN2xPrRaxI3PpTPGX17G2L v0jobIRwlMZy6u3Qjy1UB9dDgHl9RTNfa2n2GVGlvluLP6zDasrzJJUN6HRBiKowZLs5 J1gw==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=gfsRdRpi; arc=pass (i=1 dkim=pass dkdomain=kernel.org); spf=pass (google.com: domain of linux-kernel+bounces-103050-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.199.223 as permitted sender) smtp.mailfrom="linux-kernel+bounces-103050-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from ny.mirrors.kernel.org (ny.mirrors.kernel.org. [147.75.199.223]) by mx.google.com with ESMTPS id d15-20020a05622a100f00b0042ee01bc1cesi1087560qte.292.2024.03.14.02.29.13 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 14 Mar 2024 02:29:13 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel+bounces-103050-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.199.223 as permitted sender) client-ip=147.75.199.223; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=gfsRdRpi; arc=pass (i=1 dkim=pass dkdomain=kernel.org); spf=pass (google.com: domain of linux-kernel+bounces-103050-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.199.223 as permitted sender) smtp.mailfrom="linux-kernel+bounces-103050-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Message-ID: <65f2c369.050a0220.baa77.84afSMTPIN_ADDED_BROKEN@mx.google.com> X-Google-Original-Message-ID: =?utf-8?q?=3C20240314-for-netnext-mt7530-better-fix-xtal-frequen?= =?utf-8?q?cy-v2-1-fe30795593df=40arinc9=2Ecom=3E?= Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ny.mirrors.kernel.org (Postfix) with ESMTPS id 189D11C221FF for ; Thu, 14 Mar 2024 09:29:13 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id D908A6CDC8; Thu, 14 Mar 2024 09:29:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="gfsRdRpi" Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CBF1FEEC4; Thu, 14 Mar 2024 09:29:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710408542; cv=none; b=JrsOkusq/E8TVDmK/ETVqRPBTCcXtiMC/3T/8s4CyZqoSWrLWAMWYgbD2wh/qDoHdtK7+eKljNX+rI4FprYfwe1ai4BtmQHKaLhSam7pEbzlkl5CjN8wQ+JC+05aAMwyfzQ92ZkoVHbha8IAVfW+RTtiUdEqBbNAuc64f42r/xo= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710408542; c=relaxed/simple; bh=Jx/AZAWXpqocB7lNLUtwT+UcAklkZMnptmke1Ph4jas=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:To:Cc; b=FkJmo5mWlaRnOJ3lXkioOS3x27BsP9nsIfZGH81CQte0dKGKIY0vT4t+UW6rgHHY5rHOlmtRA3TD/PCB0R0j5z4YzLcrLflDnrtxHjZuLy327EPJRjXmHhJIYjA+bWN/RLr6fGJrZaCzeTiwM5pLrhJpby+//GpRqtI4Q6faBtU= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=gfsRdRpi; arc=none smtp.client-ip=10.30.226.201 Received: by smtp.kernel.org (Postfix) with ESMTPS id 2DD6BC433F1; Thu, 14 Mar 2024 09:29:02 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1710408542; bh=Jx/AZAWXpqocB7lNLUtwT+UcAklkZMnptmke1Ph4jas=; h=From:Date:Subject:To:Cc:Reply-To:From; b=gfsRdRpidNPAJe43U7bZizUjxnb7lhLHXhWDvnq6d/KhPYVAVIjUfjecau5q3pGdu q5vKfxAY5KDwkMXc3jfNOj1VWiIUUa6gHlGAUu9jO2gssv0S6cDknBbAzyRwXWv44l tXrGiiIXicEZ/U8Qf2rdouocNpxKGtUxGQzmVS5tT5cSTOZBRVZ0PIxogPyQlmRIcW Da6lOxw/x0CBHt3z04JlbRUCAr6zCcxJkf1GyP5+HRUEVCtsOwY+5fWyXaP1aiLnzi jtGyH8WPc0OvVEXZYApt0BmxxcH3cVS0nWPm+S+pxWY7JFUI+/pigICMSXWIKfx1xY hhnC7esVYq/Rw== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 239FDC54E67; Thu, 14 Mar 2024 09:29:02 +0000 (UTC) From: =?utf-8?b?QXLEsW7DpyDDnE5BTA==?= via B4 Relay Date: Thu, 14 Mar 2024 12:28:35 +0300 Subject: [PATCH net v2] net: dsa: mt7530: prevent possible incorrect XTAL frequency selection Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 8bit X-B4-Tracking: v=1; b=H4sIAELD8mUC/5WOSw7CIBRFt9K8sc/wERscuQ/TAdKHJbGggE2bp nuXNG7A4f3knrtCpuQpw6VZIdHks4+hCnFowA4mPAh9XzUIJk5McoEuJgxUAs0Fx9IqyfBOpVB C52eci3miS/T+ULALSk5np7SWvHVQJ1+JamvH3aCuQFfNwecS07JfmPge/WjyP9rEkaMyivVOa 6e4uZrkg9VHG0fotm37An9I9ZHuAAAA To: Daniel Golle , DENG Qingfang , Sean Wang , Andrew Lunn , Florian Fainelli , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Matthias Brugger , AngeloGioacchino Del Regno , Philipp Zabel , Landen Chao Cc: Bartel Eerdekens , mithat.guner@xeront.com, erkin.bozoglu@xeront.com, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-mediatek@lists.infradead.org, Justin Swartz , =?utf-8?q?Ar=C4=B1n=C3=A7_=C3=9CNAL?= X-Mailer: b4 0.13.0 X-Developer-Signature: v=1; a=ed25519-sha256; t=1710408527; l=6807; i=arinc.unal@arinc9.com; s=arinc9-patatt; h=from:subject:message-id; bh=b3iyIQB+IfaOXBCFV+CLb00V/DTdBVGoIX1+WquqbvY=; b=Ipl+/Xf00qHI5kU6sQQr2t9e/tXIrxQha0M6Rg9B5s1AJvw/WD/0qGsj5wKPMdj2NU+7fw4JW AwKYa8g+h8iAgA13wPCzDbrlFJrd5GsCTjjA+VX97fIzFSXvtQe+9Kn X-Developer-Key: i=arinc.unal@arinc9.com; a=ed25519; pk=VmvgMWwm73yVIrlyJYvGtnXkQJy9CvbaeEqPQO9Z4kA= X-Endpoint-Received: by B4 Relay for arinc.unal@arinc9.com/arinc9-patatt with auth_id=115 X-Original-From: =?utf-8?b?QXLEsW7DpyDDnE5BTA==?= Reply-To: From: Arınç ÜNAL On MT7530, the HT_XTAL_FSEL field of the HWTRAP register stores a 2-bit value that represents the frequency of the crystal oscillator connected to the switch IC. The field is populated by the state of the ESW_P4_LED_0 and ESW_P4_LED_0 pins, which is done right after reset is deasserted. ESW_P4_LED_0 ESW_P3_LED_0 Frequency ----------------------------------------- 0 0 Reserved 0 1 20MHz 1 0 40MHz 1 1 25MHz On MT7531, the XTAL25 bit of the STRAP register stores this. The LAN0LED0 pin is used to populate the bit. 25MHz when the pin is high, 40MHz when it's low. These pins are also used with LEDs, therefore, their state can be set to something other than the bootstrapping configuration. For example, a link may be established on port 3 before the DSA subdriver takes control of the switch which would set ESW_P3_LED_0 to high. Currently on mt7530_setup() and mt7531_setup(), 1000 - 1100 usec delay is described between reset assertion and deassertion. Some switch ICs in real life conditions cannot always have these pins set back to the bootstrapping configuration before reset deassertion in this amount of delay. This causes wrong crystal frequency to be selected which puts the switch in a nonfunctional state after reset deassertion. The tests below are conducted on an MT7530 with a 40MHz crystal oscillator by Justin Swartz. With a cable from an active peer connected to port 3 before reset, an incorrect crystal frequency (0b11 = 25MHz) is selected: [1] [3] [5] : : : _____________________________ __________________ ESW_P4_LED_0 |_______| _____________________________ ESW_P3_LED_0 |__________________________ : : : : : : [4]...: : : [2]................: [1] Reset is asserted. [2] Period of 1000 - 1100 usec. [3] Reset is deasserted. [4] Period of 315 usec. HWTRAP register is populated with incorrect XTAL frequency. [5] Signals reflect the bootstrapped configuration. Increase the delay between reset_control_assert() and reset_control_deassert(), and gpiod_set_value_cansleep(priv->reset, 0) and gpiod_set_value_cansleep(priv->reset, 1) to 5000 - 5100 usec. This amount ensures a higher possibility that the switch IC will have these pins back to the bootstrapping configuration before reset deassertion. With a cable from an active peer connected to port 3 before reset, the correct crystal frequency (0b10 = 40MHz) is selected: [1] [2-1] [3] [5] : : : : _____________________________ __________________ ESW_P4_LED_0 |_______| ___________________ _______ ESW_P3_LED_0 |_________| |__________________ : : : : : : [2-2]...: [4]...: [2]................: [1] Reset is asserted. [2] Period of 5000 - 5100 usec. [2-1] ESW_P3_LED_0 goes low. [2-2] Remaining period of 5000 - 5100 usec. [3] Reset is deasserted. [4] Period of 310 usec. HWTRAP register is populated with bootstrapped XTAL frequency. [5] Signals reflect the bootstrapped configuration. ESW_P3_LED_0 low period before reset deassertion: 5000 usec - 5100 usec TEST RESET HOLD # (usec) --------------------- 1 5410 2 5440 3 4375 4 5490 5 5475 6 4335 7 4370 8 5435 9 4205 10 4335 11 3750 12 3170 13 4395 14 4375 15 3515 16 4335 17 4220 18 4175 19 4175 20 4350 Min 3170 Max 5490 Median 4342.500 Avg 4466.500 Revert commit 2920dd92b980 ("net: dsa: mt7530: disable LEDs before reset"). Changing the state of pins via reset assertion is simpler and more efficient than doing so by setting the LED controller off. Fixes: b8f126a8d543 ("net-next: dsa: add dsa support for Mediatek MT7530 switch") Fixes: c288575f7810 ("net: dsa: mt7530: Add the support of MT7531 switch") Co-developed-by: Justin Swartz Signed-off-by: Justin Swartz Signed-off-by: Arınç ÜNAL --- Changes in v2: - Feature Justin as a co-author. - Link to v1: https://lore.kernel.org/r/20240313-for-netnext-mt7530-better-fix-xtal-frequency-v1-1-5a50df99f51a@arinc9.com --- drivers/net/dsa/mt7530.c | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/drivers/net/dsa/mt7530.c b/drivers/net/dsa/mt7530.c index 678b51f9cea6..6986f538a4d0 100644 --- a/drivers/net/dsa/mt7530.c +++ b/drivers/net/dsa/mt7530.c @@ -2192,22 +2192,16 @@ mt7530_setup(struct dsa_switch *ds) } } - /* Disable LEDs before reset to prevent the MT7530 sampling a - * potentially incorrect HT_XTAL_FSEL value. - */ - mt7530_write(priv, MT7530_LED_EN, 0); - usleep_range(1000, 1100); - /* Reset whole chip through gpio pin or memory-mapped registers for * different type of hardware */ if (priv->mcm) { reset_control_assert(priv->rstc); - usleep_range(1000, 1100); + usleep_range(5000, 5100); reset_control_deassert(priv->rstc); } else { gpiod_set_value_cansleep(priv->reset, 0); - usleep_range(1000, 1100); + usleep_range(5000, 5100); gpiod_set_value_cansleep(priv->reset, 1); } @@ -2420,11 +2414,11 @@ mt7531_setup(struct dsa_switch *ds) */ if (priv->mcm) { reset_control_assert(priv->rstc); - usleep_range(1000, 1100); + usleep_range(5000, 5100); reset_control_deassert(priv->rstc); } else { gpiod_set_value_cansleep(priv->reset, 0); - usleep_range(1000, 1100); + usleep_range(5000, 5100); gpiod_set_value_cansleep(priv->reset, 1); } --- base-commit: d7d75124965aee23e5e4421d78376545cf070b0a change-id: 20240312-for-netnext-mt7530-better-fix-xtal-frequency-31e6f599317f Best regards, -- Arınç ÜNAL