iwlwifi: mvm: assign cab queue to the correct station
authorSara Sharon <sara.sharon@intel.com>
Thu, 6 Oct 2016 13:42:32 +0000 (16:42 +0300)
committerLuca Coelho <luciano.coelho@intel.com>
Wed, 19 Oct 2016 09:46:35 +0000 (12:46 +0300)
Currently when configuring the cab queue the scheduler is configured
without station id - which results in station id 0.
In DQA mode this causes firmware to assert later on when the actual
station 0 is added with an empty tfd_queue_mask.
Fix that by configuring the queue to the broadcast station.
This is a bit trickier since the queue should not be included in the
tfd_queue_mask of the ADD_STA since it is a multicast queue, and the
tfd_queue_mask is only unicast queue. As a result the queue should be
enabled only after the broadcast station is added.

Signed-off-by: Sara Sharon <sara.sharon@intel.com>
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
drivers/net/wireless/intel/iwlwifi/mvm/mac-ctxt.c
drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c

index 9a91203195102d86681e2fa244c46b228fcbe0f2..4a0874e4073169632e45b8e09e9a3ff98343594e 100644 (file)
@@ -499,23 +499,21 @@ int iwl_mvm_mac_ctxt_init(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
        if (ret)
                return ret;
 
+       /* If DQA is supported - queues will be enabled when needed */
+       if (iwl_mvm_is_dqa_supported(mvm))
+               return 0;
+
        switch (vif->type) {
        case NL80211_IFTYPE_P2P_DEVICE:
-               if (!iwl_mvm_is_dqa_supported(mvm))
-                       iwl_mvm_enable_ac_txq(mvm, IWL_MVM_OFFCHANNEL_QUEUE,
-                                             IWL_MVM_OFFCHANNEL_QUEUE,
-                                             IWL_MVM_TX_FIFO_VO, 0,
-                                             wdg_timeout);
+               iwl_mvm_enable_ac_txq(mvm, IWL_MVM_OFFCHANNEL_QUEUE,
+                                     IWL_MVM_OFFCHANNEL_QUEUE,
+                                     IWL_MVM_TX_FIFO_VO, 0, wdg_timeout);
                break;
        case NL80211_IFTYPE_AP:
                iwl_mvm_enable_ac_txq(mvm, vif->cab_queue, vif->cab_queue,
                                      IWL_MVM_TX_FIFO_MCAST, 0, wdg_timeout);
                /* fall through */
        default:
-               /* If DQA is supported - queues will be enabled when needed */
-               if (iwl_mvm_is_dqa_supported(mvm))
-                       break;
-
                for (ac = 0; ac < IEEE80211_NUM_ACS; ac++)
                        iwl_mvm_enable_ac_txq(mvm, vif->hw_queue[ac],
                                              vif->hw_queue[ac],
index 9eeb2c36bbc1fd3710040bbb677ee518c0d1d5d0..4f8c1347aa23fdf132ebe3a2638f6aa0cc9cc79f 100644 (file)
@@ -2099,6 +2099,22 @@ static int iwl_mvm_start_ap_ibss(struct ieee80211_hw *hw,
        if (ret)
                goto out_unbind;
 
+       /* enable the multicast queue, now that we have a station for it */
+       if (iwl_mvm_is_dqa_supported(mvm)) {
+               unsigned int wdg_timeout =
+                       iwl_mvm_get_wd_timeout(mvm, vif, false, false);
+               struct iwl_trans_txq_scd_cfg cfg = {
+                       .fifo = IWL_MVM_TX_FIFO_MCAST,
+                       .sta_id = mvmvif->bcast_sta.sta_id,
+                       .tid = IWL_MAX_TID_COUNT,
+                       .aggregate = false,
+                       .frame_limit = IWL_FRAME_LIMIT,
+               };
+
+               iwl_mvm_enable_txq(mvm, vif->cab_queue, vif->cab_queue, 0,
+                                  &cfg, wdg_timeout);
+       }
+
        /* must be set before quota calculations */
        mvmvif->ap_ibss_active = true;