ixgbe: Acquire PHY semaphore before device reset
A recent firmware change fixed an issue to acquire the PHY semaphore before accessing PHY registers. This led to a case where SW can issue a device reset clearing the MDIO registers. This patch makes SW acquire the PHY semaphore before issuing a device reset. Signed-off-by: Paul Greenwalt <paul.greenwalt@intel.com> Tested-by: Andrew Bowers <andrewx.bowers@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
This commit is contained in:
parent
4c042a80c1
commit
6133406be1
@ -95,6 +95,7 @@ s32 ixgbe_reset_hw_X540(struct ixgbe_hw *hw)
|
|||||||
{
|
{
|
||||||
s32 status;
|
s32 status;
|
||||||
u32 ctrl, i;
|
u32 ctrl, i;
|
||||||
|
u32 swfw_mask = hw->phy.phy_semaphore_mask;
|
||||||
|
|
||||||
/* Call adapter stop to disable tx/rx and clear interrupts */
|
/* Call adapter stop to disable tx/rx and clear interrupts */
|
||||||
status = hw->mac.ops.stop_adapter(hw);
|
status = hw->mac.ops.stop_adapter(hw);
|
||||||
@ -105,10 +106,17 @@ s32 ixgbe_reset_hw_X540(struct ixgbe_hw *hw)
|
|||||||
ixgbe_clear_tx_pending(hw);
|
ixgbe_clear_tx_pending(hw);
|
||||||
|
|
||||||
mac_reset_top:
|
mac_reset_top:
|
||||||
|
status = hw->mac.ops.acquire_swfw_sync(hw, swfw_mask);
|
||||||
|
if (status) {
|
||||||
|
hw_dbg(hw, "semaphore failed with %d", status);
|
||||||
|
return IXGBE_ERR_SWFW_SYNC;
|
||||||
|
}
|
||||||
|
|
||||||
ctrl = IXGBE_CTRL_RST;
|
ctrl = IXGBE_CTRL_RST;
|
||||||
ctrl |= IXGBE_READ_REG(hw, IXGBE_CTRL);
|
ctrl |= IXGBE_READ_REG(hw, IXGBE_CTRL);
|
||||||
IXGBE_WRITE_REG(hw, IXGBE_CTRL, ctrl);
|
IXGBE_WRITE_REG(hw, IXGBE_CTRL, ctrl);
|
||||||
IXGBE_WRITE_FLUSH(hw);
|
IXGBE_WRITE_FLUSH(hw);
|
||||||
|
hw->mac.ops.release_swfw_sync(hw, swfw_mask);
|
||||||
usleep_range(1000, 1200);
|
usleep_range(1000, 1200);
|
||||||
|
|
||||||
/* Poll for reset bit to self-clear indicating reset is complete */
|
/* Poll for reset bit to self-clear indicating reset is complete */
|
||||||
|
@ -3318,6 +3318,7 @@ static s32 ixgbe_reset_hw_X550em(struct ixgbe_hw *hw)
|
|||||||
u32 ctrl = 0;
|
u32 ctrl = 0;
|
||||||
u32 i;
|
u32 i;
|
||||||
bool link_up = false;
|
bool link_up = false;
|
||||||
|
u32 swfw_mask = hw->phy.phy_semaphore_mask;
|
||||||
|
|
||||||
/* Call adapter stop to disable Tx/Rx and clear interrupts */
|
/* Call adapter stop to disable Tx/Rx and clear interrupts */
|
||||||
status = hw->mac.ops.stop_adapter(hw);
|
status = hw->mac.ops.stop_adapter(hw);
|
||||||
@ -3363,9 +3364,16 @@ static s32 ixgbe_reset_hw_X550em(struct ixgbe_hw *hw)
|
|||||||
ctrl = IXGBE_CTRL_RST;
|
ctrl = IXGBE_CTRL_RST;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
status = hw->mac.ops.acquire_swfw_sync(hw, swfw_mask);
|
||||||
|
if (status) {
|
||||||
|
hw_dbg(hw, "semaphore failed with %d", status);
|
||||||
|
return IXGBE_ERR_SWFW_SYNC;
|
||||||
|
}
|
||||||
|
|
||||||
ctrl |= IXGBE_READ_REG(hw, IXGBE_CTRL);
|
ctrl |= IXGBE_READ_REG(hw, IXGBE_CTRL);
|
||||||
IXGBE_WRITE_REG(hw, IXGBE_CTRL, ctrl);
|
IXGBE_WRITE_REG(hw, IXGBE_CTRL, ctrl);
|
||||||
IXGBE_WRITE_FLUSH(hw);
|
IXGBE_WRITE_FLUSH(hw);
|
||||||
|
hw->mac.ops.release_swfw_sync(hw, swfw_mask);
|
||||||
usleep_range(1000, 1200);
|
usleep_range(1000, 1200);
|
||||||
|
|
||||||
/* Poll for reset bit to self-clear meaning reset is complete */
|
/* Poll for reset bit to self-clear meaning reset is complete */
|
||||||
|
Loading…
Reference in New Issue
Block a user