linux-wireless.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Luca Coelho <luca@coelho.fi>
To: kvalo@codeaurora.org
Cc: linux-wireless@vger.kernel.org, Luca Coelho <luciano.coelho@intel.com>
Subject: [PATCH 08/12] iwlwifi: fw: combine loading of last page block into main copy loop
Date: Sun, 22 Apr 2018 11:27:41 +0300	[thread overview]
Message-ID: <20180422082745.9743-9-luca@coelho.fi> (raw)
In-Reply-To: <20180422082745.9743-1-luca@coelho.fi>

From: Luca Coelho <luciano.coelho@intel.com>

Now that we check and copy only the actual size of the page block,
there is no need to treat the last block separately.  Remove the
mostly duplicate code and make the main copy loop handle also the last
block.

Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
---
 .../net/wireless/intel/iwlwifi/fw/paging.c    | 69 +++++++------------
 1 file changed, 26 insertions(+), 43 deletions(-)

diff --git a/drivers/net/wireless/intel/iwlwifi/fw/paging.c b/drivers/net/wireless/intel/iwlwifi/fw/paging.c
index 6afcfd1f0eec..9b8dd7fe7112 100644
--- a/drivers/net/wireless/intel/iwlwifi/fw/paging.c
+++ b/drivers/net/wireless/intel/iwlwifi/fw/paging.c
@@ -221,25 +221,39 @@ static int iwl_fill_paging_mem(struct iwl_fw_runtime *fwrt,
 	sec_idx++;
 
 	/*
-	 * copy the paging blocks to the dram
-	 * loop index start from 1 since that CSS block already copied to dram
-	 * and CSS index is 0.
-	 * loop stop at num_of_paging_blk since that last block is not full.
+	 * Copy the paging blocks to the dram.  The loop index starts
+	 * from 1 since the CSS block (index 0) was already copied to
+	 * dram.  We use num_of_paging_blk + 1 to account for that.
 	 */
-	for (idx = 1; idx < fwrt->num_of_paging_blk; idx++) {
+	for (idx = 1; idx < fwrt->num_of_paging_blk + 1; idx++) {
 		struct iwl_fw_paging *block = &fwrt->fw_paging_db[idx];
-
-		if (block->fw_paging_size > image->sec[sec_idx].len - offset) {
+		int remaining = image->sec[sec_idx].len - offset;
+		int len = block->fw_paging_size;
+
+		/*
+		 * For the last block, we copy all that is remaining,
+		 * for all other blocks, we copy fw_paging_size at a
+		 * time. */
+		if (idx == fwrt->num_of_paging_blk) {
+			len = remaining;
+			if (remaining !=
+			    fwrt->num_of_pages_in_last_blk * FW_PAGING_SIZE) {
+				IWL_ERR(fwrt,
+					"Paging: last block contains more data than expected %d\n",
+					remaining);
+				ret = -EINVAL;
+				goto err;
+			}
+		} else if (block->fw_paging_size > remaining) {
 			IWL_ERR(fwrt,
-				"Paging: paging size is larger than remaining data in block %d\n",
-				idx);
+				"Paging: not enough data in other in block %d (%d)\n",
+				idx, remaining);
 			ret = -EINVAL;
 			goto err;
 		}
 
 		memcpy(page_address(block->fw_paging_block),
-		       image->sec[sec_idx].data + offset,
-		       block->fw_paging_size);
+		       image->sec[sec_idx].data + offset, len);
 		dma_sync_single_for_device(fwrt->trans->dev,
 					   block->fw_paging_phys,
 					   block->fw_paging_size,
@@ -247,40 +261,9 @@ static int iwl_fill_paging_mem(struct iwl_fw_runtime *fwrt,
 
 		IWL_DEBUG_FW(fwrt,
 			     "Paging: copied %d paging bytes to block %d\n",
-			     block->fw_paging_size, idx);
+			     len, idx);
 
 		offset += block->fw_paging_size;
-
-		if (offset > image->sec[sec_idx].len) {
-			IWL_ERR(fwrt,
-				"Paging: offset goes over section size\n");
-			ret = -EINVAL;
-			goto err;
-		}
-	}
-
-	/* copy the last paging block */
-	if (fwrt->num_of_pages_in_last_blk > 0) {
-		struct iwl_fw_paging *block = &fwrt->fw_paging_db[idx];
-
-		if (image->sec[sec_idx].len - offset > block->fw_paging_size) {
-			IWL_ERR(fwrt,
-				"Paging: last block is larger than paging size\n");
-			ret = -EINVAL;
-			goto err;
-		}
-
-		memcpy(page_address(block->fw_paging_block),
-		       image->sec[sec_idx].data + offset,
-		       image->sec[sec_idx].len - offset);
-		dma_sync_single_for_device(fwrt->trans->dev,
-					   block->fw_paging_phys,
-					   block->fw_paging_size,
-					   DMA_BIDIRECTIONAL);
-
-		IWL_DEBUG_FW(fwrt,
-			     "Paging: copied %d pages in the last block %d\n",
-			     fwrt->num_of_pages_in_last_blk, idx);
 	}
 
 	return 0;
-- 
2.17.0

  parent reply	other threads:[~2018-04-22  8:28 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-04-22  8:27 [PATCH 00/12] iwlwifi: updates intended for v4.18 2018-04-22 Luca Coelho
2018-04-22  8:27 ` [PATCH 01/12] iwlwifi: allow different csr flags for different device families Luca Coelho
2018-05-27 12:08   ` iwlwifi: regression due to: " Alexander Wetzel
2018-05-31  6:30     ` Luca Coelho
2018-05-31  8:44       ` Kalle Valo
2018-05-31  9:17         ` Luca Coelho
2018-04-22  8:27 ` [PATCH 02/12] iwlwifi: introduce Image Loader (IML) - new firmware image Luca Coelho
2018-04-22  8:27 ` [PATCH 03/12] iwlwifi: cfg: remove unnecessary cfg data in non-dvm devices Luca Coelho
2018-04-22  8:27 ` [PATCH 04/12] iwlwifi: pcie: allow sending pre-built A-MSDUs Luca Coelho
2018-04-22  8:27 ` [PATCH 05/12] iwlwifi: support new csr addresses for hw address Luca Coelho
2018-04-22  8:27 ` [PATCH 06/12] iwlwifi: mvm: move skb padding reservation earlier Luca Coelho
2018-04-22  8:27 ` [PATCH 07/12] iwlwifi: fw: harden page loading code Luca Coelho
2018-04-22  8:27 ` Luca Coelho [this message]
2018-04-22  8:27 ` [PATCH 09/12] iwlwifi: pcie: remove non-responsive device Luca Coelho
2018-04-24  9:44   ` Kalle Valo
2018-04-24 10:56     ` Luca Coelho
2018-04-25  8:01       ` Kalle Valo
2018-04-26  7:46         ` Luca Coelho
2018-04-26  7:53   ` [PATCH v2 12/12] " Luca Coelho
2018-04-26  7:55     ` Luciano Coelho
2018-04-22  8:27 ` [PATCH 10/12] iwlwifi: make bitfield a u32 instead of u16 Luca Coelho
2018-04-22  8:27 ` [PATCH 11/12] iwlwifi: mvm: remove check for non low latency TIDs Luca Coelho
2018-04-22  8:27 ` [PATCH 12/12] iwlwifi: mvm: set wakeup filters for wowlan "any" configuration Luca Coelho
2018-04-24  9:45   ` Kalle Valo
2018-04-24 10:56     ` Luca Coelho
2018-04-26  7:52   ` [PATCH v2 " Luca Coelho

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20180422082745.9743-9-luca@coelho.fi \
    --to=luca@coelho.fi \
    --cc=kvalo@codeaurora.org \
    --cc=linux-wireless@vger.kernel.org \
    --cc=luciano.coelho@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).