Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fd35886a authored by Ashish Shah's avatar Ashish Shah Committed by David S. Miller
Browse files

i40evf: future-proof vfr_stat state check



Previously defined state I40E_VFR_VFACTIVE uses bit 1 which is now set to
"reserved."  Update the state checks to also include I40E_VFR_COMPLETED.
This change will allow the VF to work with both existing and future PFs.

Change-ID: Ifd1d34f79f3b0ffd6d2550ee4dadc55825ff52f8
Signed-off-by: default avatarAshish Shah <ashish.n.shah@intel.com>
Tested-by: default avatarSibai Li <sibai.li@intel.com>
Signed-off-by: default avatarAaron Brown <aaron.f.brown@intel.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 89cb86c3
Loading
Loading
Loading
Loading
+17 −6
Original line number Diff line number Diff line
@@ -1298,12 +1298,16 @@ static void i40evf_watchdog_task(struct work_struct *work)
					  struct i40evf_adapter,
					  watchdog_task);
	struct i40e_hw *hw = &adapter->hw;
	uint32_t rstat_val;

	if (test_and_set_bit(__I40EVF_IN_CRITICAL_TASK, &adapter->crit_section))
		goto restart_watchdog;

	if (adapter->flags & I40EVF_FLAG_PF_COMMS_FAILED) {
		if ((rd32(hw, I40E_VFGEN_RSTAT) & 0x3) == I40E_VFR_VFACTIVE) {
		rstat_val = rd32(hw, I40E_VFGEN_RSTAT) &
			    I40E_VFGEN_RSTAT_VFR_STATE_MASK;
		if ((rstat_val == I40E_VFR_VFACTIVE) ||
		    (rstat_val == I40E_VFR_COMPLETED)) {
			/* A chance for redemption! */
			dev_err(&adapter->pdev->dev, "Hardware came out of reset. Attempting reinit.\n");
			adapter->state = __I40EVF_STARTUP;
@@ -1329,8 +1333,11 @@ static void i40evf_watchdog_task(struct work_struct *work)
		goto watchdog_done;

	/* check for reset */
	rstat_val = rd32(hw, I40E_VFGEN_RSTAT) &
			    I40E_VFGEN_RSTAT_VFR_STATE_MASK;
	if (!(adapter->flags & I40EVF_FLAG_RESET_PENDING) &&
	    (rd32(hw, I40E_VFGEN_RSTAT) & 0x3) != I40E_VFR_VFACTIVE) {
	    (rstat_val != I40E_VFR_VFACTIVE) &&
	    (rstat_val != I40E_VFR_COMPLETED)) {
		adapter->state = __I40EVF_RESETTING;
		adapter->flags |= I40EVF_FLAG_RESET_PENDING;
		dev_err(&adapter->pdev->dev, "Hardware reset detected\n");
@@ -1496,7 +1503,8 @@ static void i40evf_reset_task(struct work_struct *work)
	for (i = 0; i < I40EVF_RESET_WAIT_COUNT; i++) {
		rstat_val = rd32(hw, I40E_VFGEN_RSTAT) &
			    I40E_VFGEN_RSTAT_VFR_STATE_MASK;
		if (rstat_val != I40E_VFR_VFACTIVE)
		if ((rstat_val != I40E_VFR_VFACTIVE) &&
		    (rstat_val != I40E_VFR_COMPLETED))
			break;
		else
			msleep(I40EVF_RESET_WAIT_MS);
@@ -1510,7 +1518,8 @@ static void i40evf_reset_task(struct work_struct *work)
	for (i = 0; i < I40EVF_RESET_WAIT_COUNT; i++) {
		rstat_val = rd32(hw, I40E_VFGEN_RSTAT) &
			    I40E_VFGEN_RSTAT_VFR_STATE_MASK;
		if (rstat_val == I40E_VFR_VFACTIVE)
		if ((rstat_val == I40E_VFR_VFACTIVE) ||
		    (rstat_val == I40E_VFR_COMPLETED))
			break;
		else
			msleep(I40EVF_RESET_WAIT_MS);
@@ -1947,8 +1956,10 @@ static int i40evf_check_reset_complete(struct i40e_hw *hw)
	int i;

	for (i = 0; i < 100; i++) {
		rstat = rd32(hw, I40E_VFGEN_RSTAT);
		if (rstat == I40E_VFR_VFACTIVE)
		rstat = rd32(hw, I40E_VFGEN_RSTAT) &
			    I40E_VFGEN_RSTAT_VFR_STATE_MASK;
		if ((rstat == I40E_VFR_VFACTIVE) ||
		    (rstat == I40E_VFR_COMPLETED))
			return 0;
		udelay(10);
	}