Message ID | 20240605101611.18791-3-Raju.Lakkaraju@microchip.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | net: lan743x: Fixes for multiple WOL related issues | expand |
On 05.06.2024 12:16, Raju Lakkaraju wrote: > Prevent options not supported by the PHY from being requested to it by the MAC > Whenever a WOL option is supported by both, the PHY is given priority > since that usually leads to better power savings > > Fixes: e9e13b6adc338 ("lan743x: fix for potential NULL pointer dereference with bare card") > Signed-off-by: Raju Lakkaraju <Raju.Lakkaraju@microchip.com> > --- Reviewed-by: Wojciech Drewek <wojciech.drewek@intel.com> > Change List: > ------------ > V2 -> V3: > - Remove the "phy does not support WOL" debug message which is not required > - Remove WAKE_PHY support option from Ethernet MAC (LAN743x/PCI11x1x) driver > - Add "phy_wol_supported" and "phy_wolopts" variables to hold PHY's WOL config > V1 -> V2: > - Repost - No change > V0 -> V1: > - Change the "phy does not support WOL" print from netif_info() to > netif_dbg() > > .../net/ethernet/microchip/lan743x_ethtool.c | 44 +++++++++++++++++-- > drivers/net/ethernet/microchip/lan743x_main.c | 16 +++++-- > drivers/net/ethernet/microchip/lan743x_main.h | 4 ++ > 3 files changed, 56 insertions(+), 8 deletions(-) > > diff --git a/drivers/net/ethernet/microchip/lan743x_ethtool.c b/drivers/net/ethernet/microchip/lan743x_ethtool.c > index d0f4ff4ee075..0d1740d64676 100644 > --- a/drivers/net/ethernet/microchip/lan743x_ethtool.c > +++ b/drivers/net/ethernet/microchip/lan743x_ethtool.c > @@ -1127,8 +1127,12 @@ static void lan743x_ethtool_get_wol(struct net_device *netdev, > if (netdev->phydev) > phy_ethtool_get_wol(netdev->phydev, wol); > > - wol->supported |= WAKE_BCAST | WAKE_UCAST | WAKE_MCAST | > - WAKE_MAGIC | WAKE_PHY | WAKE_ARP; > + if (wol->supported != adapter->phy_wol_supported) > + netif_warn(adapter, drv, adapter->netdev, > + "PHY changed its supported WOL! old=%x, new=%x\n", > + adapter->phy_wol_supported, wol->supported); > + > + wol->supported |= MAC_SUPPORTED_WAKES; > > if (adapter->is_pci11x1x) > wol->supported |= WAKE_MAGICSECURE; > @@ -1143,7 +1147,39 @@ static int lan743x_ethtool_set_wol(struct net_device *netdev, > { > struct lan743x_adapter *adapter = netdev_priv(netdev); > > + /* WAKE_MAGICSEGURE is a modifier of and only valid together with > + * WAKE_MAGIC > + */ > + if ((wol->wolopts & WAKE_MAGICSECURE) && !(wol->wolopts & WAKE_MAGIC)) > + return -EINVAL; > + > + if (netdev->phydev) { > + struct ethtool_wolinfo phy_wol; > + int ret; > + > + phy_wol.wolopts = wol->wolopts & adapter->phy_wol_supported; > + > + /* If WAKE_MAGICSECURE was requested, filter out WAKE_MAGIC > + * for PHYs that do not support WAKE_MAGICSECURE > + */ > + if (wol->wolopts & WAKE_MAGICSECURE && > + !(adapter->phy_wol_supported & WAKE_MAGICSECURE)) > + phy_wol.wolopts &= ~WAKE_MAGIC; > + > + ret = phy_ethtool_set_wol(netdev->phydev, &phy_wol); > + if (ret && (ret != -EOPNOTSUPP)) > + return ret; > + > + if (ret == -EOPNOTSUPP) > + adapter->phy_wolopts = 0; > + else > + adapter->phy_wolopts = phy_wol.wolopts; > + } else { > + adapter->phy_wolopts = 0; > + } > + > adapter->wolopts = 0; > + wol->wolopts &= ~adapter->phy_wolopts; > if (wol->wolopts & WAKE_UCAST) > adapter->wolopts |= WAKE_UCAST; > if (wol->wolopts & WAKE_MCAST) > @@ -1164,10 +1200,10 @@ static int lan743x_ethtool_set_wol(struct net_device *netdev, > memset(adapter->sopass, 0, sizeof(u8) * SOPASS_MAX); > } > > + wol->wolopts = adapter->wolopts | adapter->phy_wolopts; > device_set_wakeup_enable(&adapter->pdev->dev, (bool)wol->wolopts); > > - return netdev->phydev ? phy_ethtool_set_wol(netdev->phydev, wol) > - : -ENETDOWN; > + return 0; > } > #endif /* CONFIG_PM */ > > diff --git a/drivers/net/ethernet/microchip/lan743x_main.c b/drivers/net/ethernet/microchip/lan743x_main.c > index 6a40b961fafb..b6810840bc61 100644 > --- a/drivers/net/ethernet/microchip/lan743x_main.c > +++ b/drivers/net/ethernet/microchip/lan743x_main.c > @@ -3118,6 +3118,15 @@ static int lan743x_netdev_open(struct net_device *netdev) > if (ret) > goto close_tx; > } > + > + if (adapter->netdev->phydev) { > + struct ethtool_wolinfo wol = { .cmd = ETHTOOL_GWOL }; > + > + phy_ethtool_get_wol(netdev->phydev, &wol); > + adapter->phy_wol_supported = wol.supported; > + adapter->phy_wolopts = wol.wolopts; > + } > + > return 0; > > close_tx: > @@ -3587,10 +3596,9 @@ static void lan743x_pm_set_wol(struct lan743x_adapter *adapter) > > pmtctl |= PMT_CTL_ETH_PHY_D3_COLD_OVR_ | PMT_CTL_ETH_PHY_D3_OVR_; > > - if (adapter->wolopts & WAKE_PHY) { > - pmtctl |= PMT_CTL_ETH_PHY_EDPD_PLL_CTL_; > + if (adapter->phy_wolopts) > pmtctl |= PMT_CTL_ETH_PHY_WAKE_EN_; > - } > + > if (adapter->wolopts & WAKE_MAGIC) { > wucsr |= MAC_WUCSR_MPEN_; > macrx |= MAC_RX_RXEN_; > @@ -3686,7 +3694,7 @@ static int lan743x_pm_suspend(struct device *dev) > lan743x_csr_write(adapter, MAC_WUCSR2, 0); > lan743x_csr_write(adapter, MAC_WK_SRC, 0xFFFFFFFF); > > - if (adapter->wolopts) > + if (adapter->wolopts || adapter->phy_wolopts) > lan743x_pm_set_wol(adapter); > > if (adapter->is_pci11x1x) { > diff --git a/drivers/net/ethernet/microchip/lan743x_main.h b/drivers/net/ethernet/microchip/lan743x_main.h > index fac0f33d10b2..3b2585a384e2 100644 > --- a/drivers/net/ethernet/microchip/lan743x_main.h > +++ b/drivers/net/ethernet/microchip/lan743x_main.h > @@ -1042,6 +1042,8 @@ enum lan743x_sgmii_lsd { > LINK_2500_SLAVE > }; > > +#define MAC_SUPPORTED_WAKES (WAKE_BCAST | WAKE_UCAST | WAKE_MCAST | \ > + WAKE_MAGIC | WAKE_ARP) > struct lan743x_adapter { > struct net_device *netdev; > struct mii_bus *mdiobus; > @@ -1049,6 +1051,8 @@ struct lan743x_adapter { > #ifdef CONFIG_PM > u32 wolopts; > u8 sopass[SOPASS_MAX]; > + u32 phy_wolopts; > + u32 phy_wol_supported; > #endif > struct pci_dev *pdev; > struct lan743x_csr csr;
Hi Raju, kernel test robot noticed the following build errors: [auto build test ERROR on net/main] url: https://github.com/intel-lab-lkp/linux/commits/Raju-Lakkaraju/net-lan743x-disable-WOL-upon-resume-to-restore-full-data-path-operation/20240605-182110 base: net/main patch link: https://lore.kernel.org/r/20240605101611.18791-3-Raju.Lakkaraju%40microchip.com patch subject: [PATCH net V3 2/3] net: lan743x: Support WOL at both the PHY and MAC appropriately config: alpha-allyesconfig (https://download.01.org/0day-ci/archive/20240605/202406052200.w3zuc32H-lkp@intel.com/config) compiler: alpha-linux-gcc (GCC) 13.2.0 reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240605/202406052200.w3zuc32H-lkp@intel.com/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202406052200.w3zuc32H-lkp@intel.com/ All errors (new ones prefixed by >>): drivers/net/ethernet/microchip/lan743x_main.c: In function 'lan743x_netdev_open': >> drivers/net/ethernet/microchip/lan743x_main.c:3126:24: error: 'struct lan743x_adapter' has no member named 'phy_wol_supported' 3126 | adapter->phy_wol_supported = wol.supported; | ^~ >> drivers/net/ethernet/microchip/lan743x_main.c:3127:24: error: 'struct lan743x_adapter' has no member named 'phy_wolopts' 3127 | adapter->phy_wolopts = wol.wolopts; | ^~ vim +3126 drivers/net/ethernet/microchip/lan743x_main.c 3085 3086 static int lan743x_netdev_open(struct net_device *netdev) 3087 { 3088 struct lan743x_adapter *adapter = netdev_priv(netdev); 3089 int index; 3090 int ret; 3091 3092 ret = lan743x_intr_open(adapter); 3093 if (ret) 3094 goto return_error; 3095 3096 ret = lan743x_mac_open(adapter); 3097 if (ret) 3098 goto close_intr; 3099 3100 ret = lan743x_phy_open(adapter); 3101 if (ret) 3102 goto close_mac; 3103 3104 ret = lan743x_ptp_open(adapter); 3105 if (ret) 3106 goto close_phy; 3107 3108 lan743x_rfe_open(adapter); 3109 3110 for (index = 0; index < LAN743X_USED_RX_CHANNELS; index++) { 3111 ret = lan743x_rx_open(&adapter->rx[index]); 3112 if (ret) 3113 goto close_rx; 3114 } 3115 3116 for (index = 0; index < adapter->used_tx_channels; index++) { 3117 ret = lan743x_tx_open(&adapter->tx[index]); 3118 if (ret) 3119 goto close_tx; 3120 } 3121 3122 if (adapter->netdev->phydev) { 3123 struct ethtool_wolinfo wol = { .cmd = ETHTOOL_GWOL }; 3124 3125 phy_ethtool_get_wol(netdev->phydev, &wol); > 3126 adapter->phy_wol_supported = wol.supported; > 3127 adapter->phy_wolopts = wol.wolopts; 3128 } 3129 3130 return 0; 3131 3132 close_tx: 3133 for (index = 0; index < adapter->used_tx_channels; index++) { 3134 if (adapter->tx[index].ring_cpu_ptr) 3135 lan743x_tx_close(&adapter->tx[index]); 3136 } 3137 3138 close_rx: 3139 for (index = 0; index < LAN743X_USED_RX_CHANNELS; index++) { 3140 if (adapter->rx[index].ring_cpu_ptr) 3141 lan743x_rx_close(&adapter->rx[index]); 3142 } 3143 lan743x_ptp_close(adapter); 3144 3145 close_phy: 3146 lan743x_phy_close(adapter); 3147 3148 close_mac: 3149 lan743x_mac_close(adapter); 3150 3151 close_intr: 3152 lan743x_intr_close(adapter); 3153 3154 return_error: 3155 netif_warn(adapter, ifup, adapter->netdev, 3156 "Error opening LAN743x\n"); 3157 return ret; 3158 } 3159
Hi Raju, kernel test robot noticed the following build errors: [auto build test ERROR on net/main] url: https://github.com/intel-lab-lkp/linux/commits/Raju-Lakkaraju/net-lan743x-disable-WOL-upon-resume-to-restore-full-data-path-operation/20240605-182110 base: net/main patch link: https://lore.kernel.org/r/20240605101611.18791-3-Raju.Lakkaraju%40microchip.com patch subject: [PATCH net V3 2/3] net: lan743x: Support WOL at both the PHY and MAC appropriately config: s390-allmodconfig (https://download.01.org/0day-ci/archive/20240606/202406060612.UBlHLtM8-lkp@intel.com/config) compiler: clang version 19.0.0git (https://github.com/llvm/llvm-project d7d2d4f53fc79b4b58e8d8d08151b577c3699d4a) reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240606/202406060612.UBlHLtM8-lkp@intel.com/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202406060612.UBlHLtM8-lkp@intel.com/ All errors (new ones prefixed by >>): In file included from drivers/net/ethernet/microchip/lan743x_main.c:4: In file included from include/linux/module.h:19: In file included from include/linux/elf.h:6: In file included from arch/s390/include/asm/elf.h:173: In file included from arch/s390/include/asm/mmu_context.h:11: In file included from arch/s390/include/asm/pgalloc.h:18: In file included from include/linux/mm.h:2253: include/linux/vmstat.h:500:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion] 500 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS + | ~~~~~~~~~~~~~~~~~~~~~ ^ 501 | item]; | ~~~~ include/linux/vmstat.h:507:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion] 507 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS + | ~~~~~~~~~~~~~~~~~~~~~ ^ 508 | NR_VM_NUMA_EVENT_ITEMS + | ~~~~~~~~~~~~~~~~~~~~~~ include/linux/vmstat.h:514:36: warning: arithmetic between different enumeration types ('enum node_stat_item' and 'enum lru_list') [-Wenum-enum-conversion] 514 | return node_stat_name(NR_LRU_BASE + lru) + 3; // skip "nr_" | ~~~~~~~~~~~ ^ ~~~ include/linux/vmstat.h:519:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion] 519 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS + | ~~~~~~~~~~~~~~~~~~~~~ ^ 520 | NR_VM_NUMA_EVENT_ITEMS + | ~~~~~~~~~~~~~~~~~~~~~~ include/linux/vmstat.h:528:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion] 528 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS + | ~~~~~~~~~~~~~~~~~~~~~ ^ 529 | NR_VM_NUMA_EVENT_ITEMS + | ~~~~~~~~~~~~~~~~~~~~~~ In file included from drivers/net/ethernet/microchip/lan743x_main.c:5: In file included from include/linux/pci.h:39: In file included from include/linux/io.h:14: In file included from arch/s390/include/asm/io.h:93: include/asm-generic/io.h:548:31: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] 548 | val = __raw_readb(PCI_IOBASE + addr); | ~~~~~~~~~~ ^ include/asm-generic/io.h:561:61: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] 561 | val = __le16_to_cpu((__le16 __force)__raw_readw(PCI_IOBASE + addr)); | ~~~~~~~~~~ ^ include/uapi/linux/byteorder/big_endian.h:37:59: note: expanded from macro '__le16_to_cpu' 37 | #define __le16_to_cpu(x) __swab16((__force __u16)(__le16)(x)) | ^ include/uapi/linux/swab.h:102:54: note: expanded from macro '__swab16' 102 | #define __swab16(x) (__u16)__builtin_bswap16((__u16)(x)) | ^ In file included from drivers/net/ethernet/microchip/lan743x_main.c:5: In file included from include/linux/pci.h:39: In file included from include/linux/io.h:14: In file included from arch/s390/include/asm/io.h:93: include/asm-generic/io.h:574:61: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] 574 | val = __le32_to_cpu((__le32 __force)__raw_readl(PCI_IOBASE + addr)); | ~~~~~~~~~~ ^ include/uapi/linux/byteorder/big_endian.h:35:59: note: expanded from macro '__le32_to_cpu' 35 | #define __le32_to_cpu(x) __swab32((__force __u32)(__le32)(x)) | ^ include/uapi/linux/swab.h:115:54: note: expanded from macro '__swab32' 115 | #define __swab32(x) (__u32)__builtin_bswap32((__u32)(x)) | ^ In file included from drivers/net/ethernet/microchip/lan743x_main.c:5: In file included from include/linux/pci.h:39: In file included from include/linux/io.h:14: In file included from arch/s390/include/asm/io.h:93: include/asm-generic/io.h:585:33: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] 585 | __raw_writeb(value, PCI_IOBASE + addr); | ~~~~~~~~~~ ^ include/asm-generic/io.h:595:59: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] 595 | __raw_writew((u16 __force)cpu_to_le16(value), PCI_IOBASE + addr); | ~~~~~~~~~~ ^ include/asm-generic/io.h:605:59: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] 605 | __raw_writel((u32 __force)cpu_to_le32(value), PCI_IOBASE + addr); | ~~~~~~~~~~ ^ include/asm-generic/io.h:693:20: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] 693 | readsb(PCI_IOBASE + addr, buffer, count); | ~~~~~~~~~~ ^ include/asm-generic/io.h:701:20: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] 701 | readsw(PCI_IOBASE + addr, buffer, count); | ~~~~~~~~~~ ^ include/asm-generic/io.h:709:20: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] 709 | readsl(PCI_IOBASE + addr, buffer, count); | ~~~~~~~~~~ ^ include/asm-generic/io.h:718:21: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] 718 | writesb(PCI_IOBASE + addr, buffer, count); | ~~~~~~~~~~ ^ include/asm-generic/io.h:727:21: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] 727 | writesw(PCI_IOBASE + addr, buffer, count); | ~~~~~~~~~~ ^ include/asm-generic/io.h:736:21: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] 736 | writesl(PCI_IOBASE + addr, buffer, count); | ~~~~~~~~~~ ^ >> drivers/net/ethernet/microchip/lan743x_main.c:3126:12: error: no member named 'phy_wol_supported' in 'struct lan743x_adapter' 3126 | adapter->phy_wol_supported = wol.supported; | ~~~~~~~ ^ >> drivers/net/ethernet/microchip/lan743x_main.c:3127:12: error: no member named 'phy_wolopts' in 'struct lan743x_adapter' 3127 | adapter->phy_wolopts = wol.wolopts; | ~~~~~~~ ^ 17 warnings and 2 errors generated. vim +3126 drivers/net/ethernet/microchip/lan743x_main.c 3085 3086 static int lan743x_netdev_open(struct net_device *netdev) 3087 { 3088 struct lan743x_adapter *adapter = netdev_priv(netdev); 3089 int index; 3090 int ret; 3091 3092 ret = lan743x_intr_open(adapter); 3093 if (ret) 3094 goto return_error; 3095 3096 ret = lan743x_mac_open(adapter); 3097 if (ret) 3098 goto close_intr; 3099 3100 ret = lan743x_phy_open(adapter); 3101 if (ret) 3102 goto close_mac; 3103 3104 ret = lan743x_ptp_open(adapter); 3105 if (ret) 3106 goto close_phy; 3107 3108 lan743x_rfe_open(adapter); 3109 3110 for (index = 0; index < LAN743X_USED_RX_CHANNELS; index++) { 3111 ret = lan743x_rx_open(&adapter->rx[index]); 3112 if (ret) 3113 goto close_rx; 3114 } 3115 3116 for (index = 0; index < adapter->used_tx_channels; index++) { 3117 ret = lan743x_tx_open(&adapter->tx[index]); 3118 if (ret) 3119 goto close_tx; 3120 } 3121 3122 if (adapter->netdev->phydev) { 3123 struct ethtool_wolinfo wol = { .cmd = ETHTOOL_GWOL }; 3124 3125 phy_ethtool_get_wol(netdev->phydev, &wol); > 3126 adapter->phy_wol_supported = wol.supported; > 3127 adapter->phy_wolopts = wol.wolopts; 3128 } 3129 3130 return 0; 3131 3132 close_tx: 3133 for (index = 0; index < adapter->used_tx_channels; index++) { 3134 if (adapter->tx[index].ring_cpu_ptr) 3135 lan743x_tx_close(&adapter->tx[index]); 3136 } 3137 3138 close_rx: 3139 for (index = 0; index < LAN743X_USED_RX_CHANNELS; index++) { 3140 if (adapter->rx[index].ring_cpu_ptr) 3141 lan743x_rx_close(&adapter->rx[index]); 3142 } 3143 lan743x_ptp_close(adapter); 3144 3145 close_phy: 3146 lan743x_phy_close(adapter); 3147 3148 close_mac: 3149 lan743x_mac_close(adapter); 3150 3151 close_intr: 3152 lan743x_intr_close(adapter); 3153 3154 return_error: 3155 netif_warn(adapter, ifup, adapter->netdev, 3156 "Error opening LAN743x\n"); 3157 return ret; 3158 } 3159
The target architecture of alpha's config file miss the "CONFIG_PM=y" cofiguration. "phy_wolopts" and "phy_wol_supported" variable define in struct lan743x_adapter under CONFIG_PM compiler option. these variable define in drivers/net/ethernet/microchip/lan743x_main.h file. Thanks, Raju The 06/05/2024 22:56, kernel test robot wrote: > EXTERNAL EMAIL: Do not click links or open attachments unless you know the content is safe > > Hi Raju, > > kernel test robot noticed the following build errors: > > [auto build test ERROR on net/main] > > url: https://github.com/intel-lab-lkp/linux/commits/Raju-Lakkaraju/net-lan743x-disable-WOL-upon-resume-to-restore-full-data-path-operation/20240605-182110 > base: net/main > patch link: https://lore.kernel.org/r/20240605101611.18791-3-Raju.Lakkaraju%40microchip.com > patch subject: [PATCH net V3 2/3] net: lan743x: Support WOL at both the PHY and MAC appropriately > config: alpha-allyesconfig (https://download.01.org/0day-ci/archive/20240605/202406052200.w3zuc32H-lkp@intel.com/config) > compiler: alpha-linux-gcc (GCC) 13.2.0 > reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240605/202406052200.w3zuc32H-lkp@intel.com/reproduce) > > If you fix the issue in a separate patch/commit (i.e. not just a new version of > the same patch/commit), kindly add following tags > | Reported-by: kernel test robot <lkp@intel.com> > | Closes: https://lore.kernel.org/oe-kbuild-all/202406052200.w3zuc32H-lkp@intel.com/ > > All errors (new ones prefixed by >>): > > drivers/net/ethernet/microchip/lan743x_main.c: In function 'lan743x_netdev_open': > >> drivers/net/ethernet/microchip/lan743x_main.c:3126:24: error: 'struct lan743x_adapter' has no member named 'phy_wol_supported' > 3126 | adapter->phy_wol_supported = wol.supported; > | ^~ > >> drivers/net/ethernet/microchip/lan743x_main.c:3127:24: error: 'struct lan743x_adapter' has no member named 'phy_wolopts' > 3127 | adapter->phy_wolopts = wol.wolopts; > | ^~ > > > vim +3126 drivers/net/ethernet/microchip/lan743x_main.c > > 3085 > 3086 static int lan743x_netdev_open(struct net_device *netdev) > 3087 { > 3088 struct lan743x_adapter *adapter = netdev_priv(netdev); > 3089 int index; > 3090 int ret; > 3091 > 3092 ret = lan743x_intr_open(adapter); > 3093 if (ret) > 3094 goto return_error; > 3095 > 3096 ret = lan743x_mac_open(adapter); > 3097 if (ret) > 3098 goto close_intr; > 3099 > 3100 ret = lan743x_phy_open(adapter); > 3101 if (ret) > 3102 goto close_mac; > 3103 > 3104 ret = lan743x_ptp_open(adapter); > 3105 if (ret) > 3106 goto close_phy; > 3107 > 3108 lan743x_rfe_open(adapter); > 3109 > 3110 for (index = 0; index < LAN743X_USED_RX_CHANNELS; index++) { > 3111 ret = lan743x_rx_open(&adapter->rx[index]); > 3112 if (ret) > 3113 goto close_rx; > 3114 } > 3115 > 3116 for (index = 0; index < adapter->used_tx_channels; index++) { > 3117 ret = lan743x_tx_open(&adapter->tx[index]); > 3118 if (ret) > 3119 goto close_tx; > 3120 } > 3121 > 3122 if (adapter->netdev->phydev) { > 3123 struct ethtool_wolinfo wol = { .cmd = ETHTOOL_GWOL }; > 3124 > 3125 phy_ethtool_get_wol(netdev->phydev, &wol); > > 3126 adapter->phy_wol_supported = wol.supported; > > 3127 adapter->phy_wolopts = wol.wolopts; > 3128 } > 3129 > 3130 return 0; > 3131 > 3132 close_tx: > 3133 for (index = 0; index < adapter->used_tx_channels; index++) { > 3134 if (adapter->tx[index].ring_cpu_ptr) > 3135 lan743x_tx_close(&adapter->tx[index]); > 3136 } > 3137 > 3138 close_rx: > 3139 for (index = 0; index < LAN743X_USED_RX_CHANNELS; index++) { > 3140 if (adapter->rx[index].ring_cpu_ptr) > 3141 lan743x_rx_close(&adapter->rx[index]); > 3142 } > 3143 lan743x_ptp_close(adapter); > 3144 > 3145 close_phy: > 3146 lan743x_phy_close(adapter); > 3147 > 3148 close_mac: > 3149 lan743x_mac_close(adapter); > 3150 > 3151 close_intr: > 3152 lan743x_intr_close(adapter); > 3153 > 3154 return_error: > 3155 netif_warn(adapter, ifup, adapter->netdev, > 3156 "Error opening LAN743x\n"); > 3157 return ret; > 3158 } > 3159 > > -- > 0-DAY CI Kernel Test Service > https://github.com/intel/lkp-tests/wiki
"phy_wolopts" and "phy_wol_supported" variable define in struct lan743x_adapter under CONFIG_PM compiler build option. These variable define in drivers/net/ethernet/microchip/lan743x_main.h file. Can you please add the config (CONFIG_PM=y) to build? Thanks, Raju The 06/06/2024 06:25, kernel test robot wrote: > EXTERNAL EMAIL: Do not click links or open attachments unless you know the content is safe > > Hi Raju, > > kernel test robot noticed the following build errors: > > [auto build test ERROR on net/main] > > url: https://github.com/intel-lab-lkp/linux/commits/Raju-Lakkaraju/net-lan743x-disable-WOL-upon-resume-to-restore-full-data-path-operation/20240605-182110 > base: net/main > patch link: https://lore.kernel.org/r/20240605101611.18791-3-Raju.Lakkaraju%40microchip.com > patch subject: [PATCH net V3 2/3] net: lan743x: Support WOL at both the PHY and MAC appropriately > config: s390-allmodconfig (https://download.01.org/0day-ci/archive/20240606/202406060612.UBlHLtM8-lkp@intel.com/config) > compiler: clang version 19.0.0git (https://github.com/llvm/llvm-project d7d2d4f53fc79b4b58e8d8d08151b577c3699d4a) > reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240606/202406060612.UBlHLtM8-lkp@intel.com/reproduce) > > If you fix the issue in a separate patch/commit (i.e. not just a new version of > the same patch/commit), kindly add following tags > | Reported-by: kernel test robot <lkp@intel.com> > | Closes: https://lore.kernel.org/oe-kbuild-all/202406060612.UBlHLtM8-lkp@intel.com/ > > All errors (new ones prefixed by >>): > > In file included from drivers/net/ethernet/microchip/lan743x_main.c:4: > In file included from include/linux/module.h:19: > In file included from include/linux/elf.h:6: > In file included from arch/s390/include/asm/elf.h:173: > In file included from arch/s390/include/asm/mmu_context.h:11: > In file included from arch/s390/include/asm/pgalloc.h:18: > In file included from include/linux/mm.h:2253: > include/linux/vmstat.h:500:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion] > 500 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS + > | ~~~~~~~~~~~~~~~~~~~~~ ^ > 501 | item]; > | ~~~~ > include/linux/vmstat.h:507:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion] > 507 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS + > | ~~~~~~~~~~~~~~~~~~~~~ ^ > 508 | NR_VM_NUMA_EVENT_ITEMS + > | ~~~~~~~~~~~~~~~~~~~~~~ > include/linux/vmstat.h:514:36: warning: arithmetic between different enumeration types ('enum node_stat_item' and 'enum lru_list') [-Wenum-enum-conversion] > 514 | return node_stat_name(NR_LRU_BASE + lru) + 3; // skip "nr_" > | ~~~~~~~~~~~ ^ ~~~ > include/linux/vmstat.h:519:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion] > 519 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS + > | ~~~~~~~~~~~~~~~~~~~~~ ^ > 520 | NR_VM_NUMA_EVENT_ITEMS + > | ~~~~~~~~~~~~~~~~~~~~~~ > include/linux/vmstat.h:528:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion] > 528 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS + > | ~~~~~~~~~~~~~~~~~~~~~ ^ > 529 | NR_VM_NUMA_EVENT_ITEMS + > | ~~~~~~~~~~~~~~~~~~~~~~ > In file included from drivers/net/ethernet/microchip/lan743x_main.c:5: > In file included from include/linux/pci.h:39: > In file included from include/linux/io.h:14: > In file included from arch/s390/include/asm/io.h:93: > include/asm-generic/io.h:548:31: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] > 548 | val = __raw_readb(PCI_IOBASE + addr); > | ~~~~~~~~~~ ^ > include/asm-generic/io.h:561:61: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] > 561 | val = __le16_to_cpu((__le16 __force)__raw_readw(PCI_IOBASE + addr)); > | ~~~~~~~~~~ ^ > include/uapi/linux/byteorder/big_endian.h:37:59: note: expanded from macro '__le16_to_cpu' > 37 | #define __le16_to_cpu(x) __swab16((__force __u16)(__le16)(x)) > | ^ > include/uapi/linux/swab.h:102:54: note: expanded from macro '__swab16' > 102 | #define __swab16(x) (__u16)__builtin_bswap16((__u16)(x)) > | ^ > In file included from drivers/net/ethernet/microchip/lan743x_main.c:5: > In file included from include/linux/pci.h:39: > In file included from include/linux/io.h:14: > In file included from arch/s390/include/asm/io.h:93: > include/asm-generic/io.h:574:61: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] > 574 | val = __le32_to_cpu((__le32 __force)__raw_readl(PCI_IOBASE + addr)); > | ~~~~~~~~~~ ^ > include/uapi/linux/byteorder/big_endian.h:35:59: note: expanded from macro '__le32_to_cpu' > 35 | #define __le32_to_cpu(x) __swab32((__force __u32)(__le32)(x)) > | ^ > include/uapi/linux/swab.h:115:54: note: expanded from macro '__swab32' > 115 | #define __swab32(x) (__u32)__builtin_bswap32((__u32)(x)) > | ^ > In file included from drivers/net/ethernet/microchip/lan743x_main.c:5: > In file included from include/linux/pci.h:39: > In file included from include/linux/io.h:14: > In file included from arch/s390/include/asm/io.h:93: > include/asm-generic/io.h:585:33: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] > 585 | __raw_writeb(value, PCI_IOBASE + addr); > | ~~~~~~~~~~ ^ > include/asm-generic/io.h:595:59: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] > 595 | __raw_writew((u16 __force)cpu_to_le16(value), PCI_IOBASE + addr); > | ~~~~~~~~~~ ^ > include/asm-generic/io.h:605:59: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] > 605 | __raw_writel((u32 __force)cpu_to_le32(value), PCI_IOBASE + addr); > | ~~~~~~~~~~ ^ > include/asm-generic/io.h:693:20: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] > 693 | readsb(PCI_IOBASE + addr, buffer, count); > | ~~~~~~~~~~ ^ > include/asm-generic/io.h:701:20: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] > 701 | readsw(PCI_IOBASE + addr, buffer, count); > | ~~~~~~~~~~ ^ > include/asm-generic/io.h:709:20: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] > 709 | readsl(PCI_IOBASE + addr, buffer, count); > | ~~~~~~~~~~ ^ > include/asm-generic/io.h:718:21: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] > 718 | writesb(PCI_IOBASE + addr, buffer, count); > | ~~~~~~~~~~ ^ > include/asm-generic/io.h:727:21: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] > 727 | writesw(PCI_IOBASE + addr, buffer, count); > | ~~~~~~~~~~ ^ > include/asm-generic/io.h:736:21: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] > 736 | writesl(PCI_IOBASE + addr, buffer, count); > | ~~~~~~~~~~ ^ > >> drivers/net/ethernet/microchip/lan743x_main.c:3126:12: error: no member named 'phy_wol_supported' in 'struct lan743x_adapter' > 3126 | adapter->phy_wol_supported = wol.supported; > | ~~~~~~~ ^ > >> drivers/net/ethernet/microchip/lan743x_main.c:3127:12: error: no member named 'phy_wolopts' in 'struct lan743x_adapter' > 3127 | adapter->phy_wolopts = wol.wolopts; > | ~~~~~~~ ^ > 17 warnings and 2 errors generated. > > > vim +3126 drivers/net/ethernet/microchip/lan743x_main.c > > 3085 > 3086 static int lan743x_netdev_open(struct net_device *netdev) > 3087 { > 3088 struct lan743x_adapter *adapter = netdev_priv(netdev); > 3089 int index; > 3090 int ret; > 3091 > 3092 ret = lan743x_intr_open(adapter); > 3093 if (ret) > 3094 goto return_error; > 3095 > 3096 ret = lan743x_mac_open(adapter); > 3097 if (ret) > 3098 goto close_intr; > 3099 > 3100 ret = lan743x_phy_open(adapter); > 3101 if (ret) > 3102 goto close_mac; > 3103 > 3104 ret = lan743x_ptp_open(adapter); > 3105 if (ret) > 3106 goto close_phy; > 3107 > 3108 lan743x_rfe_open(adapter); > 3109 > 3110 for (index = 0; index < LAN743X_USED_RX_CHANNELS; index++) { > 3111 ret = lan743x_rx_open(&adapter->rx[index]); > 3112 if (ret) > 3113 goto close_rx; > 3114 } > 3115 > 3116 for (index = 0; index < adapter->used_tx_channels; index++) { > 3117 ret = lan743x_tx_open(&adapter->tx[index]); > 3118 if (ret) > 3119 goto close_tx; > 3120 } > 3121 > 3122 if (adapter->netdev->phydev) { > 3123 struct ethtool_wolinfo wol = { .cmd = ETHTOOL_GWOL }; > 3124 > 3125 phy_ethtool_get_wol(netdev->phydev, &wol); > > 3126 adapter->phy_wol_supported = wol.supported; > > 3127 adapter->phy_wolopts = wol.wolopts; > 3128 } > 3129 > 3130 return 0; > 3131 > 3132 close_tx: > 3133 for (index = 0; index < adapter->used_tx_channels; index++) { > 3134 if (adapter->tx[index].ring_cpu_ptr) > 3135 lan743x_tx_close(&adapter->tx[index]); > 3136 } > 3137 > 3138 close_rx: > 3139 for (index = 0; index < LAN743X_USED_RX_CHANNELS; index++) { > 3140 if (adapter->rx[index].ring_cpu_ptr) > 3141 lan743x_rx_close(&adapter->rx[index]); > 3142 } > 3143 lan743x_ptp_close(adapter); > 3144 > 3145 close_phy: > 3146 lan743x_phy_close(adapter); > 3147 > 3148 close_mac: > 3149 lan743x_mac_close(adapter); > 3150 > 3151 close_intr: > 3152 lan743x_intr_close(adapter); > 3153 > 3154 return_error: > 3155 netif_warn(adapter, ifup, adapter->netdev, > 3156 "Error opening LAN743x\n"); > 3157 return ret; > 3158 } > 3159 > > -- > 0-DAY CI Kernel Test Service > https://github.com/intel/lkp-tests/wiki
On Thu, Jun 06, 2024 at 03:52:51PM +0530, Raju Lakkaraju wrote: > The target architecture of alpha's config file miss the "CONFIG_PM=y" > cofiguration. No. Your patch is missing support for CONFIG_PM = n. Or you need to add a depends on PM. We expect the kernel to build for any configuration. There are build bots which create random configurations and see if they build. Not having PM is a valid configuration, especially for a big iron server which never sleeps. Andrew
This patch series implement the following fixes:
1. Disable WOL upon resume in order to restore full data path operation
2. Support WOL at both the PHY and MAC appropriately
3. Remove interrupt mask clearing from config_init
Patch-3 was sent seperately earlier. Review comments in link:
https://lore.kernel.org/lkml/4a565d54-f468-4e32-8a2c-102c1203f72c@lunn.ch/T/
Reviewed-by: Wojciech Drewek <wojciech.drewek@intel.com>
Reported-by: kernel test robot <lkp@intel.com>
Closes: https://lore.kernel.org/oe-kbuild-all/202406052200.w3zuc32H-lkp@intel.com/
Raju Lakkaraju (3):
net: lan743x: disable WOL upon resume to restore full data path
operation
net: lan743x: Support WOL at both the PHY and MAC appropriately
net: phy: mxl-gpy: Remove interrupt mask clearing from config_init
.../net/ethernet/microchip/lan743x_ethtool.c | 44 ++++++++++++--
drivers/net/ethernet/microchip/lan743x_main.c | 46 ++++++++++++---
drivers/net/ethernet/microchip/lan743x_main.h | 28 +++++++++
drivers/net/phy/mxl-gpy.c | 58 ++++++++++++-------
4 files changed, 144 insertions(+), 32 deletions(-)
Hi Raju, Is this not supposed to be v4? Because I can see v3 here: https://www.spinics.net/lists/netdev/msg1002225.html The 06/11/2024 11:57, Raju Lakkaraju wrote: > This patch series implement the following fixes: > 1. Disable WOL upon resume in order to restore full data path operation > 2. Support WOL at both the PHY and MAC appropriately > 3. Remove interrupt mask clearing from config_init > > Patch-3 was sent seperately earlier. Review comments in link: > https://lore.kernel.org/lkml/4a565d54-f468-4e32-8a2c-102c1203f72c@lunn.ch/T/ > > Reviewed-by: Wojciech Drewek <wojciech.drewek@intel.com> > Reported-by: kernel test robot <lkp@intel.com> > Closes: https://lore.kernel.org/oe-kbuild-all/202406052200.w3zuc32H-lkp@intel.com/ I think you should drop the 'Reported-by' and 'Closes' tags because the issue that is getting closed is the one that you introduced in one of your previous version of the patch series. > > Raju Lakkaraju (3): > net: lan743x: disable WOL upon resume to restore full data path > operation > net: lan743x: Support WOL at both the PHY and MAC appropriately > net: phy: mxl-gpy: Remove interrupt mask clearing from config_init > > .../net/ethernet/microchip/lan743x_ethtool.c | 44 ++++++++++++-- > drivers/net/ethernet/microchip/lan743x_main.c | 46 ++++++++++++--- > drivers/net/ethernet/microchip/lan743x_main.h | 28 +++++++++ > drivers/net/phy/mxl-gpy.c | 58 ++++++++++++------- > 4 files changed, 144 insertions(+), 32 deletions(-) > > -- > 2.34.1 > >
Hi Horatiu, There is no new changes except "kernel test robot" reported issue. I fix the issue and sent the patch along with other old patches. Also add "Reported-by" and "Closes" tags to all patches and --in-reply-to=202406052200.w3zuc32H-lkp@intel.com. i.e. If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202406052200.w3zuc32H-lkp@intel.com/ Is it sufficient? or Do you need to generete new version of patches ? Thanks, Raju The 06/11/2024 09:10, Horatiu Vultur wrote: > Hi Raju, > > Is this not supposed to be v4? > Because I can see v3 here: > https://www.spinics.net/lists/netdev/msg1002225.html > > The 06/11/2024 11:57, Raju Lakkaraju wrote: > > This patch series implement the following fixes: > > 1. Disable WOL upon resume in order to restore full data path operation > > 2. Support WOL at both the PHY and MAC appropriately > > 3. Remove interrupt mask clearing from config_init > > > > Patch-3 was sent seperately earlier. Review comments in link: > > https://lore.kernel.org/lkml/4a565d54-f468-4e32-8a2c-102c1203f72c@lunn.ch/T/ > > > > Reviewed-by: Wojciech Drewek <wojciech.drewek@intel.com> > > Reported-by: kernel test robot <lkp@intel.com> > > Closes: https://lore.kernel.org/oe-kbuild-all/202406052200.w3zuc32H-lkp@intel.com/ > > I think you should drop the 'Reported-by' and 'Closes' tags because the > issue that is getting closed is the one that you introduced in one of > your previous version of the patch series. > > > > > Raju Lakkaraju (3): > > net: lan743x: disable WOL upon resume to restore full data path > > operation > > net: lan743x: Support WOL at both the PHY and MAC appropriately > > net: phy: mxl-gpy: Remove interrupt mask clearing from config_init > > > > .../net/ethernet/microchip/lan743x_ethtool.c | 44 ++++++++++++-- > > drivers/net/ethernet/microchip/lan743x_main.c | 46 ++++++++++++--- > > drivers/net/ethernet/microchip/lan743x_main.h | 28 +++++++++ > > drivers/net/phy/mxl-gpy.c | 58 ++++++++++++------- > > 4 files changed, 144 insertions(+), 32 deletions(-) > > > > -- > > 2.34.1 > > > > > > -- > /Horatiu
The 06/11/2024 13:31, Raju Lakkaraju wrote: > Hi Horatiu, > > There is no new changes except "kernel test robot" reported issue. So there is no change in the code, you just added the tags between this version and the previous one where the robot complained? Because to me it looks like you added an extra #ifdef in 2/3 patch. > > I fix the issue and sent the patch along with other old patches. > Also add "Reported-by" and "Closes" tags to all patches and > --in-reply-to=202406052200.w3zuc32H-lkp@intel.com. > i.e. > If you fix the issue in a separate patch/commit (i.e. not just a new version of > the same patch/commit), kindly add following tags > | Reported-by: kernel test robot <lkp@intel.com> > | Closes: https://lore.kernel.org/oe-kbuild-all/202406052200.w3zuc32H-lkp@intel.com/ It doesn't say to add only if you fix the issue in a separate patch and not just for a new version of the patch/commit. Or I miss reading this? > > Is it sufficient? or > Do you need to generete new version of patches ? Every time when you do a change in your patch until is accepted, you will need to generate a new version. Don't forget about 24h rule. That you need to wait 24h before you can send a new version. > > Thanks, > Raju > The 06/11/2024 09:10, Horatiu Vultur wrote: > > Hi Raju, > > > > Is this not supposed to be v4? > > Because I can see v3 here: > > https://www.spinics.net/lists/netdev/msg1002225.html > > > > The 06/11/2024 11:57, Raju Lakkaraju wrote: > > > This patch series implement the following fixes: > > > 1. Disable WOL upon resume in order to restore full data path operation > > > 2. Support WOL at both the PHY and MAC appropriately > > > 3. Remove interrupt mask clearing from config_init > > > > > > Patch-3 was sent seperately earlier. Review comments in link: > > > https://lore.kernel.org/lkml/4a565d54-f468-4e32-8a2c-102c1203f72c@lunn.ch/T/ > > > > > > Reviewed-by: Wojciech Drewek <wojciech.drewek@intel.com> > > > Reported-by: kernel test robot <lkp@intel.com> > > > Closes: https://lore.kernel.org/oe-kbuild-all/202406052200.w3zuc32H-lkp@intel.com/ > > > > I think you should drop the 'Reported-by' and 'Closes' tags because the > > issue that is getting closed is the one that you introduced in one of > > your previous version of the patch series. > > > > > > > > Raju Lakkaraju (3): > > > net: lan743x: disable WOL upon resume to restore full data path > > > operation > > > net: lan743x: Support WOL at both the PHY and MAC appropriately > > > net: phy: mxl-gpy: Remove interrupt mask clearing from config_init > > > > > > .../net/ethernet/microchip/lan743x_ethtool.c | 44 ++++++++++++-- > > > drivers/net/ethernet/microchip/lan743x_main.c | 46 ++++++++++++--- > > > drivers/net/ethernet/microchip/lan743x_main.h | 28 +++++++++ > > > drivers/net/phy/mxl-gpy.c | 58 ++++++++++++------- > > > 4 files changed, 144 insertions(+), 32 deletions(-) > > > > > > -- > > > 2.34.1 > > > > > > > > > > -- > > /Horatiu > > -- > Thanks, > Raju
diff --git a/drivers/net/ethernet/microchip/lan743x_ethtool.c b/drivers/net/ethernet/microchip/lan743x_ethtool.c index d0f4ff4ee075..0d1740d64676 100644 --- a/drivers/net/ethernet/microchip/lan743x_ethtool.c +++ b/drivers/net/ethernet/microchip/lan743x_ethtool.c @@ -1127,8 +1127,12 @@ static void lan743x_ethtool_get_wol(struct net_device *netdev, if (netdev->phydev) phy_ethtool_get_wol(netdev->phydev, wol); - wol->supported |= WAKE_BCAST | WAKE_UCAST | WAKE_MCAST | - WAKE_MAGIC | WAKE_PHY | WAKE_ARP; + if (wol->supported != adapter->phy_wol_supported) + netif_warn(adapter, drv, adapter->netdev, + "PHY changed its supported WOL! old=%x, new=%x\n", + adapter->phy_wol_supported, wol->supported); + + wol->supported |= MAC_SUPPORTED_WAKES; if (adapter->is_pci11x1x) wol->supported |= WAKE_MAGICSECURE; @@ -1143,7 +1147,39 @@ static int lan743x_ethtool_set_wol(struct net_device *netdev, { struct lan743x_adapter *adapter = netdev_priv(netdev); + /* WAKE_MAGICSEGURE is a modifier of and only valid together with + * WAKE_MAGIC + */ + if ((wol->wolopts & WAKE_MAGICSECURE) && !(wol->wolopts & WAKE_MAGIC)) + return -EINVAL; + + if (netdev->phydev) { + struct ethtool_wolinfo phy_wol; + int ret; + + phy_wol.wolopts = wol->wolopts & adapter->phy_wol_supported; + + /* If WAKE_MAGICSECURE was requested, filter out WAKE_MAGIC + * for PHYs that do not support WAKE_MAGICSECURE + */ + if (wol->wolopts & WAKE_MAGICSECURE && + !(adapter->phy_wol_supported & WAKE_MAGICSECURE)) + phy_wol.wolopts &= ~WAKE_MAGIC; + + ret = phy_ethtool_set_wol(netdev->phydev, &phy_wol); + if (ret && (ret != -EOPNOTSUPP)) + return ret; + + if (ret == -EOPNOTSUPP) + adapter->phy_wolopts = 0; + else + adapter->phy_wolopts = phy_wol.wolopts; + } else { + adapter->phy_wolopts = 0; + } + adapter->wolopts = 0; + wol->wolopts &= ~adapter->phy_wolopts; if (wol->wolopts & WAKE_UCAST) adapter->wolopts |= WAKE_UCAST; if (wol->wolopts & WAKE_MCAST) @@ -1164,10 +1200,10 @@ static int lan743x_ethtool_set_wol(struct net_device *netdev, memset(adapter->sopass, 0, sizeof(u8) * SOPASS_MAX); } + wol->wolopts = adapter->wolopts | adapter->phy_wolopts; device_set_wakeup_enable(&adapter->pdev->dev, (bool)wol->wolopts); - return netdev->phydev ? phy_ethtool_set_wol(netdev->phydev, wol) - : -ENETDOWN; + return 0; } #endif /* CONFIG_PM */ diff --git a/drivers/net/ethernet/microchip/lan743x_main.c b/drivers/net/ethernet/microchip/lan743x_main.c index 6a40b961fafb..b6810840bc61 100644 --- a/drivers/net/ethernet/microchip/lan743x_main.c +++ b/drivers/net/ethernet/microchip/lan743x_main.c @@ -3118,6 +3118,15 @@ static int lan743x_netdev_open(struct net_device *netdev) if (ret) goto close_tx; } + + if (adapter->netdev->phydev) { + struct ethtool_wolinfo wol = { .cmd = ETHTOOL_GWOL }; + + phy_ethtool_get_wol(netdev->phydev, &wol); + adapter->phy_wol_supported = wol.supported; + adapter->phy_wolopts = wol.wolopts; + } + return 0; close_tx: @@ -3587,10 +3596,9 @@ static void lan743x_pm_set_wol(struct lan743x_adapter *adapter) pmtctl |= PMT_CTL_ETH_PHY_D3_COLD_OVR_ | PMT_CTL_ETH_PHY_D3_OVR_; - if (adapter->wolopts & WAKE_PHY) { - pmtctl |= PMT_CTL_ETH_PHY_EDPD_PLL_CTL_; + if (adapter->phy_wolopts) pmtctl |= PMT_CTL_ETH_PHY_WAKE_EN_; - } + if (adapter->wolopts & WAKE_MAGIC) { wucsr |= MAC_WUCSR_MPEN_; macrx |= MAC_RX_RXEN_; @@ -3686,7 +3694,7 @@ static int lan743x_pm_suspend(struct device *dev) lan743x_csr_write(adapter, MAC_WUCSR2, 0); lan743x_csr_write(adapter, MAC_WK_SRC, 0xFFFFFFFF); - if (adapter->wolopts) + if (adapter->wolopts || adapter->phy_wolopts) lan743x_pm_set_wol(adapter); if (adapter->is_pci11x1x) { diff --git a/drivers/net/ethernet/microchip/lan743x_main.h b/drivers/net/ethernet/microchip/lan743x_main.h index fac0f33d10b2..3b2585a384e2 100644 --- a/drivers/net/ethernet/microchip/lan743x_main.h +++ b/drivers/net/ethernet/microchip/lan743x_main.h @@ -1042,6 +1042,8 @@ enum lan743x_sgmii_lsd { LINK_2500_SLAVE }; +#define MAC_SUPPORTED_WAKES (WAKE_BCAST | WAKE_UCAST | WAKE_MCAST | \ + WAKE_MAGIC | WAKE_ARP) struct lan743x_adapter { struct net_device *netdev; struct mii_bus *mdiobus; @@ -1049,6 +1051,8 @@ struct lan743x_adapter { #ifdef CONFIG_PM u32 wolopts; u8 sopass[SOPASS_MAX]; + u32 phy_wolopts; + u32 phy_wol_supported; #endif struct pci_dev *pdev; struct lan743x_csr csr;
Prevent options not supported by the PHY from being requested to it by the MAC Whenever a WOL option is supported by both, the PHY is given priority since that usually leads to better power savings Fixes: e9e13b6adc338 ("lan743x: fix for potential NULL pointer dereference with bare card") Signed-off-by: Raju Lakkaraju <Raju.Lakkaraju@microchip.com> --- Change List: ------------ V2 -> V3: - Remove the "phy does not support WOL" debug message which is not required - Remove WAKE_PHY support option from Ethernet MAC (LAN743x/PCI11x1x) driver - Add "phy_wol_supported" and "phy_wolopts" variables to hold PHY's WOL config V1 -> V2: - Repost - No change V0 -> V1: - Change the "phy does not support WOL" print from netif_info() to netif_dbg() .../net/ethernet/microchip/lan743x_ethtool.c | 44 +++++++++++++++++-- drivers/net/ethernet/microchip/lan743x_main.c | 16 +++++-- drivers/net/ethernet/microchip/lan743x_main.h | 4 ++ 3 files changed, 56 insertions(+), 8 deletions(-)