aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorShannon Nelson <shannon.nelson@intel.com>2014-05-20 04:01:35 -0400
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>2014-06-09 01:50:53 -0400
commit86df242b4dbe4d38ef85e0e828ff8a55d182ec80 (patch)
tree611c1add81c026921562c6a7b2cb3799d48d623b
parentb78370c021c9d52721c7f96fbb3e10f5b2f428d3 (diff)
i40e: add checks for AQ error status bits
Check for error status bits on the AdminQ event queue and announce them if seen. If the Firmware sets these bits, it will trigger an AdminQ interrupt to get the driver's attention to process the ARQ, which will likely be enough to clear the actual issue. Signed-off-by: Shannon Nelson <shannon.nelson@intel.com> Change-ID: I009e0ebc8be764e40e193b29aed2863f43eb5cb0 Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
-rw-r--r--drivers/net/ethernet/intel/i40e/i40e_main.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c
index 8c16e185de81..ab0b6e101c1b 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_main.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_main.c
@@ -5132,11 +5132,47 @@ static void i40e_clean_adminq_subtask(struct i40e_pf *pf)
5132 u16 pending, i = 0; 5132 u16 pending, i = 0;
5133 i40e_status ret; 5133 i40e_status ret;
5134 u16 opcode; 5134 u16 opcode;
5135 u32 oldval;
5135 u32 val; 5136 u32 val;
5136 5137
5137 if (!test_bit(__I40E_ADMINQ_EVENT_PENDING, &pf->state)) 5138 if (!test_bit(__I40E_ADMINQ_EVENT_PENDING, &pf->state))
5138 return; 5139 return;
5139 5140
5141 /* check for error indications */
5142 val = rd32(&pf->hw, pf->hw.aq.arq.len);
5143 oldval = val;
5144 if (val & I40E_PF_ARQLEN_ARQVFE_MASK) {
5145 dev_info(&pf->pdev->dev, "ARQ VF Error detected\n");
5146 val &= ~I40E_PF_ARQLEN_ARQVFE_MASK;
5147 }
5148 if (val & I40E_PF_ARQLEN_ARQOVFL_MASK) {
5149 dev_info(&pf->pdev->dev, "ARQ Overflow Error detected\n");
5150 val &= ~I40E_PF_ARQLEN_ARQOVFL_MASK;
5151 }
5152 if (val & I40E_PF_ARQLEN_ARQCRIT_MASK) {
5153 dev_info(&pf->pdev->dev, "ARQ Critical Error detected\n");
5154 val &= ~I40E_PF_ARQLEN_ARQCRIT_MASK;
5155 }
5156 if (oldval != val)
5157 wr32(&pf->hw, pf->hw.aq.arq.len, val);
5158
5159 val = rd32(&pf->hw, pf->hw.aq.asq.len);
5160 oldval = val;
5161 if (val & I40E_PF_ATQLEN_ATQVFE_MASK) {
5162 dev_info(&pf->pdev->dev, "ASQ VF Error detected\n");
5163 val &= ~I40E_PF_ATQLEN_ATQVFE_MASK;
5164 }
5165 if (val & I40E_PF_ATQLEN_ATQOVFL_MASK) {
5166 dev_info(&pf->pdev->dev, "ASQ Overflow Error detected\n");
5167 val &= ~I40E_PF_ATQLEN_ATQOVFL_MASK;
5168 }
5169 if (val & I40E_PF_ATQLEN_ATQCRIT_MASK) {
5170 dev_info(&pf->pdev->dev, "ASQ Critical Error detected\n");
5171 val &= ~I40E_PF_ATQLEN_ATQCRIT_MASK;
5172 }
5173 if (oldval != val)
5174 wr32(&pf->hw, pf->hw.aq.asq.len, val);
5175
5140 event.msg_size = I40E_MAX_AQ_BUF_SIZE; 5176 event.msg_size = I40E_MAX_AQ_BUF_SIZE;
5141 event.msg_buf = kzalloc(event.msg_size, GFP_KERNEL); 5177 event.msg_buf = kzalloc(event.msg_size, GFP_KERNEL);
5142 if (!event.msg_buf) 5178 if (!event.msg_buf)