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:
wma 2016-05-20 11:02:04 +00:00
parent 60eec567ab
commit c6acdff608
2 changed files with 26 additions and 6 deletions

View File

@ -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);
}
}

View File

@ -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);
}