net: lan743x: Add support for SGMII interface
authorRaju Lakkaraju <Raju.Lakkaraju@microchip.com>
Sat, 12 Feb 2022 15:53:14 +0000 (21:23 +0530)
committerDavid S. Miller <davem@davemloft.net>
Sun, 13 Feb 2022 12:07:26 +0000 (12:07 +0000)
This change facilitates the selection between SGMII and (R)GIII
interfaces

Signed-off-by: Raju Lakkaraju <Raju.Lakkaraju@microchip.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/microchip/lan743x_main.c
drivers/net/ethernet/microchip/lan743x_main.h

index 814d825..8b0890a 100644 (file)
 #include "lan743x_main.h"
 #include "lan743x_ethtool.h"
 
+static void pci11x1x_strap_get_status(struct lan743x_adapter *adapter)
+{
+       u32 chip_rev;
+       u32 strap;
+
+       strap = lan743x_csr_read(adapter, STRAP_READ);
+       if (strap & STRAP_READ_USE_SGMII_EN_) {
+               if (strap & STRAP_READ_SGMII_EN_)
+                       adapter->is_sgmii_en = true;
+               else
+                       adapter->is_sgmii_en = false;
+               netif_dbg(adapter, drv, adapter->netdev,
+                         "STRAP_READ: 0x%08X\n", strap);
+       } else {
+               chip_rev = lan743x_csr_read(adapter, FPGA_REV);
+               if (chip_rev) {
+                       if (chip_rev & FPGA_SGMII_OP)
+                               adapter->is_sgmii_en = true;
+                       else
+                               adapter->is_sgmii_en = false;
+                       netif_dbg(adapter, drv, adapter->netdev,
+                                 "FPGA_REV: 0x%08X\n", chip_rev);
+               } else {
+                       adapter->is_sgmii_en = false;
+               }
+       }
+}
+
 static bool is_pci11x1x_chip(struct lan743x_adapter *adapter)
 {
        struct lan743x_csr *csr = &adapter->csr;
@@ -2744,6 +2772,7 @@ static int lan743x_hardware_init(struct lan743x_adapter *adapter,
                adapter->max_tx_channels = PCI11X1X_MAX_TX_CHANNELS;
                adapter->used_tx_channels = PCI11X1X_USED_TX_CHANNELS;
                adapter->max_vector_count = PCI11X1X_MAX_VECTOR_COUNT;
+               pci11x1x_strap_get_status(adapter);
        } else {
                adapter->max_tx_channels = LAN743X_MAX_TX_CHANNELS;
                adapter->used_tx_channels = LAN743X_USED_TX_CHANNELS;
@@ -2792,6 +2821,7 @@ static int lan743x_hardware_init(struct lan743x_adapter *adapter,
 
 static int lan743x_mdiobus_init(struct lan743x_adapter *adapter)
 {
+       u32 sgmii_ctl;
        int ret;
 
        adapter->mdiobus = devm_mdiobus_alloc(&adapter->pdev->dev);
@@ -2801,6 +2831,24 @@ static int lan743x_mdiobus_init(struct lan743x_adapter *adapter)
        }
 
        adapter->mdiobus->priv = (void *)adapter;
+       if (adapter->is_pci11x1x) {
+               if (adapter->is_sgmii_en) {
+                       sgmii_ctl = lan743x_csr_read(adapter, SGMII_CTL);
+                       sgmii_ctl |= SGMII_CTL_SGMII_ENABLE_;
+                       sgmii_ctl &= ~SGMII_CTL_SGMII_POWER_DN_;
+                       lan743x_csr_write(adapter, SGMII_CTL, sgmii_ctl);
+                       netif_dbg(adapter, drv, adapter->netdev,
+                                 "SGMII operation\n");
+               } else {
+                       sgmii_ctl = lan743x_csr_read(adapter, SGMII_CTL);
+                       sgmii_ctl &= ~SGMII_CTL_SGMII_ENABLE_;
+                       sgmii_ctl |= SGMII_CTL_SGMII_POWER_DN_;
+                       lan743x_csr_write(adapter, SGMII_CTL, sgmii_ctl);
+                       netif_dbg(adapter, drv, adapter->netdev,
+                                         "(R)GMII operation\n");
+               }
+       }
+
        adapter->mdiobus->read = lan743x_mdiobus_read;
        adapter->mdiobus->write = lan743x_mdiobus_write;
        adapter->mdiobus->name = "lan743x-mdiobus";
index 9a3ac9d..7c387ca 100644 (file)
 #define FPGA_REV                       (0x04)
 #define FPGA_REV_GET_MINOR_(fpga_rev)  (((fpga_rev) >> 8) & 0x000000FF)
 #define FPGA_REV_GET_MAJOR_(fpga_rev)  ((fpga_rev) & 0x000000FF)
+#define FPGA_SGMII_OP                  BIT(24)
+
+#define STRAP_READ                     (0x0C)
+#define STRAP_READ_USE_SGMII_EN_       BIT(22)
+#define STRAP_READ_SGMII_EN_           BIT(6)
+#define STRAP_READ_SGMII_REFCLK_       BIT(5)
+#define STRAP_READ_SGMII_2_5G_         BIT(4)
+#define STRAP_READ_BASE_X_             BIT(3)
+#define STRAP_READ_RGMII_TXC_DELAY_EN_ BIT(2)
+#define STRAP_READ_RGMII_RXC_DELAY_EN_ BIT(1)
+#define STRAP_READ_ADV_PM_DISABLE_     BIT(0)
 
 #define HW_CFG                                 (0x010)
 #define HW_CFG_RELOAD_TYPE_ALL_                        (0x00000FC0)
 
 #define MAC_WUCSR2                     (0x600)
 
+#define SGMII_CTL                      (0x728)
+#define SGMII_CTL_SGMII_ENABLE_                BIT(31)
+#define SGMII_CTL_LINK_STATUS_SOURCE_  BIT(8)
+#define SGMII_CTL_SGMII_POWER_DN_      BIT(1)
+
 #define INT_STS                                (0x780)
 #define INT_BIT_DMA_RX_(channel)       BIT(24 + (channel))
 #define INT_BIT_ALL_RX_                        (0x0F000000)
@@ -739,6 +755,7 @@ struct lan743x_adapter {
        struct lan743x_tx       tx[PCI11X1X_USED_TX_CHANNELS];
        struct lan743x_rx       rx[LAN743X_USED_RX_CHANNELS];
        bool                    is_pci11x1x;
+       bool                    is_sgmii_en;
        u8                      max_tx_channels;
        u8                      used_tx_channels;
        u8                      max_vector_count;