Commit 3677713b799155c96637cdef3fa025e42f3fcf48
1 parent
266af4c745
Exists in
master
and in
7 other branches
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 | }; |