i40e: tolerate lost interrupts
authorMitch Williams <mitch.a.williams@intel.com>
Wed, 4 Jun 2014 08:45:18 +0000 (08:45 +0000)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Thu, 3 Jul 2014 02:02:19 +0000 (19:02 -0700)
If the AQ interrupt gets lost for some reason, VF communications will
stall as the VFs have no way of reaching the PF, which is essentially
deaf. The VFs end up waiting forever for a reply that will never come.

To alleviate this condition, go ahead and check the ARQ every time we
run the service task. Remove the check for a pending event, and get rid
of a chatty error message that is now meaningless.

Change-ID: I0fc9d18169cd45c98f60188aef872cd6cee9a027
Signed-off-by: Mitch Williams <mitch.a.williams@intel.com>
Tested-by: Jim Young <jamesx.m.young@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
drivers/net/ethernet/intel/i40e/i40e_main.c

index 440b671..88704c0 100644 (file)
@@ -5314,9 +5314,6 @@ static void i40e_clean_adminq_subtask(struct i40e_pf *pf)
        u32 oldval;
        u32 val;
 
-       if (!test_bit(__I40E_ADMINQ_EVENT_PENDING, &pf->state))
-               return;
-
        /* check for error indications */
        val = rd32(&pf->hw, pf->hw.aq.arq.len);
        oldval = val;
@@ -5360,10 +5357,9 @@ static void i40e_clean_adminq_subtask(struct i40e_pf *pf)
        do {
                event.msg_size = I40E_MAX_AQ_BUF_SIZE; /* reinit each time */
                ret = i40e_clean_arq_element(hw, &event, &pending);
-               if (ret == I40E_ERR_ADMIN_QUEUE_NO_WORK) {
-                       dev_info(&pf->pdev->dev, "No ARQ event found\n");
+               if (ret == I40E_ERR_ADMIN_QUEUE_NO_WORK)
                        break;
-               else if (ret) {
+               else if (ret) {
                        dev_info(&pf->pdev->dev, "ARQ event error %d\n", ret);
                        break;
                }