net: lan743x: Add support for SGMII interface
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>
This commit is contained in:
parent
ac16b6eb39
commit
a46d9d37c4
@ -18,6 +18,34 @@
|
||||
#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";
|
||||
|
@ -30,6 +30,17 @@
|
||||
#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)
|
||||
@ -219,6 +230,11 @@
|
||||
|
||||
#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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user