Hello friends. I completed analyzing and reworking of the openwrt code for the 3011th. A working version is ready (based on the sumo code).
OpenWRT-ziswiler-RB3011
Also I want to share my research on the rb3011 switch chips. I compiled the kernel module for RouterOS and with its help read the switch chip registers.
Based on these data, it became clear how exactly the operation of the network subsystem is rebuilt when the SFP is pluged in.
So, in RB3011 we have 4 network interfaces:
gmac0: 0x37000000 - eth0 - rgmii to switch0[0]
gmac1: 0x37200000 - eth1 - rgmii to switch1[0] or sgmii to SFP !!!
gmac2: 0x37400000 - eth2 - sgmii to switch0[6] only work if SERDES_AEN Autoneg is DISABLED!
gmac3: 0x37600000 - eth3 - sgmii to switch1[6 or 0 if SFP! ] only work if SERDES_AEN Autoneg is DISABLED!
*** without SFP ***
RouterOS dmesg grep:
switch0: open mac 0 as rgmii
switch1: open mac 1 as rgmii
switch0: open mac 2 as sgmii
switch1: open mac 3 as sgmii
NSS_COMMON_CLK_GATE register = 0xf0fcc
gmac0: RgMII_RX_EN = 1, RgMII_TX_EN = 1, SgMII_RX_EN = 0, SgMII_TX_EN = 0, GATE_PTP_EN = 1
gmac1: RgMII_RX_EN = 1, RgMII_TX_EN = 1, SgMII_RX_EN = 0, SgMII_TX_EN = 0, GATE_PTP_EN = 1
gmac2: RgMII_RX_EN = 0, RgMII_TX_EN = 0, SgMII_RX_EN = 1, SgMII_TX_EN = 1, GATE_PTP_EN = 1
gmac3: RgMII_RX_EN = 0, RgMII_TX_EN = 0, SgMII_RX_EN = 1, SgMII_TX_EN = 1, GATE_PTP_EN = 1
switches registers dump(without SFP):
0x0004: 0x07680000, 0x07680000 /* PAD0_MODE */
0x0008: 0x01000000, 0x01000000 /* PAD5_MODE */
0x000c: 0x00000080, 0x00000080 /* PAD6_MODE */
0x0010: 0x40000000, 0x40000000 /* POWER_ON_STRIP ! */
0x00e0: 0xc741e7de, 0xc741e7de /* SGMII_CTRL */
0x00e4: 0x0002a545, 0x0006a545 /* MAC_POWER_SEL */
0x007c: 0x00000c7e, 0x00000c7e /* PORT0_STATUS */
0x0094: 0x00000c7e, 0x00000c7e /* PORT6_STATUS */
0x0970: 0x1e864443, 0x1e864443 /* QM_PORT0_CTRL0 */
0x0974: 0x000001c6, 0x000001c6 /* QM_PORT0_CTRL1 */
0x0978: 0x19008643, 0x19008643 /* QM_PORT1_CTRL0 */
0x097c: 0x000001c6, 0x000001c6 /* QM_PORT1_CTRL1 */
0x0980: 0x19008643, 0x19008643 /* QM_PORT2_CTRL0 */
0x0984: 0x000001c6, 0x000001c6 /* QM_PORT2_CTRL1 */
0x0988: 0x19008643, 0x19008643 /* QM_PORT3_CTRL0 */
0x098c: 0x000001c6, 0x000001c6 /* QM_PORT3_CTRL1 */
0x0990: 0x19008643, 0x19008643 /* QM_PORT4_CTRL0 */
0x0994: 0x000001c6, 0x000001c6 /* QM_PORT4_CTRL1 */
0x0998: 0x1e864443, 0x1e864443 /* QM_PORT5_CTRL0 */
0x099c: 0x000001c6, 0x000001c6 /* QM_PORT5_CTRL1 */
0x09a0: 0x1e864443, 0x1e864443 /* QM_PORT6_CTRL0 */
0x09a4: 0x000001c6, 0x000001c6 /* QM_PORT6_CTRL1 */
*** With SFP ***
RouterOS dmesg grep:
switch0: open mac 0 as rgmii
eth5: open mac 1 as sgmii
switch0: open mac 2 as sgmii
switch1: open mac 3 as sgmii
NSS_COMMON_CLK_GATE register = 0xf03ee
gmac0: RgMII_RX_EN = 1, RgMII_TX_EN = 1, SgMII_RX_EN = 0, SgMII_TX_EN = 0, GATE_PTP_EN = 1
gmac1: RgMII_RX_EN = 0, RgMII_TX_EN = 0, SgMII_RX_EN = 1, SgMII_TX_EN = 1, GATE_PTP_EN = 1
gmac2: RgMII_RX_EN = 0, RgMII_TX_EN = 0, SgMII_RX_EN = 1, SgMII_TX_EN = 1, GATE_PTP_EN = 1
gmac3: RgMII_RX_EN = 0, RgMII_TX_EN = 0, SgMII_RX_EN = 1, SgMII_TX_EN = 1, GATE_PTP_EN = 1
switches registers dump diff(when SPF is plugged in):
-0x0004: 0x07680000, 0x07680000 /* PAD0_MODE */
+0x0004: 0x07680000, 0x00080080 /* PAD0_MODE */
-0x0008: 0x01000000, 0x01000000 /* PAD5_MODE */
+0x0008: 0x01000000, 0x00000000 /* PAD5_MODE */
-0x000c: 0x00000080, 0x00000080 /* PAD6_MODE */
+0x000c: 0x00000080, 0x00000000 /* PAD6_MODE */
-0x0094: 0x00000c7e, 0x00000c7e /* PORT6_STATUS */
+0x0094: 0x00000c7e, 0x00000e80 /* PORT6_STATUS */
The following scheme is used for switch0:
gmac0(RGMII) is connected to switch0[0](RGMII) - OK
gmac2(SGMII) is connected to switch0[6](SGMII) - OK
That is, without SFP, the following scheme is used for switch1:
gmac1(RGMII) is connected to switch1[0](RGMII) - OK
gmac3(SGMII) is connected to switch1[6](SGMII) - OK
When plugging in SFP, the following scheme is used for switch1:
gmac1(SGMII) is connected to SFP(SGMII) - OK
gmac3(SGMII) is connected to switch1[0](SGMII) - OK