aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/iwlwifi/dvm
diff options
context:
space:
mode:
authorJohannes Berg <johannes.berg@intel.com>2012-10-31 17:21:28 -0400
committerJohannes Berg <johannes.berg@intel.com>2012-11-05 10:12:24 -0500
commita4dece9abce75332a082340bcc9b176f10484a62 (patch)
tree72a33b697d8e998ddd3013dcb27a1273fdcb29cf /drivers/net/wireless/iwlwifi/dvm
parent2eb81a40aa521035ff9c8c8309e482dff523f8c9 (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')
-rw-r--r--drivers/net/wireless/iwlwifi/dvm/agn.h4
-rw-r--r--drivers/net/wireless/iwlwifi/dvm/commands.h3
-rw-r--r--drivers/net/wireless/iwlwifi/dvm/debugfs.c2
-rw-r--r--drivers/net/wireless/iwlwifi/dvm/lib.c29
-rw-r--r--drivers/net/wireless/iwlwifi/dvm/mac80211.c2
-rw-r--r--drivers/net/wireless/iwlwifi/dvm/main.c2
6 files changed, 20 insertions, 22 deletions
diff --git a/drivers/net/wireless/iwlwifi/dvm/agn.h b/drivers/net/wireless/iwlwifi/dvm/agn.h
index 75e12f29d9eb..33b3ad2e546b 100644
--- a/drivers/net/wireless/iwlwifi/dvm/agn.h
+++ b/drivers/net/wireless/iwlwifi/dvm/agn.h
@@ -176,8 +176,8 @@ int iwlagn_hw_valid_rtc_data_addr(u32 addr);
176/* lib */ 176/* lib */
177int iwlagn_send_tx_power(struct iwl_priv *priv); 177int iwlagn_send_tx_power(struct iwl_priv *priv);
178void iwlagn_temperature(struct iwl_priv *priv); 178void iwlagn_temperature(struct iwl_priv *priv);
179int iwlagn_txfifo_flush(struct iwl_priv *priv, u16 flush_control); 179int iwlagn_txfifo_flush(struct iwl_priv *priv);
180void iwlagn_dev_txfifo_flush(struct iwl_priv *priv, u16 flush_control); 180void iwlagn_dev_txfifo_flush(struct iwl_priv *priv);
181int iwlagn_send_beacon_cmd(struct iwl_priv *priv); 181int iwlagn_send_beacon_cmd(struct iwl_priv *priv);
182int iwl_send_statistics_request(struct iwl_priv *priv, 182int iwl_send_statistics_request(struct iwl_priv *priv,
183 u8 flags, bool clear); 183 u8 flags, bool clear);
diff --git a/drivers/net/wireless/iwlwifi/dvm/commands.h b/drivers/net/wireless/iwlwifi/dvm/commands.h
index ac24861f04ad..71ab76b2b39d 100644
--- a/drivers/net/wireless/iwlwifi/dvm/commands.h
+++ b/drivers/net/wireless/iwlwifi/dvm/commands.h
@@ -986,8 +986,7 @@ struct iwl_rem_sta_cmd {
986 986
987#define IWL_AGG_TX_QUEUE_MSK cpu_to_le32(0xffc00) 987#define IWL_AGG_TX_QUEUE_MSK cpu_to_le32(0xffc00)
988 988
989#define IWL_DROP_SINGLE 0 989#define IWL_DROP_ALL BIT(1)
990#define IWL_DROP_ALL (BIT(IWL_RXON_CTX_BSS) | BIT(IWL_RXON_CTX_PAN))
991 990
992/* 991/*
993 * REPLY_TXFIFO_FLUSH = 0x1e(command and response) 992 * REPLY_TXFIFO_FLUSH = 0x1e(command and response)
diff --git a/drivers/net/wireless/iwlwifi/dvm/debugfs.c b/drivers/net/wireless/iwlwifi/dvm/debugfs.c
index 1a98fa3ab06d..769a08bca86f 100644
--- a/drivers/net/wireless/iwlwifi/dvm/debugfs.c
+++ b/drivers/net/wireless/iwlwifi/dvm/debugfs.c
@@ -2101,7 +2101,7 @@ static ssize_t iwl_dbgfs_txfifo_flush_write(struct file *file,
2101 if (iwl_is_rfkill(priv)) 2101 if (iwl_is_rfkill(priv))
2102 return -EFAULT; 2102 return -EFAULT;
2103 2103
2104 iwlagn_dev_txfifo_flush(priv, IWL_DROP_ALL); 2104 iwlagn_dev_txfifo_flush(priv);
2105 2105
2106 return count; 2106 return count;
2107} 2107}
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 */
139int iwlagn_txfifo_flush(struct iwl_priv *priv, u16 flush_control) 139int 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
173void iwlagn_dev_txfifo_flush(struct iwl_priv *priv, u16 flush_control) 172void 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 }
diff --git a/drivers/net/wireless/iwlwifi/dvm/mac80211.c b/drivers/net/wireless/iwlwifi/dvm/mac80211.c
index 46b0d1c46529..cb443d54f9b9 100644
--- a/drivers/net/wireless/iwlwifi/dvm/mac80211.c
+++ b/drivers/net/wireless/iwlwifi/dvm/mac80211.c
@@ -1017,7 +1017,7 @@ static void iwlagn_mac_flush(struct ieee80211_hw *hw, bool drop)
1017 */ 1017 */
1018 if (drop) { 1018 if (drop) {
1019 IWL_DEBUG_MAC80211(priv, "send flush command\n"); 1019 IWL_DEBUG_MAC80211(priv, "send flush command\n");
1020 if (iwlagn_txfifo_flush(priv, IWL_DROP_ALL)) { 1020 if (iwlagn_txfifo_flush(priv)) {
1021 IWL_ERR(priv, "flush request fail\n"); 1021 IWL_ERR(priv, "flush request fail\n");
1022 goto done; 1022 goto done;
1023 } 1023 }
diff --git a/drivers/net/wireless/iwlwifi/dvm/main.c b/drivers/net/wireless/iwlwifi/dvm/main.c
index 4547f36bcc6c..95d348b02846 100644
--- a/drivers/net/wireless/iwlwifi/dvm/main.c
+++ b/drivers/net/wireless/iwlwifi/dvm/main.c
@@ -511,7 +511,7 @@ static void iwl_bg_tx_flush(struct work_struct *work)
511 return; 511 return;
512 512
513 IWL_DEBUG_INFO(priv, "device request: flush all tx frames\n"); 513 IWL_DEBUG_INFO(priv, "device request: flush all tx frames\n");
514 iwlagn_dev_txfifo_flush(priv, IWL_DROP_ALL); 514 iwlagn_dev_txfifo_flush(priv);
515} 515}
516 516
517/* 517/*