11b8d1c50SMengyuan Lou // SPDX-License-Identifier: GPL-2.0
21b8d1c50SMengyuan Lou /* Copyright (c) 2015 - 2023 Beijing WangXun Technology Co., Ltd. */
31b8d1c50SMengyuan Lou
41b8d1c50SMengyuan Lou #include <linux/pci.h>
51b8d1c50SMengyuan Lou #include <linux/phy.h>
61b8d1c50SMengyuan Lou #include <linux/netdevice.h>
71b8d1c50SMengyuan Lou
81b8d1c50SMengyuan Lou #include "../libwx/wx_ethtool.h"
9*6963e463SMengyuan Lou #include "../libwx/wx_type.h"
101b8d1c50SMengyuan Lou #include "ngbe_ethtool.h"
111b8d1c50SMengyuan Lou
ngbe_get_wol(struct net_device * netdev,struct ethtool_wolinfo * wol)12*6963e463SMengyuan Lou static void ngbe_get_wol(struct net_device *netdev,
13*6963e463SMengyuan Lou struct ethtool_wolinfo *wol)
14*6963e463SMengyuan Lou {
15*6963e463SMengyuan Lou struct wx *wx = netdev_priv(netdev);
16*6963e463SMengyuan Lou
17*6963e463SMengyuan Lou if (!wx->wol_hw_supported)
18*6963e463SMengyuan Lou return;
19*6963e463SMengyuan Lou wol->supported = WAKE_MAGIC;
20*6963e463SMengyuan Lou wol->wolopts = 0;
21*6963e463SMengyuan Lou if (wx->wol & WX_PSR_WKUP_CTL_MAG)
22*6963e463SMengyuan Lou wol->wolopts |= WAKE_MAGIC;
23*6963e463SMengyuan Lou }
24*6963e463SMengyuan Lou
ngbe_set_wol(struct net_device * netdev,struct ethtool_wolinfo * wol)25*6963e463SMengyuan Lou static int ngbe_set_wol(struct net_device *netdev,
26*6963e463SMengyuan Lou struct ethtool_wolinfo *wol)
27*6963e463SMengyuan Lou {
28*6963e463SMengyuan Lou struct wx *wx = netdev_priv(netdev);
29*6963e463SMengyuan Lou struct pci_dev *pdev = wx->pdev;
30*6963e463SMengyuan Lou
31*6963e463SMengyuan Lou if (!wx->wol_hw_supported)
32*6963e463SMengyuan Lou return -EOPNOTSUPP;
33*6963e463SMengyuan Lou
34*6963e463SMengyuan Lou wx->wol = 0;
35*6963e463SMengyuan Lou if (wol->wolopts & WAKE_MAGIC)
36*6963e463SMengyuan Lou wx->wol = WX_PSR_WKUP_CTL_MAG;
37*6963e463SMengyuan Lou netdev->wol_enabled = !!(wx->wol);
38*6963e463SMengyuan Lou wr32(wx, WX_PSR_WKUP_CTL, wx->wol);
39*6963e463SMengyuan Lou device_set_wakeup_enable(&pdev->dev, netdev->wol_enabled);
40*6963e463SMengyuan Lou
41*6963e463SMengyuan Lou return 0;
42*6963e463SMengyuan Lou }
43*6963e463SMengyuan Lou
441b8d1c50SMengyuan Lou static const struct ethtool_ops ngbe_ethtool_ops = {
451b8d1c50SMengyuan Lou .get_drvinfo = wx_get_drvinfo,
461b8d1c50SMengyuan Lou .get_link = ethtool_op_get_link,
471b8d1c50SMengyuan Lou .get_link_ksettings = phy_ethtool_get_link_ksettings,
481b8d1c50SMengyuan Lou .set_link_ksettings = phy_ethtool_set_link_ksettings,
491b8d1c50SMengyuan Lou .nway_reset = phy_ethtool_nway_reset,
50*6963e463SMengyuan Lou .get_wol = ngbe_get_wol,
51*6963e463SMengyuan Lou .set_wol = ngbe_set_wol,
521b8d1c50SMengyuan Lou };
531b8d1c50SMengyuan Lou
ngbe_set_ethtool_ops(struct net_device * netdev)541b8d1c50SMengyuan Lou void ngbe_set_ethtool_ops(struct net_device *netdev)
551b8d1c50SMengyuan Lou {
561b8d1c50SMengyuan Lou netdev->ethtool_ops = &ngbe_ethtool_ops;
571b8d1c50SMengyuan Lou }
58