From: Barbara Skobiej <barbara.skob...@intel.com>

HWSW semaphore acquisition in Atom C3000 NIC is a two stage process.
Each time two semaphore acquisitions are required. Each second semaphore
failure require re-acquisition of first semaphore. This patch decouples
the two acquisitions preventing potentially hundreds of thousands
of unnecessary loop iterations.

Signed-off-by: Barbara Skobiej <barbara.skob...@intel.com>
---
 drivers/net/ixgbe/base/ixgbe_x550.c | 41 ++++++++++++++++-------------
 1 file changed, 22 insertions(+), 19 deletions(-)

diff --git a/drivers/net/ixgbe/base/ixgbe_x550.c 
b/drivers/net/ixgbe/base/ixgbe_x550.c
index 29055a818a..74c2563dd5 100644
--- a/drivers/net/ixgbe/base/ixgbe_x550.c
+++ b/drivers/net/ixgbe/base/ixgbe_x550.c
@@ -4211,36 +4211,39 @@ STATIC s32 ixgbe_acquire_swfw_sync_X550a(struct 
ixgbe_hw *hw, u32 mask)
 
        DEBUGFUNC("ixgbe_acquire_swfw_sync_X550a");
 
+       status = IXGBE_SUCCESS;
+       if (hmask)
+               status = ixgbe_acquire_swfw_sync_X540(hw, hmask);
+
+       if (status) {
+               DEBUGOUT1("Could not acquire SWFW semaphore, Status = %d\n", 
status);
+               return status;
+       }
+
+       if (!(mask & IXGBE_GSSR_TOKEN_SM))
+               return IXGBE_SUCCESS;
+
        while (--retries) {
-               status = IXGBE_SUCCESS;
-               if (hmask)
-                       status = ixgbe_acquire_swfw_sync_X540(hw, hmask);
-               if (status) {
-                       DEBUGOUT1("Could not acquire SWFW semaphore, Status = 
%d\n",
-                                 status);
-                       return status;
-               }
-               if (!(mask & IXGBE_GSSR_TOKEN_SM))
-                       return IXGBE_SUCCESS;
-
                status = ixgbe_get_phy_token(hw);
-               if (status == IXGBE_ERR_TOKEN_RETRY)
-                       DEBUGOUT1("Could not acquire PHY token, Status = %d\n",
-                                 status);
 
                if (status == IXGBE_SUCCESS)
                        return IXGBE_SUCCESS;
 
-               if (hmask)
-                       ixgbe_release_swfw_sync_X540(hw, hmask);
-
                if (status != IXGBE_ERR_TOKEN_RETRY) {
-                       DEBUGOUT1("Unable to retry acquiring the PHY token, 
Status = %d\n",
-                                 status);
+                       DEBUGOUT1("Retry acquiring the PHY token failed, Status 
= %d\n", status);
+                       if (hmask)
+                               ixgbe_release_swfw_sync_X540(hw, hmask);
                        return status;
                }
+
+               if (status == IXGBE_ERR_TOKEN_RETRY)
+                       DEBUGOUT1("Could not acquire PHY token, Status = %d\n",
+                                 status);
        }
 
+       if (hmask)
+               ixgbe_release_swfw_sync_X540(hw, hmask);
+
        DEBUGOUT1("Semaphore acquisition retries failed!: PHY ID = 0x%08X\n",
                  hw->phy.id);
        return status;
-- 
2.43.0

Reply via email to