Commit c2bc9ce9 authored by Alexander Duyck's avatar Alexander Duyck Committed by Jeff Kirsher

ixgbe: Reorder search to work from the top down instead of bottom up

This patch is meant to reduce the complexity of the search function used
for finding a VLVF entry associated with a given VLAN ID.  The previous
code was searching from bottom to top.  I reordered it to search from top
to bottom.  In addition I pulled an AND statement out of the loop and
instead replaced it with an OR statement outside the loop.  This should
help to reduce the overall size and complexity of the function.

There was also some formatting I cleaned up in regards to whitespace and
such.
Signed-off-by: default avatarAlexander Duyck <aduyck@mirantis.com>
Tested-by: default avatarPhil Schmitt <phillip.j.schmitt@intel.com>
Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
parent b6488b66
...@@ -3002,7 +3002,7 @@ s32 ixgbe_init_uta_tables_generic(struct ixgbe_hw *hw) ...@@ -3002,7 +3002,7 @@ s32 ixgbe_init_uta_tables_generic(struct ixgbe_hw *hw)
static s32 ixgbe_find_vlvf_slot(struct ixgbe_hw *hw, u32 vlan, bool vlvf_bypass) static s32 ixgbe_find_vlvf_slot(struct ixgbe_hw *hw, u32 vlan, bool vlvf_bypass)
{ {
s32 regindex, first_empty_slot; s32 regindex, first_empty_slot;
u32 bits = 0; u32 bits;
/* short cut the special case */ /* short cut the special case */
if (vlan == 0) if (vlan == 0)
...@@ -3014,33 +3014,29 @@ static s32 ixgbe_find_vlvf_slot(struct ixgbe_hw *hw, u32 vlan, bool vlvf_bypass) ...@@ -3014,33 +3014,29 @@ static s32 ixgbe_find_vlvf_slot(struct ixgbe_hw *hw, u32 vlan, bool vlvf_bypass)
*/ */
first_empty_slot = vlvf_bypass ? IXGBE_ERR_NO_SPACE : 0; first_empty_slot = vlvf_bypass ? IXGBE_ERR_NO_SPACE : 0;
/* /* add VLAN enable bit for comparison */
* Search for the vlan id in the VLVF entries. Save off the first empty vlan |= IXGBE_VLVF_VIEN;
* slot found along the way
/* Search for the vlan id in the VLVF entries. Save off the first empty
* slot found along the way.
*
* pre-decrement loop covering (IXGBE_VLVF_ENTRIES - 1) .. 1
*/ */
for (regindex = 1; regindex < IXGBE_VLVF_ENTRIES; regindex++) { for (regindex = IXGBE_VLVF_ENTRIES; --regindex;) {
bits = IXGBE_READ_REG(hw, IXGBE_VLVF(regindex)); bits = IXGBE_READ_REG(hw, IXGBE_VLVF(regindex));
if (!bits && !(first_empty_slot)) if (bits == vlan)
return regindex;
if (!first_empty_slot && !bits)
first_empty_slot = regindex; first_empty_slot = regindex;
else if ((bits & 0x0FFF) == vlan)
break;
} }
/* /* If we are here then we didn't find the VLAN. Return first empty
* If regindex is less than IXGBE_VLVF_ENTRIES, then we found the vlan * slot we found during our search, else error.
* in the VLVF. Else use the first empty VLVF register for this
* vlan id.
*/ */
if (regindex >= IXGBE_VLVF_ENTRIES) { if (!first_empty_slot)
if (first_empty_slot)
regindex = first_empty_slot;
else {
hw_dbg(hw, "No space in VLVF.\n"); hw_dbg(hw, "No space in VLVF.\n");
regindex = IXGBE_ERR_NO_SPACE;
}
}
return regindex; return first_empty_slot ? : IXGBE_ERR_NO_SPACE;
} }
/** /**
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment