Commit 3ebbd9f6 authored by Edward Cree's avatar Edward Cree Committed by Jakub Kicinski

net: move ethtool-related netdev state into its own struct

net_dev->ethtool is a pointer to new struct ethtool_netdev_state, which
 currently contains only the wol_enabled field.
Suggested-by: default avatarJakub Kicinski <kuba@kernel.org>
Signed-off-by: default avatarEdward Cree <ecree.xilinx@gmail.com>
Reviewed-by: default avatarPrzemek Kitszel <przemyslaw.kitszel@intel.com>
Link: https://patch.msgid.link/293a562278371de7534ed1eb17531838ca090633.1719502239.git.ecree.xilinx@gmail.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent c2dd2139
...@@ -1608,7 +1608,7 @@ static void __rtl8169_set_wol(struct rtl8169_private *tp, u32 wolopts) ...@@ -1608,7 +1608,7 @@ static void __rtl8169_set_wol(struct rtl8169_private *tp, u32 wolopts)
if (!tp->dash_enabled) { if (!tp->dash_enabled) {
rtl_set_d3_pll_down(tp, !wolopts); rtl_set_d3_pll_down(tp, !wolopts);
tp->dev->wol_enabled = wolopts ? 1 : 0; tp->dev->ethtool->wol_enabled = wolopts ? 1 : 0;
} }
} }
...@@ -5478,7 +5478,7 @@ static int rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -5478,7 +5478,7 @@ static int rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
rtl_set_d3_pll_down(tp, true); rtl_set_d3_pll_down(tp, true);
} else { } else {
rtl_set_d3_pll_down(tp, false); rtl_set_d3_pll_down(tp, false);
dev->wol_enabled = 1; dev->ethtool->wol_enabled = 1;
} }
jumbo_max = rtl_jumbo_max(tp); jumbo_max = rtl_jumbo_max(tp);
......
...@@ -37,9 +37,9 @@ static int ngbe_set_wol(struct net_device *netdev, ...@@ -37,9 +37,9 @@ static int ngbe_set_wol(struct net_device *netdev,
wx->wol = 0; wx->wol = 0;
if (wol->wolopts & WAKE_MAGIC) if (wol->wolopts & WAKE_MAGIC)
wx->wol = WX_PSR_WKUP_CTL_MAG; wx->wol = WX_PSR_WKUP_CTL_MAG;
netdev->wol_enabled = !!(wx->wol); netdev->ethtool->wol_enabled = !!(wx->wol);
wr32(wx, WX_PSR_WKUP_CTL, wx->wol); wr32(wx, WX_PSR_WKUP_CTL, wx->wol);
device_set_wakeup_enable(&pdev->dev, netdev->wol_enabled); device_set_wakeup_enable(&pdev->dev, netdev->ethtool->wol_enabled);
return 0; return 0;
} }
......
...@@ -650,7 +650,7 @@ static int ngbe_probe(struct pci_dev *pdev, ...@@ -650,7 +650,7 @@ static int ngbe_probe(struct pci_dev *pdev,
if (wx->wol_hw_supported) if (wx->wol_hw_supported)
wx->wol = NGBE_PSR_WKUP_CTL_MAG; wx->wol = NGBE_PSR_WKUP_CTL_MAG;
netdev->wol_enabled = !!(wx->wol); netdev->ethtool->wol_enabled = !!(wx->wol);
wr32(wx, NGBE_PSR_WKUP_CTL, wx->wol); wr32(wx, NGBE_PSR_WKUP_CTL, wx->wol);
device_set_wakeup_enable(&pdev->dev, wx->wol); device_set_wakeup_enable(&pdev->dev, wx->wol);
......
...@@ -1309,7 +1309,7 @@ static irqreturn_t phy_interrupt(int irq, void *phy_dat) ...@@ -1309,7 +1309,7 @@ static irqreturn_t phy_interrupt(int irq, void *phy_dat)
if (netdev) { if (netdev) {
struct device *parent = netdev->dev.parent; struct device *parent = netdev->dev.parent;
if (netdev->wol_enabled) if (netdev->ethtool->wol_enabled)
pm_system_wakeup(); pm_system_wakeup();
else if (device_may_wakeup(&netdev->dev)) else if (device_may_wakeup(&netdev->dev))
pm_wakeup_dev_event(&netdev->dev, 0, true); pm_wakeup_dev_event(&netdev->dev, 0, true);
......
...@@ -296,7 +296,7 @@ static bool mdio_bus_phy_may_suspend(struct phy_device *phydev) ...@@ -296,7 +296,7 @@ static bool mdio_bus_phy_may_suspend(struct phy_device *phydev)
if (!netdev) if (!netdev)
goto out; goto out;
if (netdev->wol_enabled) if (netdev->ethtool->wol_enabled)
return false; return false;
/* As long as not all affected network drivers support the /* As long as not all affected network drivers support the
...@@ -1984,7 +1984,8 @@ int phy_suspend(struct phy_device *phydev) ...@@ -1984,7 +1984,8 @@ int phy_suspend(struct phy_device *phydev)
return 0; return 0;
phy_ethtool_get_wol(phydev, &wol); phy_ethtool_get_wol(phydev, &wol);
phydev->wol_enabled = wol.wolopts || (netdev && netdev->wol_enabled); phydev->wol_enabled = wol.wolopts ||
(netdev && netdev->ethtool->wol_enabled);
/* If the device has WOL enabled, we cannot suspend the PHY */ /* If the device has WOL enabled, we cannot suspend the PHY */
if (phydev->wol_enabled && !(phydrv->flags & PHY_ALWAYS_CALL_SUSPEND)) if (phydev->wol_enabled && !(phydrv->flags & PHY_ALWAYS_CALL_SUSPEND))
return -EBUSY; return -EBUSY;
......
...@@ -2282,7 +2282,7 @@ void phylink_suspend(struct phylink *pl, bool mac_wol) ...@@ -2282,7 +2282,7 @@ void phylink_suspend(struct phylink *pl, bool mac_wol)
{ {
ASSERT_RTNL(); ASSERT_RTNL();
if (mac_wol && (!pl->netdev || pl->netdev->wol_enabled)) { if (mac_wol && (!pl->netdev || pl->netdev->ethtool->wol_enabled)) {
/* Wake-on-Lan enabled, MAC handling */ /* Wake-on-Lan enabled, MAC handling */
mutex_lock(&pl->state_mutex); mutex_lock(&pl->state_mutex);
......
...@@ -1004,6 +1004,14 @@ int ethtool_virtdev_set_link_ksettings(struct net_device *dev, ...@@ -1004,6 +1004,14 @@ int ethtool_virtdev_set_link_ksettings(struct net_device *dev,
const struct ethtool_link_ksettings *cmd, const struct ethtool_link_ksettings *cmd,
u32 *dev_speed, u8 *dev_duplex); u32 *dev_speed, u8 *dev_duplex);
/**
* struct ethtool_netdev_state - per-netdevice state for ethtool features
* @wol_enabled: Wake-on-LAN is enabled
*/
struct ethtool_netdev_state {
unsigned wol_enabled:1;
};
struct phy_device; struct phy_device;
struct phy_tdr_config; struct phy_tdr_config;
struct phy_plca_cfg; struct phy_plca_cfg;
......
...@@ -80,6 +80,7 @@ struct xdp_buff; ...@@ -80,6 +80,7 @@ struct xdp_buff;
struct xdp_frame; struct xdp_frame;
struct xdp_metadata_ops; struct xdp_metadata_ops;
struct xdp_md; struct xdp_md;
struct ethtool_netdev_state;
typedef u32 xdp_features_t; typedef u32 xdp_features_t;
...@@ -1986,8 +1987,6 @@ enum netdev_reg_state { ...@@ -1986,8 +1987,6 @@ enum netdev_reg_state {
* switch driver and used to set the phys state of the * switch driver and used to set the phys state of the
* switch port. * switch port.
* *
* @wol_enabled: Wake-on-LAN is enabled
*
* @threaded: napi threaded mode is enabled * @threaded: napi threaded mode is enabled
* *
* @module_fw_flash_in_progress: Module firmware flashing is in progress. * @module_fw_flash_in_progress: Module firmware flashing is in progress.
...@@ -2001,6 +2000,7 @@ enum netdev_reg_state { ...@@ -2001,6 +2000,7 @@ enum netdev_reg_state {
* @udp_tunnel_nic_info: static structure describing the UDP tunnel * @udp_tunnel_nic_info: static structure describing the UDP tunnel
* offload capabilities of the device * offload capabilities of the device
* @udp_tunnel_nic: UDP tunnel offload state * @udp_tunnel_nic: UDP tunnel offload state
* @ethtool: ethtool related state
* @xdp_state: stores info on attached XDP BPF programs * @xdp_state: stores info on attached XDP BPF programs
* *
* @nested_level: Used as a parameter of spin_lock_nested() of * @nested_level: Used as a parameter of spin_lock_nested() of
...@@ -2375,7 +2375,7 @@ struct net_device { ...@@ -2375,7 +2375,7 @@ struct net_device {
struct lock_class_key *qdisc_tx_busylock; struct lock_class_key *qdisc_tx_busylock;
bool proto_down; bool proto_down;
bool threaded; bool threaded;
unsigned wol_enabled:1;
unsigned module_fw_flash_in_progress:1; unsigned module_fw_flash_in_progress:1;
struct list_head net_notifier_list; struct list_head net_notifier_list;
...@@ -2386,6 +2386,8 @@ struct net_device { ...@@ -2386,6 +2386,8 @@ struct net_device {
const struct udp_tunnel_nic_info *udp_tunnel_nic_info; const struct udp_tunnel_nic_info *udp_tunnel_nic_info;
struct udp_tunnel_nic *udp_tunnel_nic; struct udp_tunnel_nic *udp_tunnel_nic;
struct ethtool_netdev_state *ethtool;
/* protected by rtnl_lock */ /* protected by rtnl_lock */
struct bpf_xdp_entity xdp_state[__MAX_XDP_MODE]; struct bpf_xdp_entity xdp_state[__MAX_XDP_MODE];
......
...@@ -11116,6 +11116,9 @@ struct net_device *alloc_netdev_mqs(int sizeof_priv, const char *name, ...@@ -11116,6 +11116,9 @@ struct net_device *alloc_netdev_mqs(int sizeof_priv, const char *name,
dev->real_num_rx_queues = rxqs; dev->real_num_rx_queues = rxqs;
if (netif_alloc_rx_queues(dev)) if (netif_alloc_rx_queues(dev))
goto free_all; goto free_all;
dev->ethtool = kzalloc(sizeof(*dev->ethtool), GFP_KERNEL_ACCOUNT);
if (!dev->ethtool)
goto free_all;
strcpy(dev->name, name); strcpy(dev->name, name);
dev->name_assign_type = name_assign_type; dev->name_assign_type = name_assign_type;
...@@ -11166,6 +11169,7 @@ void free_netdev(struct net_device *dev) ...@@ -11166,6 +11169,7 @@ void free_netdev(struct net_device *dev)
return; return;
} }
kfree(dev->ethtool);
netif_free_tx_queues(dev); netif_free_tx_queues(dev);
netif_free_rx_queues(dev); netif_free_rx_queues(dev);
......
...@@ -1509,7 +1509,7 @@ static int ethtool_set_wol(struct net_device *dev, char __user *useraddr) ...@@ -1509,7 +1509,7 @@ static int ethtool_set_wol(struct net_device *dev, char __user *useraddr)
if (ret) if (ret)
return ret; return ret;
dev->wol_enabled = !!wol.wolopts; dev->ethtool->wol_enabled = !!wol.wolopts;
ethtool_notify(dev, ETHTOOL_MSG_WOL_NTF, NULL); ethtool_notify(dev, ETHTOOL_MSG_WOL_NTF, NULL);
return 0; return 0;
......
...@@ -137,7 +137,7 @@ ethnl_set_wol(struct ethnl_req_info *req_info, struct genl_info *info) ...@@ -137,7 +137,7 @@ ethnl_set_wol(struct ethnl_req_info *req_info, struct genl_info *info)
ret = dev->ethtool_ops->set_wol(dev, &wol); ret = dev->ethtool_ops->set_wol(dev, &wol);
if (ret) if (ret)
return ret; return ret;
dev->wol_enabled = !!wol.wolopts; dev->ethtool->wol_enabled = !!wol.wolopts;
return 1; return 1;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment