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 | |
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>
-rw-r--r-- | drivers/net/wireless/iwlwifi/dvm/agn.h | 4 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/dvm/commands.h | 3 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/dvm/debugfs.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/dvm/lib.c | 29 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/dvm/mac80211.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/dvm/main.c | 2 |
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 */ |
177 | int iwlagn_send_tx_power(struct iwl_priv *priv); | 177 | int iwlagn_send_tx_power(struct iwl_priv *priv); |
178 | void iwlagn_temperature(struct iwl_priv *priv); | 178 | void iwlagn_temperature(struct iwl_priv *priv); |
179 | int iwlagn_txfifo_flush(struct iwl_priv *priv, u16 flush_control); | 179 | int iwlagn_txfifo_flush(struct iwl_priv *priv); |
180 | void iwlagn_dev_txfifo_flush(struct iwl_priv *priv, u16 flush_control); | 180 | void iwlagn_dev_txfifo_flush(struct iwl_priv *priv); |
181 | int iwlagn_send_beacon_cmd(struct iwl_priv *priv); | 181 | int iwlagn_send_beacon_cmd(struct iwl_priv *priv); |
182 | int iwl_send_statistics_request(struct iwl_priv *priv, | 182 | int 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 | */ |
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 | } |
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 | /* |