2
0
Эх сурвалжийг харах

generic: mtk_eth_soc: allow setting MDIO clock frequency

Backport patch allowing to set the MDIO bus clock frequency.
By default the MDIO bus clock runs on 2.5 MHz, allow increasing it
up to 25 MHz.

Signed-off-by: Daniel Golle <[email protected]>
Daniel Golle 2 жил өмнө
parent
commit
5b972d7272

+ 76 - 0
target/linux/generic/backport-5.15/733-v6.3-19-net-ethernet-mtk_eth_soc-set-MDIO-bus-clock-frequenc.patch

@@ -0,0 +1,76 @@
+From c0a440031d4314d1023c1b87f43a4233634eebdb Mon Sep 17 00:00:00 2001
+From: Daniel Golle <[email protected]>
+Date: Sun, 19 Mar 2023 12:57:15 +0000
+Subject: [PATCH] net: ethernet: mtk_eth_soc: set MDIO bus clock frequency
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Set MDIO bus clock frequency and allow setting a custom maximum
+frequency from device tree.
+
+Reviewed-by: Andrew Lunn <[email protected]>
+Reviewed-by: Florian Fainelli <[email protected]>
+Tested-by: Bjørn Mork <[email protected]>
+Signed-off-by: Daniel Golle <[email protected]>
+Signed-off-by: Jakub Kicinski <[email protected]>
+---
+ drivers/net/ethernet/mediatek/mtk_eth_soc.c | 21 +++++++++++++++++++++
+ drivers/net/ethernet/mediatek/mtk_eth_soc.h |  7 +++++++
+ 2 files changed, 28 insertions(+)
+
+--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
+@@ -704,8 +704,10 @@ static const struct phylink_mac_ops mtk_
+ 
+ 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) {
+@@ -731,6 +733,25 @@ static int mtk_mdio_init(struct mtk_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:
+--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
+@@ -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)

+ 3 - 3
target/linux/generic/pending-5.15/702-net-ethernet-mtk_eth_soc-enable-threaded-NAPI.patch

@@ -10,7 +10,7 @@ Signed-off-by: Felix Fietkau <[email protected]>
 
 
 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
 +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
 +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -2972,8 +2972,8 @@ static irqreturn_t mtk_handle_irq_rx(int
+@@ -2993,8 +2993,8 @@ static irqreturn_t mtk_handle_irq_rx(int
  
  
  	eth->rx_events++;
  	eth->rx_events++;
  	if (likely(napi_schedule_prep(&eth->rx_napi))) {
  	if (likely(napi_schedule_prep(&eth->rx_napi))) {
@@ -20,7 +20,7 @@ Signed-off-by: Felix Fietkau <[email protected]>
  	}
  	}
  
  
  	return IRQ_HANDLED;
  	return IRQ_HANDLED;
-@@ -2985,8 +2985,8 @@ static irqreturn_t mtk_handle_irq_tx(int
+@@ -3006,8 +3006,8 @@ static irqreturn_t mtk_handle_irq_tx(int
  
  
  	eth->tx_events++;
  	eth->tx_events++;
  	if (likely(napi_schedule_prep(&eth->tx_napi))) {
  	if (likely(napi_schedule_prep(&eth->tx_napi))) {
@@ -30,7 +30,7 @@ Signed-off-by: Felix Fietkau <[email protected]>
  	}
  	}
  
  
  	return IRQ_HANDLED;
  	return IRQ_HANDLED;
-@@ -4617,6 +4617,8 @@ static int mtk_probe(struct platform_dev
+@@ -4638,6 +4638,8 @@ static int mtk_probe(struct platform_dev
  	 * for NAPI to work
  	 * for NAPI to work
  	 */
  	 */
  	init_dummy_netdev(&eth->dummy_dev);
  	init_dummy_netdev(&eth->dummy_dev);

+ 1 - 1
target/linux/generic/pending-5.15/723-net-mt7531-ensure-all-MACs-are-powered-down-before-r.patch

@@ -15,7 +15,7 @@ Signed-off-by: Alexander Couzens <[email protected]>
 
 
 --- a/drivers/net/dsa/mt7530.c
 --- a/drivers/net/dsa/mt7530.c
 +++ b/drivers/net/dsa/mt7530.c
 +++ b/drivers/net/dsa/mt7530.c
-@@ -2341,6 +2341,10 @@ mt7531_setup(struct dsa_switch *ds)
+@@ -2342,6 +2342,10 @@ mt7531_setup(struct dsa_switch *ds)
  		return -ENODEV;
  		return -ENODEV;
  	}
  	}
  
  

+ 6 - 6
target/linux/generic/pending-5.15/731-net-ethernet-mediatek-ppe-add-support-for-flow-accou.patch

@@ -53,7 +53,7 @@ v2: fix wrong variable name in return value check spotted by Denis Kirjanov
 
 
 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
 +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
 +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -4586,8 +4586,8 @@ static int mtk_probe(struct platform_dev
+@@ -4607,8 +4607,8 @@ static int mtk_probe(struct platform_dev
  		for (i = 0; i < num_ppe; i++) {
  		for (i = 0; i < num_ppe; i++) {
  			u32 ppe_addr = eth->soc->reg_map->ppe_base + i * 0x400;
  			u32 ppe_addr = eth->soc->reg_map->ppe_base + i * 0x400;
  
  
@@ -64,7 +64,7 @@ v2: fix wrong variable name in return value check spotted by Denis Kirjanov
  			if (!eth->ppe[i]) {
  			if (!eth->ppe[i]) {
  				err = -ENOMEM;
  				err = -ENOMEM;
  				goto err_free_dev;
  				goto err_free_dev;
-@@ -4712,6 +4712,7 @@ static const struct mtk_soc_data mt7622_
+@@ -4733,6 +4733,7 @@ static const struct mtk_soc_data mt7622_
  	.required_pctl = false,
  	.required_pctl = false,
  	.offload_version = 2,
  	.offload_version = 2,
  	.hash_offset = 2,
  	.hash_offset = 2,
@@ -72,7 +72,7 @@ v2: fix wrong variable name in return value check spotted by Denis Kirjanov
  	.foe_entry_size = sizeof(struct mtk_foe_entry) - 16,
  	.foe_entry_size = sizeof(struct mtk_foe_entry) - 16,
  	.txrx = {
  	.txrx = {
  		.txd_size = sizeof(struct mtk_tx_dma),
  		.txd_size = sizeof(struct mtk_tx_dma),
-@@ -4749,6 +4750,7 @@ static const struct mtk_soc_data mt7629_
+@@ -4770,6 +4771,7 @@ static const struct mtk_soc_data mt7629_
  	.hw_features = MTK_HW_FEATURES,
  	.hw_features = MTK_HW_FEATURES,
  	.required_clks = MT7629_CLKS_BITMAP,
  	.required_clks = MT7629_CLKS_BITMAP,
  	.required_pctl = false,
  	.required_pctl = false,
@@ -80,7 +80,7 @@ v2: fix wrong variable name in return value check spotted by Denis Kirjanov
  	.txrx = {
  	.txrx = {
  		.txd_size = sizeof(struct mtk_tx_dma),
  		.txd_size = sizeof(struct mtk_tx_dma),
  		.rxd_size = sizeof(struct mtk_rx_dma),
  		.rxd_size = sizeof(struct mtk_rx_dma),
-@@ -4769,6 +4771,7 @@ static const struct mtk_soc_data mt7986_
+@@ -4790,6 +4792,7 @@ static const struct mtk_soc_data mt7986_
  	.offload_version = 2,
  	.offload_version = 2,
  	.hash_offset = 4,
  	.hash_offset = 4,
  	.foe_entry_size = sizeof(struct mtk_foe_entry),
  	.foe_entry_size = sizeof(struct mtk_foe_entry),
@@ -90,7 +90,7 @@ v2: fix wrong variable name in return value check spotted by Denis Kirjanov
  		.rxd_size = sizeof(struct mtk_rx_dma_v2),
  		.rxd_size = sizeof(struct mtk_rx_dma_v2),
 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
 +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
 +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
-@@ -1037,6 +1037,8 @@ struct mtk_reg_map {
+@@ -1044,6 +1044,8 @@ struct mtk_reg_map {
   *				the extra setup for those pins used by GMAC.
   *				the extra setup for those pins used by GMAC.
   * @hash_offset			Flow table hash offset.
   * @hash_offset			Flow table hash offset.
   * @foe_entry_size		Foe table entry size.
   * @foe_entry_size		Foe table entry size.
@@ -99,7 +99,7 @@ v2: fix wrong variable name in return value check spotted by Denis Kirjanov
   * @txd_size			Tx DMA descriptor size.
   * @txd_size			Tx DMA descriptor size.
   * @rxd_size			Rx DMA descriptor size.
   * @rxd_size			Rx DMA descriptor size.
   * @rx_irq_done_mask		Rx irq done register mask.
   * @rx_irq_done_mask		Rx irq done register mask.
-@@ -1054,6 +1056,7 @@ struct mtk_soc_data {
+@@ -1061,6 +1063,7 @@ struct mtk_soc_data {
  	u8		hash_offset;
  	u8		hash_offset;
  	u16		foe_entry_size;
  	u16		foe_entry_size;
  	netdev_features_t hw_features;
  	netdev_features_t hw_features;

+ 7 - 7
target/linux/generic/pending-5.15/732-00-net-ethernet-mtk_eth_soc-drop-generic-vlan-rx-offloa.patch

@@ -17,7 +17,7 @@ Signed-off-by: Felix Fietkau <[email protected]>
 
 
 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
 +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
 +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -1830,9 +1830,7 @@ static int mtk_poll_rx(struct napi_struc
+@@ -1851,9 +1851,7 @@ static int mtk_poll_rx(struct napi_struc
  
  
  	while (done < budget) {
  	while (done < budget) {
  		unsigned int pktlen, *rxdcsum;
  		unsigned int pktlen, *rxdcsum;
@@ -27,7 +27,7 @@ Signed-off-by: Felix Fietkau <[email protected]>
  		dma_addr_t dma_addr;
  		dma_addr_t dma_addr;
  		u32 hash, reason;
  		u32 hash, reason;
  		int mac = 0;
  		int mac = 0;
-@@ -1967,36 +1965,21 @@ static int mtk_poll_rx(struct napi_struc
+@@ -1988,36 +1986,21 @@ static int mtk_poll_rx(struct napi_struc
  			skb_checksum_none_assert(skb);
  			skb_checksum_none_assert(skb);
  		skb->protocol = eth_type_trans(skb, netdev);
  		skb->protocol = eth_type_trans(skb, netdev);
  
  
@@ -70,7 +70,7 @@ Signed-off-by: Felix Fietkau <[email protected]>
  		skb_record_rx_queue(skb, 0);
  		skb_record_rx_queue(skb, 0);
  		napi_gro_receive(napi, skb);
  		napi_gro_receive(napi, skb);
  
  
-@@ -2811,29 +2794,11 @@ static netdev_features_t mtk_fix_feature
+@@ -2832,29 +2815,11 @@ static netdev_features_t mtk_fix_feature
  
  
  static int mtk_set_features(struct net_device *dev, netdev_features_t features)
  static int mtk_set_features(struct net_device *dev, netdev_features_t features)
  {
  {
@@ -100,7 +100,7 @@ Signed-off-by: Felix Fietkau <[email protected]>
  	return 0;
  	return 0;
  }
  }
  
  
-@@ -3147,30 +3112,6 @@ static int mtk_open(struct net_device *d
+@@ -3168,30 +3133,6 @@ static int mtk_open(struct net_device *d
  	struct mtk_eth *eth = mac->hw;
  	struct mtk_eth *eth = mac->hw;
  	int i, err;
  	int i, err;
  
  
@@ -131,7 +131,7 @@ Signed-off-by: Felix Fietkau <[email protected]>
  	err = phylink_of_phy_connect(mac->phylink, mac->of_node, 0);
  	err = phylink_of_phy_connect(mac->phylink, mac->of_node, 0);
  	if (err) {
  	if (err) {
  		netdev_err(dev, "%s: could not attach PHY: %d\n", __func__,
  		netdev_err(dev, "%s: could not attach PHY: %d\n", __func__,
-@@ -3211,6 +3152,35 @@ static int mtk_open(struct net_device *d
+@@ -3232,6 +3173,35 @@ static int mtk_open(struct net_device *d
  	phylink_start(mac->phylink);
  	phylink_start(mac->phylink);
  	netif_tx_start_all_queues(dev);
  	netif_tx_start_all_queues(dev);
  
  
@@ -167,7 +167,7 @@ Signed-off-by: Felix Fietkau <[email protected]>
  	return 0;
  	return 0;
  }
  }
  
  
-@@ -3695,10 +3665,9 @@ static int mtk_hw_init(struct mtk_eth *e
+@@ -3716,10 +3686,9 @@ static int mtk_hw_init(struct mtk_eth *e
  	if (!MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) {
  	if (!MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) {
  		val = mtk_r32(eth, MTK_CDMP_IG_CTRL);
  		val = mtk_r32(eth, MTK_CDMP_IG_CTRL);
  		mtk_w32(eth, val | MTK_CDMP_STAG_EN, MTK_CDMP_IG_CTRL);
  		mtk_w32(eth, val | MTK_CDMP_STAG_EN, MTK_CDMP_IG_CTRL);
@@ -180,7 +180,7 @@ Signed-off-by: Felix Fietkau <[email protected]>
  
  
  	/* set interrupt delays based on current Net DIM sample */
  	/* set interrupt delays based on current Net DIM sample */
  	mtk_dim_rx(&eth->rx_dim.work);
  	mtk_dim_rx(&eth->rx_dim.work);
-@@ -4336,7 +4305,7 @@ static int mtk_add_mac(struct mtk_eth *e
+@@ -4357,7 +4326,7 @@ static int mtk_add_mac(struct mtk_eth *e
  		eth->netdev[id]->hw_features |= NETIF_F_LRO;
  		eth->netdev[id]->hw_features |= NETIF_F_LRO;
  
  
  	eth->netdev[id]->vlan_features = eth->soc->hw_features &
  	eth->netdev[id]->vlan_features = eth->soc->hw_features &

+ 3 - 3
target/linux/generic/pending-5.15/732-01-net-ethernet-mtk_eth_soc-work-around-issue-with-send.patch

@@ -16,7 +16,7 @@ Signed-off-by: Felix Fietkau <[email protected]>
 
 
 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
 +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
 +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -1403,12 +1403,28 @@ static void mtk_wake_queue(struct mtk_et
+@@ -1424,12 +1424,28 @@ static void mtk_wake_queue(struct mtk_et
  	}
  	}
  }
  }
  
  
@@ -45,7 +45,7 @@ Signed-off-by: Felix Fietkau <[email protected]>
  	bool gso = false;
  	bool gso = false;
  	int tx_num;
  	int tx_num;
  
  
-@@ -1430,6 +1446,18 @@ static netdev_tx_t mtk_start_xmit(struct
+@@ -1451,6 +1467,18 @@ static netdev_tx_t mtk_start_xmit(struct
  		return NETDEV_TX_BUSY;
  		return NETDEV_TX_BUSY;
  	}
  	}
  
  
@@ -64,7 +64,7 @@ Signed-off-by: Felix Fietkau <[email protected]>
  	/* TSO: fill MSS info in tcp checksum field */
  	/* TSO: fill MSS info in tcp checksum field */
  	if (skb_is_gso(skb)) {
  	if (skb_is_gso(skb)) {
  		if (skb_cow_head(skb, 0)) {
  		if (skb_cow_head(skb, 0)) {
-@@ -1445,8 +1473,14 @@ static netdev_tx_t mtk_start_xmit(struct
+@@ -1466,8 +1494,14 @@ static netdev_tx_t mtk_start_xmit(struct
  		}
  		}
  	}
  	}
  
  

+ 1 - 1
target/linux/generic/pending-5.15/736-01-net-ethernet-mtk_eth_soc-add-code-for-offloading-flo.patch

@@ -14,7 +14,7 @@ Signed-off-by: Felix Fietkau <[email protected]>
 
 
 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
 +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
 +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
-@@ -1357,6 +1357,9 @@ int mtk_gmac_rgmii_path_setup(struct mtk
+@@ -1364,6 +1364,9 @@ int mtk_gmac_rgmii_path_setup(struct mtk
  int mtk_eth_offload_init(struct mtk_eth *eth);
  int mtk_eth_offload_init(struct mtk_eth *eth);
  int mtk_eth_setup_tc(struct net_device *dev, enum tc_setup_type type,
  int mtk_eth_setup_tc(struct net_device *dev, enum tc_setup_type type,
  		     void *type_data);
  		     void *type_data);

+ 2 - 2
target/linux/mediatek/patches-5.15/703-v5.17-net-ethernet-mtk_eth_soc-implement-Clause-45-MDIO-ac.patch

@@ -103,7 +103,7 @@ Signed-off-by: David S. Miller <[email protected]>
  
  
  	ret = mtk_mdio_busy_wait(eth);
  	ret = mtk_mdio_busy_wait(eth);
  	if (ret < 0)
  	if (ret < 0)
-@@ -727,6 +770,7 @@ static int mtk_mdio_init(struct mtk_eth
+@@ -729,6 +772,7 @@ static int mtk_mdio_init(struct mtk_eth
  	eth->mii_bus->name = "mdio";
  	eth->mii_bus->name = "mdio";
  	eth->mii_bus->read = mtk_mdio_read;
  	eth->mii_bus->read = mtk_mdio_read;
  	eth->mii_bus->write = mtk_mdio_write;
  	eth->mii_bus->write = mtk_mdio_write;
@@ -113,7 +113,7 @@ Signed-off-by: David S. Miller <[email protected]>
  
  
 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
 +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
 +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
-@@ -369,9 +369,12 @@
+@@ -376,9 +376,12 @@
  #define PHY_IAC_ADDR_MASK	GENMASK(24, 20)
  #define PHY_IAC_ADDR_MASK	GENMASK(24, 20)
  #define PHY_IAC_ADDR(x)		FIELD_PREP(PHY_IAC_ADDR_MASK, (x))
  #define PHY_IAC_ADDR(x)		FIELD_PREP(PHY_IAC_ADDR_MASK, (x))
  #define PHY_IAC_CMD_MASK	GENMASK(19, 18)
  #define PHY_IAC_CMD_MASK	GENMASK(19, 18)