xref: /linux/drivers/net/wireless/nxp/nxpwifi/ethtool.c (revision 91ec2035134982b98fab0609a9fd8480e8217dc1)
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 Chen static 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 Chen static 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