kernel: fix mtk_eth_soc throughput regressions on gigabit PHY ports
authorFelix Fietkau <nbd@nbd.name>
Wed, 29 Mar 2023 09:38:30 +0000 (11:38 +0200)
committerFelix Fietkau <nbd@nbd.name>
Wed, 29 Mar 2023 14:14:37 +0000 (16:14 +0200)
Fixes issues on MT7621 and MT7623 switch ports, and PHY ports on all SoC

Signed-off-by: Felix Fietkau <nbd@nbd.name>
target/linux/generic/backport-5.15/730-18-v6.3-net-ethernet-mtk_eth_soc-fix-tx-throughput-regressio.patch [new file with mode: 0644]
target/linux/generic/backport-5.15/733-v6.3-18-net-ethernet-mtk_eth_soc-add-support-for-MT7981.patch
target/linux/generic/backport-5.15/733-v6.3-19-net-ethernet-mtk_eth_soc-set-MDIO-bus-clock-frequenc.patch
target/linux/generic/backport-5.15/733-v6.3-20-net-ethernet-mtk_eth_soc-switch-to-external-PCS-driv.patch
target/linux/generic/pending-5.15/702-net-ethernet-mtk_eth_soc-enable-threaded-NAPI.patch
target/linux/generic/pending-5.15/731-net-ethernet-mediatek-ppe-add-support-for-flow-accou.patch
target/linux/generic/pending-5.15/732-00-net-ethernet-mtk_eth_soc-drop-generic-vlan-rx-offloa.patch
target/linux/generic/pending-5.15/732-01-net-ethernet-mtk_eth_soc-work-around-issue-with-send.patch
target/linux/generic/pending-5.15/732-03-net-ethernet-mtk_eth_soc-fix-remaining-throughput-re.patch [new file with mode: 0644]
target/linux/mediatek/patches-5.15/703-v5.17-net-ethernet-mtk_eth_soc-implement-Clause-45-MDIO-ac.patch

diff --git a/target/linux/generic/backport-5.15/730-18-v6.3-net-ethernet-mtk_eth_soc-fix-tx-throughput-regressio.patch b/target/linux/generic/backport-5.15/730-18-v6.3-net-ethernet-mtk_eth_soc-fix-tx-throughput-regressio.patch
new file mode 100644 (file)
index 0000000..e633f6f
--- /dev/null
@@ -0,0 +1,31 @@
+From: Felix Fietkau <nbd@nbd.name>
+Date: Fri, 24 Mar 2023 14:56:58 +0100
+Subject: [PATCH] net: ethernet: mtk_eth_soc: fix tx throughput regression with
+ direct 1G links
+
+Using the QDMA tx scheduler to throttle tx to line speed works fine for
+switch ports, but apparently caused a regression on non-switch ports.
+
+Based on a number of tests, it seems that this throttling can be safely
+dropped without re-introducing the issues on switch ports that the
+tx scheduling changes resolved.
+
+Link: https://lore.kernel.org/netdev/trinity-92c3826f-c2c8-40af-8339-bc6d0d3ffea4-1678213958520@3c-app-gmx-bs16/
+Fixes: f63959c7eec3 ("net: ethernet: mtk_eth_soc: implement multi-queue support for per-port queues")
+Reported-by: Frank Wunderlich <frank-w@public-files.de>
+Reported-by: Daniel Golle <daniel@makrotopia.org>
+Tested-by: Daniel Golle <daniel@makrotopia.org>
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+
+--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
+@@ -676,8 +676,6 @@ static void mtk_mac_link_up(struct phyli
+               break;
+       }
+-      mtk_set_queue_speed(mac->hw, mac->id, speed);
+-
+       /* Configure duplex */
+       if (duplex == DUPLEX_FULL)
+               mcr |= MAC_MCR_FORCE_DPX;
index bfa0df305345acb79b74bffd9b4ae4dc949add90..066b70c5e2c3cc5478961422b8fec8ae6d4ba87b 100644 (file)
@@ -34,7 +34,7 @@
                mtk_eth_path_name(path), __func__, updated);
 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
 +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -4757,6 +4757,26 @@ static const struct mtk_soc_data mt7629_
