net: stmmac: xgmac: show more MAC HW features in debugfs
authorFurong Xu <0x1207@gmail.com>
Fri, 11 Aug 2023 12:51:39 +0000 (20:51 +0800)
committerDavid S. Miller <davem@davemloft.net>
Mon, 14 Aug 2023 07:09:00 +0000 (08:09 +0100)
1. Show TSSTSSEL(Timestamp System Time Source),
ADDMACADRSEL(additional MAC addresses), SMASEL(SMA/MDIO Interface),
HDSEL(Half-duplex Support) in debugfs.
2. Show exact number of additional MAC address registers for XGMAC2 core.
3. XGMAC2 core does not have different IP checksum offload types, so just
show rx_coe instead of rx_coe_type1 or rx_coe_type2.
4. XGMAC2 core does not have rxfifo_over_2048 definition, skip it.

Signed-off-by: Furong Xu <0x1207@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/stmicro/stmmac/common.h
drivers/net/ethernet/stmicro/stmmac/dwxgmac2.h
drivers/net/ethernet/stmicro/stmmac/dwxgmac2_dma.c
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c

index c67171975d5c72f507f8a18731101ba2405df672..1f5293c8cc0471e0832006bc500c87ba7ab3b6ed 100644 (file)
@@ -438,6 +438,8 @@ struct dma_features {
        unsigned int tbssel;
        /* Numbers of Auxiliary Snapshot Inputs */
        unsigned int aux_snapshot_n;
+       /* Timestamp System Time Source */
+       unsigned int tssrc;
 };
 
 /* RX Buffer size must be multiple of 4/8/16 bytes */
index ce67b178c2d537f23931e26af52403b27515e41c..7f68bef456b7f83bd7dabaa0f0cac92a3abf7388 100644 (file)
 #define XGMAC_LPI_TIMER_CTRL           0x000000d4
 #define XGMAC_HW_FEATURE0              0x0000011c
 #define XGMAC_HWFEAT_SAVLANINS         BIT(27)
+#define XGMAC_HWFEAT_TSSTSSEL          GENMASK(26, 25)
+#define XGMAC_HWFEAT_ADDMACADRSEL      GENMASK(22, 18)
 #define XGMAC_HWFEAT_RXCOESEL          BIT(16)
 #define XGMAC_HWFEAT_TXCOESEL          BIT(14)
 #define XGMAC_HWFEAT_EEESEL            BIT(13)
 #define XGMAC_HWFEAT_MMCSEL            BIT(8)
 #define XGMAC_HWFEAT_MGKSEL            BIT(7)
 #define XGMAC_HWFEAT_RWKSEL            BIT(6)
+#define XGMAC_HWFEAT_SMASEL            BIT(5)
 #define XGMAC_HWFEAT_VLHASH            BIT(4)
+#define XGMAC_HWFEAT_HDSEL             BIT(3)
 #define XGMAC_HWFEAT_GMIISEL           BIT(1)
 #define XGMAC_HW_FEATURE1              0x00000120
 #define XGMAC_HWFEAT_L3L4FNUM          GENMASK(30, 27)
