1*73b01e57SJeff Chen // SPDX-License-Identifier: GPL-2.0-only 2*73b01e57SJeff Chen /* 3*73b01e57SJeff Chen * nxpwifi: ethtool 4*73b01e57SJeff Chen * 5*73b01e57SJeff Chen * Copyright 2011-2024 NXP 6*73b01e57SJeff Chen */ 7*73b01e57SJeff Chen 8*73b01e57SJeff Chen #include "main.h" 9*73b01e57SJeff Chen nxpwifi_ethtool_get_wol(struct net_device * dev,struct ethtool_wolinfo * wol)10*73b01e57SJeff Chenstatic void nxpwifi_ethtool_get_wol(struct net_device *dev, 11*73b01e57SJeff Chen struct ethtool_wolinfo *wol) 12*73b01e57SJeff Chen { 13*73b01e57SJeff Chen struct nxpwifi_private *priv = nxpwifi_netdev_get_priv(dev); 14*73b01e57SJeff Chen u32 conditions = le32_to_cpu(priv->adapter->hs_cfg.conditions); 15*73b01e57SJeff Chen 16*73b01e57SJeff Chen wol->supported = WAKE_UCAST | WAKE_MCAST | WAKE_BCAST | WAKE_PHY; 17*73b01e57SJeff Chen 18*73b01e57SJeff Chen if (conditions == HS_CFG_COND_DEF) 19*73b01e57SJeff Chen return; 20*73b01e57SJeff Chen 21*73b01e57SJeff Chen if (conditions & HS_CFG_COND_UNICAST_DATA) 22*73b01e57SJeff Chen wol->wolopts |= WAKE_UCAST; 23*73b01e57SJeff Chen if (conditions & HS_CFG_COND_MULTICAST_DATA) 24*73b01e57SJeff Chen wol->wolopts |= WAKE_MCAST; 25*73b01e57SJeff Chen if (conditions & HS_CFG_COND_BROADCAST_DATA) 26*73b01e57SJeff Chen wol->wolopts |= WAKE_BCAST; 27*73b01e57SJeff Chen if (conditions & HS_CFG_COND_MAC_EVENT) 28*73b01e57SJeff Chen wol->wolopts |= WAKE_PHY; 29*73b01e57SJeff Chen } 30*73b01e57SJeff Chen nxpwifi_ethtool_set_wol(struct net_device * dev,struct ethtool_wolinfo * wol)31*73b01e57SJeff Chenstatic int nxpwifi_ethtool_set_wol(struct net_device *dev, 32*73b01e57SJeff Chen struct ethtool_wolinfo *wol) 33*73b01e57SJeff Chen { 34*73b01e57SJeff Chen struct nxpwifi_private *priv = nxpwifi_netdev_get_priv(dev); 35*73b01e57SJeff Chen u32 conditions = 0; 36*73b01e57SJeff Chen 37*73b01e57SJeff Chen if (wol->wolopts & ~(WAKE_UCAST | WAKE_MCAST | WAKE_BCAST | WAKE_PHY)) 38*73b01e57SJeff Chen return -EOPNOTSUPP; 39*73b01e57SJeff Chen 40*73b01e57SJeff Chen if (wol->wolopts & WAKE_UCAST) 41*73b01e57SJeff Chen conditions |= HS_CFG_COND_UNICAST_DATA; 42*73b01e57SJeff Chen if (wol->wolopts & WAKE_MCAST) 43*73b01e57SJeff Chen conditions |= HS_CFG_COND_MULTICAST_DATA; 44*73b01e57SJeff Chen if (wol->wolopts & WAKE_BCAST) 45*73b01e57SJeff Chen conditions |= HS_CFG_COND_BROADCAST_DATA; 46*73b01e57SJeff Chen if (wol->wolopts & WAKE_PHY) 47*73b01e57SJeff Chen conditions |= HS_CFG_COND_MAC_EVENT; 48*73b01e57SJeff Chen if (wol->wolopts == 0) 49*73b01e57SJeff Chen conditions |= HS_CFG_COND_DEF; 50*73b01e57SJeff Chen priv->adapter->hs_cfg.conditions = cpu_to_le32(conditions); 51*73b01e57SJeff Chen 52*73b01e57SJeff Chen return 0; 53*73b01e57SJeff Chen } 54*73b01e57SJeff Chen 55*73b01e57SJeff Chen const struct ethtool_ops nxpwifi_ethtool_ops = { 56*73b01e57SJeff Chen .get_wol = nxpwifi_ethtool_get_wol, 57*73b01e57SJeff Chen .set_wol = nxpwifi_ethtool_set_wol, 58*73b01e57SJeff Chen }; 59