1 #include <linux/utsname.h>
2 #include <net/cfg80211.h>
6 static void cfg80211_get_drvinfo(struct net_device
*dev
,
7 struct ethtool_drvinfo
*info
)
9 struct wireless_dev
*wdev
= dev
->ieee80211_ptr
;
11 strlcpy(info
->driver
, wiphy_dev(wdev
->wiphy
)->driver
->name
,
12 sizeof(info
->driver
));
14 strlcpy(info
->version
, init_utsname()->release
, sizeof(info
->version
));
16 if (wdev
->wiphy
->fw_version
[0])
17 strncpy(info
->fw_version
, wdev
->wiphy
->fw_version
,
18 sizeof(info
->fw_version
));
20 strncpy(info
->fw_version
, "N/A", sizeof(info
->fw_version
));
22 strlcpy(info
->bus_info
, dev_name(wiphy_dev(wdev
->wiphy
)),
23 sizeof(info
->bus_info
));
26 static int cfg80211_get_regs_len(struct net_device
*dev
)
28 /* For now, return 0... */
32 static void cfg80211_get_regs(struct net_device
*dev
, struct ethtool_regs
*regs
,
35 struct wireless_dev
*wdev
= dev
->ieee80211_ptr
;
37 regs
->version
= wdev
->wiphy
->hw_version
;
41 static void cfg80211_get_ringparam(struct net_device
*dev
,
42 struct ethtool_ringparam
*rp
)
44 struct wireless_dev
*wdev
= dev
->ieee80211_ptr
;
45 struct cfg80211_registered_device
*rdev
= wiphy_to_dev(wdev
->wiphy
);
47 memset(rp
, 0, sizeof(*rp
));
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
);
55 static int cfg80211_set_ringparam(struct net_device
*dev
,
56 struct ethtool_ringparam
*rp
)
58 struct wireless_dev
*wdev
= dev
->ieee80211_ptr
;
59 struct cfg80211_registered_device
*rdev
= wiphy_to_dev(wdev
->wiphy
);
61 if (rp
->rx_mini_pending
!= 0 || rp
->rx_jumbo_pending
!= 0)
64 if (rdev
->ops
->set_ringparam
)
65 return rdev
->ops
->set_ringparam(wdev
->wiphy
,
66 rp
->tx_pending
, rp
->rx_pending
);
71 static int cfg80211_get_sset_count(struct net_device
*dev
, int sset
)
73 struct wireless_dev
*wdev
= dev
->ieee80211_ptr
;
74 struct cfg80211_registered_device
*rdev
= wiphy_to_dev(wdev
->wiphy
);
75 if (rdev
->ops
->get_et_sset_count
)
76 return rdev
->ops
->get_et_sset_count(wdev
->wiphy
, dev
, sset
);
80 static void cfg80211_get_stats(struct net_device
*dev
,
81 struct ethtool_stats
*stats
, u64
*data
)
83 struct wireless_dev
*wdev
= dev
->ieee80211_ptr
;
84 struct cfg80211_registered_device
*rdev
= wiphy_to_dev(wdev
->wiphy
);
85 if (rdev
->ops
->get_et_stats
)
86 rdev
->ops
->get_et_stats(wdev
->wiphy
, dev
, stats
, data
);
89 static void cfg80211_get_strings(struct net_device
*dev
, u32 sset
, u8
*data
)
91 struct wireless_dev
*wdev
= dev
->ieee80211_ptr
;
92 struct cfg80211_registered_device
*rdev
= wiphy_to_dev(wdev
->wiphy
);
93 if (rdev
->ops
->get_et_strings
)
94 rdev
->ops
->get_et_strings(wdev
->wiphy
, dev
, sset
, data
);
97 const struct ethtool_ops cfg80211_ethtool_ops
= {
98 .get_drvinfo
= cfg80211_get_drvinfo
,
99 .get_regs_len
= cfg80211_get_regs_len
,
100 .get_regs
= cfg80211_get_regs
,
101 .get_link
= ethtool_op_get_link
,
102 .get_ringparam
= cfg80211_get_ringparam
,
103 .set_ringparam
= cfg80211_set_ringparam
,
104 .get_strings
= cfg80211_get_strings
,
105 .get_ethtool_stats
= cfg80211_get_stats
,
106 .get_sset_count
= cfg80211_get_sset_count
,