Commit a46d9d37 authored by Raju Lakkaraju's avatar Raju Lakkaraju Committed by David S. Miller
Browse files

net: lan743x: Add support for SGMII interface



This change facilitates the selection between SGMII and (R)GIII
interfaces

Signed-off-by: default avatarRaju Lakkaraju <Raju.Lakkaraju@microchip.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent ac16b6eb
Loading
Loading
Loading
Loading
+48 −0
Original line number Diff line number Diff line
@@ -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";
+17 −0
Original line number Diff line number Diff line
@@ -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;