]> www.infradead.org Git - users/hch/configfs.git/commitdiff
ice: implement AQ download pkg retry
authorWojciech Drewek <wojciech.drewek@intel.com>
Tue, 4 Jun 2024 12:55:14 +0000 (14:55 +0200)
committerTony Nguyen <anthony.l.nguyen@intel.com>
Thu, 13 Jun 2024 15:24:17 +0000 (08:24 -0700)
ice_aqc_opc_download_pkg (0x0C40) AQ sporadically returns error due
to FW issue. Fix this by retrying five times before moving to
Safe Mode. Sleep for 20 ms before retrying. This was tested with the
4.40 firmware.

Fixes: c76488109616 ("ice: Implement Dynamic Device Personalization (DDP) download")
Reviewed-by: Michal Swiatkowski <michal.swiatkowski@linux.intel.com>
Signed-off-by: Wojciech Drewek <wojciech.drewek@intel.com>
Reviewed-by: Brett Creeley <brett.creeley@amd.com>
Reviewed-by: Przemek Kitszel <przemyslaw.kitszel@intel.com>
Tested-by: Pucha Himasekhar Reddy <himasekharx.reddy.pucha@intel.com> (A Contingent worker at Intel)
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
drivers/net/ethernet/intel/ice/ice_ddp.c

index ce5034ed2b240ce7c35bb8d78ffcd85be8c592f3..f182179529b7dee3c2c06e1e4734ccb797d8bc5e 100644 (file)
@@ -1339,6 +1339,7 @@ ice_dwnld_cfg_bufs_no_lock(struct ice_hw *hw, struct ice_buf *bufs, u32 start,
 
        for (i = 0; i < count; i++) {
                bool last = false;
+               int try_cnt = 0;
                int status;
 
                bh = (struct ice_buf_hdr *)(bufs + start + i);
@@ -1346,8 +1347,26 @@ ice_dwnld_cfg_bufs_no_lock(struct ice_hw *hw, struct ice_buf *bufs, u32 start,
                if (indicate_last)
                        last = ice_is_last_download_buffer(bh, i, count);
 
-               status = ice_aq_download_pkg(hw, bh, ICE_PKG_BUF_SIZE, last,
-                                            &offset, &info, NULL);
+               while (1) {
+                       status = ice_aq_download_pkg(hw, bh, ICE_PKG_BUF_SIZE,
+                                                    last, &offset, &info,
+                                                    NULL);
+                       if (hw->adminq.sq_last_status != ICE_AQ_RC_ENOSEC &&
+                           hw->adminq.sq_last_status != ICE_AQ_RC_EBADSIG)
+                               break;
+
+                       try_cnt++;
+
+                       if (try_cnt == 5)
+                               break;
+
+                       msleep(20);
+               }
+
+               if (try_cnt)
+                       dev_dbg(ice_hw_to_dev(hw),
+                               "ice_aq_download_pkg number of retries: %d\n",
+                               try_cnt);
 
                /* Save AQ status from download package */
                if (status) {