aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorShannon Nelson <shannon.nelson@intel.com>2014-04-23 00:50:16 -0400
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>2014-06-06 05:00:27 -0400
commit6374184672c8e405640ab57ea9ad1cb7ed4fa669 (patch)
tree726ca9f7ee71246db4fa938e2d34ed2088418372
parent60442dea2e9314b472c772c76ed1b2ba5b961e02 (diff)
i40e: remove irqs only when they are set up
Use an extra state variable to keep track of when the IRQs are fully set up. This keeps us from trying to unhook IRQs that already were left unhooked in a failed reset recovery, e.g. when firmware is broken. Change-ID: I073eb081e4ef8aedcbdf1ee0717c0ed64fa172f2 Signed-off-by: Shannon Nelson <shannon.nelson@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
-rw-r--r--drivers/net/ethernet/intel/i40e/i40e.h1
-rw-r--r--drivers/net/ethernet/intel/i40e/i40e_main.c6
2 files changed, 7 insertions, 0 deletions
diff --git a/drivers/net/ethernet/intel/i40e/i40e.h b/drivers/net/ethernet/intel/i40e/i40e.h
index 581898f23223..9c27d8b657b2 100644
--- a/drivers/net/ethernet/intel/i40e/i40e.h
+++ b/drivers/net/ethernet/intel/i40e/i40e.h
@@ -414,6 +414,7 @@ struct i40e_vsi {
414 struct i40e_q_vector **q_vectors; 414 struct i40e_q_vector **q_vectors;
415 int num_q_vectors; 415 int num_q_vectors;
416 int base_vector; 416 int base_vector;
417 bool irqs_ready;
417 418
418 u16 seid; /* HW index of this VSI (absolute index) */ 419 u16 seid; /* HW index of this VSI (absolute index) */
419 u16 id; /* VSI number */ 420 u16 id; /* VSI number */
diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c
index 52bd69d38d9c..029288e1bb98 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_main.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_main.c
@@ -2790,6 +2790,7 @@ static int i40e_vsi_request_irq_msix(struct i40e_vsi *vsi, char *basename)
2790 &q_vector->affinity_mask); 2790 &q_vector->affinity_mask);
2791 } 2791 }
2792 2792
2793 vsi->irqs_ready = true;
2793 return 0; 2794 return 0;
2794 2795
2795free_queue_irqs: 2796free_queue_irqs:
@@ -3349,6 +3350,10 @@ static void i40e_vsi_free_irq(struct i40e_vsi *vsi)
3349 if (!vsi->q_vectors) 3350 if (!vsi->q_vectors)
3350 return; 3351 return;
3351 3352
3353 if (!vsi->irqs_ready)
3354 return;
3355
3356 vsi->irqs_ready = false;
3352 for (i = 0; i < vsi->num_q_vectors; i++) { 3357 for (i = 0; i < vsi->num_q_vectors; i++) {
3353 u16 vector = i + base; 3358 u16 vector = i + base;
3354 3359
@@ -5953,6 +5958,7 @@ static int i40e_vsi_mem_alloc(struct i40e_pf *pf, enum i40e_vsi_type type)
5953 vsi->netdev_registered = false; 5958 vsi->netdev_registered = false;
5954 vsi->work_limit = I40E_DEFAULT_IRQ_WORK; 5959 vsi->work_limit = I40E_DEFAULT_IRQ_WORK;
5955 INIT_LIST_HEAD(&vsi->mac_filter_list); 5960 INIT_LIST_HEAD(&vsi->mac_filter_list);
5961 vsi->irqs_ready = false;
5956 5962
5957 ret = i40e_set_num_rings_in_vsi(vsi); 5963 ret = i40e_set_num_rings_in_vsi(vsi);
5958 if (ret) 5964 if (ret)