Skip to content

Commit 7725363

Browse files
Raju LakkarajuPaolo Abeni
authored andcommitted
net: lan743x: disable WOL upon resume to restore full data path operation
When Wake-on-LAN (WoL) is active and the system is in suspend mode, triggering a system event can wake the system from sleep, which may block the data path. To restore normal data path functionality after waking, disable all wake-up events. Furthermore, clear all Write 1 to Clear (W1C) status bits by writing 1's to them. Fixes: 4d94282 ("lan743x: Add power management support") Reviewed-by: Wojciech Drewek <wojciech.drewek@intel.com> Signed-off-by: Raju Lakkaraju <Raju.Lakkaraju@microchip.com> Signed-off-by: Paolo Abeni <pabeni@redhat.com>
1 parent 2d71982 commit 7725363

2 files changed

Lines changed: 50 additions & 4 deletions

File tree

drivers/net/ethernet/microchip/lan743x_main.c

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3575,7 +3575,7 @@ static void lan743x_pm_set_wol(struct lan743x_adapter *adapter)
35753575

35763576
/* clear wake settings */
35773577
pmtctl = lan743x_csr_read(adapter, PMT_CTL);
3578-
pmtctl |= PMT_CTL_WUPS_MASK_;
3578+
pmtctl |= PMT_CTL_WUPS_MASK_ | PMT_CTL_RES_CLR_WKP_MASK_;
35793579
pmtctl &= ~(PMT_CTL_GPIO_WAKEUP_EN_ | PMT_CTL_EEE_WAKEUP_EN_ |
35803580
PMT_CTL_WOL_EN_ | PMT_CTL_MAC_D3_RX_CLK_OVR_ |
35813581
PMT_CTL_RX_FCT_RFE_D3_CLK_OVR_ | PMT_CTL_ETH_PHY_WAKE_EN_);
@@ -3710,6 +3710,7 @@ static int lan743x_pm_resume(struct device *dev)
37103710
struct pci_dev *pdev = to_pci_dev(dev);
37113711
struct net_device *netdev = pci_get_drvdata(pdev);
37123712
struct lan743x_adapter *adapter = netdev_priv(netdev);
3713+
u32 data;
37133714
int ret;
37143715

37153716
pci_set_power_state(pdev, PCI_D0);
@@ -3728,6 +3729,30 @@ static int lan743x_pm_resume(struct device *dev)
37283729
return ret;
37293730
}
37303731

