iwlwifi: fix queue flush confusion
authorJohannes Berg <johannes.berg@intel.com>
Wed, 31 Oct 2012 21:21:28 +0000 (22:21 +0100)
committerJohannes Berg <johannes.berg@intel.com>
Mon, 5 Nov 2012 15:12:24 +0000 (16:12 +0100)
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>
drivers/net/wireless/iwlwifi/dvm/agn.h
drivers/net/wireless/iwlwifi/dvm/commands.h
drivers/net/wireless/iwlwifi/dvm/debugfs.c
drivers/net/wireless/iwlwifi/dvm/lib.c
drivers/net/wireless/iwlwifi/dvm/mac80211.c
drivers/net/wireless/iwlwifi/dvm/main.c

index 75e12f29d9eb7dc0e4a16bb92aa5cd6aa587b062..33b3ad2e546bc9c4fbad24516c2ab1d279888041 100644 (file)
@@ -176,8 +176,8 @@ int iwlagn_hw_valid_rtc_data_addr(u32 addr);
 /* lib */
 int iwlagn_send_tx_power(struct iwl_priv *priv);
 void iwlagn_temperature(struct iwl_priv *priv);
-int iwlagn_txfifo_flush(struct iwl_priv *priv, u16 flush_control);
-void iwlagn_dev_txfifo_flush(struct iwl_priv *priv, u16 flush_control);
+int iwlagn_txfifo_flush(struct iwl_priv *priv);
+void iwlagn_dev_txfifo_flush(struct iwl_priv *priv);
 int iwlagn_send_beacon_cmd(struct iwl_priv *priv);
 int iwl_send_statistics_request(struct iwl_priv *priv,
                                u8 flags, bool clear);
index ac24861f04ad30124d22665cea51bf1f10e6c1b1..71ab76b2b39d18da16518e99b5d36ab90ac87042 100644 (file)
@@ -986,8 +986,7 @@ struct iwl_rem_sta_cmd {
 
 #define IWL_AGG_TX_QUEUE_MSK           cpu_to_le32(0xffc00)
 
-#define IWL_DROP_SINGLE                0
-#define IWL_DROP_ALL           (BIT(IWL_RXON_CTX_BSS) | BIT(IWL_RXON_CTX_PAN))
+#define IWL_DROP_ALL                   BIT(1)
 
 /*
  * REPLY_TXFIFO_FLUSH = 0x1e(command and response)
index 1a98fa3ab06df6fbf9ae8ec3197680adef182883..769a08bca86f1551be49af3ef4317529fab0402c 100644 (file)
@@ -2101,7 +2101,7 @@ static ssize_t iwl_dbgfs_txfifo_flush_write(struct file *file,
        if (iwl_is_rfkill(priv))
                return -EFAULT;
 
-       iwlagn_dev_txfifo_flush(priv, IWL_DROP_ALL);
+       iwlagn_dev_txfifo_flush(priv);
 
        return count;
 }
index 01ff55faf2abae23bd8b3b07d84b1bfc32319410..7e59be4b89b8e7106bdfd3bdb7a563dfca0be04b 100644 (file)
@@ -136,7 +136,7 @@ int iwlagn_manage_ibss_station(struct iwl_priv *priv,
  *  1. acquire mutex before calling
  *  2. make sure rf is on and not in exit state
  */
-int iwlagn_txfifo_flush(struct iwl_priv *priv, u16 flush_control)
+int iwlagn_txfifo_flush(struct iwl_priv *priv)
 {
        struct iwl_txfifo_flush_cmd flush_cmd;
        struct iwl_host_cmd cmd = {
@@ -146,35 +146,34 @@ int iwlagn_txfifo_flush(struct iwl_priv *priv, u16 flush_control)
                .data = { &flush_cmd, },
        };
 
-       might_sleep();
-
        memset(&flush_cmd, 0, sizeof(flush_cmd));
-       if (flush_control & BIT(IWL_RXON_CTX_BSS))
-               flush_cmd.queue_control = IWL_SCD_VO_MSK | IWL_SCD_VI_MSK |
-                                IWL_SCD_BE_MSK | IWL_SCD_BK_MSK |
-                                IWL_SCD_MGMT_MSK;
-       if ((flush_control & BIT(IWL_RXON_CTX_PAN)) &&
-           (priv->valid_contexts != BIT(IWL_RXON_CTX_BSS)))
+
+       flush_cmd.queue_control = IWL_SCD_VO_MSK | IWL_SCD_VI_MSK |
+                                 IWL_SCD_BE_MSK | IWL_SCD_BK_MSK |
+                                 IWL_SCD_MGMT_MSK;
+       if ((priv->valid_contexts != BIT(IWL_RXON_CTX_BSS)))
                flush_cmd.queue_control |= IWL_PAN_SCD_VO_MSK |
-                               IWL_PAN_SCD_VI_MSK | IWL_PAN_SCD_BE_MSK |
-                               IWL_PAN_SCD_BK_MSK | IWL_PAN_SCD_MGMT_MSK |
-                               IWL_PAN_SCD_MULTICAST_MSK;
+                                          IWL_PAN_SCD_VI_MSK |
+                                          IWL_PAN_SCD_BE_MSK |
+                                          IWL_PAN_SCD_BK_MSK |
+                                          IWL_PAN_SCD_MGMT_MSK |
+                                          IWL_PAN_SCD_MULTICAST_MSK;
 
        if (priv->eeprom_data->sku & EEPROM_SKU_CAP_11N_ENABLE)
                flush_cmd.queue_control |= IWL_AGG_TX_QUEUE_MSK;
 
        IWL_DEBUG_INFO(priv, "queue control: 0x%x\n",
                       flush_cmd.queue_control);
-       flush_cmd.flush_control = cpu_to_le16(flush_control);
+       flush_cmd.flush_control = cpu_to_le16(IWL_DROP_ALL);
 
        return iwl_dvm_send_cmd(priv, &cmd);
 }
 
-void iwlagn_dev_txfifo_flush(struct iwl_priv *priv, u16 flush_control)
+void iwlagn_dev_txfifo_flush(struct iwl_priv *priv)
 {
        mutex_lock(&priv->mutex);
        ieee80211_stop_queues(priv->hw);
-       if (iwlagn_txfifo_flush(priv, IWL_DROP_ALL)) {
+       if (iwlagn_txfifo_flush(priv)) {
                IWL_ERR(priv, "flush request fail\n");
                goto done;
        }
index 46b0d1c46529496deed7052932c2855600cee6d7..cb443d54f9b9aef46485317ac80cd911614a7265 100644 (file)
@@ -1017,7 +1017,7 @@ static void iwlagn_mac_flush(struct ieee80211_hw *hw, bool drop)
         */
        if (drop) {
                IWL_DEBUG_MAC80211(priv, "send flush command\n");
-               if (iwlagn_txfifo_flush(priv, IWL_DROP_ALL)) {
+               if (iwlagn_txfifo_flush(priv)) {
                        IWL_ERR(priv, "flush request fail\n");
                        goto done;
                }
index 4547f36bcc6c7deda1d5c5c8e3dd770e9c41f537..95d348b028461a0ab21b1d856b5a87837edc0d53 100644 (file)
@@ -511,7 +511,7 @@ static void iwl_bg_tx_flush(struct work_struct *work)
                return;
 
        IWL_DEBUG_INFO(priv, "device request: flush all tx frames\n");
-       iwlagn_dev_txfifo_flush(priv, IWL_DROP_ALL);
+       iwlagn_dev_txfifo_flush(priv);
 }
 
 /*