// SPDX-License-Identifier: GPL-2.0 /* Copyright (c) 2015 - 2023 Beijing WangXun Technology Co., Ltd. */ #include #include #include #include "../libwx/wx_ethtool.h" #include "../libwx/wx_type.h" #include "ngbe_ethtool.h" static void ngbe_get_wol(struct net_device *netdev, struct ethtool_wolinfo *wol) { struct wx *wx = netdev_priv(netdev); if (!wx->wol_hw_supported) return; wol->supported = WAKE_MAGIC; wol->wolopts = 0; if (wx->wol & WX_PSR_WKUP_CTL_MAG) wol->wolopts |= WAKE_MAGIC; } static int ngbe_set_wol(struct net_device *netdev, struct ethtool_wolinfo *wol) { struct wx *wx = netdev_priv(netdev); struct pci_dev *pdev = wx->pdev; if (!wx->wol_hw_supported) return -EOPNOTSUPP; wx->wol = 0; if (wol->wolopts & WAKE_MAGIC) wx->wol = WX_PSR_WKUP_CTL_MAG; netdev->wol_enabled = !!(wx->wol); wr32(wx, WX_PSR_WKUP_CTL, wx->wol); device_set_wakeup_enable(&pdev->dev, netdev->wol_enabled); return 0; } static const struct ethtool_ops ngbe_ethtool_ops = { .get_drvinfo = wx_get_drvinfo, .get_link = ethtool_op_get_link, .get_link_ksettings = phy_ethtool_get_link_ksettings, .set_link_ksettings = phy_ethtool_set_link_ksettings, .nway_reset = phy_ethtool_nway_reset, .get_wol = ngbe_get_wol, .set_wol = ngbe_set_wol, }; void ngbe_set_ethtool_ops(struct net_device *netdev) { netdev->ethtool_ops = &ngbe_ethtool_ops; }