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 c671719..1f5293c 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 ce67b17..7f68bef 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 b09395f..3aacf79 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 351eca6..733b5e9 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",