@@ -415,6 +415,89 @@ static int lan743x_ethtool_get_sset_count(struct net_device *netdev, int sset)
415
415
}
416
416
}
417
417
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
+
418
501
#ifdef CONFIG_PM
419
502
static void lan743x_ethtool_get_wol (struct net_device * netdev ,
420
503
struct ethtool_wolinfo * wol )
@@ -470,6 +553,8 @@ const struct ethtool_ops lan743x_ethtool_ops = {
470
553
.get_strings = lan743x_ethtool_get_strings ,
471
554
.get_ethtool_stats = lan743x_ethtool_get_ethtool_stats ,
472
555
.get_sset_count = lan743x_ethtool_get_sset_count ,
556
+ .get_eee = lan743x_ethtool_get_eee ,
557
+ .set_eee = lan743x_ethtool_set_eee ,
473
558
.get_link_ksettings = phy_ethtool_get_link_ksettings ,
474
559
.set_link_ksettings = phy_ethtool_set_link_ksettings ,
475
560
#ifdef CONFIG_PM
0 commit comments