@@ -107,6 +107,7 @@ struct gpy_priv {
107
107
108
108
u8 fw_major ;
109
109
u8 fw_minor ;
110
+ u32 wolopts ;
110
111
111
112
/* It takes 3 seconds to fully switch out of loopback mode before
112
113
* it can safely re-enter loopback mode. Record the time when
@@ -221,6 +222,15 @@ static int gpy_hwmon_register(struct phy_device *phydev)
221
222
}
222
223
#endif
223
224
225
+ static int gpy_ack_interrupt (struct phy_device * phydev )
226
+ {
227
+ int ret ;
228
+
229
+ /* Clear all pending interrupts */
230
+ ret = phy_read (phydev , PHY_ISTAT );
231
+ return ret < 0 ? ret : 0 ;
232
+ }
233
+
224
234
static int gpy_mbox_read (struct phy_device * phydev , u32 addr )
225
235
{
226
236
struct gpy_priv * priv = phydev -> priv ;
@@ -262,16 +272,8 @@ static int gpy_mbox_read(struct phy_device *phydev, u32 addr)
262
272
263
273
static int gpy_config_init (struct phy_device * phydev )
264
274
{
265
- int ret ;
266
-
267
- /* Mask all interrupts */
268
- ret = phy_write (phydev , PHY_IMASK , 0 );
269
- if (ret )
270
- return ret ;
271
-
272
- /* Clear all pending interrupts */
273
- ret = phy_read (phydev , PHY_ISTAT );
274
- return ret < 0 ? ret : 0 ;
275
+ /* Nothing to configure. Configuration Requirement Placeholder */
276
+ return 0 ;
275
277
}
276
278
277
279
static int gpy21x_config_init (struct phy_device * phydev )
@@ -627,11 +629,23 @@ static int gpy_read_status(struct phy_device *phydev)
627
629
628
630
static int gpy_config_intr (struct phy_device * phydev )
629
631
{
632
+ struct gpy_priv * priv = phydev -> priv ;
630
633
u16 mask = 0 ;
634
+ int ret ;
635
+
636
+ ret = gpy_ack_interrupt (phydev );
637
+ if (ret )
638
+ return ret ;
631
639
632
640
if (phydev -> interrupts == PHY_INTERRUPT_ENABLED )
633
641
mask = PHY_IMASK_MASK ;
634
642
643
+ if (priv -> wolopts & WAKE_MAGIC )
644
+ mask |= PHY_IMASK_WOL ;
645
+
646
+ if (priv -> wolopts & WAKE_PHY )
647
+ mask |= PHY_IMASK_LSTC ;
648
+
635
649
return phy_write (phydev , PHY_IMASK , mask );
636
650
}
637
651
@@ -678,6 +692,7 @@ static int gpy_set_wol(struct phy_device *phydev,
678
692
struct ethtool_wolinfo * wol )
679
693
{
680
694
struct net_device * attach_dev = phydev -> attached_dev ;
695
+ struct gpy_priv * priv = phydev -> priv ;
681
696
int ret ;
682
697
683
698
if (wol -> wolopts & WAKE_MAGIC ) {
@@ -725,13 +740,22 @@ static int gpy_set_wol(struct phy_device *phydev,
725
740
ret = phy_read (phydev , PHY_ISTAT );
726
741
if (ret < 0 )
727
742
return ret ;
743
+
744
+ priv -> wolopts |= WAKE_MAGIC ;
728
745
} else {
729
746
/* Disable magic packet matching */
730
747
ret = phy_clear_bits_mmd (phydev , MDIO_MMD_VEND2 ,
731
748
VPSPEC2_WOL_CTL ,
732
749
WOL_EN );
733
750
if (ret < 0 )
734
751
return ret ;
752
+
753
+ /* Disable the WOL interrupt */
754
+ ret = phy_clear_bits (phydev , PHY_IMASK , PHY_IMASK_WOL );
755
+ if (ret < 0 )
756
+ return ret ;
757
+
758
+ priv -> wolopts &= ~WAKE_MAGIC ;
735
759
}
736
760
737
761
if (wol -> wolopts & WAKE_PHY ) {
@@ -748,28 +772,22 @@ static int gpy_set_wol(struct phy_device *phydev,
748
772
if (ret & (PHY_IMASK_MASK & ~PHY_IMASK_LSTC ))
749
773
phy_trigger_machine (phydev );
750
774
775
+ priv -> wolopts |= WAKE_PHY ;
751
776
return 0 ;
752
777
}
753
778
779
+ priv -> wolopts &= ~WAKE_PHY ;
754
780
/* Disable the link state change interrupt */
755
781
return phy_clear_bits (phydev , PHY_IMASK , PHY_IMASK_LSTC );
756
782
}
757
783
758
784
static void gpy_get_wol (struct phy_device * phydev ,
759
785
struct ethtool_wolinfo * wol )
760
786
{
761
- int ret ;
787
+ struct gpy_priv * priv = phydev -> priv ;
762
788
763
789
wol -> supported = WAKE_MAGIC | WAKE_PHY ;
764
- wol -> wolopts = 0 ;
765
-
766
- ret = phy_read_mmd (phydev , MDIO_MMD_VEND2 , VPSPEC2_WOL_CTL );
767
- if (ret & WOL_EN )
768
- wol -> wolopts |= WAKE_MAGIC ;
769
-
770
- ret = phy_read (phydev , PHY_IMASK );
771
- if (ret & PHY_IMASK_LSTC )
772
- wol -> wolopts |= WAKE_PHY ;
790
+ wol -> wolopts = priv -> wolopts ;
773
791
}
774
792
775
793
static int gpy_loopback (struct phy_device * phydev , bool enable )
0 commit comments