OSDN Git Service

iwlwifi: pcie: set cmd_len in the correct place
authorSara Sharon <sara.sharon@intel.com>
Mon, 20 Aug 2018 07:07:32 +0000 (10:07 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 5 Dec 2019 08:20:15 +0000 (09:20 +0100)
[ Upstream commit 956343a61226e1af3d146386f70a059feb567d0c ]

command len is set too early in the code, since when building
AMSDU, the size changes. This causes the byte count table to
have the wrong size.

Fixes: a0ec0169b7a9 ("iwlwifi: support new tx api")
Signed-off-by: Sara Sharon <sara.sharon@intel.com>
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/wireless/intel/iwlwifi/pcie/tx-gen2.c

index 61ffa1d..316e2ba 100644 (file)
@@ -560,18 +560,6 @@ int iwl_trans_pcie_gen2_tx(struct iwl_trans *trans, struct sk_buff *skb,
 
        spin_lock(&txq->lock);
 
-       if (trans->cfg->device_family >= IWL_DEVICE_FAMILY_22560) {
-               struct iwl_tx_cmd_gen3 *tx_cmd_gen3 =
-                       (void *)dev_cmd->payload;
-
-               cmd_len = le16_to_cpu(tx_cmd_gen3->len);
-       } else {
-               struct iwl_tx_cmd_gen2 *tx_cmd_gen2 =
-                       (void *)dev_cmd->payload;
-
-               cmd_len = le16_to_cpu(tx_cmd_gen2->len);
-       }
-
        if (iwl_queue_space(trans, txq) < txq->high_mark) {
                iwl_stop_queue(trans, txq);
 
@@ -609,6 +597,18 @@ int iwl_trans_pcie_gen2_tx(struct iwl_trans *trans, struct sk_buff *skb,
                return -1;
        }
 
+       if (trans->cfg->device_family >= IWL_DEVICE_FAMILY_22560) {
+               struct iwl_tx_cmd_gen3 *tx_cmd_gen3 =
+                       (void *)dev_cmd->payload;
+
+               cmd_len = le16_to_cpu(tx_cmd_gen3->len);
+       } else {
+               struct iwl_tx_cmd_gen2 *tx_cmd_gen2 =
+                       (void *)dev_cmd->payload;
+
+               cmd_len = le16_to_cpu(tx_cmd_gen2->len);
+       }
+
        /* Set up entry for this TFD in Tx byte-count array */
        iwl_pcie_gen2_update_byte_tbl(trans_pcie, txq, cmd_len,
                                      iwl_pcie_gen2_get_num_tbs(trans, tfd));