[BPI-R2] Kernel Development

Hi Does somebody try to use 2-nd gmac to wan directly? Gmac1 -> port 5 -> PHY port 4. I think this mode is better for routers.

I made tests with vlan aware bridge (bridging aux/p5 and gmac) some time ago for r2 and r64.

See second ethernet lane here

https://wiki.fw-web.de/doku.php?id=en:bpi-r2:network:start#permanent

I made it through dts for kernel 5.10.

    &eth {
    status = "okay";

    gmac0: mac@0 {
            compatible = "mediatek,eth-mac";
            mac-address = [fe dc ba 98 76 54];
            reg = <0>;
            phy-mode = "trgmii";

            fixed-link {
                    speed = <1000>;
                    full-duplex;
                    pause;
            };
    };

    gmac1: mac@1 {
            compatible = "mediatek,eth-mac";
            mac-address = [01 23 45 67 89 ab];
            reg = <1>;
            phy-mode = "rgmii";
            phy-handle = <&phy0>;

    };

    mdio: mdio-bus {
            #address-cells = <1>;
            #size-cells = <0>;

            /* Internal phy */
            phy0: eth-phy@0 {
                    reg = <0>;
            };

            mt7530: switch@1 {
                    compatible = "mediatek,mt7530";
                    reg = <1>;
                    /* reset-gpios = <&pio 33 0>; */
                    core-supply = <&mt6323_vpa_reg>;
                    io-supply = <&mt6323_vemc3v3_reg>;
                    mediatek,mcm;

                    resets = <&ethsys MT2701_ETHSYS_MCM_RST> ; /* 2>; */
                    reset-names = "mcm";

                    ports {
                            #address-cells = <1>;
                            #size-cells = <0>;
/*
                            port@0 {
                                    reg = <0>;
                                    label = "wan";
                            };
*/
                            port@1 {
                                    reg = <1>;
                                    label = "lan0";
                            };

                            port@2 {
                                    reg = <2>;
                                    label = "lan1";
                            };

                            port@3 {
                                    reg = <3>;
                                    label = "lan2";
                            };

                            port@4 {
                                    reg = <4>;
                                    label = "lan3";
                            };

                            cpu_port0: port@6 {
                                    reg = <6>;
                                    label = "cpu";
                                    ethernet = <&gmac0>;
                                    phy-mode = "trgmii";

                                    fixed-link {
                                            speed = <1000>;
                                            full-duplex;
                                            pause;
                                    };
                            };
                    };
            };
    };
};

It’s working for port0 as wan.

1 Like

Ok, did not know it is possible this way…does it work with full speed?

I don’t test speed yet. But I’m looking for an opportunity test it by available resources.

this seems not working on r64

+++ b/arch/arm64/boot/dts/mediatek/mt7622-bananapi-bpi-r64.dts
@@ -136,6 +136,7 @@ gmac1: mac@1 {
                compatible = "mediatek,eth-mac";
                reg = <1>;
                phy-mode = "rgmii";
+               phy-handle = <&phy0>;
 
                fixed-link {
                        speed = <1000>;
@@ -148,6 +149,11 @@ mdio: mdio-bus {
                #address-cells = <1>;
                #size-cells = <0>;
 
+               /* Internal phy */
+               phy0: eth-phy@0 {
+                       reg = <0>;
+               };
+
                switch@0 {
                        compatible = "mediatek,mt7531";
                        reg = <0>;
@@ -157,10 +163,10 @@ ports {
                                #address-cells = <1>;
                                #size-cells = <0>;
 
-                               port@0 {
+                               /*port@0 {
                                        reg = <0>;
                                        label = "wan";
-                               };
+                               };*/

results in probe error of mtk_soc_eth driver

mtk_soc_eth: probe of 1b100000.ethernet failed with error -16

but i see you have address 1 for switch on mdio bus, how did you get this address (imho this have not to be 1 and 0 is broadcast)?

I tried to modify configuration from example 2 of https://github.com/frank-w/BPI-R2-4.14/blob/5.10-main/Documentation/devicetree/bindings/net/dsa/mt7530.txt . And with phy0: eth-phy@0 { reg = <4>; and mt7530: switch@0 { reg = <0>; all worked, using port 4 as eth1. Changing phy reg = <0> disabled mt7530 init. I thought it was reg conflict (phy makes switch0) and tried to change reg of switch to 1. Also, mt7530 require mediatek,mcm flag and mcm reset for external phy. I don’t know to mt7531 needs it.

  • the original r64 dts works (wan with reg=0 over eth0)
  • why changing reg to 4 for internal phy as 4 is another port (lan3)

i don’t think it is related to mcm, problem is more that internal phy maps to phy-id 0 (broadcast) and switch too…imho mt7531 on r64 does not have real phy-id…tried to read out via mii-tool but got warning with stacktrace

WARNING: CPU: 0 PID: 1961 at drivers/net/phy/swphy.c:127 swphy_read_reg

I don’t know how it works on r2 because I don’t understand what reg means on mdio bus. As i mind mdio is setup interface for switch only. And those settings will not work on mt6531. This switch have considerably different init procedure in /drivers/net/dsa/mt7530.c

mdio is bus system comparable to i2c where multiple devices can be attached with different adresses (phy-ids).

the top reg (below switch compatible) is normally the phy-id on mdio-but, where 0 is broadcast. in my example above 2 nodes have broadcast-adress so it is invalid (which device is meant when get a response to broadcast). Ports having their own reg-property which are handled by switch driver.

yes init is different, but the reg-property handling (top by mdio-probe, ports by switch-driver/dsa-core) should be same/similar

Now I absolutely do not understand why it works …

And I don’t have a mt7530 manual