mac80211: save tx params per sdata
authorEliad Peller <eliad@wizery.com>
Sun, 25 Sep 2011 17:06:54 +0000 (20:06 +0300)
committerJohn W. Linville <linville@tuxdriver.com>
Tue, 27 Sep 2011 18:34:11 +0000 (14:34 -0400)
save and configure tx param per sdata, rather than
per hardware.

Signed-off-by: Eliad Peller <eliad@wizery.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
net/mac80211/cfg.c
net/mac80211/driver-ops.h
net/mac80211/driver-trace.h
net/mac80211/ieee80211_i.h
net/mac80211/mlme.c
net/mac80211/util.c

index 726fb88..8fef3cd 100644 (file)
@@ -1275,6 +1275,7 @@ static int ieee80211_set_txq_params(struct wiphy *wiphy,
                                    struct ieee80211_txq_params *params)
 {
        struct ieee80211_local *local = wiphy_priv(wiphy);
+       struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
        struct ieee80211_tx_queue_params p;
 
        if (!local->ops->conf_tx)
@@ -1295,8 +1296,8 @@ static int ieee80211_set_txq_params(struct wiphy *wiphy,
        if (params->queue >= local->hw.queues)
                return -EINVAL;
 
-       local->tx_conf[params->queue] = p;
-       if (drv_conf_tx(local, params->queue, &p)) {
+       sdata->tx_conf[params->queue] = p;
+       if (drv_conf_tx(local, sdata, params->queue, &p)) {
                wiphy_debug(local->hw.wiphy,
                            "failed to set TX queue parameters for queue %d\n",
                            params->queue);
index 5e5d973..4f845c0 100644 (file)
@@ -413,14 +413,15 @@ static inline void drv_sta_remove(struct ieee80211_local *local,
        trace_drv_return_void(local);
 }
 
-static inline int drv_conf_tx(struct ieee80211_local *local, u16 queue,
+static inline int drv_conf_tx(struct ieee80211_local *local,
+                             struct ieee80211_sub_if_data *sdata, u16 queue,
                              const struct ieee80211_tx_queue_params *params)
 {
        int ret = -EOPNOTSUPP;
 
        might_sleep();
 
-       trace_drv_conf_tx(local, queue, params);
+       trace_drv_conf_tx(local, sdata, queue, params);
        if (local->ops->conf_tx)
                ret = local->ops->conf_tx(&local->hw, queue, params);
        trace_drv_return_int(local, ret);
index 07d94ff..a46b279 100644 (file)
@@ -697,32 +697,38 @@ TRACE_EVENT(drv_sta_remove,
 );
 
 TRACE_EVENT(drv_conf_tx,
-       TP_PROTO(struct ieee80211_local *local, u16 queue,
+       TP_PROTO(struct ieee80211_local *local,
+                struct ieee80211_sub_if_data *sdata,
+                u16 queue,
                 const struct ieee80211_tx_queue_params *params),
 
-       TP_ARGS(local, queue, params),
+       TP_ARGS(local, sdata, queue, params),
 
        TP_STRUCT__entry(
                LOCAL_ENTRY
+               VIF_ENTRY
                __field(u16, queue)
                __field(u16, txop)
                __field(u16, cw_min)
                __field(u16, cw_max)
                __field(u8, aifs)
+               __field(bool, uapsd)
        ),
 
        TP_fast_assign(
                LOCAL_ASSIGN;
+               VIF_ASSIGN;
                __entry->queue = queue;
                __entry->txop = params->txop;
                __entry->cw_max = params->cw_max;
                __entry->cw_min = params->cw_min;
                __entry->aifs = params->aifs;
+               __entry->uapsd = params->uapsd;
        ),
 
        TP_printk(
-               LOCAL_PR_FMT " queue:%d",
-               LOCAL_PR_ARG, __entry->queue
+               LOCAL_PR_FMT  VIF_PR_FMT  " queue:%d",
+               LOCAL_PR_ARG, VIF_PR_ARG, __entry->queue
        )
 );
 
index 4822d69..5cadcbb 100644 (file)
@@ -609,6 +609,8 @@ struct ieee80211_sub_if_data {
        __be16 control_port_protocol;
        bool control_port_no_encrypt;
 
+       struct ieee80211_tx_queue_params tx_conf[IEEE80211_MAX_QUEUES];
+
        struct work_struct work;
        struct sk_buff_head skb_queue;
 
@@ -751,7 +753,6 @@ struct ieee80211_local {
        struct workqueue_struct *workqueue;
 
        unsigned long queue_stop_reasons[IEEE80211_MAX_QUEUES];
-       struct ieee80211_tx_queue_params tx_conf[IEEE80211_MAX_QUEUES];
        /* also used to protect ampdu_ac_queue and amdpu_ac_stop_refcnt */
        spinlock_t queue_stop_reason_lock;
 
index cc80d32..cd37a4e 100644 (file)
@@ -936,8 +936,8 @@ static void ieee80211_sta_wmm_params(struct ieee80211_local *local,
                            params.aifs, params.cw_min, params.cw_max,
                            params.txop, params.uapsd);
 #endif
-               local->tx_conf[queue] = params;
-               if (drv_conf_tx(local, queue, &params))
+               sdata->tx_conf[queue] = params;
+               if (drv_conf_tx(local, sdata, queue, &params))
                        wiphy_debug(local->hw.wiphy,
                                    "failed to set TX queue parameters for queue %d\n",
                                    queue);
index ead345d..2c9dc36 100644 (file)
@@ -632,8 +632,8 @@ void ieee80211_set_wmm_default(struct ieee80211_sub_if_data *sdata)
 
                qparam.uapsd = false;
 
-               local->tx_conf[queue] = qparam;
-               drv_conf_tx(local, queue, &qparam);
+               sdata->tx_conf[queue] = qparam;
+               drv_conf_tx(local, sdata, queue, &qparam);
        }
 
        /* after reinitialize QoS TX queues setting to default,
@@ -1044,8 +1044,15 @@ int ieee80211_reconfig(struct ieee80211_local *local)
        mutex_unlock(&local->sta_mtx);
 
        /* reconfigure tx conf */
-       for (i = 0; i < hw->queues; i++)
-               drv_conf_tx(local, i, &local->tx_conf[i]);
+       list_for_each_entry(sdata, &local->interfaces, list) {
+               if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN ||
+                   sdata->vif.type == NL80211_IFTYPE_MONITOR ||
+                   !ieee80211_sdata_running(sdata))
+                       continue;
+
+               for (i = 0; i < hw->queues; i++)
+                       drv_conf_tx(local, sdata, i, &sdata->tx_conf[i]);
+       }
 
        /* reconfigure hardware */
        ieee80211_hw_config(local, ~0);