]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
amd-xgbe: add support for giant packet size
authorRaju Rangoju <Raju.Rangoju@amd.com>
Tue, 1 Jul 2025 12:19:29 +0000 (17:49 +0530)
committerJakub Kicinski <kuba@kernel.org>
Wed, 2 Jul 2025 21:50:07 +0000 (14:50 -0700)
AMD XGBE hardware supports giant Ethernet frames up to 16K bytes.
Add support for configuring and enabling giant packet handling
in the driver.

- Define new register fields and macros for giant packet support.
- Update the jumbo frame configuration logic to enable giant
  packet mode when MTU exceeds the jumbo threshold.

Acked-by: Shyam Sundar S K <Shyam-sundar.S-k@amd.com>
Signed-off-by: Raju Rangoju <Raju.Rangoju@amd.com>
Reviewed-by: Simon Horman <horms@kernel.org>
Link: https://patch.msgid.link/20250701121929.319690-1-Raju.Rangoju@amd.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/amd/xgbe/xgbe-common.h
drivers/net/ethernet/amd/xgbe/xgbe-dev.c
drivers/net/ethernet/amd/xgbe/xgbe-main.c
drivers/net/ethernet/amd/xgbe/xgbe.h

index e1296cbf4ff309893233fcc648386e92892962d4..734f446606206a9fc3aeee0a86472dc8298026ba 100644 (file)
 #define MAC_RCR_CST_WIDTH              1
 #define MAC_RCR_DCRCC_INDEX            3
 #define MAC_RCR_DCRCC_WIDTH            1
+#define MAC_RCR_GPSLCE_INDEX           6
+#define MAC_RCR_GPSLCE_WIDTH           1
+#define MAC_RCR_WD_INDEX               7
+#define MAC_RCR_WD_WIDTH               1
 #define MAC_RCR_HDSMS_INDEX            12
 #define MAC_RCR_HDSMS_WIDTH            3
 #define MAC_RCR_IPC_INDEX              9
 #define MAC_RCR_LM_WIDTH               1
 #define MAC_RCR_RE_INDEX               0
 #define MAC_RCR_RE_WIDTH               1
+#define MAC_RCR_GPSL_INDEX             16
+#define MAC_RCR_GPSL_WIDTH             14
 #define MAC_RFCR_PFCE_INDEX            8
 #define MAC_RFCR_PFCE_WIDTH            1
 #define MAC_RFCR_RFE_INDEX             0
 #define MAC_TCR_VNE_WIDTH              1
 #define MAC_TCR_VNM_INDEX              25
 #define MAC_TCR_VNM_WIDTH              1
+#define MAC_TCR_JD_INDEX               16
+#define MAC_TCR_JD_WIDTH               1
 #define MAC_TIR_TNID_INDEX             0
 #define MAC_TIR_TNID_WIDTH             16
 #define MAC_TSCR_AV8021ASMEN_INDEX     28
index 466b5f6e55789d6c6aacb310ada98dea0fc0b8e8..9e4e79bfe6247be757d13c1b8d183fca9302a641 100644 (file)
@@ -2850,9 +2850,19 @@ static void xgbe_config_jumbo_enable(struct xgbe_prv_data *pdata)
 {
        unsigned int val;
 
-       val = (pdata->netdev->mtu > XGMAC_STD_PACKET_MTU) ? 1 : 0;
-
-       XGMAC_IOWRITE_BITS(pdata, MAC_RCR, JE, val);
+       if (pdata->netdev->mtu > XGMAC_JUMBO_PACKET_MTU) {
+               XGMAC_IOWRITE_BITS(pdata, MAC_RCR, GPSL,
+                                  XGMAC_GIANT_PACKET_MTU);
+               XGMAC_IOWRITE_BITS(pdata, MAC_RCR, WD, 1);
+               XGMAC_IOWRITE_BITS(pdata, MAC_TCR, JD, 1);
+               XGMAC_IOWRITE_BITS(pdata, MAC_RCR, GPSLCE, 1);
+       } else {
+               val = pdata->netdev->mtu > XGMAC_STD_PACKET_MTU ? 1 : 0;
+               XGMAC_IOWRITE_BITS(pdata, MAC_RCR, GPSLCE, 0);
+               XGMAC_IOWRITE_BITS(pdata, MAC_RCR, WD, 0);
+               XGMAC_IOWRITE_BITS(pdata, MAC_TCR, JD, 0);
+               XGMAC_IOWRITE_BITS(pdata, MAC_RCR, JE, val);
+       }
 }
 
 static void xgbe_config_mac_speed(struct xgbe_prv_data *pdata)
index 4ebdd123c4355d867dcfd7ffb47b047c99ed6605..d1f0419edb234925ee05d149cb28fa554eb88704 100644 (file)
@@ -275,7 +275,7 @@ int xgbe_config_netdev(struct xgbe_prv_data *pdata)
 
        netdev->priv_flags |= IFF_UNICAST_FLT;
        netdev->min_mtu = 0;
-       netdev->max_mtu = XGMAC_JUMBO_PACKET_MTU;
+       netdev->max_mtu = XGMAC_GIANT_PACKET_MTU - XGBE_ETH_FRAME_HDR;
 
        /* Use default watchdog timeout */
        netdev->watchdog_timeo = 0;
index 6359bb87dc13e3d58078f2754b535a75b2fec29e..29b42e7ab6cf0478db5a7f0d2d55d7b24f98150f 100644 (file)
 #define XGBE_IRQ_MODE_EDGE     0
 #define XGBE_IRQ_MODE_LEVEL    1
 
+#define XGBE_ETH_FRAME_HDR     (ETH_HLEN + ETH_FCS_LEN + VLAN_HLEN)
 #define XGMAC_MIN_PACKET       60
 #define XGMAC_STD_PACKET_MTU   1500
 #define XGMAC_MAX_STD_PACKET   1518
 #define XGMAC_JUMBO_PACKET_MTU 9000
 #define XGMAC_MAX_JUMBO_PACKET 9018
+#define XGMAC_GIANT_PACKET_MTU 16368
 #define XGMAC_ETH_PREAMBLE     (12 + 8)        /* Inter-frame gap + preamble */
 
 #define XGMAC_PFC_DATA_LEN     46