|
@@ -1590,6 +1590,7 @@ static void i40evf_adminq_task(struct work_struct *work)
|
|
|
struct i40e_arq_event_info event;
|
|
|
struct i40e_virtchnl_msg *v_msg;
|
|
|
i40e_status ret;
|
|
|
+ u32 val, oldval;
|
|
|
u16 pending;
|
|
|
|
|
|
if (adapter->flags & I40EVF_FLAG_PF_COMMS_FAILED)
|
|
@@ -1617,6 +1618,41 @@ static void i40evf_adminq_task(struct work_struct *work)
|
|
|
}
|
|
|
} while (pending);
|
|
|
|
|
|
+ /* check for error indications */
|
|
|
+ val = rd32(hw, hw->aq.arq.len);
|
|
|
+ oldval = val;
|
|
|
+ if (val & I40E_VF_ARQLEN_ARQVFE_MASK) {
|
|
|
+ dev_info(&adapter->pdev->dev, "ARQ VF Error detected\n");
|
|
|
+ val &= ~I40E_VF_ARQLEN_ARQVFE_MASK;
|
|
|
+ }
|
|
|
+ if (val & I40E_VF_ARQLEN_ARQOVFL_MASK) {
|
|
|
+ dev_info(&adapter->pdev->dev, "ARQ Overflow Error detected\n");
|
|
|
+ val &= ~I40E_VF_ARQLEN_ARQOVFL_MASK;
|
|
|
+ }
|
|
|
+ if (val & I40E_VF_ARQLEN_ARQCRIT_MASK) {
|
|
|
+ dev_info(&adapter->pdev->dev, "ARQ Critical Error detected\n");
|
|
|
+ val &= ~I40E_VF_ARQLEN_ARQCRIT_MASK;
|
|
|
+ }
|
|
|
+ if (oldval != val)
|
|
|
+ wr32(hw, hw->aq.arq.len, val);
|
|
|
+
|
|
|
+ val = rd32(hw, hw->aq.asq.len);
|
|
|
+ oldval = val;
|
|
|
+ if (val & I40E_VF_ATQLEN_ATQVFE_MASK) {
|
|
|
+ dev_info(&adapter->pdev->dev, "ASQ VF Error detected\n");
|
|
|
+ val &= ~I40E_VF_ATQLEN_ATQVFE_MASK;
|
|
|
+ }
|
|
|
+ if (val & I40E_VF_ATQLEN_ATQOVFL_MASK) {
|
|
|
+ dev_info(&adapter->pdev->dev, "ASQ Overflow Error detected\n");
|
|
|
+ val &= ~I40E_VF_ATQLEN_ATQOVFL_MASK;
|
|
|
+ }
|
|
|
+ if (val & I40E_VF_ATQLEN_ATQCRIT_MASK) {
|
|
|
+ dev_info(&adapter->pdev->dev, "ASQ Critical Error detected\n");
|
|
|
+ val &= ~I40E_VF_ATQLEN_ATQCRIT_MASK;
|
|
|
+ }
|
|
|
+ if (oldval != val)
|
|
|
+ wr32(hw, hw->aq.asq.len, val);
|
|
|
+
|
|
|
/* re-enable Admin queue interrupt cause */
|
|
|
i40evf_misc_irq_enable(adapter);
|
|
|
|