Skip to content

Commit c9cf96b

Browse files
BryanW11731-MCHPdavem330
authored andcommitted
lan743x: Add EEE support
Implement EEE support Signed-off-by: Bryan Whitehead <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 4d94282 commit c9cf96b

File tree

2 files changed

+88
-0
lines changed

2 files changed

+88
-0
lines changed

drivers/net/ethernet/microchip/lan743x_ethtool.c

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -415,6 +415,89 @@ static int lan743x_ethtool_get_sset_count(struct net_device *netdev, int sset)
415415
}
416416
}
417417

418+
static int lan743x_ethtool_get_eee(struct net_device *netdev,
419+
struct ethtool_eee *eee)
420+
{
421+
struct lan743x_adapter *adapter = netdev_priv(netdev);
422+
struct phy_device *phydev = netdev->phydev;
423+
u32 buf;
424+
int ret;
425+
426+
if (!phydev)
427+
return -EIO;
428+
if (!phydev->drv) {
429+
netif_err(adapter, drv, adapter->netdev,
430+
"Missing PHY Driver\n");
431+
return -EIO;
432+
}
433+
434+
ret = phy_ethtool_get_eee(phydev, eee);
435+
if (ret < 0)
436+
return ret;
437+
438+
buf = lan743x_csr_read(adapter, MAC_CR);
439+
if (buf & MAC_CR_EEE_EN_) {
440+
eee->eee_enabled = true;
441+
eee->eee_active = !!(eee->advertised & eee->lp_advertised);
442+
eee->tx_lpi_enabled = true;
443+
/* EEE_TX_LPI_REQ_DLY & tx_lpi_timer are same uSec unit */
444+
buf = lan743x_csr_read(adapter, MAC_EEE_TX_LPI_REQ_DLY_CNT);
445+
eee->tx_lpi_timer = buf;
446+
} else {
447+
eee->eee_enabled = false;
448+
eee->eee_active = false;
449+
eee->tx_lpi_enabled = false;
450+
eee->tx_lpi_timer = 0;
451+
}
452+
453+
return 0;
454+
}
455+
456+
static int lan743x_ethtool_set_eee(struct net_device *netdev,
457+
struct ethtool_eee *eee)
458+
{
459+
struct lan743x_adapter *adapter = netdev_priv(netdev);
460+
struct phy_device *phydev = NULL;
461+
u32 buf = 0;
462+
int ret = 0;
463+
464+
if (!netdev)
465+
return -EINVAL;
466+
adapter = netdev_priv(netdev);
467+
if (!adapter)
468+
return -EINVAL;
469+
phydev = netdev->phydev;
470+
if (!phydev)
471+
return -EIO;
472+
if (!phydev->drv) {
473+
netif_err(adapter, drv, adapter->netdev,
474+
"Missing PHY Driver\n");
475+
return -EIO;
476+
}
477+
478+
if (eee->eee_enabled) {
479+
ret = phy_init_eee(phydev, 0);
480+
if (ret) {
481+
netif_err(adapter, drv, adapter->netdev,
482+
"EEE initialization failed\n");
483+
return ret;
484+
}
485+
486+
buf = (u32)eee->tx_lpi_timer;
487+
lan743x_csr_write(adapter, MAC_EEE_TX_LPI_REQ_DLY_CNT, buf);
488+
489+
buf = lan743x_csr_read(adapter, MAC_CR);
490+
buf |= MAC_CR_EEE_EN_;
491+
lan743x_csr_write(adapter, MAC_CR, buf);
492+
} else {
493+
buf = lan743x_csr_read(adapter, MAC_CR);
494+
buf &= ~MAC_CR_EEE_EN_;
495+
lan743x_csr_write(adapter, MAC_CR, buf);
496+
}
497+
498+
return phy_ethtool_set_eee(phydev, eee);
499+
}
500+
418501
#ifdef CONFIG_PM
419502
static void lan743x_ethtool_get_wol(struct net_device *netdev,
420503
struct ethtool_wolinfo *wol)
@@ -470,6 +553,8 @@ const struct ethtool_ops lan743x_ethtool_ops = {
470553
.get_strings = lan743x_ethtool_get_strings,
471554
.get_ethtool_stats = lan743x_ethtool_get_ethtool_stats,
472555
.get_sset_count = lan743x_ethtool_get_sset_count,
556+
.get_eee = lan743x_ethtool_get_eee,
557+
.set_eee = lan743x_ethtool_set_eee,
473558
.get_link_ksettings = phy_ethtool_get_link_ksettings,
474559
.set_link_ksettings = phy_ethtool_set_link_ksettings,
475560
#ifdef CONFIG_PM

drivers/net/ethernet/microchip/lan743x_main.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@
8282
((value << 0) & FCT_FLOW_CTL_ON_THRESHOLD_)
8383

8484
#define MAC_CR (0x100)
85+
#define MAC_CR_EEE_EN_ BIT(17)
8586
#define MAC_CR_ADD_ BIT(12)
8687
#define MAC_CR_ASD_ BIT(11)
8788
#define MAC_CR_CNTR_RST_ BIT(5)
@@ -117,6 +118,8 @@
117118

118119
#define MAC_MII_DATA (0x124)
119120

121+
#define MAC_EEE_TX_LPI_REQ_DLY_CNT (0x130)
122+
120123
#define MAC_WUCSR (0x140)
121124
#define MAC_WUCSR_RFE_WAKE_EN_ BIT(14)
122125
#define MAC_WUCSR_PFDA_EN_ BIT(3)

0 commit comments

Comments
 (0)