i40evf: Add additional check for reset
authorMitch Williams <mitch.a.williams@intel.com>
Thu, 10 Mar 2016 22:59:49 +0000 (14:59 -0800)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Tue, 5 Apr 2016 19:27:09 +0000 (12:27 -0700)
If the driver happens to read a register during the time in which the
device is undergoing reset, it will receive a value of 0xdeadbeef
instead of a valid value. Unfortunately, the driver may misinterpret
this as a valid value, especially if it's just looking for individual
bits.

Add an explicit check for this value when we are looking for admin queue
errors, and trigger reset recovery if we find it.

Signed-off-by: Mitch Williams <mitch.a.williams@intel.com>
Tested-by: Andrew Bowers <andrewx.bowers@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
drivers/net/ethernet/intel/i40evf/i40evf_main.c

index 820ad94c932b1848d83cec7032559a2c8e3713db..d783c1b19a16a4c3743bc7fdc7c39e0e34b3c9de 100644 (file)
@@ -1994,6 +1994,8 @@ static void i40evf_adminq_task(struct work_struct *work)
 
        /* check for error indications */
        val = rd32(hw, hw->aq.arq.len);
+       if (val == 0xdeadbeef) /* indicates device in reset */
+               goto freedom;
        oldval = val;
        if (val & I40E_VF_ARQLEN1_ARQVFE_MASK) {
                dev_info(&adapter->pdev->dev, "ARQ VF Error detected\n");