igc: Fix infinite loop in release_swfw_sync
[ 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: c0071c7aa5
("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>
This commit is contained in:

committed by
Greg Kroah-Hartman

parent
c075c3ea03
commit
46b0e4f998
@@ -156,8 +156,15 @@ void igc_release_swfw_sync_i225(struct igc_hw *hw, u16 mask)
|
|||||||
{
|
{
|
||||||
u32 swfw_sync;
|
u32 swfw_sync;
|
||||||
|
|
||||||
while (igc_get_hw_semaphore_i225(hw))
|
/* Releasing the resource requires first getting the HW semaphore.
|
||||||
; /* Empty */
|
* 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 = rd32(IGC_SW_FW_SYNC);
|
||||||
swfw_sync &= ~mask;
|
swfw_sync &= ~mask;
|
||||||
|
Reference in New Issue
Block a user