Changelog: https://cdn.kernel.org/pub/linux/kernel/v6.x/ChangeLog-6.6.28 Removed upstream: pending-6.6/796-net-dsa-mt7530-trap-link-local-frames-regardless-of-.patch All oither patches automatically rebased. 1. https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=v6.6.28&id=8b6c4b62582606c62074a7e7c64156f56d2785f2 Build system: x86/64 Build-tested: x86/64/AMD Cezanne, flogic/xiaomi_redmi-router-ax6000-ubootmod, ramips/tplink_archer-a6-v3 Run-tested: x86/64/AMD Cezanne, flogic/xiaomi_redmi-router-ax6000-ubootmod, ramips/tplink_archer-a6-v3 Signed-off-by: John Audia <therealgraysky@proton.me>
155 lines
5.7 KiB
Diff
155 lines
5.7 KiB
Diff
From b9547109205c5e0a27e5bed568b0fc183fff906b Mon Sep 17 00:00:00 2001
|
||
From: =?UTF-8?q?Ar=C4=B1n=C3=A7=20=C3=9CNAL?= <arinc.unal@arinc9.com>
|
||
Date: Thu, 14 Mar 2024 12:28:35 +0300
|
||
Subject: [PATCH 30/30] net: dsa: mt7530: prevent possible incorrect XTAL
|
||
frequency selection
|
||
MIME-Version: 1.0
|
||
Content-Type: text/plain; charset=UTF-8
|
||
Content-Transfer-Encoding: 8bit
|
||
|
||
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 <justin.swartz@risingedge.co.za>
|
||
Signed-off-by: Justin Swartz <justin.swartz@risingedge.co.za>
|
||
Signed-off-by: Arınç ÜNAL <arinc.unal@arinc9.com>
|
||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||
---
|
||
drivers/net/dsa/mt7530.c | 6 ------
|
||
1 file changed, 6 deletions(-)
|
||
|
||
--- a/drivers/net/dsa/mt7530.c
|
||
+++ b/drivers/net/dsa/mt7530.c
|
||
@@ -2389,12 +2389,6 @@ 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
|
||
*/
|