lan743x: Add EEE support

Implement EEE support

Signed-off-by: Bryan Whitehead <Bryan.Whitehead@microchip.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Bryan Whitehead 2018-07-23 16:16:32 -04:00 committed by David S. Miller
parent 4d94282afd
commit c9cf96bb5f
2 changed files with 88 additions and 0 deletions

View File

@ -415,6 +415,89 @@ static int lan743x_ethtool_get_sset_count(struct net_device *netdev, int sset)
}
}
static int lan743x_ethtool_get_eee(struct net_device *netdev,
struct ethtool_eee *eee)
{
struct lan743x_adapter *adapter = netdev_priv(netdev);
struct phy_device *phydev = netdev->phydev;
u32 buf;
int ret;
if (!phydev)
return -EIO;
if (!phydev->drv) {
netif_err(adapter, drv, adapter->netdev,
"Missing PHY Driver\n");
return -EIO;
}
ret = phy_ethtool_get_eee(phydev, eee);
if (ret < 0)
return ret;
buf = lan743x_csr_read(adapter, MAC_CR);
if (buf & MAC_CR_EEE_EN_) {
eee->eee_enabled = true;
eee->eee_active = !!(eee->advertised & eee->lp_advertised);
eee->tx_lpi_enabled = true;
/* EEE_TX_LPI_REQ_DLY & tx_lpi_timer are same uSec unit */
buf = lan743x_csr_read(adapter, MAC_EEE_TX_LPI_REQ_DLY_CNT);
eee->tx_lpi_timer = buf;
} else {
eee->eee_enabled = false;
eee->eee_active = false;
eee->tx_lpi_enabled = false;
eee->tx_lpi_timer = 0;
}
return 0;
}
static int lan743x_ethtool_set_eee(struct net_device *netdev,
struct ethtool_eee *eee)
{
struct lan743x_adapter *adapter = netdev_priv(netdev);
struct phy_device *phydev = NULL;
u32 buf = 0;
int ret = 0;
if (!netdev)
return -EINVAL;
adapter = netdev_priv(netdev);
if (!adapter)
return -EINVAL;
phydev = netdev->phydev;
if (!phydev)
return -EIO;
if (!phydev->drv) {
netif_err(adapter, drv, adapter->netdev,
"Missing PHY Driver\n");
return -EIO;
}
if (eee->eee_enabled) {
ret = phy_init_eee(phydev, 0);
if (ret) {
netif_err(adapter, drv, adapter->netdev,
"EEE initialization failed\n");
return ret;
}
buf = (u32)eee->tx_lpi_timer;
lan743x_csr_write(adapter, MAC_EEE_TX_LPI_REQ_DLY_CNT, buf);
buf = lan743x_csr_read(adapter, MAC_CR);
buf |= MAC_CR_EEE_EN_;
lan743x_csr_write(adapter, MAC_CR, buf);
} else {
buf = lan743x_csr_read(adapter, MAC_CR);
buf &= ~MAC_CR_EEE_EN_;
lan743x_csr_write(adapter, MAC_CR, buf);
}
return phy_ethtool_set_eee(phydev, eee);
}
#ifdef CONFIG_PM
static void lan743x_ethtool_get_wol(struct net_device *netdev,
struct ethtool_wolinfo *wol)
@ -470,6 +553,8 @@ const struct ethtool_ops lan743x_ethtool_ops = {
.get_strings = lan743x_ethtool_get_strings,
.get_ethtool_stats = lan743x_ethtool_get_ethtool_stats,
.get_sset_count = lan743x_ethtool_get_sset_count,
.get_eee = lan743x_ethtool_get_eee,
.set_eee = lan743x_ethtool_set_eee,
.get_link_ksettings = phy_ethtool_get_link_ksettings,
.set_link_ksettings = phy_ethtool_set_link_ksettings,
#ifdef CONFIG_PM

View File

@ -82,6 +82,7 @@
((value << 0) & FCT_FLOW_CTL_ON_THRESHOLD_)
#define MAC_CR (0x100)
#define MAC_CR_EEE_EN_ BIT(17)
#define MAC_CR_ADD_ BIT(12)
#define MAC_CR_ASD_ BIT(11)
#define MAC_CR_CNTR_RST_ BIT(5)
@ -117,6 +118,8 @@
#define MAC_MII_DATA (0x124)
#define MAC_EEE_TX_LPI_REQ_DLY_CNT (0x130)
#define MAC_WUCSR (0x140)
#define MAC_WUCSR_RFE_WAKE_EN_ BIT(14)
#define MAC_WUCSR_PFDA_EN_ BIT(3)