generic: sync MediaTek Ethernet driver with upstream
[openwrt/openwrt.git] / target / linux / generic / pending-5.15 / 732-01-net-ethernet-mtk_eth_soc-work-around-issue-with-send.patch
index fbf0cb5735eb2b58f6a58333874d8b33ff5997dd..56edb63234539e02b7f8ea023038811bf0a6b263 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
-@@ -1423,12 +1423,28 @@ static void mtk_wake_queue(struct mtk_et
+@@ -1516,12 +1516,28 @@ static void mtk_wake_queue(struct mtk_et
        }
  }
  
@@ -45,11 +45,11 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
        bool gso = false;
        int tx_num;
  
-@@ -1450,6 +1466,18 @@ static netdev_tx_t mtk_start_xmit(struct
+@@ -1543,6 +1559,18 @@ static netdev_tx_t mtk_start_xmit(struct
                return NETDEV_TX_BUSY;
        }
  
-+      if (!MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2) &&
++      if (mtk_is_netsys_v1(eth) &&
 +          skb_is_gso(skb) && mtk_skb_has_small_frag(skb)) {
 +              segs = skb_gso_segment(skb, dev->features & ~NETIF_F_ALL_TSO);
 +              if (IS_ERR(segs))
@@ -64,14 +64,14 @@ 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)) {
-@@ -1465,8 +1493,14 @@ static netdev_tx_t mtk_start_xmit(struct
+@@ -1558,8 +1586,14 @@ static netdev_tx_t mtk_start_xmit(struct
                }
        }
  
 -      if (mtk_tx_map(skb, dev, tx_num, ring, gso) < 0)
 -              goto drop;
 +      skb_list_walk_safe(skb, skb, next) {
-+              if ((!MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2) &&
++              if ((mtk_is_netsys_v1(eth) &&
 +                   mtk_skb_has_small_frag(skb) && skb_linearize(skb)) ||
 +                  mtk_tx_map(skb, dev, tx_num, ring, gso) < 0) {
 +                              stats->tx_dropped++;
@@ -83,7 +83,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
                netif_tx_stop_all_queues(dev);
 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
 +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
-@@ -258,7 +258,7 @@
+@@ -268,7 +268,7 @@
  #define MTK_CHK_DDONE_EN      BIT(28)
  #define MTK_DMAD_WR_WDONE     BIT(26)
  #define MTK_WCOMP_EN          BIT(24)