162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci/* Copyright (c) 2015 - 2023 Beijing WangXun Technology Co., Ltd. */ 362306a36Sopenharmony_ci 462306a36Sopenharmony_ci#include <linux/pci.h> 562306a36Sopenharmony_ci#include <linux/phy.h> 662306a36Sopenharmony_ci#include <linux/netdevice.h> 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#include "../libwx/wx_ethtool.h" 962306a36Sopenharmony_ci#include "../libwx/wx_type.h" 1062306a36Sopenharmony_ci#include "ngbe_ethtool.h" 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_cistatic void ngbe_get_wol(struct net_device *netdev, 1362306a36Sopenharmony_ci struct ethtool_wolinfo *wol) 1462306a36Sopenharmony_ci{ 1562306a36Sopenharmony_ci struct wx *wx = netdev_priv(netdev); 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci if (!wx->wol_hw_supported) 1862306a36Sopenharmony_ci return; 1962306a36Sopenharmony_ci wol->supported = WAKE_MAGIC; 2062306a36Sopenharmony_ci wol->wolopts = 0; 2162306a36Sopenharmony_ci if (wx->wol & WX_PSR_WKUP_CTL_MAG) 2262306a36Sopenharmony_ci wol->wolopts |= WAKE_MAGIC; 2362306a36Sopenharmony_ci} 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_cistatic int ngbe_set_wol(struct net_device *netdev, 2662306a36Sopenharmony_ci struct ethtool_wolinfo *wol) 2762306a36Sopenharmony_ci{ 2862306a36Sopenharmony_ci struct wx *wx = netdev_priv(netdev); 2962306a36Sopenharmony_ci struct pci_dev *pdev = wx->pdev; 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_ci if (!wx->wol_hw_supported) 3262306a36Sopenharmony_ci return -EOPNOTSUPP; 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci wx->wol = 0; 3562306a36Sopenharmony_ci if (wol->wolopts & WAKE_MAGIC) 3662306a36Sopenharmony_ci wx->wol = WX_PSR_WKUP_CTL_MAG; 3762306a36Sopenharmony_ci netdev->wol_enabled = !!(wx->wol); 3862306a36Sopenharmony_ci wr32(wx, WX_PSR_WKUP_CTL, wx->wol); 3962306a36Sopenharmony_ci device_set_wakeup_enable(&pdev->dev, netdev->wol_enabled); 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci return 0; 4262306a36Sopenharmony_ci} 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_cistatic const struct ethtool_ops ngbe_ethtool_ops = { 4562306a36Sopenharmony_ci .get_drvinfo = wx_get_drvinfo, 4662306a36Sopenharmony_ci .get_link = ethtool_op_get_link, 4762306a36Sopenharmony_ci .get_link_ksettings = phy_ethtool_get_link_ksettings, 4862306a36Sopenharmony_ci .set_link_ksettings = phy_ethtool_set_link_ksettings, 4962306a36Sopenharmony_ci .nway_reset = phy_ethtool_nway_reset, 5062306a36Sopenharmony_ci .get_wol = ngbe_get_wol, 5162306a36Sopenharmony_ci .set_wol = ngbe_set_wol, 5262306a36Sopenharmony_ci}; 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_civoid ngbe_set_ethtool_ops(struct net_device *netdev) 5562306a36Sopenharmony_ci{ 5662306a36Sopenharmony_ci netdev->ethtool_ops = &ngbe_ethtool_ops; 5762306a36Sopenharmony_ci} 58