Author: eadler
Date: Thu Mar  1 05:06:16 2018
New Revision: 330160
URL: https://svnweb.freebsd.org/changeset/base/330160

Log:
  MFC r308777:
  
  [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.

Modified:
  stable/11/sys/dev/iwm/if_iwm.c
Directory Properties:
  stable/11/   (props changed)

Modified: stable/11/sys/dev/iwm/if_iwm.c
==============================================================================
--- stable/11/sys/dev/iwm/if_iwm.c      Thu Mar  1 05:05:08 2018        
(r330159)
+++ stable/11/sys/dev/iwm/if_iwm.c      Thu Mar  1 05:06:16 2018        
(r330160)
@@ -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, uint16_t sect
        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, uint16_t sect
        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, uint16_t sect
        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;
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to