net: ethernet: mtk_eth_soc: various enhancements
Subsystems (9)
Daniel Golle
maintainerv11 cover net: ethernet: mtk_eth_soc: various enhancements
This series brings a variety of fixes and enhancements for mtk_eth_soc, adds support for the MT7981 SoC and facilitates sharing the SGMII PCS code between mtk_eth_soc and mt7530.
Note that this series depends on commit 697c3892d825 ("regmap: apply reg_base and reg_downshift for single register ops") to not break mt7530 pcs register access.
The whole series has been tested on MT7622+MT7531 (BPi-R64), MT7623+MT7530 (BPi-R2), MT7981+GPY211 (GL.iNet GL-MT3000) and MT7986+MT7531 (BPi-R3).
Changes since v10:
* improve mediatek,mt7981-eth dt-bindings
* use regmap_set_bits instead of regmap_update_bits where possible
* completely remove mtk_sgmii.c
* no need to keep struct mtk_sgmii either as it had only a single element
Changes since v9:
* fix path in mediatek,sgmiisys dt-binding
Changes since v8:
* move mediatek,sgmiisys dt-bindings to correct net/pcs folder
* rebase on top of net-next/main so series applies cleanly again
Changes since v7:
* move mediatek,sgmiisys.yaml to more appropriate folder
* don't include <linux/phylink.h> twice in PCS driver, sort includes
Changes since v6:
* label MAC MCR bit 12 in 08/12, MediaTek replied explaining its function
Changes since v5:
* drop dev pointer also from struct mtk_sgmii, pass it as function parameter instead
* address comments left for dt-bindings
* minor improvements to commit messages
Changes since v4:
* remove unused dev pointer in struct pcs_mtk_lynxi
* squash link timer check into correct follow-up patch
Changes since v3:
* remove unused #define's
* use BMCR_* instead of #define'ing our own constants
* return before changing registers in case of invalid link timer
Changes since v2:
* improve dt-bindings, convert sgmisys bindings to dt-schema yaml
* fix typo
Changes since v1:
* apply reverse xmas tree everywhere
* improve commit descriptions
* add dt binding documentation
* various small changes addressing all comments received for v1
Daniel Golle (12):
net: ethernet: mtk_eth_soc: add support for MT7981 SoC
dt-bindings: net: mediatek,net: add mt7981-eth binding
dt-bindings: arm: mediatek: sgmiisys: Convert to DT schema
dt-bindings: arm: mediatek: sgmiisys: add MT7981 SoC
net: ethernet: mtk_eth_soc: set MDIO bus clock frequency
net: ethernet: mtk_eth_soc: reset PCS state
net: ethernet: mtk_eth_soc: only write values if needed
net: ethernet: mtk_eth_soc: fix RX data corruption issue
net: ethernet: mtk_eth_soc: ppe: add support for flow accounting
net: pcs: add driver for MediaTek SGMII PCS
net: ethernet: mtk_eth_soc: switch to external PCS driver
net: dsa: mt7530: use external PCS driver
.../arm/mediatek/mediatek,sgmiisys.txt | 27 -- .../devicetree/bindings/net/mediatek,net.yaml | 53 ++- .../bindings/net/pcs/mediatek,sgmiisys.yaml | 55 ++++ MAINTAINERS | 7 + drivers/net/dsa/Kconfig | 1 + drivers/net/dsa/mt7530.c | 277 ++++------------ drivers/net/dsa/mt7530.h | 47 +-- drivers/net/ethernet/mediatek/Kconfig | 2 + drivers/net/ethernet/mediatek/Makefile | 2 +- drivers/net/ethernet/mediatek/mtk_eth_path.c | 14 +- drivers/net/ethernet/mediatek/mtk_eth_soc.c | 114 ++++++- drivers/net/ethernet/mediatek/mtk_eth_soc.h | 114 +++---- drivers/net/ethernet/mediatek/mtk_ppe.c | 114 ++++++- drivers/net/ethernet/mediatek/mtk_ppe.h | 25 +- .../net/ethernet/mediatek/mtk_ppe_debugfs.c | 9 +- .../net/ethernet/mediatek/mtk_ppe_offload.c | 8 + drivers/net/ethernet/mediatek/mtk_ppe_regs.h | 14 + drivers/net/ethernet/mediatek/mtk_sgmii.c | 203 ------------ drivers/net/pcs/Kconfig | 7 + drivers/net/pcs/Makefile | 1 + drivers/net/pcs/pcs-mtk-lynxi.c | 302 ++++++++++++++++++ include/linux/pcs/pcs-mtk-lynxi.h | 13 + 22 files changed, 817 insertions(+), 592 deletions(-) delete mode 100644 Documentation/devicetree/bindings/arm/mediatek/mediatek,sgmiisys.txt create mode 100644 Documentation/devicetree/bindings/net/pcs/mediatek,sgmiisys.yaml delete mode 100644 drivers/net/ethernet/mediatek/mtk_sgmii.c create mode 100644 drivers/net/pcs/pcs-mtk-lynxi.c create mode 100644 include/linux/pcs/pcs-mtk-lynxi.h
base-commit: 1716a175592aff9549a0c07aac8f9cadd03003f5
Signature · 1 line
2.39.2
Daniel Golle
maintainerRFC PATCH v11 1/12 net: ethernet: mtk_eth_soc: add support for MT7981 SoC
The MediaTek MT7981 SoC comes with two 1G/2.5G SGMII ports, just like MT7986.
In addition MT7981 is equipped with a built-in 1000Base-T PHY which can be used with GMAC1.
As many MT7981 boards make use of inverting SGMII signal polarity, add new device-tree attribute 'mediatek,pn_swap' to support them.
--- drivers/net/ethernet/mediatek/mtk_eth_path.c | 14 +++++++-- drivers/net/ethernet/mediatek/mtk_eth_soc.c | 21 +++++++++++++ drivers/net/ethernet/mediatek/mtk_eth_soc.h | 31 ++++++++++++++++++++ drivers/net/ethernet/mediatek/mtk_sgmii.c | 10 +++++++ 4 files changed, 73 insertions(+), 3 deletions(-)
drivers/net/ethernet/mediatek/mtk_eth_path.c +11 -3
@@ -96,12 +96,20 @@ static int set_mux_gmac2_gmac0_to_gephy(struct mtk_eth *eth, int path)static int set_mux_u3_gmac2_to_qphy (struct mtk_eth *eth,int path) { -unsigned int val =0 ; +unsigned int val =0 , mask =0 , reg =0 ;bool updated = true;switch (path) {case MTK_ETH_PATH_GMAC2_SGMII : - val =CO_QPHY_SEL ; +if (MTK_HAS_CAPS (eth->soc->caps,MTK_U3_COPHY_V2 )) { + reg =USB_PHY_SWITCH_REG ; + val =SGMII_QPHY_SEL ; + mask =QPHY_SEL_MASK ; + }else { + reg =INFRA_MISC2 ; + val =CO_QPHY_SEL ; + mask = val; + }break ;default : updated = false;
@@ -109,7 +117,7 @@ static int set_mux_u3_gmac2_to_qphy(struct mtk_eth *eth, int path) }if (updated) -regmap_update_bits (eth->infra,INFRA_MISC2 ,CO_QPHY_SEL , val); +regmap_update_bits (eth->infra, reg, mask, val);dev_dbg (eth->dev,"path %s in %s updated = %d\n" ,mtk_eth_path_name (path), __func__, updated);
drivers/net/ethernet/mediatek/mtk_eth_soc.c +21 -0
@@ -4860,6 +4860,26 @@ static const struct mtk_soc_data mt7629_data = { }, }; +static const struct mtk_soc_data mt7981_data = { + .reg_map = &mt7986_reg_map, + .ana_rgc3 =0x128 , + .caps =MT7981_CAPS , + .hw_features =MTK_HW_FEATURES , + .required_clks =MT7981_CLKS_BITMAP , + .required_pctl = false, + .offload_version =2 , + .hash_offset =4 , + .foe_entry_size =sizeof (struct mtk_foe_entry ), + .txrx = { + .txd_size =sizeof (struct mtk_tx_dma_v2 ), + .rxd_size =sizeof (struct mtk_rx_dma_v2 ), + .rx_irq_done_mask =MTK_RX_DONE_INT_V2 , + .rx_dma_l4_valid =RX_DMA_L4_VALID_V2 , + .dma_max_len =MTK_TX_DMA_BUF_LEN_V2 , + .dma_len_offset =8 , + }, +}; +static const struct mtk_soc_data mt7986_data = { .reg_map = &mt7986_reg_map, .ana_rgc3 =0x128 ,
@@ -4902,6 +4922,7 @@ const struct of_device_id of_mtk_match[] = { { .compatible = "mediatek,mt7622-eth", .data = &mt7622_data}, { .compatible = "mediatek,mt7623-eth", .data = &mt7623_data}, { .compatible = "mediatek,mt7629-eth", .data = &mt7629_data}, + { .compatible = "mediatek,mt7981-eth", .data = &mt7981_data}, { .compatible = "mediatek,mt7986-eth", .data = &mt7986_data}, { .compatible = "ralink,rt5350-eth", .data = &rt5350_data}, {},
drivers/net/ethernet/mediatek/mtk_eth_soc.h +31 -0
@@ -551,11 +551,22 @@#define SGMSYS_QPHY_PWR_STATE_CTRL 0xe8#define SGMII_PHYA_PWD BIT(4) +/* Register to QPHY wrapper control */ +#define SGMSYS_QPHY_WRAP_CTRL 0xec +#define SGMII_PN_SWAP_MASK GENMASK(1, 0) +#define SGMII_PN_SWAP_TX_RX (BIT(0) | BIT(1)) +#define MTK_SGMII_FLAG_PN_SWAP BIT(0) +/* Infrasys subsystem config registers */ #define INFRA_MISC2 0x70c#define CO_QPHY_SEL BIT(0)#define GEPHY_MAC_SEL BIT(1) +/* Top misc registers */ +#define USB_PHY_SWITCH_REG 0x218 +#define QPHY_SEL_MASK GENMASK(1, 0) +#define SGMII_QPHY_SEL 0x2 +/* MT7628/88 specific stuff */ #define MT7628_PDMA_OFFSET 0x0800#define MT7628_SDM_OFFSET 0x0c00
@@ -736,6 +747,17 @@ enum mtk_clks_map { BIT(MTK_CLK_SGMII2_CDR_FB) | \ BIT(MTK_CLK_SGMII_CK) | \ BIT(MTK_CLK_ETH2PLL) | BIT(MTK_CLK_SGMIITOP)) +#define MT7981_CLKS_BITMAP (BIT(MTK_CLK_FE) | BIT(MTK_CLK_GP2) | BIT(MTK_CLK_GP1) | \ + BIT(MTK_CLK_WOCPU0) | \ + BIT(MTK_CLK_SGMII_TX_250M) | \ + BIT(MTK_CLK_SGMII_RX_250M) | \ + BIT(MTK_CLK_SGMII_CDR_REF) | \ + BIT(MTK_CLK_SGMII_CDR_FB) | \ + BIT(MTK_CLK_SGMII2_TX_250M) | \ + BIT(MTK_CLK_SGMII2_RX_250M) | \ + BIT(MTK_CLK_SGMII2_CDR_REF) | \ + BIT(MTK_CLK_SGMII2_CDR_FB) | \ + BIT(MTK_CLK_SGMII_CK))#define MT7986_CLKS_BITMAP (BIT(MTK_CLK_FE) | BIT(MTK_CLK_GP2) | BIT(MTK_CLK_GP1) | \ BIT(MTK_CLK_WOCPU1) | BIT(MTK_CLK_WOCPU0) | \ BIT(MTK_CLK_SGMII_TX_250M) | \
@@ -849,6 +871,7 @@ enum mkt_eth_capabilities {MTK_NETSYS_V2_BIT ,MTK_SOC_MT7628_BIT ,MTK_RSTCTRL_PPE1_BIT , +MTK_U3_COPHY_V2_BIT ,/* MUX BITS*/ MTK_ETH_MUX_GDM1_TO_GMAC1_ESW_BIT,
@@ -883,6 +906,7 @@ enum mkt_eth_capabilities {#define MTK_NETSYS_V2 BIT(MTK_NETSYS_V2_BIT)#define MTK_SOC_MT7628 BIT(MTK_SOC_MT7628_BIT)#define MTK_RSTCTRL_PPE1 BIT(MTK_RSTCTRL_PPE1_BIT) +#define MTK_U3_COPHY_V2 BIT(MTK_U3_COPHY_V2_BIT)#define MTK_ETH_MUX_GDM1_TO_GMAC1_ESW \ BIT(MTK_ETH_MUX_GDM1_TO_GMAC1_ESW_BIT)
@@ -955,6 +979,11 @@ enum mkt_eth_capabilities { MTK_MUX_U3_GMAC2_TO_QPHY | \ MTK_MUX_GMAC12_TO_GEPHY_SGMII | MTK_QDMA) +#define MT7981_CAPS (MTK_GMAC1_SGMII | MTK_GMAC2_SGMII | MTK_GMAC2_GEPHY | \ + MTK_MUX_GMAC12_TO_GEPHY_SGMII | MTK_QDMA | \ + MTK_MUX_U3_GMAC2_TO_QPHY | MTK_U3_COPHY_V2 | \ + MTK_NETSYS_V2 | MTK_RSTCTRL_PPE1) +#define MT7986_CAPS (MTK_GMAC1_SGMII | MTK_GMAC2_SGMII | \ MTK_MUX_GMAC12_TO_GEPHY_SGMII | MTK_QDMA | \ MTK_NETSYS_V2 | MTK_RSTCTRL_PPE1)
@@ -1068,12 +1097,14 @@ struct mtk_soc_data {* @ana_rgc3: The offset refers to register ANA_RGC3 related to regmap * @interface: Currently configured interface mode * @pcs: Phylink PCS structure +* @flags: Flags indicating hardware properties */ struct mtk_pcs {struct regmap *regmap;u32 ana_rgc3;phy_interface_t interface;struct phylink_pcs pcs; +u32 flags; };/* struct mtk_sgmii - This is the structure holding sgmii regmap and its
drivers/net/ethernet/mediatek/mtk_sgmii.c +10 -0
@@ -88,6 +88,11 @@ static int mtk_pcs_config(struct phylink_pcs *pcs, unsigned int mode,regmap_update_bits (mpcs->regmap,SGMSYS_QPHY_PWR_STATE_CTRL ,SGMII_PHYA_PWD ,SGMII_PHYA_PWD ); +if (mpcs->flags &MTK_SGMII_FLAG_PN_SWAP ) +regmap_update_bits (mpcs->regmap,SGMSYS_QPHY_WRAP_CTRL , +SGMII_PN_SWAP_MASK , +SGMII_PN_SWAP_TX_RX ); +if (interface ==PHY_INTERFACE_MODE_2500BASEX ) rgc3 =RG_PHY_SPEED_3_125G ;else
@@ -182,6 +187,11 @@ int mtk_sgmii_init(struct mtk_sgmii *ss, struct device_node *r, u32 ana_rgc3) ss->pcs[i].ana_rgc3 = ana_rgc3; ss->pcs[i].regmap =syscon_node_to_regmap (np); + + ss->pcs[i].flags =0 ; +if (of_property_read_bool (np,"mediatek,pnswap" )) + ss->pcs[i].flags |=MTK_SGMII_FLAG_PN_SWAP ; +of_node_put (np);if (IS_ERR (ss->pcs[i].regmap))return PTR_ERR (ss->pcs[i].regmap);
Signature · 1 line
2.39.2
Daniel Golle
maintainerRFC PATCH v11 2/12 dt-bindings: net: mediatek,net: add mt7981-eth binding
In reply to Daniel GolleIntroduce DT bindings for the MT7981 SoC to mediatek,net.yaml.
--- .../devicetree/bindings/net/mediatek,net.yaml | 53 +++++++++++++++++-- 1 file changed, 48 insertions(+), 5 deletions(-)
Documentation/devicetree/bindings/net/mediatek,net.yaml +48 -5
@@ -21,6 +21,7 @@ properties: - mediatek,mt7623-eth - mediatek,mt7622-eth - mediatek,mt7629-eth + - mediatek,mt7981-eth - mediatek,mt7986-eth - ralink,rt5350-eth
@@ -78,6 +79,11 @@ properties: description: List of phandles to wireless ethernet dispatch nodes. + mediatek,wed-pcie: + $ref: /schemas/types.yaml#/definitions/phandle + description: + Phandle to the mediatek wed-pcie controller. + dma-coherent: true mdio-bus:
@@ -123,6 +129,8 @@ allOf: mediatek,wed: false + mediatek,wed-pcie: false + - if: properties: compatible:
@@ -160,6 +168,8 @@ allOf: description: Phandle to the mediatek pcie-mirror controller. + mediatek,wed-pcie: false + - if: properties: compatible:
@@ -206,6 +216,44 @@ allOf: mediatek,wed: false + mediatek,wed-pcie: false + + - if: + properties: + compatible: + contains: + const: mediatek,mt7981-eth + then: + properties: + interrupts: + minItems: 4 + + clocks: + minItems: 15 + maxItems: 15 + + clock-names: + items: + - const: fe + - const: gp2 + - const: gp1 + - const: wocpu0 + - const: sgmii_ck + - const: sgmii_tx250m + - const: sgmii_rx250m + - const: sgmii_cdr_ref + - const: sgmii_cdr_fb + - const: sgmii2_tx250m + - const: sgmii2_rx250m + - const: sgmii2_cdr_ref + - const: sgmii2_cdr_fb + - const: netsys0 + - const: netsys1 + + mediatek,sgmiisys: + minItems: 2 + maxItems: 2 + - if: properties: compatible:
@@ -242,11 +290,6 @@ allOf: minItems: 2 maxItems: 2 - mediatek,wed-pcie: - $ref: /schemas/types.yaml#/definitions/phandle - description: - Phandle to the mediatek wed-pcie controller. - patternProperties: "^mac@[0-1]$": type: object
Signature · 1 line
2.39.2
Daniel Golle
maintainerRFC PATCH v11 3/12 dt-bindings: arm: mediatek: sgmiisys: Convert to DT schema
In reply to Daniel GolleConvert mediatek,sgmiiisys bindings to DT schema format.
Add maintainer Matthias Brugger, no maintainers were listed in the original documentation.
As this node is also referenced by the Ethernet controller and used as SGMII PCS add this fact to the description.
Move the file to Documentation/devicetree/bindings/pcs/ which seems more appropriate given that the great majority of registers are related to SGMII PCS functionality and only one register represents clock bits.
--- .../arm/mediatek/mediatek,sgmiisys.txt | 27 ---------- .../bindings/net/pcs/mediatek,sgmiisys.yaml | 49 +++++++++++++++++++ 2 files changed, 49 insertions(+), 27 deletions(-) delete mode 100644 Documentation/devicetree/bindings/arm/mediatek/mediatek,sgmiisys.txt create mode 100644 Documentation/devicetree/bindings/net/pcs/mediatek,sgmiisys.yaml
Documentation/devicetree/bindings/arm/mediatek/mediatek,sgmiisys.txt deleted +0 -27
@@ -1,27 +0,0 @@ -MediaTek SGMIISYS controller -============================ - -The MediaTek SGMIISYS controller provides various clocks to the system. - -Required Properties: - -- compatible: Should be: - - "mediatek,mt7622-sgmiisys", "syscon" - - "mediatek,mt7629-sgmiisys", "syscon" - - "mediatek,mt7981-sgmiisys_0", "syscon" - - "mediatek,mt7981-sgmiisys_1", "syscon" - - "mediatek,mt7986-sgmiisys_0", "syscon" - - "mediatek,mt7986-sgmiisys_1", "syscon" -- #clock-cells: Must be 1 - -The SGMIISYS controller uses the common clk binding from -Documentation/devicetree/bindings/clock/clock-bindings.txt -The available clocks are defined in dt-bindings/clock/mt*-clk.h. - -Example: - -sgmiisys: sgmiisys@1b128000 { - compatible = "mediatek,mt7622-sgmiisys", "syscon"; - reg = <0 0x1b128000 0 0x1000>; - #clock-cells = <1>; -};
Documentation/devicetree/bindings/net/pcs/mediatek,sgmiisys.yaml new file +49 -0
49 lines not on this page · raw message
Signature · 1 line
2.39.2
Daniel Golle
maintainerRFC PATCH v11 4/12 dt-bindings: arm: mediatek: sgmiisys: add MT7981 SoC
In reply to Daniel GolleAdd mediatek,pnswap boolean property needed on many boards using the MediaTek MT7981 SoC.
--- .../devicetree/bindings/net/pcs/mediatek,sgmiisys.yaml | 6 ++++++ 1 file changed, 6 insertions(+)
Documentation/devicetree/bindings/net/pcs/mediatek,sgmiisys.yaml +6 -0
@@ -19,6 +19,8 @@ properties: - enum: - mediatek,mt7622-sgmiisys - mediatek,mt7629-sgmiisys + - mediatek,mt7981-sgmiisys_0 + - mediatek,mt7981-sgmiisys_1 - mediatek,mt7986-sgmiisys_0 - mediatek,mt7986-sgmiisys_1 - const: syscon
@@ -29,6 +31,10 @@ properties: '#clock-cells': const: 1 + mediatek,pnswap: + description: Invert polarity of the SGMII data lanes + type: boolean + required: - compatible - reg
Signature · 1 line
2.39.2
Daniel Golle
maintainerRFC PATCH v11 5/12 net: ethernet: mtk_eth_soc: set MDIO bus clock frequency
In reply to Daniel GolleSet MDIO bus clock frequency and allow setting a custom maximum frequency from device tree.
--- drivers/net/ethernet/mediatek/mtk_eth_soc.c | 21 +++++++++++++++++++++ drivers/net/ethernet/mediatek/mtk_eth_soc.h | 7 +++++++ 2 files changed, 28 insertions(+)
drivers/net/ethernet/mediatek/mtk_eth_soc.c +21 -0
@@ -789,8 +789,10 @@ static const struct phylink_mac_ops mtk_phylink_ops = {static int mtk_mdio_init (struct mtk_eth *eth) { +unsigned int max_clk =2500000 , divider;struct device_node *mii_np;int ret; +u32 val; mii_np =of_get_child_by_name (eth->dev->of_node,"mdio-bus" );if (!mii_np) {
@@ -818,6 +820,25 @@ static int mtk_mdio_init(struct mtk_eth *eth) eth->mii_bus->parent = eth->dev;snprintf (eth->mii_bus->id,MII_BUS_ID_SIZE ,"%pOFn" , mii_np); + +if (!of_property_read_u32 (mii_np,"clock-frequency" , &val)) { +if (val >MDC_MAX_FREQ || val <MDC_MAX_FREQ /MDC_MAX_DIVIDER ) { +dev_err (eth->dev,"MDIO clock frequency out of range" ); + ret = -EINVAL ; + goto err_put_node; + } + max_clk = val; + } + divider = min_t(unsigned int, DIV_ROUND_UP(MDC_MAX_FREQ, max_clk), 63); + +/* Configure MDC Divider */ + val =mtk_r32 (eth,MTK_PPSC ); + val &= ~PPSC_MDC_CFG ; + val |=FIELD_PREP (PPSC_MDC_CFG , divider) |PPSC_MDC_TURBO ; +mtk_w32 (eth, val,MTK_PPSC ); + +dev_dbg (eth->dev,"MDC is running on %d Hz\n" ,MDC_MAX_FREQ / divider); + ret =of_mdiobus_register (eth->mii_bus, mii_np); err_put_node:
drivers/net/ethernet/mediatek/mtk_eth_soc.h +7 -0
@@ -363,6 +363,13 @@#define RX_DMA_VTAG_V2 BIT(0)#define RX_DMA_L4_VALID_V2 BIT(2) +/* PHY Polling and SMI Master Control registers */ +#define MTK_PPSC 0x10000 +#define PPSC_MDC_CFG GENMASK(29, 24) +#define PPSC_MDC_TURBO BIT(20) +#define MDC_MAX_FREQ 25000000 +#define MDC_MAX_DIVIDER 63 +/* PHY Indirect Access Control registers */ #define MTK_PHY_IAC 0x10004#define PHY_IAC_ACCESS BIT(31)
Signature · 1 line
2.39.2
Daniel Golle
maintainerRFC PATCH v11 6/12 net: ethernet: mtk_eth_soc: reset PCS state
In reply to Daniel GolleReset PCS state when changing interface mode.
--- drivers/net/ethernet/mediatek/mtk_eth_soc.h | 4 ++++ drivers/net/ethernet/mediatek/mtk_sgmii.c | 4 ++++ 2 files changed, 8 insertions(+)
drivers/net/ethernet/mediatek/mtk_eth_soc.h +4 -0
@@ -548,6 +548,10 @@#define SGMII_SEND_AN_ERROR_EN BIT(11)#define SGMII_IF_MODE_MASK GENMASK(5, 1) +/* Register to reset SGMII design */ +#define SGMII_RESERVED_0 0x34 +#define SGMII_SW_RESET BIT(0) +/* Register to set SGMII speed, ANA RG_ Control Signals III*/ #define SGMSYS_ANA_RG_CS3 0x2028#define RG_PHY_SPEED_MASK (BIT(2) | BIT(3))
drivers/net/ethernet/mediatek/mtk_sgmii.c +4 -0
@@ -88,6 +88,10 @@ static int mtk_pcs_config(struct phylink_pcs *pcs, unsigned int mode,regmap_update_bits (mpcs->regmap,SGMSYS_QPHY_PWR_STATE_CTRL ,SGMII_PHYA_PWD ,SGMII_PHYA_PWD ); +/* Reset SGMII PCS state */ +regmap_update_bits (mpcs->regmap,SGMII_RESERVED_0 , +SGMII_SW_RESET ,SGMII_SW_RESET ); +if (mpcs->flags &MTK_SGMII_FLAG_PN_SWAP ) regmap_update_bits(mpcs->regmap, SGMSYS_QPHY_WRAP_CTRL, SGMII_PN_SWAP_MASK,
Signature · 1 line
2.39.2
Daniel Golle
maintainerRFC PATCH v11 7/12 net: ethernet: mtk_eth_soc: only write values if needed
In reply to Daniel GolleOnly restart auto-negotiation and write link timer if actually necessary.
--- drivers/net/ethernet/mediatek/mtk_sgmii.c | 24 +++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-)
drivers/net/ethernet/mediatek/mtk_sgmii.c +12 -12
@@ -38,20 +38,16 @@ static int mtk_pcs_config(struct phylink_pcs *pcs, unsigned int mode,const unsigned long *advertising, bool permit_pause_to_mac) { + bool mode_changed = false, changed, use_an;struct mtk_pcs *mpcs =pcs_to_mtk_pcs (pcs);unsigned int rgc3, sgm_mode, bmcr;int advertise, link_timer; -bool changed, use_an; advertise =phylink_mii_c22_pcs_encode_advertisement (interface, advertising);if (advertise <0 )return advertise; - link_timer =phylink_get_link_timer_ns (interface); -if (link_timer <0 ) -return link_timer; -/* Clearing IF_MODE_BIT0 switches the PCS to BASE-X mode, and * we assume that fixes it's speed at bitrate = line rate (in * other words, 1000Mbps or 2500Mbps).
@@ -77,13 +73,16 @@ static int mtk_pcs_config(struct phylink_pcs *pcs, unsigned int mode, }if (use_an) { -/* FIXME: Do we need to set AN_RESTART here? */ - bmcr =SGMII_AN_RESTART |SGMII_AN_ENABLE ; + bmcr =SGMII_AN_ENABLE ; }else { bmcr =0 ; }if (mpcs->interface != interface) { + link_timer =phylink_get_link_timer_ns (interface); +if (link_timer <0 ) +return link_timer; +/* PHYA power down */ regmap_update_bits (mpcs->regmap,SGMSYS_QPHY_PWR_STATE_CTRL ,SGMII_PHYA_PWD ,SGMII_PHYA_PWD );
@@ -106,16 +105,17 @@ static int mtk_pcs_config(struct phylink_pcs *pcs, unsigned int mode,regmap_update_bits (mpcs->regmap, mpcs->ana_rgc3,RG_PHY_SPEED_3_125G , rgc3); +/* Setup the link timer */ +regmap_write (mpcs->regmap,SGMSYS_PCS_LINK_TIMER , link_timer /2 /8 ); + mpcs->interface = interface; + mode_changed = true; }/* Update the advertisement, noting whether it has changed */ regmap_update_bits_check (mpcs->regmap,SGMSYS_PCS_ADVERTISE ,SGMII_ADVERTISE , advertise, &changed); -/* Setup the link timer and QPHY power up inside SGMIISYS */ -regmap_write (mpcs->regmap,SGMSYS_PCS_LINK_TIMER , link_timer /2 /8 ); -/* Update the sgmsys mode register */ regmap_update_bits(mpcs->regmap, SGMSYS_SGMII_MODE, SGMII_REMOTE_FAULT_DIS | SGMII_SPEED_DUPLEX_AN |
@@ -123,7 +123,7 @@ static int mtk_pcs_config(struct phylink_pcs *pcs, unsigned int mode,/* Update the BMCR */ regmap_update_bits (mpcs->regmap,SGMSYS_PCS_CONTROL_1 , -SGMII_AN_RESTART |SGMII_AN_ENABLE , bmcr); +SGMII_AN_ENABLE , bmcr);/* Release PHYA power down state * Only removing bit SGMII_PHYA_PWD isn't enough.
@@ -137,7 +137,7 @@ static int mtk_pcs_config(struct phylink_pcs *pcs, unsigned int mode,usleep_range (50 ,100 );regmap_write (mpcs->regmap,SGMSYS_QPHY_PWR_STATE_CTRL ,0 ); -return changed; +return changed || mode_changed; }static void mtk_pcs_restart_an (struct phylink_pcs *pcs)
Signature · 1 line
2.39.2
Daniel Golle
maintainerRFC PATCH v11 8/12 net: ethernet: mtk_eth_soc: fix RX data corruption issue
In reply to Daniel GolleAlso set bit 12 which disabled the RX FIDO clear function when setting up MAC MCR, as MediaTek SDK did the same change stating:
"If without this patch, kernel might receive invalid packets that are corrupted by GMAC."[1]
This fixes issues with <= 1G speed where we could previously observe about 30% packet loss while the bad packet counter was increasing.
--- drivers/net/ethernet/mediatek/mtk_eth_soc.c | 3 ++- drivers/net/ethernet/mediatek/mtk_eth_soc.h | 1 + 2 files changed, 3 insertions(+), 1 deletion(-)
drivers/net/ethernet/mediatek/mtk_eth_soc.c +2 -1
@@ -616,7 +616,8 @@ static int mtk_mac_finish(struct phylink_config *config, unsigned int mode, mcr_cur =mtk_r32 (mac->hw,MTK_MAC_MCR (mac->id)); mcr_new = mcr_cur; mcr_new |=MAC_MCR_IPG_CFG |MAC_MCR_FORCE_MODE | -MAC_MCR_BACKOFF_EN |MAC_MCR_BACKPR_EN |MAC_MCR_FORCE_LINK ; +MAC_MCR_BACKOFF_EN |MAC_MCR_BACKPR_EN |MAC_MCR_FORCE_LINK | +MAC_MCR_RX_FIFO_CLR_DIS ;/* Only update control register when needed! */ if (mcr_new != mcr_cur)
drivers/net/ethernet/mediatek/mtk_eth_soc.h +1 -0
@@ -404,6 +404,7 @@#define MAC_MCR_FORCE_MODE BIT(15)#define MAC_MCR_TX_EN BIT(14)#define MAC_MCR_RX_EN BIT(13) +#define MAC_MCR_RX_FIFO_CLR_DIS BIT(12)#define MAC_MCR_BACKOFF_EN BIT(9)#define MAC_MCR_BACKPR_EN BIT(8)#define MAC_MCR_FORCE_RX_FC BIT(5)
Signature · 1 line
2.39.2
Vladimir Oltean
maintainerRe: [RFC PATCH v11 08/12] net: ethernet: mtk_eth_soc: fix RX data corruption issue
Quoted 11 lines · Daniel Golle
Also set bit 12 which disabled the RX FIDO clear function when setting up MAC MCR, as MediaTek SDK did the same change stating:
"If without this patch, kernel might receive invalid packets that are corrupted by GMAC."[1]
This fixes issues with <= 1G speed where we could previously observe about 30% packet loss while the bad packet counter was increasing.Tested-by Bjørn Mork <[email protected]>Signed-off-by Daniel Golle <[email protected]>---
Should this patch be submitted separately from the series, to the net.git tree, to be backported to stable kernels?
Daniel Golle
maintainerRe: [RFC PATCH v11 08/12] net: ethernet: mtk_eth_soc: fix RX data corruption issue
Quoted 8 lines · Vladimir Oltean
Quoted 7 lines · Daniel Golle
Also set bit 12 which disabled the RX FIDO clear function when setting up MAC MCR, as MediaTek SDK did the same change stating:
"If without this patch, kernel might receive invalid packets that are corrupted by GMAC."[1]
This fixes issues with <= 1G speed where we could previously observe about 30% packet loss while the bad packet counter was increasing.
Quoted 7 lines
Quoted 4 lines
Tested-by Bjørn Mork <[email protected]>Signed-off-by Daniel Golle <[email protected]>---
Should this patch be submitted separately from the series, to the net.git tree, to be backported to stable kernels?
Maybe yes, as this issue may affect e.g. the BPi-R3 board when used with 1G SFP modules. Previously this has just never been a problem as all practically all boards with MediaTek SoCs using SGMII also use the MediaTek MT7531 switch connecting in 2500Base-X mode.
Should the Fixes:-tag hence reference the commit adding support for the BPi-R3?
Vladimir Oltean
maintainerRe: [RFC PATCH v11 08/12] net: ethernet: mtk_eth_soc: fix RX data corruption issue
Quoted 17 lines · Daniel Golle
Quoted 8 lines · Vladimir Oltean
Quoted 7 lines · Daniel Golle
Also set bit 12 which disabled the RX FIDO clear function when setting up MAC MCR, as MediaTek SDK did the same change stating:
"If without this patch, kernel might receive invalid packets that are corrupted by GMAC."[1]
This fixes issues with <= 1G speed where we could previously observe about 30% packet loss while the bad packet counter was increasing.Quoted 7 lines
Quoted 4 lines
Tested-by Bjørn Mork <[email protected]>Signed-off-by Daniel Golle <[email protected]>---
Should this patch be submitted separately from the series, to the net.git tree, to be backported to stable kernels?
Quoted 7 lines
Maybe yes, as this issue may affect e.g. the BPi-R3 board when used with 1G SFP modules. Previously this has just never been a problem as all practically all boards with MediaTek SoCs using SGMII also use the MediaTek MT7531 switch connecting in 2500Base-X mode.
Should the Fixes:-tag hence reference the commit adding support for the BPi-R3?
If it's not an issue that affects existing setups, there is no need to backport the patch. But it needs to be clearly described as such in the commit message.
You mention <= 1G speeds, but then only talk about 1G SFP modules. I see that the mtk_eth_soc driver also sets "gmii" and "rgmii" in phylink's supported_interfaces. Those are also <= 1G speeds. There could also be SGMII on-board PHYs. Does the RX FIFO clearing issue not affect those?
Daniel Golle
maintainerRe: [RFC PATCH v11 08/12] net: ethernet: mtk_eth_soc: fix RX data corruption issue
Quoted 30 lines · Vladimir Oltean
Quoted 17 lines · Daniel Golle
Quoted 8 lines · Vladimir Oltean
Quoted 7 lines · Daniel Golle
Also set bit 12 which disabled the RX FIDO clear function when setting up MAC MCR, as MediaTek SDK did the same change stating:
"If without this patch, kernel might receive invalid packets that are corrupted by GMAC."[1]
This fixes issues with <= 1G speed where we could previously observe about 30% packet loss while the bad packet counter was increasing.Quoted 7 lines
Quoted 4 lines
Tested-by Bjørn Mork <[email protected]>Signed-off-by Daniel Golle <[email protected]>---
Should this patch be submitted separately from the series, to the net.git tree, to be backported to stable kernels?
Quoted 7 lines
Maybe yes, as this issue may affect e.g. the BPi-R3 board when used with 1G SFP modules. Previously this has just never been a problem as all practically all boards with MediaTek SoCs using SGMII also use the MediaTek MT7531 switch connecting in 2500Base-X mode.
Should the Fixes:-tag hence reference the commit adding support for the BPi-R3?
If it's not an issue that affects existing setups, there is no need to backport the patch. But it needs to be clearly described as such in the commit message.
Quoted 5 lines
You mention <= 1G speeds, but then only talk about 1G SFP modules. I see that the
mtk_eth_socdriver also sets "gmii" and "rgmii" in phylink'ssupported_interfaces. Those are also <= 1G speeds. There could also be SGMII on-board PHYs. Does the RX FIFO clearing issue not affect those?
The issues affects PHYs (and potentially switch PHY ICs) connected via SGMII operating at 1.25Mbaud.
The only officially supported board affected by this is the BPi-R3 where it affects the SFP cages -- the on-board MT7531 switch which is also used on all other boards using these SoCs is connected with 2500Base-X.
The issue does **not** affect RGMII or GMII on the MT7623 SoC, but I don't have any way to try RGMII or GMII on more recent SoCs as I lack hardware making use of that to connect a PHY.
Vladimir Oltean
maintainerRe: [RFC PATCH v11 08/12] net: ethernet: mtk_eth_soc: fix RX data corruption issue
Quoted 10 lines · Daniel Golle
The issues affects PHYs (and potentially switch PHY ICs) connected via SGMII operating at 1.25Mbaud.
The only officially supported board affected by this is the BPi-R3 where it affects the SFP cages -- the on-board MT7531 switch which is also used on all other boards using these SoCs is connected with 2500Base-X.
The issue does **not** affect RGMII or GMII on the MT7623 SoC, but I don't have any way to try RGMII or GMII on more recent SoCs as I lack hardware making use of that to connect a PHY.
I don't believe that board vendors need to have their device tree "officially supported" in Linux in order to claim that a bug affecting them should be fixed on stable kernels. As long as the PHY interface type is generally supported by the driver and is expected to work, it should work with any board (the exception being if there are other configuration steps specific to that board required).
In any case, a good commit message for a bug fix explains what is the user impact of the bug being fixed, the configurations which are affected, how it was noticed, an adequate Fixes: tag, and if necessary, why it is being fixed the way it is. In other words, it must be able to respond to normal questions that a reader might have when he/she stumbles upon it, for various reasons (it introduces a regression, they are debugging an issue and want to assess whether backporting this patch would help them, etc). The reader might be in the not so close future, when you might not be able to provide clarifications personally, so the commit message should contain all that you know which is relevant to the topic.
Most of these clarifications were provided by you as replies to the patch, but they should be present in the commit message instead.
Daniel Golle
maintainerRFC PATCH v11 9/12 net: ethernet: mtk_eth_soc: ppe: add support for flow accounting
In reply to Daniel GolleThe PPE units found in MT7622 and newer support packet and byte accounting of hw-offloaded flows. Add support for reading those counters as found in MediaTek's SDK[1].
--- drivers/net/ethernet/mediatek/mtk_eth_soc.c | 8 +- drivers/net/ethernet/mediatek/mtk_eth_soc.h | 3 + drivers/net/ethernet/mediatek/mtk_ppe.c | 114 +++++++++++++++++- drivers/net/ethernet/mediatek/mtk_ppe.h | 25 +++- .../net/ethernet/mediatek/mtk_ppe_debugfs.c | 9 +- .../net/ethernet/mediatek/mtk_ppe_offload.c | 8 ++ drivers/net/ethernet/mediatek/mtk_ppe_regs.h | 14 +++ 7 files changed, 172 insertions(+), 9 deletions(-)
drivers/net/ethernet/mediatek/mtk_eth_soc.c +6 -2
@@ -4712,8 +4712,8 @@ static int mtk_probe(struct platform_device *pdev)for (i =0 ; i < num_ppe; i++) {u32 ppe_addr = eth->soc->reg_map->ppe_base + i *0x400 ; - eth->ppe[i] =mtk_ppe_init (eth, eth->base + ppe_addr, - eth->soc->offload_version, i); + eth->ppe[i] =mtk_ppe_init (eth, eth->base + ppe_addr, i); +if (!eth->ppe[i]) { err = -ENOMEM ; goto err_deinit_ppe;
@@ -4835,6 +4835,7 @@ static const struct mtk_soc_data mt7622_data = { .required_pctl = false, .offload_version = 2, .hash_offset = 2, + .has_accounting = true, .foe_entry_size = sizeof(struct mtk_foe_entry) - 16, .txrx = { .txd_size = sizeof(struct mtk_tx_dma),
@@ -4872,6 +4873,7 @@ static const struct mtk_soc_data mt7629_data = { .hw_features = MTK_HW_FEATURES, .required_clks = MT7629_CLKS_BITMAP, .required_pctl = false, + .has_accounting = true, .txrx = { .txd_size = sizeof(struct mtk_tx_dma), .rxd_size = sizeof(struct mtk_rx_dma),
@@ -4892,6 +4894,7 @@ static const struct mtk_soc_data mt7981_data = { .offload_version = 2, .hash_offset = 4, .foe_entry_size = sizeof(struct mtk_foe_entry), + .has_accounting = true, .txrx = { .txd_size = sizeof(struct mtk_tx_dma_v2), .rxd_size = sizeof(struct mtk_rx_dma_v2),
@@ -4912,6 +4915,7 @@ static const struct mtk_soc_data mt7986_data = { .offload_version = 2, .hash_offset = 4, .foe_entry_size = sizeof(struct mtk_foe_entry), + .has_accounting = true, .txrx = { .txd_size = sizeof(struct mtk_tx_dma_v2), .rxd_size = sizeof(struct mtk_rx_dma_v2),
drivers/net/ethernet/mediatek/mtk_eth_soc.h +3 -0
@@ -1070,6 +1070,8 @@ struct mtk_reg_map {* the extra setup for those pins used by GMAC. * @hash_offset Flow table hash offset. * @foe_entry_size Foe table entry size. +* @has_accounting Bool indicating support for accounting of +* offloaded flows. * @txd_size Tx DMA descriptor size. * @rxd_size Rx DMA descriptor size. * @rx_irq_done_mask Rx irq done register mask.
@@ -1087,6 +1089,7 @@ struct mtk_soc_data {u8 hash_offset;u16 foe_entry_size;netdev_features_t hw_features; +bool has_accounting;struct {u32 txd_size;u32 rxd_size;
drivers/net/ethernet/mediatek/mtk_ppe.c +111 -3
159 lines not on this page · raw message
drivers/net/ethernet/mediatek/mtk_ppe.h +23 -2
@@ -57,6 +57,7 @@ enum {#define MTK_FOE_IB2_MULTICAST BIT(8)#define MTK_FOE_IB2_WDMA_QID2 GENMASK(13, 12) +#define MTK_FOE_IB2_MIB_CNT BIT(15)#define MTK_FOE_IB2_WDMA_DEVIDX BIT(16)#define MTK_FOE_IB2_WDMA_WINFO BIT(17)
@@ -285,16 +286,34 @@ struct mtk_flow_entry {unsigned long cookie; }; +struct mtk_mib_entry { +u32 byt_cnt_l; +u16 byt_cnt_h; +u32 pkt_cnt_l; +u8 pkt_cnt_h; +u8 _rsv0; +u32 _rsv1; +} __packed; + +struct mtk_foe_accounting { +u64 bytes; +u64 packets; +}; +struct mtk_ppe {struct mtk_eth *eth;struct device *dev;void __iomem *base;int version;char dirname[5 ]; +bool accounting;void *foe_table;dma_addr_t foe_phys; +struct mtk_mib_entry *mib_table; +dma_addr_t mib_phys; +u16 foe_check_time[MTK_PPE_ENTRIES ];struct hlist_head *foe_flow;
@@ -303,8 +322,8 @@ struct mtk_ppe {void *acct_table; }; -struct mtk_ppe *mtk_ppe_init (struct mtk_eth *eth,void __iomem *base, -int version,int index); +struct mtk_ppe *mtk_ppe_init (struct mtk_eth *eth,void __iomem *base,int index); +void mtk_ppe_deinit (struct mtk_eth *eth);void mtk_ppe_start (struct mtk_ppe *ppe);int mtk_ppe_stop (struct mtk_ppe *ppe);
@@ -359,5 +378,7 @@ int mtk_foe_entry_commit(struct mtk_ppe *ppe, struct mtk_flow_entry *entry);void mtk_foe_entry_clear (struct mtk_ppe *ppe,struct mtk_flow_entry *entry);int mtk_foe_entry_idle_time (struct mtk_ppe *ppe,struct mtk_flow_entry *entry);int mtk_ppe_debugfs_init (struct mtk_ppe *ppe,int index); +struct mtk_foe_accounting *mtk_foe_entry_get_mib (struct mtk_ppe *ppe,u32 index, +struct mtk_foe_accounting *diff);#endif
drivers/net/ethernet/mediatek/mtk_ppe_debugfs.c +7 -2
@@ -82,6 +82,7 @@ mtk_ppe_debugfs_foe_show(struct seq_file *m, void *private, bool bind)struct mtk_foe_entry *entry =mtk_foe_get_entry (ppe, i);struct mtk_foe_mac_info *l2;struct mtk_flow_addr_info ai = {}; +struct mtk_foe_accounting *acct;unsigned char h_source[ETH_ALEN ];unsigned char h_dest[ETH_ALEN ];int type, state;
@@ -95,6 +96,8 @@ mtk_ppe_debugfs_foe_show(struct seq_file *m, void *private, bool bind)if (bind && state !=MTK_FOE_STATE_BIND )continue ; + acct =mtk_foe_entry_get_mib (ppe, i,NULL ); + type =FIELD_GET (MTK_FOE_IB1_PACKET_TYPE , entry->ib1); seq_printf(m, "%05x %s %7s", i, mtk_foe_entry_state_str(state),
@@ -153,9 +156,11 @@ mtk_ppe_debugfs_foe_show(struct seq_file *m, void *private, bool bind) *((__be16 *)&h_dest[4 ]) =htons (l2->dest_mac_lo);seq_printf (m," eth=%pM->%pM etype=%04x" -" vlan=%d,%d ib1=%08x ib2=%08x\n" , +" vlan=%d,%d ib1=%08x ib2=%08x" +" packets=%llu bytes=%llu\n" , h_source, h_dest,ntohs (l2->etype), - l2->vlan1, l2->vlan2, entry->ib1, ib2); + l2->vlan1, l2->vlan2, entry->ib1, ib2, + acct ? acct->packets :0 , acct ? acct->bytes :0 ); }return 0 ;
drivers/net/ethernet/mediatek/mtk_ppe_offload.c +8 -0
@@ -497,6 +497,7 @@ static int mtk_flow_offload_stats(struct mtk_eth *eth, struct flow_cls_offload *f) { struct mtk_flow_entry *entry; +struct mtk_foe_accounting diff;u32 idle; entry = rhashtable_lookup(ð->flow_table, &f->cookie,
@@ -507,6 +508,13 @@ mtk_flow_offload_stats(struct mtk_eth *eth, struct flow_cls_offload *f) idle =mtk_foe_entry_idle_time (eth->ppe[entry->ppe_index], entry); f->stats.lastused = jiffies - idle *HZ ; +if (entry->hash !=0xFFFF && +mtk_foe_entry_get_mib (eth->ppe[entry->ppe_index], entry->hash, + &diff)) { + f->stats.pkts += diff.packets; + f->stats.bytes += diff.bytes; + } +return 0 ; }
drivers/net/ethernet/mediatek/mtk_ppe_regs.h +14 -0
@@ -149,6 +149,20 @@ enum {#define MTK_PPE_MIB_TB_BASE 0x338 +#define MTK_PPE_MIB_SER_CR 0x33C +#define MTK_PPE_MIB_SER_CR_ST BIT(16) +#define MTK_PPE_MIB_SER_CR_ADDR GENMASK(13, 0) + +#define MTK_PPE_MIB_SER_R0 0x340 +#define MTK_PPE_MIB_SER_R0_BYTE_CNT_LOW GENMASK(31, 0) + +#define MTK_PPE_MIB_SER_R1 0x344 +#define MTK_PPE_MIB_SER_R1_PKT_CNT_LOW GENMASK(31, 16) +#define MTK_PPE_MIB_SER_R1_BYTE_CNT_HIGH GENMASK(15, 0) + +#define MTK_PPE_MIB_SER_R2 0x348 +#define MTK_PPE_MIB_SER_R2_PKT_CNT_HIGH GENMASK(23, 0) +#define MTK_PPE_MIB_CACHE_CTL 0x350#define MTK_PPE_MIB_CACHE_CTL_EN BIT(0)#define MTK_PPE_MIB_CACHE_CTL_FLUSH BIT(2)
Signature · 1 line
2.39.2
Daniel Golle
maintainerRFC PATCH v11 10/12 net: pcs: add driver for MediaTek SGMII PCS
In reply to Daniel GolleThe SGMII core found in several MediaTek SoCs is identical to what can also be found in MediaTek's MT7531 Ethernet switch IC.
As this has not always been clear, both drivers developed different implementations to deal with the PCS.
Add a dedicated driver, mostly by copying the code now found in the Ethernet driver. The now redundant code will be removed by a follow-up commit.
--- MAINTAINERS | 7 + drivers/net/pcs/Kconfig | 7 + drivers/net/pcs/Makefile | 1 + drivers/net/pcs/pcs-mtk-lynxi.c | 302 ++++++++++++++++++++++++++++++ include/linux/pcs/pcs-mtk-lynxi.h | 13 ++ 5 files changed, 330 insertions(+) create mode 100644 drivers/net/pcs/pcs-mtk-lynxi.c create mode 100644 include/linux/pcs/pcs-mtk-lynxi.h
MAINTAINERS +7 -0
@@ -13048,6 +13048,13 @@ L: [email protected] S: Maintained F: drivers/net/ethernet/mediatek/ +MEDIATEK ETHERNET PCS DRIVER +M: Daniel Golle <[email protected]> +L: [email protected] +S: Maintained +F: drivers/net/pcs/pcs-mtk-lynxi.c +F: include/linux/pcs/pcs-mtk-lynxi.h + MEDIATEK I2C CONTROLLER DRIVER M: Qii Wang <[email protected]> L: [email protected]
drivers/net/pcs/Kconfig +7 -0
@@ -18,6 +18,13 @@ config PCS_LYNX This module provides helpers to phylink for managing the Lynx PCS which is part of the Layerscape and QorIQ Ethernet SERDES. +config PCS_MTK_LYNXI + tristate + select REGMAP + help + This module provides helpers to phylink for managing the LynxI PCS + which is part of MediaTek's SoC and Ethernet switch ICs. + config PCS_RZN1_MIIC tristate "Renesas RZ/N1 MII converter" depends on OF && (ARCH_RZN1 || COMPILE_TEST)
drivers/net/pcs/Makefile +1 -0
@@ -5,5 +5,6 @@ pcs_xpcs-$(CONFIG_PCS_XPCS) := pcs-xpcs.o pcs-xpcs-nxp.o obj-$(CONFIG_PCS_XPCS) += pcs_xpcs.o obj-$(CONFIG_PCS_LYNX) += pcs-lynx.o +obj-$(CONFIG_PCS_MTK_LYNXI) += pcs-mtk-lynxi.o obj-$(CONFIG_PCS_RZN1_MIIC) += pcs-rzn1-miic.o obj-$(CONFIG_PCS_ALTERA_TSE) += pcs-altera-tse.o
drivers/net/pcs/pcs-mtk-lynxi.c new file +302 -0
302 lines not on this page · raw message
include/linux/pcs/pcs-mtk-lynxi.h new file +13 -0
@@ -0,0 +1,13 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef __LINUX_PCS_MTK_LYNXI_H +#define __LINUX_PCS_MTK_LYNXI_H + +#include <linux/phylink.h> +#include <linux/regmap.h> + +#define MTK_SGMII_FLAG_PN_SWAP BIT(0) +struct phylink_pcs *mtk_pcs_lynxi_create (struct device *dev, +struct regmap *regmap, +u32 ana_rgc3,u32 flags); +void mtk_pcs_lynxi_destroy (struct phylink_pcs *pcs); +#endif
Signature · 1 line
2.39.2
Daniel Golle
maintainerRFC PATCH v11 11/12 net: ethernet: mtk_eth_soc: switch to external PCS driver
In reply to Daniel GolleNow that we got a PCS driver, use it and remove the now redundant PCS code and it's header macros from the Ethernet driver.
--- drivers/net/ethernet/mediatek/Kconfig | 2 + drivers/net/ethernet/mediatek/Makefile | 2 +- drivers/net/ethernet/mediatek/mtk_eth_soc.c | 61 +++++- drivers/net/ethernet/mediatek/mtk_eth_soc.h | 92 +-------- drivers/net/ethernet/mediatek/mtk_sgmii.c | 217 -------------------- 5 files changed, 55 insertions(+), 319 deletions(-) delete mode 100644 drivers/net/ethernet/mediatek/mtk_sgmii.c
drivers/net/ethernet/mediatek/Kconfig +2 -0
@@ -19,6 +19,8 @@ config NET_MEDIATEK_SOC select DIMLIB select PAGE_POOL select PAGE_POOL_STATS + select PCS_MTK_LYNXI + select REGMAP_MMIO help This driver supports the gigabit ethernet MACs in the MediaTek SoC family.
drivers/net/ethernet/mediatek/Makefile +1 -1
@@ -4,7 +4,7 @@ # obj-$(CONFIG_NET_MEDIATEK_SOC) += mtk_eth.o -mtk_eth-y := mtk_eth_soc.o mtk_sgmii.o mtk_eth_path.o mtk_ppe.o mtk_ppe_debugfs.o mtk_ppe_offload.o +mtk_eth-y := mtk_eth_soc.o mtk_eth_path.o mtk_ppe.o mtk_ppe_debugfs.o mtk_ppe_offload.o mtk_eth-$(CONFIG_NET_MEDIATEK_SOC_WED) += mtk_wed.o mtk_wed_mcu.o mtk_wed_wo.o ifdef CONFIG_DEBUG_FS mtk_eth-$(CONFIG_NET_MEDIATEK_SOC_WED) += mtk_wed_debugfs.o
drivers/net/ethernet/mediatek/mtk_eth_soc.c +50 -11
110 lines not on this page · raw message
drivers/net/ethernet/mediatek/mtk_eth_soc.h +2 -90
116 lines not on this page · raw message
drivers/net/ethernet/mediatek/mtk_sgmii.c deleted +0 -217
217 lines not on this page · raw message
Signature · 1 line
2.39.2
kernel test robot
build botRe: [RFC PATCH v11 11/12] net: ethernet: mtk_eth_soc: switch to external PCS driver
reproduce (this is a W=1 build): wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross #…
Hi Daniel,
[FYI, it's a private test report for your RFC patch.] [auto build test WARNING on 1716a175592aff9549a0c07aac8f9cadd03003f5]
url: https://github.com/intel-lab-lkp/linux/commits/Daniel-Golle/net-ethernet-mtk_eth_soc-add-support-for-MT7981-SoC/20230302-035810 base: 1716a175592aff9549a0c07aac8f9cadd03003f5 patch link: https://lore.kernel.org/r/657bbf01e94fe4fdf5a2342b2a52c61bc121d999.1677699407.git.daniel%40makrotopia.org patch subject: [RFC PATCH v11 11/12] net: ethernet: mtk_eth_soc: switch to external PCS driver config: m68k-allyesconfig (https://download.01.org/0day-ci/archive/20230302/[email protected]/config) compiler: m68k-linux-gcc (GCC) 12.1.0
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# https://github.com/intel-lab-lkp/linux/commit/ff89e0d2a6208203b967ff9df9e2d2d4c9a48927
git remote add linux-review https://github.com/intel-lab-lkp/linux
git fetch --no-tags linux-review Daniel-Golle/net-ethernet-mtk_eth_soc-add-support-for-MT7981-SoC/20230302-035810 git checkout ff89e0d2a6208203b967ff9df9e2d2d4c9a48927
# save the config file
mkdir build_dir && cp config build_dir/.config
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross W=1 O=build_dir ARCH=m68k olddefconfig COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross W=1 O=build_dir ARCH=m68k SHELL=/bin/bash drivers/net/ethernet/mediatek/
If you fix the issue, kindly add following tag where applicable
| Reported-by: kernel test robot <[email protected]>
| Link: https://lore.kernel.org/oe-kbuild-all/[email protected]/
All warnings (new ones prefixed by >>):
>> drivers/net/ethernet/mediatek/mtk_eth_soc.c:4082:6: warning: no previous prototype for 'mtk_sgmii_destroy' [-Wmissing-prototypes]
4082 | void mtk_sgmii_destroy(struct mtk_eth *eth)
| ^~~~~~~~~~~~~~~~~
vim +/mtk_sgmii_destroy +4082 drivers/net/ethernet/mediatek/mtk_eth_soc.c
4081
> 4082 void mtk_sgmii_destroy(struct mtk_eth *eth)
4083 {
4084 int i;
4085
4086 for (i = 0; i < MTK_MAX_DEVS; i++)
4087 mtk_pcs_lynxi_destroy(eth->sgmii_pcs[i]);
4088 }
4089
Signature · 2 lines
0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests
Daniel Golle
maintainerRFC PATCH v11 12/12 net: dsa: mt7530: use external PCS driver
In reply to Daniel GolleImplement regmap access wrappers, for now only to be used by the pcs-mtk driver.
Make use of external PCS driver and drop the reduntant implementation in mt7530.c.
As a nice side effect the SGMII registers can now also more easily be inspected for debugging via /sys/kernel/debug/regmap.
--- drivers/net/dsa/Kconfig | 1 + drivers/net/dsa/mt7530.c | 277 ++++++++++----------------------------- drivers/net/dsa/mt7530.h | 47 +------ 3 files changed, 71 insertions(+), 254 deletions(-)
drivers/net/dsa/Kconfig +1 -0
@@ -38,6 +38,7 @@ config NET_DSA_MT7530 tristate "MediaTek MT7530 and MT7531 Ethernet switch support" select NET_DSA_TAG_MTK select MEDIATEK_GE_PHY + select PCS_MTK_LYNXI help This enables support for the MediaTek MT7530 and MT7531 Ethernet switch chips. Multi-chip module MT7530 in MT7621AT, MT7621DAT,
drivers/net/dsa/mt7530.c +66 -211
360 lines not on this page · raw message
drivers/net/dsa/mt7530.h +4 -43
64 lines not on this page · raw message
Signature · 1 line
2.39.2