@@ -3361,6 +3361,8 @@ enum ieee80211_reconfig_type {
*
* @get_et_stats: Ethtool API to get a set of u64 stats.
*
+ * @get_et_stats2: Ethtool API to get a set of u64 stats, with flags.
+ *
* @get_et_strings: Ethtool API to get a set of strings to describe stats
* and perhaps other supported types of ethtool data-sets.
*
@@ -3692,6 +3694,10 @@ struct ieee80211_ops {
void (*get_et_stats)(struct ieee80211_hw *hw,
struct ieee80211_vif *vif,
struct ethtool_stats *stats, u64 *data);
+ void (*get_et_stats2)(struct ieee80211_hw *hw,
+ struct ieee80211_vif *vif,
+ struct ethtool_stats *stats, u64 *data,
+ u32 flags);
void (*get_et_strings)(struct ieee80211_hw *hw,
struct ieee80211_vif *vif,
u32 sset, u8 *data);
@@ -58,10 +58,15 @@ static inline void drv_get_et_strings(struct ieee80211_sub_if_data *sdata,
static inline void drv_get_et_stats(struct ieee80211_sub_if_data *sdata,
struct ethtool_stats *stats,
- u64 *data)
+ u64 *data, u32 flags)
{
struct ieee80211_local *local = sdata->local;
- if (local->ops->get_et_stats) {
+ if (local->ops->get_et_stats2) {
+ trace_drv_get_et_stats(local);
+ local->ops->get_et_stats2(&local->hw, &sdata->vif, stats, data,
+ flags);
+ trace_drv_return_void(local);
+ } else if (local->ops->get_et_stats) {
trace_drv_get_et_stats(local);
local->ops->get_et_stats(&local->hw, &sdata->vif, stats, data);
trace_drv_return_void(local);
@@ -61,9 +61,9 @@ static int ieee80211_get_sset_count(struct net_device *dev, int sset)
return rv;
}
-static void ieee80211_get_stats(struct net_device *dev,
- struct ethtool_stats *stats,
- u64 *data)
+static void ieee80211_get_stats2(struct net_device *dev,
+ struct ethtool_stats *stats,
+ u64 *data, u32 flags)
{
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
struct ieee80211_chanctx_conf *chanctx_conf;
@@ -199,7 +199,14 @@ static void ieee80211_get_stats(struct net_device *dev,
if (WARN_ON(i != STA_STATS_LEN))
return;
- drv_get_et_stats(sdata, stats, &(data[STA_STATS_LEN]));
+ drv_get_et_stats(sdata, stats, &data[STA_STATS_LEN], flags);
+}
+
+static void ieee80211_get_stats(struct net_device *dev,
+ struct ethtool_stats *stats,
+ u64 *data)
+{
+ ieee80211_get_stats2(dev, stats, data, 0);
}
static void ieee80211_get_strings(struct net_device *dev, u32 sset, u8 *data)
@@ -211,7 +218,7 @@ static void ieee80211_get_strings(struct net_device *dev, u32 sset, u8 *data)
sz_sta_stats = sizeof(ieee80211_gstrings_sta_stats);
memcpy(data, ieee80211_gstrings_sta_stats, sz_sta_stats);
}
- drv_get_et_strings(sdata, sset, &(data[sz_sta_stats]));
+ drv_get_et_strings(sdata, sset, &data[sz_sta_stats]);
}
static int ieee80211_get_regs_len(struct net_device *dev)
@@ -238,5 +245,6 @@ const struct ethtool_ops ieee80211_ethtool_ops = {
.set_ringparam = ieee80211_set_ringparam,
.get_strings = ieee80211_get_strings,
.get_ethtool_stats = ieee80211_get_stats,
+ .get_ethtool_stats2 = ieee80211_get_stats2,
.get_sset_count = ieee80211_get_sset_count,
};