ethtool.c 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * NXP Wireless LAN device driver: ethtool
  4. *
  5. * Copyright 2011-2020 NXP
  6. */
  7. #include "main.h"
  8. static void mwifiex_ethtool_get_wol(struct net_device *dev,
  9. struct ethtool_wolinfo *wol)
  10. {
  11. struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev);
  12. u32 conditions = le32_to_cpu(priv->adapter->hs_cfg.conditions);
  13. wol->supported = WAKE_UCAST|WAKE_MCAST|WAKE_BCAST|WAKE_PHY;
  14. if (conditions == HS_CFG_COND_DEF)
  15. return;
  16. if (conditions & HS_CFG_COND_UNICAST_DATA)
  17. wol->wolopts |= WAKE_UCAST;
  18. if (conditions & HS_CFG_COND_MULTICAST_DATA)
  19. wol->wolopts |= WAKE_MCAST;
  20. if (conditions & HS_CFG_COND_BROADCAST_DATA)
  21. wol->wolopts |= WAKE_BCAST;
  22. if (conditions & HS_CFG_COND_MAC_EVENT)
  23. wol->wolopts |= WAKE_PHY;
  24. }
  25. static int mwifiex_ethtool_set_wol(struct net_device *dev,
  26. struct ethtool_wolinfo *wol)
  27. {
  28. struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev);
  29. u32 conditions = 0;
  30. if (wol->wolopts & ~(WAKE_UCAST|WAKE_MCAST|WAKE_BCAST|WAKE_PHY))
  31. return -EOPNOTSUPP;
  32. if (wol->wolopts & WAKE_UCAST)
  33. conditions |= HS_CFG_COND_UNICAST_DATA;
  34. if (wol->wolopts & WAKE_MCAST)
  35. conditions |= HS_CFG_COND_MULTICAST_DATA;
  36. if (wol->wolopts & WAKE_BCAST)
  37. conditions |= HS_CFG_COND_BROADCAST_DATA;
  38. if (wol->wolopts & WAKE_PHY)
  39. conditions |= HS_CFG_COND_MAC_EVENT;
  40. if (wol->wolopts == 0)
  41. conditions |= HS_CFG_COND_DEF;
  42. priv->adapter->hs_cfg.conditions = cpu_to_le32(conditions);
  43. return 0;
  44. }
  45. const struct ethtool_ops mwifiex_ethtool_ops = {
  46. .get_wol = mwifiex_ethtool_get_wol,
  47. .set_wol = mwifiex_ethtool_set_wol,
  48. };