Fix VNIC module unloading
Fix panics which were present when BGX and PF module were unloaded. Reviewed by: zbb Obtained from: Semihalf Sponsored by: Cavium Differential Revision: https://reviews.freebsd.org/D6346
This commit is contained in:
parent
60eec567ab
commit
c6acdff608
@ -247,7 +247,9 @@ static int
|
||||
nicpf_detach(device_t dev)
|
||||
{
|
||||
struct nicpf *nic;
|
||||
int err;
|
||||
|
||||
err = 0;
|
||||
nic = device_get_softc(dev);
|
||||
|
||||
callout_drain(&nic->check_link);
|
||||
@ -257,7 +259,12 @@ nicpf_detach(device_t dev)
|
||||
nicpf_free_res(nic);
|
||||
pci_disable_busmaster(dev);
|
||||
|
||||
return (0);
|
||||
#ifdef PCI_IOV
|
||||
err = pci_iov_detach(dev);
|
||||
if (err != 0)
|
||||
device_printf(dev, "SR-IOV in use. Detach first.\n");
|
||||
#endif
|
||||
return (err);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -1055,6 +1062,9 @@ nic_disable_msix(struct nicpf *nic)
|
||||
nic->msix_enabled = 0;
|
||||
nic->num_vec = 0;
|
||||
}
|
||||
|
||||
bus_release_resource(nic->dev, SYS_RES_MEMORY,
|
||||
rman_get_rid(nic->msix_table_res), nic->msix_table_res);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -1071,7 +1081,7 @@ nic_free_all_interrupts(struct nicpf *nic)
|
||||
nic->msix_entries[irq].handle);
|
||||
}
|
||||
|
||||
bus_release_resource(nic->dev, SYS_RES_IRQ, irq,
|
||||
bus_release_resource(nic->dev, SYS_RES_IRQ, irq + 1,
|
||||
nic->msix_entries[irq].irq_res);
|
||||
}
|
||||
}
|
||||
|
@ -136,12 +136,16 @@ static int
|
||||
thunder_bgx_attach(device_t dev)
|
||||
{
|
||||
struct bgx *bgx;
|
||||
uint8_t lmac;
|
||||
uint8_t lmacid;
|
||||
int err;
|
||||
int rid;
|
||||
struct lmac *lmac;
|
||||
|
||||
bgx = malloc(sizeof(*bgx), M_BGX, (M_WAITOK | M_ZERO));
|
||||
bgx->dev = dev;
|
||||
|
||||
lmac = device_get_softc(dev);
|
||||
lmac->bgx = bgx;
|
||||
/* Enable bus mastering */
|
||||
pci_enable_busmaster(dev);
|
||||
/* Allocate resources - configuration registers */
|
||||
@ -168,11 +172,11 @@ thunder_bgx_attach(device_t dev)
|
||||
bgx_init_hw(bgx);
|
||||
|
||||
/* Enable all LMACs */
|
||||
for (lmac = 0; lmac < bgx->lmac_count; lmac++) {
|
||||
err = bgx_lmac_enable(bgx, lmac);
|
||||
for (lmacid = 0; lmacid < bgx->lmac_count; lmacid++) {
|
||||
err = bgx_lmac_enable(bgx, lmacid);
|
||||
if (err) {
|
||||
device_printf(dev, "BGX%d failed to enable lmac%d\n",
|
||||
bgx->bgx_id, lmac);
|
||||
bgx->bgx_id, lmacid);
|
||||
goto err_free_res;
|
||||
}
|
||||
}
|
||||
@ -203,6 +207,12 @@ thunder_bgx_detach(device_t dev)
|
||||
for (lmacid = 0; lmacid < bgx->lmac_count; lmacid++)
|
||||
bgx_lmac_disable(bgx, lmacid);
|
||||
|
||||
bgx_vnic[bgx->bgx_id] = NULL;
|
||||
bus_release_resource(dev, SYS_RES_MEMORY,
|
||||
rman_get_rid(bgx->reg_base), bgx->reg_base);
|
||||
free(bgx, M_BGX);
|
||||
pci_disable_busmaster(dev);
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user