]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
iwlwifi: pcie: don't warn if we use all the transmit pointers
authorEmmanuel Grumbach <emmanuel.grumbach@intel.com>
Wed, 27 Dec 2017 06:58:02 +0000 (08:58 +0200)
committerLuca Coelho <luciano.coelho@intel.com>
Fri, 16 Feb 2018 13:34:32 +0000 (15:34 +0200)
Our Transmit Frame Descriptor (TFD) is a DMA descriptor that
includes several pointers to be able to transmit a packet
which is not physically contiguous.

Depending on the hardware being use, we can have 20 or 25
pointers in a single TFD. In both cases, it is more than
enough and it is quite hard to hit this limit.
It has been reported that when using specific applications
(Ktorrent), we can actually use all the pointers and then
a long standing bug showed up.

When we free the TFD, we check its number of valid pointers
and make sure it doesn't exceed the number of pointers the
hardware support.
This check had an off by one bug: it is perfectly valid to
free the 20 pointers if the TFD has 20 pointers.

Fix that.

https://bugzilla.kernel.org/show_bug.cgi?id=197981

Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
drivers/net/wireless/intel/iwlwifi/pcie/tx-gen2.c
drivers/net/wireless/intel/iwlwifi/pcie/tx.c

index 6d0a907d5ba58f8666d06e65744d1c179edf3013..fabae0f6068390c1a054deb5cc5bbf9da7f63354 100644 (file)
@@ -147,7 +147,7 @@ static void iwl_pcie_gen2_tfd_unmap(struct iwl_trans *trans,
        /* Sanity check on number of chunks */
        num_tbs = iwl_pcie_gen2_get_num_tbs(trans, tfd);
 
-       if (num_tbs >= trans_pcie->max_tbs) {
+       if (num_tbs > trans_pcie->max_tbs) {
                IWL_ERR(trans, "Too many chunks: %i\n", num_tbs);
                return;
        }
index 3f85713c41dcc9291130f25873ef97bd702335f1..1a566287993d5d9054f3aa22b4a329d405feb854 100644 (file)
@@ -378,7 +378,7 @@ static void iwl_pcie_tfd_unmap(struct iwl_trans *trans,
        /* Sanity check on number of chunks */
        num_tbs = iwl_pcie_tfd_get_num_tbs(trans, tfd);
 
-       if (num_tbs >= trans_pcie->max_tbs) {
+       if (num_tbs > trans_pcie->max_tbs) {
                IWL_ERR(trans, "Too many chunks: %i\n", num_tbs);
                /* @todo issue fatal error, it is quite serious situation */
                return;