3732+
ret = lan743x_csr_read(adapter, MAC_WK_SRC);
3733+
netif_dbg(adapter, drv, adapter->netdev,
3734+
"Wakeup source : 0x%08X\n", ret);
3735+
3736+
/* Clear the wol configuration and status bits. Note that
3737+
* the status bits are "Write One to Clear (W1C)"
3738+
*/
3739+
data = MAC_WUCSR_EEE_TX_WAKE_ | MAC_WUCSR_EEE_RX_WAKE_ |
3740+
MAC_WUCSR_RFE_WAKE_FR_ | MAC_WUCSR_PFDA_FR_ | MAC_WUCSR_WUFR_ |
3741+
MAC_WUCSR_MPR_ | MAC_WUCSR_BCAST_FR_;
3742+
lan743x_csr_write(adapter, MAC_WUCSR, data);
3743+
3744+
data = MAC_WUCSR2_NS_RCD_ | MAC_WUCSR2_ARP_RCD_ |
3745+
MAC_WUCSR2_IPV6_TCPSYN_RCD_ | MAC_WUCSR2_IPV4_TCPSYN_RCD_;
3746+
lan743x_csr_write(adapter, MAC_WUCSR2, data);
3747+
3748+
data = MAC_WK_SRC_ETH_PHY_WK_ | MAC_WK_SRC_IPV6_TCPSYN_RCD_WK_ |
3749+
MAC_WK_SRC_IPV4_TCPSYN_RCD_WK_ | MAC_WK_SRC_EEE_TX_WK_ |
3750+
MAC_WK_SRC_EEE_RX_WK_ | MAC_WK_SRC_RFE_FR_WK_ |
3751+
MAC_WK_SRC_PFDA_FR_WK_ | MAC_WK_SRC_MP_FR_WK_ |
3752+
MAC_WK_SRC_BCAST_FR_WK_ | MAC_WK_SRC_WU_FR_WK_ |
3753+
MAC_WK_SRC_WK_FR_SAVED_;
3754+
lan743x_csr_write(adapter, MAC_WK_SRC, data);
3755+
37313756
/* open netdev when netdev is at running state while resume.
37323757
* For instance, it is true when system wakesup after pm-suspend
37333758
* However, it is false when system wakes up after suspend GUI menu
@@ -3736,9 +3761,6 @@ static int lan743x_pm_resume(struct device *dev)
37363761
lan743x_netdev_open(netdev);
37373762

37383763
netif_device_attach(netdev);
3739-
ret = lan743x_csr_read(adapter, MAC_WK_SRC);
3740-
netif_info(adapter, drv, adapter->netdev,
3741-
"Wakeup source : 0x%08X\n", ret);
37423764

37433765
return 0;
37443766
}

drivers/net/ethernet/microchip/lan743x_main.h

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@
6161
#define PMT_CTL_RX_FCT_RFE_D3_CLK_OVR_ BIT(18)
6262
#define PMT_CTL_GPIO_WAKEUP_EN_ BIT(15)
6363
#define PMT_CTL_EEE_WAKEUP_EN_ BIT(13)
64+
#define PMT_CTL_RES_CLR_WKP_MASK_ GENMASK(9, 8)
6465
#define PMT_CTL_READY_ BIT(7)
6566
#define PMT_CTL_ETH_PHY_RST_ BIT(4)
6667
#define PMT_CTL_WOL_EN_ BIT(3)
@@ -227,12 +228,31 @@
227228
#define MAC_WUCSR (0x140)
228229
#define MAC_MP_SO_EN_ BIT(21)
229230
#define MAC_WUCSR_RFE_WAKE_EN_ BIT(14)
231+
#define MAC_WUCSR_EEE_TX_WAKE_ BIT(13)
232+
#define MAC_WUCSR_EEE_RX_WAKE_ BIT(11)
233+
#define MAC_WUCSR_RFE_WAKE_FR_ BIT(9)
234+
#define MAC_WUCSR_PFDA_FR_ BIT(7)
235+
#define MAC_WUCSR_WUFR_ BIT(6)
236+
#define MAC_WUCSR_MPR_ BIT(5)
237+
#define MAC_WUCSR_BCAST_FR_ BIT(4)
230238
#define MAC_WUCSR_PFDA_EN_ BIT(3)
231239
#define MAC_WUCSR_WAKE_EN_ BIT(2)
232240
#define MAC_WUCSR_MPEN_ BIT(1)
233241
#define MAC_WUCSR_BCST_EN_ BIT(0)
234242

235243
#define MAC_WK_SRC (0x144)
244+
#define MAC_WK_SRC_ETH_PHY_WK_ BIT(17)
245+
#define MAC_WK_SRC_IPV6_TCPSYN_RCD_WK_ BIT(16)
246+
#define MAC_WK_SRC_IPV4_TCPSYN_RCD_WK_ BIT(15)
247+
#define MAC_WK_SRC_EEE_TX_WK_ BIT(14)
248+
#define MAC_WK_SRC_EEE_RX_WK_ BIT(13)
249+
#define MAC_WK_SRC_RFE_FR_WK_ BIT(12)
250+
#define MAC_WK_SRC_PFDA_FR_WK_ BIT(11)
251+
#define MAC_WK_SRC_MP_FR_WK_ BIT(10)
252+
#define MAC_WK_SRC_BCAST_FR_WK_ BIT(9)
253+
#define MAC_WK_SRC_WU_FR_WK_ BIT(8)
254+
#define MAC_WK_SRC_WK_FR_SAVED_ BIT(7)
255+
236256
#define MAC_MP_SO_HI (0x148)
237257
#define MAC_MP_SO_LO (0x14C)
238258

@@ -295,6 +315,10 @@
295315
#define RFE_INDX(index) (0x580 + (index << 2))
296316

297317
#define MAC_WUCSR2 (0x600)
318+
#define MAC_WUCSR2_NS_RCD_ BIT(7)
319+
#define MAC_WUCSR2_ARP_RCD_ BIT(6)
320+
#define MAC_WUCSR2_IPV6_TCPSYN_RCD_ BIT(5)
321+
#define MAC_WUCSR2_IPV4_TCPSYN_RCD_ BIT(4)
298322

299323
#define SGMII_ACC (0x720)
300324
#define SGMII_ACC_SGMII_BZY_ BIT(31)

0 commit comments

Comments
 (0)