|
@@ -2376,6 +2376,11 @@ static int ieee80211_set_wiphy_params(struct wiphy *wiphy, u32 changed)
|
|
|
(WIPHY_PARAM_RETRY_SHORT | WIPHY_PARAM_RETRY_LONG))
|
|
|
ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_RETRY_LIMITS);
|
|
|
|
|
|
+ if (changed & (WIPHY_PARAM_TXQ_LIMIT |
|
|
|
+ WIPHY_PARAM_TXQ_MEMORY_LIMIT |
|
|
|
+ WIPHY_PARAM_TXQ_QUANTUM))
|
|
|
+ ieee80211_txq_set_params(local);
|
|
|
+
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -3705,6 +3710,99 @@ static int ieee80211_set_multicast_to_unicast(struct wiphy *wiphy,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+void ieee80211_fill_txq_stats(struct cfg80211_txq_stats *txqstats,
|
|
|
+ struct txq_info *txqi)
|
|
|
+{
|
|
|
+ if (!(txqstats->filled & BIT(NL80211_TXQ_STATS_BACKLOG_BYTES))) {
|
|
|
+ txqstats->filled |= BIT(NL80211_TXQ_STATS_BACKLOG_BYTES);
|
|
|
+ txqstats->backlog_bytes = txqi->tin.backlog_bytes;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!(txqstats->filled & BIT(NL80211_TXQ_STATS_BACKLOG_PACKETS))) {
|
|
|
+ txqstats->filled |= BIT(NL80211_TXQ_STATS_BACKLOG_PACKETS);
|
|
|
+ txqstats->backlog_packets = txqi->tin.backlog_packets;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!(txqstats->filled & BIT(NL80211_TXQ_STATS_FLOWS))) {
|
|
|
+ txqstats->filled |= BIT(NL80211_TXQ_STATS_FLOWS);
|
|
|
+ txqstats->flows = txqi->tin.flows;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!(txqstats->filled & BIT(NL80211_TXQ_STATS_DROPS))) {
|
|
|
+ txqstats->filled |= BIT(NL80211_TXQ_STATS_DROPS);
|
|
|
+ txqstats->drops = txqi->cstats.drop_count;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!(txqstats->filled & BIT(NL80211_TXQ_STATS_ECN_MARKS))) {
|
|
|
+ txqstats->filled |= BIT(NL80211_TXQ_STATS_ECN_MARKS);
|
|
|
+ txqstats->ecn_marks = txqi->cstats.ecn_mark;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!(txqstats->filled & BIT(NL80211_TXQ_STATS_OVERLIMIT))) {
|
|
|
+ txqstats->filled |= BIT(NL80211_TXQ_STATS_OVERLIMIT);
|
|
|
+ txqstats->overlimit = txqi->tin.overlimit;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!(txqstats->filled & BIT(NL80211_TXQ_STATS_COLLISIONS))) {
|
|
|
+ txqstats->filled |= BIT(NL80211_TXQ_STATS_COLLISIONS);
|
|
|
+ txqstats->collisions = txqi->tin.collisions;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!(txqstats->filled & BIT(NL80211_TXQ_STATS_TX_BYTES))) {
|
|
|
+ txqstats->filled |= BIT(NL80211_TXQ_STATS_TX_BYTES);
|
|
|
+ txqstats->tx_bytes = txqi->tin.tx_bytes;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!(txqstats->filled & BIT(NL80211_TXQ_STATS_TX_PACKETS))) {
|
|
|
+ txqstats->filled |= BIT(NL80211_TXQ_STATS_TX_PACKETS);
|
|
|
+ txqstats->tx_packets = txqi->tin.tx_packets;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+static int ieee80211_get_txq_stats(struct wiphy *wiphy,
|
|
|
+ struct wireless_dev *wdev,
|
|
|
+ struct cfg80211_txq_stats *txqstats)
|
|
|
+{
|
|
|
+ struct ieee80211_local *local = wiphy_priv(wiphy);
|
|
|
+ struct ieee80211_sub_if_data *sdata;
|
|
|
+ int ret = 0;
|
|
|
+
|
|
|
+ if (!local->ops->wake_tx_queue)
|
|
|
+ return 1;
|
|
|
+
|
|
|
+ spin_lock_bh(&local->fq.lock);
|
|
|
+ rcu_read_lock();
|
|
|
+
|
|
|
+ if (wdev) {
|
|
|
+ sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
|
|
|
+ if (!sdata->vif.txq) {
|
|
|
+ ret = 1;
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+ ieee80211_fill_txq_stats(txqstats, to_txq_info(sdata->vif.txq));
|
|
|
+ } else {
|
|
|
+ /* phy stats */
|
|
|
+ txqstats->filled |= BIT(NL80211_TXQ_STATS_BACKLOG_PACKETS) |
|
|
|
+ BIT(NL80211_TXQ_STATS_BACKLOG_BYTES) |
|
|
|
+ BIT(NL80211_TXQ_STATS_OVERLIMIT) |
|
|
|
+ BIT(NL80211_TXQ_STATS_OVERMEMORY) |
|
|
|
+ BIT(NL80211_TXQ_STATS_COLLISIONS) |
|
|
|
+ BIT(NL80211_TXQ_STATS_MAX_FLOWS);
|
|
|
+ txqstats->backlog_packets = local->fq.backlog;
|
|
|
+ txqstats->backlog_bytes = local->fq.memory_usage;
|
|
|
+ txqstats->overlimit = local->fq.overlimit;
|
|
|
+ txqstats->overmemory = local->fq.overmemory;
|
|
|
+ txqstats->collisions = local->fq.collisions;
|
|
|
+ txqstats->max_flows = local->fq.flows_cnt;
|
|
|
+ }
|
|
|
+
|
|
|
+out:
|
|
|
+ rcu_read_unlock();
|
|
|
+ spin_unlock_bh(&local->fq.lock);
|
|
|
+
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
const struct cfg80211_ops mac80211_config_ops = {
|
|
|
.add_virtual_intf = ieee80211_add_iface,
|
|
|
.del_virtual_intf = ieee80211_del_iface,
|
|
@@ -3798,4 +3896,5 @@ const struct cfg80211_ops mac80211_config_ops = {
|
|
|
.del_nan_func = ieee80211_del_nan_func,
|
|
|
.set_multicast_to_unicast = ieee80211_set_multicast_to_unicast,
|
|
|
.tx_control_port = ieee80211_tx_control_port,
|
|
|
+ .get_txq_stats = ieee80211_get_txq_stats,
|
|
|
};
|