From: Maciej Rabeda ixgbe_disable_rx_buff_generic polls for SECRX_RDY with 40 iterations and a 1000 us (1 ms) busy-wait per iteration via udelay(), giving an exact total wait of 40 ms. On fast hardware the security block is typically ready well under 1 ms, so each iteration wastes up to 999 us of stalled initialization time. Replace udelay(1000) with usleep_range(10, 20) and raise the iteration limit to 4000. Because usleep_range(min, max) is guaranteed to sleep at least 'min' microseconds, 4000 * 10 us preserves the original 40 ms minimum wait before timeout. The nominal worst-case rises to ~80 ms (4000 * 20 us); on a loaded system actual scheduler wakeup latency may push this higher. This is acceptable because SECRX_RDY failing to assert is a non-fatal informational condition: the function just logs a debug message and returns success. On platforms where SECRX_RDY asserts quickly this reduces the typical stall from up to ~1 ms per iteration to ~10-20 us. The function is called only from process context, so usleep_range is appropriate. Signed-off-by: Maciej Rabeda Reviewed-by: Simon Horman Signed-off-by: Aleksandr Loktionov --- drivers/net/ethernet/intel/ixgbe/ixgbe_common.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_common.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_common.c index 3ea6765..c85618c 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_common.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_common.c @@ -2683,7 +2683,7 @@ int prot_autoc_write_generic(struct ixgbe_hw *hw, u32 reg_val, bool locked) **/ int ixgbe_disable_rx_buff_generic(struct ixgbe_hw *hw) { -#define IXGBE_MAX_SECRX_POLL 40 +#define IXGBE_MAX_SECRX_POLL 4000 int i; int secrxreg; @@ -2695,8 +2695,7 @@ int ixgbe_disable_rx_buff_generic(struct ixgbe_hw *hw) if (secrxreg & IXGBE_SECRXSTAT_SECRX_RDY) break; else - /* Use interrupt-safe sleep just in case */ - udelay(1000); + usleep_range(10, 20); } /* For informational purposes only */ -- 2.52.0