Commit 3677713b799155c96637cdef3fa025e42f3fcf48

Authored by John W. Linville
1 parent 266af4c745

wireless: add support for ethtool_ops->{get,set}_ringparam

Signed-off-by: John W. Linville <linville@tuxdriver.com>

Showing 2 changed files with 41 additions and 0 deletions Side-by-side Diff

include/net/cfg80211.h
... ... @@ -1197,6 +1197,10 @@
1197 1197 * (also see nl80211.h @NL80211_ATTR_WIPHY_ANTENNA_TX).
1198 1198 *
1199 1199 * @get_antenna: Get current antenna configuration from device (tx_ant, rx_ant).
  1200 + *
  1201 + * @set_ringparam: Set tx and rx ring sizes.
  1202 + *
  1203 + * @get_ringparam: Get tx and rx ring current and maximum sizes.
1200 1204 */
1201 1205 struct cfg80211_ops {
1202 1206 int (*suspend)(struct wiphy *wiphy);
... ... @@ -1364,6 +1368,10 @@
1364 1368  
1365 1369 int (*set_antenna)(struct wiphy *wiphy, u32 tx_ant, u32 rx_ant);
1366 1370 int (*get_antenna)(struct wiphy *wiphy, u32 *tx_ant, u32 *rx_ant);
  1371 +
  1372 + int (*set_ringparam)(struct wiphy *wiphy, u32 tx, u32 rx);
  1373 + void (*get_ringparam)(struct wiphy *wiphy,
  1374 + u32 *tx, u32 *tx_max, u32 *rx, u32 *rx_max);
1367 1375 };
1368 1376  
1369 1377 /*
net/wireless/ethtool.c
1 1 #include <linux/utsname.h>
2 2 #include <net/cfg80211.h>
  3 +#include "core.h"
3 4 #include "ethtool.h"
4 5  
5 6 static void cfg80211_get_drvinfo(struct net_device *dev,
6 7  
... ... @@ -37,10 +38,42 @@
37 38 regs->len = 0;
38 39 }
39 40  
  41 +static void cfg80211_get_ringparam(struct net_device *dev,
  42 + struct ethtool_ringparam *rp)
  43 +{
  44 + struct wireless_dev *wdev = dev->ieee80211_ptr;
  45 + struct cfg80211_registered_device *rdev = wiphy_to_dev(wdev->wiphy);
  46 +
  47 + memset(rp, 0, sizeof(*rp));
  48 +
  49 + if (rdev->ops->get_ringparam)
  50 + rdev->ops->get_ringparam(wdev->wiphy,
  51 + &rp->tx_pending, &rp->tx_max_pending,
  52 + &rp->rx_pending, &rp->rx_max_pending);
  53 +}
  54 +
  55 +static int cfg80211_set_ringparam(struct net_device *dev,
  56 + struct ethtool_ringparam *rp)
  57 +{
  58 + struct wireless_dev *wdev = dev->ieee80211_ptr;
  59 + struct cfg80211_registered_device *rdev = wiphy_to_dev(wdev->wiphy);
  60 +
  61 + if (rp->rx_mini_pending != 0 || rp->rx_jumbo_pending != 0)
  62 + return -EINVAL;
  63 +
  64 + if (rdev->ops->set_ringparam)
  65 + return rdev->ops->set_ringparam(wdev->wiphy,
  66 + rp->tx_pending, rp->rx_pending);
  67 +
  68 + return -ENOTSUPP;
  69 +}
  70 +
40 71 const struct ethtool_ops cfg80211_ethtool_ops = {
41 72 .get_drvinfo = cfg80211_get_drvinfo,
42 73 .get_regs_len = cfg80211_get_regs_len,
43 74 .get_regs = cfg80211_get_regs,
44 75 .get_link = ethtool_op_get_link,
  76 + .get_ringparam = cfg80211_get_ringparam,
  77 + .set_ringparam = cfg80211_set_ringparam,
45 78 };