xref: /openbmc/linux/drivers/net/ethernet/wangxun/ngbe/ngbe_ethtool.c (revision c900529f3d9161bfde5cca0754f83b4d3c3e0220)
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