Skip to content

Commit b37987e

Browse files
Hariprasad Shenaidavem330
authored andcommitted
cxgb4: Disable interrupts and napi before unregistering netdev
Disable interrupts and quiesce rx before unregistering net device to avoid crash while unloading driver when traffic is flowing through. Based on original work by Shameem Khalid <shameem@chelsio.com> Signed-off-by: Hariprasad Shenai <hariprasad@chelsio.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent 4b8e27a commit b37987e

File tree

1 file changed

+18
-7
lines changed

1 file changed

+18
-7
lines changed

drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -934,6 +934,21 @@ static void quiesce_rx(struct adapter *adap)
934934
}
935935
}
936936

937+
/* Disable interrupt and napi handler */
938+
static void disable_interrupts(struct adapter *adap)
939+
{
940+
if (adap->flags & FULL_INIT_DONE) {
941+
t4_intr_disable(adap);
942+
if (adap->flags & USING_MSIX) {
943+
free_msix_queue_irqs(adap);
944+
free_irq(adap->msix_info[0].vec, adap);
945+
} else {
946+
free_irq(adap->pdev->irq, adap);
947+
}
948+
quiesce_rx(adap);
949+
}
950+
}
951+
937952
/*
938953
* Enable NAPI scheduling and interrupt generation for all Rx queues.
939954
*/
@@ -4257,19 +4272,12 @@ static int cxgb_up(struct adapter *adap)
42574272

42584273
static void cxgb_down(struct adapter *adapter)
42594274
{
4260-
t4_intr_disable(adapter);
42614275
cancel_work_sync(&adapter->tid_release_task);
42624276
cancel_work_sync(&adapter->db_full_task);
42634277
cancel_work_sync(&adapter->db_drop_task);
42644278
adapter->tid_release_task_busy = false;
42654279
adapter->tid_release_head = NULL;
42664280

4267-
if (adapter->flags & USING_MSIX) {
4268-
free_msix_queue_irqs(adapter);
4269-
free_irq(adapter->msix_info[0].vec, adapter);
4270-
} else
4271-
free_irq(adapter->pdev->irq, adapter);
4272-
quiesce_rx(adapter);
42734281
t4_sge_stop(adapter);
42744282
t4_free_sge_resources(adapter);
42754283
adapter->flags &= ~FULL_INIT_DONE;
@@ -5591,6 +5599,7 @@ static pci_ers_result_t eeh_err_detected(struct pci_dev *pdev,
55915599
netif_carrier_off(dev);
55925600
}
55935601
spin_unlock(&adap->stats_lock);
5602+
disable_interrupts(adap);
55945603
if (adap->flags & FULL_INIT_DONE)
55955604
cxgb_down(adap);
55965605
rtnl_unlock();
@@ -6304,6 +6313,8 @@ static void remove_one(struct pci_dev *pdev)
63046313
if (is_offload(adapter))
63056314
detach_ulds(adapter);
63066315

6316+
disable_interrupts(adapter);
6317+
63076318
for_each_port(adapter, i)
63086319
if (adapter->port[i]->reg_state == NETREG_REGISTERED)
63096320
unregister_netdev(adapter->port[i]);

0 commit comments

Comments
 (0)