| From 3fb5a73fc48a41fb5c0b470ae14fc7398c997941 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 1 Mar 2022 15:32:10 +0200 |
| Subject: igc: Fix infinite loop in release_swfw_sync |
| |
| From: Sasha Neftin <sasha.neftin@intel.com> |
| |
| [ Upstream commit 907862e9aef75bf89e2b265efcc58870be06081e ] |
| |
| An infinite loop may occur if we fail to acquire the HW semaphore, |
| which is needed for resource release. |
| This will typically happen if the hardware is surprise-removed. |
| At this stage there is nothing to do, except log an error and quit. |
| |
| Fixes: c0071c7aa5fe ("igc: Add HW initialization code") |
| Suggested-by: Dima Ruinskiy <dima.ruinskiy@intel.com> |
| Signed-off-by: Sasha Neftin <sasha.neftin@intel.com> |
| Tested-by: Naama Meir <naamax.meir@linux.intel.com> |
| Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/net/ethernet/intel/igc/igc_i225.c | 11 +++++++++-- |
| 1 file changed, 9 insertions(+), 2 deletions(-) |
| |
| diff --git a/drivers/net/ethernet/intel/igc/igc_i225.c b/drivers/net/ethernet/intel/igc/igc_i225.c |
| index ed5d09c11c38..79252ca9e213 100644 |
| --- a/drivers/net/ethernet/intel/igc/igc_i225.c |
| +++ b/drivers/net/ethernet/intel/igc/igc_i225.c |
| @@ -156,8 +156,15 @@ void igc_release_swfw_sync_i225(struct igc_hw *hw, u16 mask) |
| { |
| u32 swfw_sync; |
| |
| - while (igc_get_hw_semaphore_i225(hw)) |
| - ; /* Empty */ |
| + /* Releasing the resource requires first getting the HW semaphore. |
| + * If we fail to get the semaphore, there is nothing we can do, |
| + * except log an error and quit. We are not allowed to hang here |
| + * indefinitely, as it may cause denial of service or system crash. |
| + */ |
| + if (igc_get_hw_semaphore_i225(hw)) { |
| + hw_dbg("Failed to release SW_FW_SYNC.\n"); |
| + return; |
| + } |
| |
| swfw_sync = rd32(IGC_SW_FW_SYNC); |
| swfw_sync &= ~mask; |
| -- |
| 2.35.1 |
| |