+@@ -4755,6 +4755,26 @@ static const struct mtk_soc_data mt7629_
        },
  };
  
@@ -61,7 +61,7 @@
  static const struct mtk_soc_data mt7986_data = {
        .reg_map = &mt7986_reg_map,
        .ana_rgc3 = 0x128,
-@@ -4799,6 +4819,7 @@ const struct of_device_id of_mtk_match[]
+@@ -4797,6 +4817,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},
index df7ee081f795da497f4f452d0f912a871b023711..9def19d67eb303aea3261c60baffc7f929fdd6ff 100644 (file)
@@ -21,7 +21,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
 
 --- 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_
+@@ -702,8 +702,10 @@ static const struct phylink_mac_ops mtk_
  
  static int mtk_mdio_init(struct mtk_eth *eth)
  {
@@ -32,7 +32,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
  
        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
+@@ -729,6 +731,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);
index 1eca7dfeaf59618be24d0bc08a855ea90548cf81..203c5dc48bb0fc292ddbd1ce1558f51929968693 100644 (file)
@@ -60,7 +60,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
        }
  
        return NULL;
-@@ -3979,8 +3980,17 @@ static int mtk_unreg_dev(struct mtk_eth
+@@ -3977,8 +3978,17 @@ static int mtk_unreg_dev(struct mtk_eth
        return 0;
  }
  
@@ -78,7 +78,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
        mtk_unreg_dev(eth);
        mtk_free_dev(eth);
        cancel_work_sync(&eth->pending_work);
-@@ -4410,6 +4420,36 @@ void mtk_eth_set_dma_device(struct mtk_e
+@@ -4408,6 +4418,36 @@ void mtk_eth_set_dma_device(struct mtk_e
        rtnl_unlock();
  }
  
@@ -115,7 +115,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
  static int mtk_probe(struct platform_device *pdev)
  {
        struct resource *res = NULL;
-@@ -4473,13 +4513,7 @@ static int mtk_probe(struct platform_dev
+@@ -4471,13 +4511,7 @@ static int mtk_probe(struct platform_dev
        }
  
        if (MTK_HAS_CAPS(eth->soc->caps, MTK_SGMII)) {
@@ -130,7 +130,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
  
                if (err)
                        return err;
-@@ -4490,14 +4524,17 @@ static int mtk_probe(struct platform_dev
+@@ -4488,14 +4522,17 @@ static int mtk_probe(struct platform_dev
                                                            "mediatek,pctl");
                if (IS_ERR(eth->pctl)) {
                        dev_err(&pdev->dev, "no pctl regmap found\n");
@@ -151,7 +151,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
        }
  
        if (eth->soc->offload_version) {
-@@ -4657,6 +4694,8 @@ err_deinit_hw:
+@@ -4655,6 +4692,8 @@ err_deinit_hw:
        mtk_hw_deinit(eth);
  err_wed_exit:
        mtk_wed_exit();
index 5dcbc6c46a239ffb11583874425c5cd743b9c673..a4e3d2650333ebb1fa2270fc2aacf02c343dfb05 100644 (file)
@@ -10,7 +10,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
 
 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
 +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -2994,8 +2994,8 @@ static irqreturn_t mtk_handle_irq_rx(int
+@@ -2992,8 +2992,8 @@ static irqreturn_t mtk_handle_irq_rx(int
  
        eth->rx_events++;
        if (likely(napi_schedule_prep(&eth->rx_napi))) {
@@ -20,7 +20,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
        }
  
        return IRQ_HANDLED;
-@@ -3007,8 +3007,8 @@ static irqreturn_t mtk_handle_irq_tx(int
+@@ -3005,8 +3005,8 @@ static irqreturn_t mtk_handle_irq_tx(int
  
        eth->tx_events++;
        if (likely(napi_schedule_prep(&eth->tx_napi))) {
@@ -30,7 +30,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
        }
  
        return IRQ_HANDLED;
-@@ -4675,6 +4675,8 @@ static int mtk_probe(struct platform_dev
+@@ -4673,6 +4673,8 @@ static int mtk_probe(struct platform_dev
         * for NAPI to work
         */
        init_dummy_netdev(&eth->dummy_dev);
index c7e1d3f6f0834f863c85e257005263bf639d2488..6ca33152fcaeabf683f1143c1242f9010da2c404 100644 (file)
@@ -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
 +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -4644,8 +4644,8 @@ static int mtk_probe(struct platform_dev
+@@ -4642,8 +4642,8 @@ static int mtk_probe(struct platform_dev
                for (i = 0; i < num_ppe; i++) {
                        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]) {
                                err = -ENOMEM;
                                goto err_free_dev;
-@@ -4772,6 +4772,7 @@ static const struct mtk_soc_data mt7622_
+@@ -4770,6 +4770,7 @@ static const struct mtk_soc_data mt7622_
        .required_pctl = false,
        .offload_version = 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,
        .txrx = {
                .txd_size = sizeof(struct mtk_tx_dma),
-@@ -4809,6 +4810,7 @@ static const struct mtk_soc_data mt7629_
+@@ -4807,6 +4808,7 @@ static const struct mtk_soc_data mt7629_
        .hw_features = MTK_HW_FEATURES,
        .required_clks = MT7629_CLKS_BITMAP,
        .required_pctl = false,
@@ -80,7 +80,7 @@ v2: fix wrong variable name in return value check spotted by Denis Kirjanov
        .txrx = {
                .txd_size = sizeof(struct mtk_tx_dma),
                .rxd_size = sizeof(struct mtk_rx_dma),
-@@ -4829,6 +4831,7 @@ static const struct mtk_soc_data mt7981_
+@@ -4827,6 +4829,7 @@ static const struct mtk_soc_data mt7981_
        .offload_version = 2,
        .hash_offset = 4,
        .foe_entry_size = sizeof(struct mtk_foe_entry),
index b5e118f9fab06d2fe824822c5116af8350b2f7f5..35b296a25532744054e5eef8bd040221fef7b4d7 100644 (file)
@@ -17,7 +17,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
 
 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
 +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -1852,9 +1852,7 @@ static int mtk_poll_rx(struct napi_struc
+@@ -1850,9 +1850,7 @@ static int mtk_poll_rx(struct napi_struc
  
        while (done < budget) {
                unsigned int pktlen, *rxdcsum;
@@ -27,7 +27,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
                dma_addr_t dma_addr;
                u32 hash, reason;
                int mac = 0;
-@@ -1989,36 +1987,21 @@ static int mtk_poll_rx(struct napi_struc
+@@ -1987,36 +1985,21 @@ static int mtk_poll_rx(struct napi_struc
                        skb_checksum_none_assert(skb);
                skb->protocol = eth_type_trans(skb, netdev);
  
@@ -70,7 +70,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
                skb_record_rx_queue(skb, 0);
                napi_gro_receive(napi, skb);
  
-@@ -2833,29 +2816,11 @@ static netdev_features_t mtk_fix_feature
+@@ -2831,29 +2814,11 @@ static netdev_features_t mtk_fix_feature
  
  static int mtk_set_features(struct net_device *dev, netdev_features_t features)
  {
@@ -100,7 +100,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
        return 0;
  }
  
-@@ -3169,30 +3134,6 @@ static int mtk_open(struct net_device *d
+@@ -3167,30 +3132,6 @@ static int mtk_open(struct net_device *d
        struct mtk_eth *eth = mac->hw;
        int i, err;
  
@@ -131,7 +131,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
        err = phylink_of_phy_connect(mac->phylink, mac->of_node, 0);
        if (err) {
                netdev_err(dev, "%s: could not attach PHY: %d\n", __func__,
-@@ -3233,6 +3174,35 @@ static int mtk_open(struct net_device *d
+@@ -3231,6 +3172,35 @@ static int mtk_open(struct net_device *d
        phylink_start(mac->phylink);
        netif_tx_start_all_queues(dev);
  
@@ -167,7 +167,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
        return 0;
  }
  
-@@ -3717,10 +3687,9 @@ static int mtk_hw_init(struct mtk_eth *e
+@@ -3715,10 +3685,9 @@ static int mtk_hw_init(struct mtk_eth *e
        if (!MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) {
                val = mtk_r32(eth, 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 <nbd@nbd.name>
  
        /* set interrupt delays based on current Net DIM sample */
        mtk_dim_rx(&eth->rx_dim.work);
-@@ -4367,7 +4336,7 @@ static int mtk_add_mac(struct mtk_eth *e
+@@ -4365,7 +4334,7 @@ static int mtk_add_mac(struct mtk_eth *e
                eth->netdev[id]->hw_features |= NETIF_F_LRO;
  
        eth->netdev[id]->vlan_features = eth->soc->hw_features &
index 72bad79c1383b92c4f3c5e745d9912ab4ea0f5f7..fbf0cb5735eb2b58f6a58333874d8b33ff5997dd 100644 (file)
@@ -16,7 +16,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
 
 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
 +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -1425,12 +1425,28 @@ static void mtk_wake_queue(struct mtk_et
+@@ -1423,12 +1423,28 @@ static void mtk_wake_queue(struct mtk_et
        }
  }
  
@@ -45,7 +45,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
        bool gso = false;
        int tx_num;
  
-@@ -1452,6 +1468,18 @@ static netdev_tx_t mtk_start_xmit(struct
+@@ -1450,6 +1466,18 @@ static netdev_tx_t mtk_start_xmit(struct
                return NETDEV_TX_BUSY;
        }
  
@@ -64,7 +64,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
        /* TSO: fill MSS info in tcp checksum field */
        if (skb_is_gso(skb)) {
                if (skb_cow_head(skb, 0)) {
-@@ -1467,8 +1495,14 @@ static netdev_tx_t mtk_start_xmit(struct
+@@ -1465,8 +1493,14 @@ static netdev_tx_t mtk_start_xmit(struct
                }
        }
  
diff --git a/target/linux/generic/pending-5.15/732-03-net-ethernet-mtk_eth_soc-fix-remaining-throughput-re.patch b/target/linux/generic/pending-5.15/732-03-net-ethernet-mtk_eth_soc-fix-remaining-throughput-re.patch
new file mode 100644 (file)
index 0000000..0aa9382
--- /dev/null
@@ -0,0 +1,42 @@
+From: Felix Fietkau <nbd@nbd.name>
+Date: Wed, 29 Mar 2023 16:02:54 +0200
+Subject: [PATCH] net: ethernet: mtk_eth_soc: fix remaining throughput
+ regression
+
+Based on further tests, it seems that the QDMA shaper is not able to
+perform shaping close to the MAC link rate without throughput loss.
+This cannot be compensated by increasing the shaping rate, so it seems
+to be an internal limit.
+
+Fix the remaining throughput regression by detecting that condition and
+limiting shaping to ports with lower link speed.
+
+This patch intentionally ignores link speed gain from TRGMII, because
+even on such links, shaping to 1000 Mbit/s incurs some throughput
+degradation.
+
+Fixes: f63959c7eec3 ("net: ethernet: mtk_eth_soc: implement multi-queue support for per-port queues")
+Reported-by: Frank Wunderlich <frank-w@public-files.de>
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+
+--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
+@@ -667,6 +667,7 @@ static void mtk_mac_link_up(struct phyli
+                MAC_MCR_FORCE_RX_FC);
+       /* Configure speed */
++      mac->speed = speed;
+       switch (speed) {
+       case SPEED_2500:
+       case SPEED_1000:
+@@ -3145,6 +3146,9 @@ found:
+       if (dp->index >= MTK_QDMA_NUM_QUEUES)
+               return NOTIFY_DONE;
++      if (mac->speed > 0 && mac->speed <= s.base.speed)
++              s.base.speed = 0;
++
+       mtk_set_queue_speed(eth, dp->index + 3, s.base.speed);
+       return NOTIFY_DONE;
index ffa98e3f0d9931a7656afdd7a2409f268d0348f6..4187557b781ea7452f31e3283fd3c44f533795fb 100644 (file)
@@ -103,7 +103,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
  
        ret = mtk_mdio_busy_wait(eth);
        if (ret < 0)
-@@ -730,6 +773,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->read = mtk_mdio_read;
        eth->mii_bus->write = mtk_mdio_write;