diff options
author | Johannes Berg <johannes.berg@intel.com> | 2012-10-31 17:21:28 -0400 |
---|---|---|
committer | Johannes Berg <johannes.berg@intel.com> | 2012-11-05 10:12:24 -0500 |
commit | a4dece9abce75332a082340bcc9b176f10484a62 (patch) | |
tree | 72a33b697d8e998ddd3013dcb27a1273fdcb29cf /drivers/net/wireless/iwlwifi/dvm/lib.c | |
parent | 2eb81a40aa521035ff9c8c8309e482dff523f8c9 (diff) |
iwlwifi: fix queue flush confusion
The flush_control parameter to iwlagn_txfifo_flush
is passed as an internal value (context flags) and
then sent to the device, that can't be right.
Fix the confusion by removing the parameter, always
use IWL_DROP_ALL that is redefined according to the
firmware API in the flush control.
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Reviewed-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'drivers/net/wireless/iwlwifi/dvm/lib.c')
-rw-r--r-- | drivers/net/wireless/iwlwifi/dvm/lib.c | 29 |
1 files changed, 14 insertions, 15 deletions
diff --git a/drivers/net/wireless/iwlwifi/dvm/lib.c b/drivers/net/wireless/iwlwifi/dvm/lib.c index 01ff55faf2ab..7e59be4b89b8 100644 --- a/drivers/net/wireless/iwlwifi/dvm/lib.c +++ b/drivers/net/wireless/iwlwifi/dvm/lib.c | |||
@@ -136,7 +136,7 @@ int iwlagn_manage_ibss_station(struct iwl_priv *priv, | |||
136 | * 1. acquire mutex before calling | 136 | * 1. acquire mutex before calling |
137 | * 2. make sure rf is on and not in exit state | 137 | * 2. make sure rf is on and not in exit state |
138 | */ | 138 | */ |
139 | int iwlagn_txfifo_flush(struct iwl_priv *priv, u16 flush_control) | 139 | int iwlagn_txfifo_flush(struct iwl_priv *priv) |
140 | { | 140 | { |
141 | struct iwl_txfifo_flush_cmd flush_cmd; | 141 | struct iwl_txfifo_flush_cmd flush_cmd; |
142 | struct iwl_host_cmd cmd = { | 142 | struct iwl_host_cmd cmd = { |
@@ -146,35 +146,34 @@ int iwlagn_txfifo_flush(struct iwl_priv *priv, u16 flush_control) | |||
146 | .data = { &flush_cmd, }, | 146 | .data = { &flush_cmd, }, |
147 | }; | 147 | }; |
148 | 148 | ||
149 | might_sleep(); | ||
150 | |||
151 | memset(&flush_cmd, 0, sizeof(flush_cmd)); | 149 | memset(&flush_cmd, 0, sizeof(flush_cmd)); |
152 | if (flush_control & BIT(IWL_RXON_CTX_BSS)) | 150 | |
153 | flush_cmd.queue_control = IWL_SCD_VO_MSK | IWL_SCD_VI_MSK | | 151 | flush_cmd.queue_control = IWL_SCD_VO_MSK | IWL_SCD_VI_MSK | |
154 | IWL_SCD_BE_MSK | IWL_SCD_BK_MSK | | 152 | IWL_SCD_BE_MSK | IWL_SCD_BK_MSK | |
155 | IWL_SCD_MGMT_MSK; | 153 | IWL_SCD_MGMT_MSK; |
156 | if ((flush_control & BIT(IWL_RXON_CTX_PAN)) && | 154 | if ((priv->valid_contexts != BIT(IWL_RXON_CTX_BSS))) |
157 | (priv->valid_contexts != BIT(IWL_RXON_CTX_BSS))) | ||
158 | flush_cmd.queue_control |= IWL_PAN_SCD_VO_MSK | | 155 | flush_cmd.queue_control |= IWL_PAN_SCD_VO_MSK | |
159 | IWL_PAN_SCD_VI_MSK | IWL_PAN_SCD_BE_MSK | | 156 | IWL_PAN_SCD_VI_MSK | |
160 | IWL_PAN_SCD_BK_MSK | IWL_PAN_SCD_MGMT_MSK | | 157 | IWL_PAN_SCD_BE_MSK | |
161 | IWL_PAN_SCD_MULTICAST_MSK; | 158 | IWL_PAN_SCD_BK_MSK | |
159 | IWL_PAN_SCD_MGMT_MSK | | ||
160 | IWL_PAN_SCD_MULTICAST_MSK; | ||
162 | 161 | ||
163 | if (priv->eeprom_data->sku & EEPROM_SKU_CAP_11N_ENABLE) | 162 | if (priv->eeprom_data->sku & EEPROM_SKU_CAP_11N_ENABLE) |
164 | flush_cmd.queue_control |= IWL_AGG_TX_QUEUE_MSK; | 163 | flush_cmd.queue_control |= IWL_AGG_TX_QUEUE_MSK; |
165 | 164 | ||
166 | IWL_DEBUG_INFO(priv, "queue control: 0x%x\n", | 165 | IWL_DEBUG_INFO(priv, "queue control: 0x%x\n", |
167 | flush_cmd.queue_control); | 166 | flush_cmd.queue_control); |
168 | flush_cmd.flush_control = cpu_to_le16(flush_control); | 167 | flush_cmd.flush_control = cpu_to_le16(IWL_DROP_ALL); |
169 | 168 | ||
170 | return iwl_dvm_send_cmd(priv, &cmd); | 169 | return iwl_dvm_send_cmd(priv, &cmd); |
171 | } | 170 | } |
172 | 171 | ||
173 | void iwlagn_dev_txfifo_flush(struct iwl_priv *priv, u16 flush_control) | 172 | void iwlagn_dev_txfifo_flush(struct iwl_priv *priv) |
174 | { | 173 | { |
175 | mutex_lock(&priv->mutex); | 174 | mutex_lock(&priv->mutex); |
176 | ieee80211_stop_queues(priv->hw); | 175 | ieee80211_stop_queues(priv->hw); |
177 | if (iwlagn_txfifo_flush(priv, IWL_DROP_ALL)) { | 176 | if (iwlagn_txfifo_flush(priv)) { |
178 | IWL_ERR(priv, "flush request fail\n"); | 177 | IWL_ERR(priv, "flush request fail\n"); |
179 | goto done; | 178 | goto done; |
180 | } | 179 | } |