Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 17 Nov 2016 20:00:20 +0000 (UTC)
From:      =?UTF-8?Q?Imre_Vad=c3=a1sz?= <ivadasz@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r308777 - head/sys/dev/iwm
Message-ID:  <201611172000.uAHK0KPS084672@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: ivadasz
Date: Thu Nov 17 20:00:20 2016
New Revision: 308777
URL: https://svnweb.freebsd.org/changeset/base/308777

Log:
  [iwm] Sync iwm_nvm_read_chunk() function with Linux iwlwifi.
  
  This fixes an error handling detail in iwm_nvm_read_chunk(), where an
  error response from the firmware for an NVM read shouldn't be fatal if
  the offset was non-zero.
  
  Approved by:	adrian (mentor)
  Obtained from:	DragonFlyBSD git 250a1c33fca1725121fe499f9cebc90267d209f9
  Differential Revision:	https://reviews.freebsd.org/D8542

Modified:
  head/sys/dev/iwm/if_iwm.c

Modified: head/sys/dev/iwm/if_iwm.c
==============================================================================
--- head/sys/dev/iwm/if_iwm.c	Thu Nov 17 19:38:30 2016	(r308776)
+++ head/sys/dev/iwm/if_iwm.c	Thu Nov 17 20:00:20 2016	(r308777)
@@ -1666,8 +1666,10 @@ const int nvm_to_read[] = {
 #define IWM_NVM_READ_OPCODE 0
 
 /* load nvm chunk response */
-#define IWM_READ_NVM_CHUNK_SUCCEED		0
-#define IWM_READ_NVM_CHUNK_INVALID_ADDRESS	1
+enum {
+	IWM_READ_NVM_CHUNK_SUCCEED = 0,
+	IWM_READ_NVM_CHUNK_NOT_VALID_ADDRESS = 1
+};
 
 static int
 iwm_nvm_read_chunk(struct iwm_softc *sc, uint16_t section,
@@ -1684,12 +1686,10 @@ iwm_nvm_read_chunk(struct iwm_softc *sc,
 	struct iwm_rx_packet *pkt;
 	struct iwm_host_cmd cmd = {
 		.id = IWM_NVM_ACCESS_CMD,
-		.flags = IWM_CMD_SYNC | IWM_CMD_WANT_SKB |
-		    IWM_CMD_SEND_IN_RFKILL,
+		.flags = IWM_CMD_WANT_SKB | IWM_CMD_SEND_IN_RFKILL,
 		.data = { &nvm_access_cmd, },
 	};
-	int ret, offset_read;
-	size_t bytes_read;
+	int ret, bytes_read, offset_read;
 	uint8_t *resp_data;
 
 	cmd.len[0] = sizeof(struct iwm_nvm_access_cmd);
@@ -1718,9 +1718,26 @@ iwm_nvm_read_chunk(struct iwm_softc *sc,
 	offset_read = le16toh(nvm_resp->offset);
 	resp_data = nvm_resp->data;
 	if (ret) {
-		IWM_DPRINTF(sc, IWM_DEBUG_RESET,
-		    "NVM access command failed with status %d\n", ret);
-		ret = EINVAL;
+		if ((offset != 0) &&
+		    (ret == IWM_READ_NVM_CHUNK_NOT_VALID_ADDRESS)) {
+			/*
+			 * meaning of NOT_VALID_ADDRESS:
+			 * driver try to read chunk from address that is
+			 * multiple of 2K and got an error since addr is empty.
+			 * meaning of (offset != 0): driver already
+			 * read valid data from another chunk so this case
+			 * is not an error.
+			 */
+			IWM_DPRINTF(sc, IWM_DEBUG_EEPROM | IWM_DEBUG_RESET,
+				    "NVM access command failed on offset 0x%x since that section size is multiple 2K\n",
+				    offset);
+			*len = 0;
+			ret = 0;
+		} else {
+			IWM_DPRINTF(sc, IWM_DEBUG_EEPROM | IWM_DEBUG_RESET,
+				    "NVM access command failed with status %d\n", ret);
+			ret = EIO;
+		}
 		goto exit;
 	}
 
@@ -1735,7 +1752,7 @@ iwm_nvm_read_chunk(struct iwm_softc *sc,
 	if (bytes_read > length) {
 		device_printf(sc->sc_dev,
 		    "NVM ACCESS response with too much data "
-		    "(%d bytes requested, %zd bytes received)\n",
+		    "(%d bytes requested, %d bytes received)\n",
 		    length, bytes_read);
 		ret = EINVAL;
 		goto exit;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201611172000.uAHK0KPS084672>