Only poll on the NVM semaphore if there's time left on a previous
reservation.

Signed-off-by: Helin Zhang <helin.zhang at intel.com>
---
 lib/librte_pmd_i40e/i40e/i40e_nvm.c | 35 +++++++++++++++++------------------
 1 file changed, 17 insertions(+), 18 deletions(-)

diff --git a/lib/librte_pmd_i40e/i40e/i40e_nvm.c 
b/lib/librte_pmd_i40e/i40e/i40e_nvm.c
index fe8c668..159989b 100644
--- a/lib/librte_pmd_i40e/i40e/i40e_nvm.c
+++ b/lib/librte_pmd_i40e/i40e/i40e_nvm.c
@@ -101,7 +101,7 @@ enum i40e_status_code i40e_acquire_nvm(struct i40e_hw *hw,
 {
        enum i40e_status_code ret_code = I40E_SUCCESS;
        u64 gtime, timeout;
-       u64 time = 0;
+       u64 time_left = 0;

        DEBUGFUNC("i40e_acquire_nvm");

@@ -109,40 +109,39 @@ enum i40e_status_code i40e_acquire_nvm(struct i40e_hw *hw,
                goto i40e_i40e_acquire_nvm_exit;

        ret_code = i40e_aq_request_resource(hw, I40E_NVM_RESOURCE_ID, access,
-                                           0, &time, NULL);
+                                           0, &time_left, NULL);
        /* Reading the Global Device Timer */
        gtime = rd32(hw, I40E_GLVFGEN_TIMER);

        /* Store the timeout */
-       hw->nvm.hw_semaphore_timeout = I40E_MS_TO_GTIME(time) + gtime;
+       hw->nvm.hw_semaphore_timeout = I40E_MS_TO_GTIME(time_left) + gtime;

-       if (ret_code != I40E_SUCCESS) {
-               /* Set the polling timeout */
-               if (time > I40E_MAX_NVM_TIMEOUT)
-                       timeout = I40E_MS_TO_GTIME(I40E_MAX_NVM_TIMEOUT)
-                                 + gtime;
-               else
-                       timeout = hw->nvm.hw_semaphore_timeout;
+       if (ret_code)
+               i40e_debug(hw, I40E_DEBUG_NVM,
+                          "NVM acquire type %d failed time_left=%llu ret=%d 
aq_err=%d\n",
+                          access, time_left, ret_code, hw->aq.asq_last_status);
+
+       if (ret_code && time_left) {
                /* Poll until the current NVM owner timeouts */
-               while (gtime < timeout) {
+               timeout = I40E_MS_TO_GTIME(I40E_MAX_NVM_TIMEOUT) + gtime;
+               while ((gtime < timeout) && time_left) {
                        i40e_msec_delay(10);
+                       gtime = rd32(hw, I40E_GLVFGEN_TIMER);
                        ret_code = i40e_aq_request_resource(hw,
                                                        I40E_NVM_RESOURCE_ID,
-                                                       access, 0, &time,
+                                                       access, 0, &time_left,
                                                        NULL);
                        if (ret_code == I40E_SUCCESS) {
                                hw->nvm.hw_semaphore_timeout =
-                                               I40E_MS_TO_GTIME(time) + gtime;
+                                           I40E_MS_TO_GTIME(time_left) + gtime;
                                break;
                        }
-                       gtime = rd32(hw, I40E_GLVFGEN_TIMER);
                }
                if (ret_code != I40E_SUCCESS) {
                        hw->nvm.hw_semaphore_timeout = 0;
-                       hw->nvm.hw_semaphore_wait =
-                                               I40E_MS_TO_GTIME(time) + gtime;
-                       DEBUGOUT1("NVM acquire timed out, wait %llu ms before 
trying again.\n",
-                                 time);
+                       i40e_debug(hw, I40E_DEBUG_NVM,
+                                  "NVM acquire timed out, wait %llu ms before 
trying again. status=%d aq_err=%d\n",
+                                  time_left, ret_code, hw->aq.asq_last_status);
                }
        }

-- 
1.8.1.4

Reply via email to