aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMitch Williams <mitch.a.williams@intel.com>2014-06-04 04:45:18 -0400
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>2014-07-02 22:02:19 -0400
commit56497978bcbcde7a310ebaf2b67a936c66397593 (patch)
tree40dff001472ddfdf7fe23fbe3a6e5136540a0c65
parent30fe8ad3667c9060a572e48ca4ada8f3161e5d2e (diff)
i40e: tolerate lost interrupts
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>
-rw-r--r--drivers/net/ethernet/intel/i40e/i40e_main.c8
1 files changed, 2 insertions, 6 deletions
diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c
index 440b671e5d01..88704c049275 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_main.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_main.c
@@ -5314,9 +5314,6 @@ static void i40e_clean_adminq_subtask(struct i40e_pf *pf)
5314 u32 oldval; 5314 u32 oldval;
5315 u32 val; 5315 u32 val;
5316 5316
5317 if (!test_bit(__I40E_ADMINQ_EVENT_PENDING, &pf->state))
5318 return;
5319
5320 /* check for error indications */ 5317 /* check for error indications */
5321 val = rd32(&pf->hw, pf->hw.aq.arq.len); 5318 val = rd32(&pf->hw, pf->hw.aq.arq.len);
5322 oldval = val; 5319 oldval = val;
@@ -5360,10 +5357,9 @@ static void i40e_clean_adminq_subtask(struct i40e_pf *pf)
5360 do { 5357 do {
5361 event.msg_size = I40E_MAX_AQ_BUF_SIZE; /* reinit each time */ 5358 event.msg_size = I40E_MAX_AQ_BUF_SIZE; /* reinit each time */
5362 ret = i40e_clean_arq_element(hw, &event, &pending); 5359 ret = i40e_clean_arq_element(hw, &event, &pending);
5363 if (ret == I40E_ERR_ADMIN_QUEUE_NO_WORK) { 5360 if (ret == I40E_ERR_ADMIN_QUEUE_NO_WORK)
5364 dev_info(&pf->pdev->dev, "No ARQ event found\n");
5365 break; 5361 break;
5366 } else if (ret) { 5362 else if (ret) {
5367 dev_info(&pf->pdev->dev, "ARQ event error %d\n", ret); 5363 dev_info(&pf->pdev->dev, "ARQ event error %d\n", ret);
5368 break; 5364 break;
5369 } 5365 }