index b09395f5edcb127b6647da1263aa323738a45442..3aacf791efebcc9369948acfaf1613bb8691c5a7 100644 (file)
@@ -391,9 +391,11 @@ static int dwxgmac2_get_hw_feature(void __iomem *ioaddr,
 {
        u32 hw_cap;
 
-       /*  MAC HW feature 0 */
+       /* MAC HW feature 0 */
        hw_cap = readl(ioaddr + XGMAC_HW_FEATURE0);
        dma_cap->vlins = (hw_cap & XGMAC_HWFEAT_SAVLANINS) >> 27;
+       dma_cap->tssrc = (hw_cap & XGMAC_HWFEAT_TSSTSSEL) >> 25;
+       dma_cap->multi_addr = (hw_cap & XGMAC_HWFEAT_ADDMACADRSEL) >> 18;
        dma_cap->rx_coe = (hw_cap & XGMAC_HWFEAT_RXCOESEL) >> 16;
        dma_cap->tx_coe = (hw_cap & XGMAC_HWFEAT_TXCOESEL) >> 14;
        dma_cap->eee = (hw_cap & XGMAC_HWFEAT_EEESEL) >> 13;
@@ -404,7 +406,9 @@ static int dwxgmac2_get_hw_feature(void __iomem *ioaddr,
        dma_cap->rmon = (hw_cap & XGMAC_HWFEAT_MMCSEL) >> 8;
        dma_cap->pmt_magic_frame = (hw_cap & XGMAC_HWFEAT_MGKSEL) >> 7;
        dma_cap->pmt_remote_wake_up = (hw_cap & XGMAC_HWFEAT_RWKSEL) >> 6;
+       dma_cap->sma_mdio = (hw_cap & XGMAC_HWFEAT_SMASEL) >> 5;
        dma_cap->vlhash = (hw_cap & XGMAC_HWFEAT_VLHASH) >> 4;
+       dma_cap->half_duplex = (hw_cap & XGMAC_HWFEAT_HDSEL) >> 3;
        dma_cap->mbps_1000 = (hw_cap & XGMAC_HWFEAT_GMIISEL) >> 1;
 
        /* MAC HW feature 1 */
index 351eca6109e01120dfbb7bbab7ba9f824d41b359..733b5e90081737ed09a8d0c051a506343d412e53 100644 (file)
@@ -6237,6 +6237,12 @@ DEFINE_SHOW_ATTRIBUTE(stmmac_rings_status);
 
 static int stmmac_dma_cap_show(struct seq_file *seq, void *v)
 {
+       static const char * const dwxgmac_timestamp_source[] = {
+               "None",
+               "Internal",
+               "External",
+               "Both",
+       };
        struct net_device *dev = seq->private;
        struct stmmac_priv *priv = netdev_priv(dev);
 
@@ -6257,8 +6263,13 @@ static int stmmac_dma_cap_show(struct seq_file *seq, void *v)
                   (priv->dma_cap.half_duplex) ? "Y" : "N");
        seq_printf(seq, "\tHash Filter: %s\n",
                   (priv->dma_cap.hash_filter) ? "Y" : "N");
-       seq_printf(seq, "\tMultiple MAC address registers: %s\n",
-                  (priv->dma_cap.multi_addr) ? "Y" : "N");
+       if (priv->plat->has_xgmac)
+               seq_printf(seq,
+                          "\tNumber of Additional MAC address registers: %d\n",
+                          priv->dma_cap.multi_addr);
+       else
+               seq_printf(seq, "\tMultiple MAC address registers: %s\n",
+                          (priv->dma_cap.multi_addr) ? "Y" : "N");
        seq_printf(seq, "\tPCS (TBI/SGMII/RTBI PHY interfaces): %s\n",
                   (priv->dma_cap.pcs) ? "Y" : "N");
        seq_printf(seq, "\tSMA (MDIO) Interface: %s\n",
@@ -6273,12 +6284,16 @@ static int stmmac_dma_cap_show(struct seq_file *seq, void *v)
                   (priv->dma_cap.time_stamp) ? "Y" : "N");
        seq_printf(seq, "\tIEEE 1588-2008 Advanced Time Stamp: %s\n",
                   (priv->dma_cap.atime_stamp) ? "Y" : "N");
+       if (priv->plat->has_xgmac)
+               seq_printf(seq, "\tTimestamp System Time Source: %s\n",
+                          dwxgmac_timestamp_source[priv->dma_cap.tssrc]);
        seq_printf(seq, "\t802.3az - Energy-Efficient Ethernet (EEE): %s\n",
                   (priv->dma_cap.eee) ? "Y" : "N");
        seq_printf(seq, "\tAV features: %s\n", (priv->dma_cap.av) ? "Y" : "N");
        seq_printf(seq, "\tChecksum Offload in TX: %s\n",
                   (priv->dma_cap.tx_coe) ? "Y" : "N");
-       if (priv->synopsys_id >= DWMAC_CORE_4_00) {
+       if (priv->synopsys_id >= DWMAC_CORE_4_00 ||
+           priv->plat->has_xgmac) {
                seq_printf(seq, "\tIP Checksum Offload in RX: %s\n",
                           (priv->dma_cap.rx_coe) ? "Y" : "N");
        } else {
@@ -6286,9 +6301,9 @@ static int stmmac_dma_cap_show(struct seq_file *seq, void *v)
                           (priv->dma_cap.rx_coe_type1) ? "Y" : "N");
                seq_printf(seq, "\tIP Checksum Offload (type2) in RX: %s\n",
                           (priv->dma_cap.rx_coe_type2) ? "Y" : "N");
+               seq_printf(seq, "\tRXFIFO > 2048bytes: %s\n",
+                          (priv->dma_cap.rxfifo_over_2048) ? "Y" : "N");
        }
-       seq_printf(seq, "\tRXFIFO > 2048bytes: %s\n",
-                  (priv->dma_cap.rxfifo_over_2048) ? "Y" : "N");
        seq_printf(seq, "\tNumber of Additional RX channel: %d\n",
                   priv->dma_cap.number_rx_channel);
        seq_printf(seq, "\tNumber of Additional TX channel: %d\n",