Message ID | 20220614103424.58971-3-Raju.Lakkaraju@microchip.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | net: lan743x: PCI11010 / PCI11414 devices Enhancements | expand |
On Tue, Jun 14, 2022 at 04:04:21PM +0530, Raju Lakkaraju wrote: > Add support to Magic Packet Detection with Secure-ON for PCI11010/PCI11414 chips > > Signed-off-by: Raju Lakkaraju <Raju.Lakkaraju@microchip.com> > --- > .../net/ethernet/microchip/lan743x_ethtool.c | 14 +++++++++ > drivers/net/ethernet/microchip/lan743x_main.c | 29 +++++++++++++++++++ > drivers/net/ethernet/microchip/lan743x_main.h | 10 +++++++ > 3 files changed, 53 insertions(+) > > diff --git a/drivers/net/ethernet/microchip/lan743x_ethtool.c b/drivers/net/ethernet/microchip/lan743x_ethtool.c > index 48b19dcd4351..b591a7aea937 100644 > --- a/drivers/net/ethernet/microchip/lan743x_ethtool.c > +++ b/drivers/net/ethernet/microchip/lan743x_ethtool.c > @@ -1149,7 +1149,13 @@ static void lan743x_ethtool_get_wol(struct net_device *netdev, > wol->supported |= WAKE_BCAST | WAKE_UCAST | WAKE_MCAST | > WAKE_MAGIC | WAKE_PHY | WAKE_ARP; > > + if (adapter->is_pci11x1x) > + wol->supported |= WAKE_MAGICSECURE; > + > wol->wolopts |= adapter->wolopts; > + if (adapter->wolopts & WAKE_MAGICSECURE) > + memcpy(wol->sopass, adapter->sopass, > + SOPASS_MAX * sizeof(wol->sopass[0])); sizeof(wol->sopass) is simpler. That is what other drivers use. > + if (wol->wolopts & WAKE_MAGICSECURE && > + wol->wolopts & WAKE_MAGIC) { > + memcpy(adapter->sopass, wol->sopass, > + SOPASS_MAX * sizeof(wol->sopass[0])); > + adapter->wolopts |= WAKE_MAGICSECURE; > + } else { > + memset(adapter->sopass, 0, sizeof(u8) * SOPASS_MAX); > + } Same here. Andrew
Hi Andrew, Thank you for review comments. The 06/14/2022 22:59, Andrew Lunn wrote: > EXTERNAL EMAIL: Do not click links or open attachments unless you know the content is safe > > On Tue, Jun 14, 2022 at 04:04:21PM +0530, Raju Lakkaraju wrote: > > Add support to Magic Packet Detection with Secure-ON for PCI11010/PCI11414 chips > > > > Signed-off-by: Raju Lakkaraju <Raju.Lakkaraju@microchip.com> > > --- > > .../net/ethernet/microchip/lan743x_ethtool.c | 14 +++++++++ > > drivers/net/ethernet/microchip/lan743x_main.c | 29 +++++++++++++++++++ > > drivers/net/ethernet/microchip/lan743x_main.h | 10 +++++++ > > 3 files changed, 53 insertions(+) > > > > diff --git a/drivers/net/ethernet/microchip/lan743x_ethtool.c b/drivers/net/ethernet/microchip/lan743x_ethtool.c > > index 48b19dcd4351..b591a7aea937 100644 > > --- a/drivers/net/ethernet/microchip/lan743x_ethtool.c > > +++ b/drivers/net/ethernet/microchip/lan743x_ethtool.c > > @@ -1149,7 +1149,13 @@ static void lan743x_ethtool_get_wol(struct net_device *netdev, > > wol->supported |= WAKE_BCAST | WAKE_UCAST | WAKE_MCAST | > > WAKE_MAGIC | WAKE_PHY | WAKE_ARP; > > > > + if (adapter->is_pci11x1x) > > + wol->supported |= WAKE_MAGICSECURE; > > + > > wol->wolopts |= adapter->wolopts; > > + if (adapter->wolopts & WAKE_MAGICSECURE) > > + memcpy(wol->sopass, adapter->sopass, > > + SOPASS_MAX * sizeof(wol->sopass[0])); > > sizeof(wol->sopass) is simpler. That is what other drivers use. > Accepted. I'll change. > > + if (wol->wolopts & WAKE_MAGICSECURE && > > + wol->wolopts & WAKE_MAGIC) { > > + memcpy(adapter->sopass, wol->sopass, > > + SOPASS_MAX * sizeof(wol->sopass[0])); > > + adapter->wolopts |= WAKE_MAGICSECURE; > > + } else { > > + memset(adapter->sopass, 0, sizeof(u8) * SOPASS_MAX); > > + } > > Same here. > Accepted. I'll change. > Andrew
diff --git a/drivers/net/ethernet/microchip/lan743x_ethtool.c b/drivers/net/ethernet/microchip/lan743x_ethtool.c index 48b19dcd4351..b591a7aea937 100644 --- a/drivers/net/ethernet/microchip/lan743x_ethtool.c +++ b/drivers/net/ethernet/microchip/lan743x_ethtool.c @@ -1149,7 +1149,13 @@ static void lan743x_ethtool_get_wol(struct net_device *netdev, wol->supported |= WAKE_BCAST | WAKE_UCAST | WAKE_MCAST | WAKE_MAGIC | WAKE_PHY | WAKE_ARP; + if (adapter->is_pci11x1x) + wol->supported |= WAKE_MAGICSECURE; + wol->wolopts |= adapter->wolopts; + if (adapter->wolopts & WAKE_MAGICSECURE) + memcpy(wol->sopass, adapter->sopass, + SOPASS_MAX * sizeof(wol->sopass[0])); } static int lan743x_ethtool_set_wol(struct net_device *netdev, @@ -1170,6 +1176,14 @@ static int lan743x_ethtool_set_wol(struct net_device *netdev, adapter->wolopts |= WAKE_PHY; if (wol->wolopts & WAKE_ARP) adapter->wolopts |= WAKE_ARP; + if (wol->wolopts & WAKE_MAGICSECURE && + wol->wolopts & WAKE_MAGIC) { + memcpy(adapter->sopass, wol->sopass, + SOPASS_MAX * sizeof(wol->sopass[0])); + adapter->wolopts |= WAKE_MAGICSECURE; + } else { + memset(adapter->sopass, 0, sizeof(u8) * SOPASS_MAX); + } device_set_wakeup_enable(&adapter->pdev->dev, (bool)wol->wolopts); diff --git a/drivers/net/ethernet/microchip/lan743x_main.c b/drivers/net/ethernet/microchip/lan743x_main.c index af81236b4b4e..6352cba19691 100644 --- a/drivers/net/ethernet/microchip/lan743x_main.c +++ b/drivers/net/ethernet/microchip/lan743x_main.c @@ -3124,6 +3124,7 @@ static void lan743x_pm_set_wol(struct lan743x_adapter *adapter) const u8 ipv6_multicast[3] = { 0x33, 0x33 }; const u8 arp_type[2] = { 0x08, 0x06 }; int mask_index; + u32 sopass; u32 pmtctl; u32 wucsr; u32 macrx; @@ -3218,6 +3219,14 @@ static void lan743x_pm_set_wol(struct lan743x_adapter *adapter) pmtctl |= PMT_CTL_RX_FCT_RFE_D3_CLK_OVR_; } + if (adapter->wolopts & WAKE_MAGICSECURE) { + sopass = *(u32 *)adapter->sopass; + lan743x_csr_write(adapter, MAC_MP_SO_LO, sopass); + sopass = *(u16 *)&adapter->sopass[4]; + lan743x_csr_write(adapter, MAC_MP_SO_HI, sopass); + wucsr |= MAC_MP_SO_EN_; + } + lan743x_csr_write(adapter, MAC_WUCSR, wucsr); lan743x_csr_write(adapter, PMT_CTL, pmtctl); lan743x_csr_write(adapter, MAC_RX, macrx); @@ -3228,6 +3237,7 @@ static int lan743x_pm_suspend(struct device *dev) struct pci_dev *pdev = to_pci_dev(dev); struct net_device *netdev = pci_get_drvdata(pdev); struct lan743x_adapter *adapter = netdev_priv(netdev); + u32 data; lan743x_pcidev_shutdown(pdev); @@ -3239,6 +3249,18 @@ static int lan743x_pm_suspend(struct device *dev) if (adapter->wolopts) lan743x_pm_set_wol(adapter); + if (adapter->is_pci11x1x) { + /* Save HW_CFG to config again in PM resume */ + data = lan743x_csr_read(adapter, HW_CFG); + adapter->hw_cfg = data; + data |= (HW_CFG_RST_PROTECT_PCIE_ | + HW_CFG_D3_RESET_DIS_ | + HW_CFG_D3_VAUX_OVR_ | + HW_CFG_HOT_RESET_DIS_ | + HW_CFG_RST_PROTECT_); + lan743x_csr_write(adapter, HW_CFG, data); + } + /* Host sets PME_En, put D3hot */ return pci_prepare_to_sleep(pdev); } @@ -3254,6 +3276,10 @@ static int lan743x_pm_resume(struct device *dev) pci_restore_state(pdev); pci_save_state(pdev); + /* Restore HW_CFG that was saved during pm suspend */ + if (adapter->is_pci11x1x) + lan743x_csr_write(adapter, HW_CFG, adapter->hw_cfg); + ret = lan743x_hardware_init(adapter, pdev); if (ret) { netif_err(adapter, probe, adapter->netdev, @@ -3270,6 +3296,9 @@ static int lan743x_pm_resume(struct device *dev) lan743x_netdev_open(netdev); netif_device_attach(netdev); + ret = lan743x_csr_read(adapter, MAC_WK_SRC); + netif_info(adapter, drv, adapter->netdev, + "Wakeup source : 0x%08X\n", ret); return 0; } diff --git a/drivers/net/ethernet/microchip/lan743x_main.h b/drivers/net/ethernet/microchip/lan743x_main.h index 1ca5f3216403..5d37263b25c8 100644 --- a/drivers/net/ethernet/microchip/lan743x_main.h +++ b/drivers/net/ethernet/microchip/lan743x_main.h @@ -43,6 +43,11 @@ #define STRAP_READ_ADV_PM_DISABLE_ BIT(0) #define HW_CFG (0x010) +#define HW_CFG_RST_PROTECT_PCIE_ BIT(19) +#define HW_CFG_HOT_RESET_DIS_ BIT(15) +#define HW_CFG_D3_VAUX_OVR_ BIT(14) +#define HW_CFG_D3_RESET_DIS_ BIT(13) +#define HW_CFG_RST_PROTECT_ BIT(12) #define HW_CFG_RELOAD_TYPE_ALL_ (0x00000FC0) #define HW_CFG_EE_OTP_RELOAD_ BIT(4) #define HW_CFG_LRST_ BIT(1) @@ -214,6 +219,7 @@ #define MAC_EEE_TX_LPI_REQ_DLY_CNT (0x130) #define MAC_WUCSR (0x140) +#define MAC_MP_SO_EN_ BIT(21) #define MAC_WUCSR_RFE_WAKE_EN_ BIT(14) #define MAC_WUCSR_PFDA_EN_ BIT(3) #define MAC_WUCSR_WAKE_EN_ BIT(2) @@ -221,6 +227,8 @@ #define MAC_WUCSR_BCST_EN_ BIT(0) #define MAC_WK_SRC (0x144) +#define MAC_MP_SO_HI (0x148) +#define MAC_MP_SO_LO (0x14C) #define MAC_WUF_CFG0 (0x150) #define MAC_NUM_OF_WUF_CFG (32) @@ -912,6 +920,7 @@ struct lan743x_adapter { int msg_enable; #ifdef CONFIG_PM u32 wolopts; + u8 sopass[SOPASS_MAX]; #endif struct pci_dev *pdev; struct lan743x_csr csr; @@ -937,6 +946,7 @@ struct lan743x_adapter { #define LAN743X_ADAPTER_FLAG_OTP BIT(0) u32 flags; + u32 hw_cfg; }; #define LAN743X_COMPONENT_FLAG_RX(channel) BIT(20 + (channel))
Add support to Magic Packet Detection with Secure-ON for PCI11010/PCI11414 chips Signed-off-by: Raju Lakkaraju <Raju.Lakkaraju@microchip.com> --- .../net/ethernet/microchip/lan743x_ethtool.c | 14 +++++++++ drivers/net/ethernet/microchip/lan743x_main.c | 29 +++++++++++++++++++ drivers/net/ethernet/microchip/lan743x_main.h | 10 +++++++ 3 files changed, 53 insertions(+)