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)
|
nicpf_detach(device_t dev)
|
||||||
{
|
{
|
||||||
struct nicpf *nic;
|
struct nicpf *nic;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
err = 0;
|
||||||
nic = device_get_softc(dev);
|
nic = device_get_softc(dev);
|
||||||
|
|
||||||
callout_drain(&nic->check_link);
|
callout_drain(&nic->check_link);
|
||||||
@ -257,7 +259,12 @@ nicpf_detach(device_t dev)
|
|||||||
nicpf_free_res(nic);
|
nicpf_free_res(nic);
|
||||||
pci_disable_busmaster(dev);
|
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->msix_enabled = 0;
|
||||||
nic->num_vec = 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
|
static void
|
||||||
@ -1071,7 +1081,7 @@ nic_free_all_interrupts(struct nicpf *nic)
|
|||||||
nic->msix_entries[irq].handle);
|
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);
|
nic->msix_entries[irq].irq_res);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -136,12 +136,16 @@ static int
|
|||||||
thunder_bgx_attach(device_t dev)
|
thunder_bgx_attach(device_t dev)
|
||||||
{
|
{
|
||||||
struct bgx *bgx;
|
struct bgx *bgx;
|
||||||
uint8_t lmac;
|
uint8_t lmacid;
|
||||||
int err;
|
int err;
|
||||||
int rid;
|
int rid;
|
||||||
|
struct lmac *lmac;
|
||||||
|
|
||||||
bgx = malloc(sizeof(*bgx), M_BGX, (M_WAITOK | M_ZERO));
|
bgx = malloc(sizeof(*bgx), M_BGX, (M_WAITOK | M_ZERO));
|
||||||
bgx->dev = dev;
|
bgx->dev = dev;
|
||||||
|
|
||||||
|
lmac = device_get_softc(dev);
|
||||||
|
lmac->bgx = bgx;
|
||||||
/* Enable bus mastering */
|
/* Enable bus mastering */
|
||||||
pci_enable_busmaster(dev);
|
pci_enable_busmaster(dev);
|
||||||
/* Allocate resources - configuration registers */
|
/* Allocate resources - configuration registers */
|
||||||
@ -168,11 +172,11 @@ thunder_bgx_attach(device_t dev)
|
|||||||
bgx_init_hw(bgx);
|
bgx_init_hw(bgx);
|
||||||
|
|
||||||
/* Enable all LMACs */
|
/* Enable all LMACs */
|
||||||
for (lmac = 0; lmac < bgx->lmac_count; lmac++) {
|
for (lmacid = 0; lmacid < bgx->lmac_count; lmacid++) {
|
||||||
err = bgx_lmac_enable(bgx, lmac);
|
err = bgx_lmac_enable(bgx, lmacid);
|
||||||
if (err) {
|
if (err) {
|
||||||
device_printf(dev, "BGX%d failed to enable lmac%d\n",
|
device_printf(dev, "BGX%d failed to enable lmac%d\n",
|
||||||
bgx->bgx_id, lmac);
|
bgx->bgx_id, lmacid);
|
||||||
goto err_free_res;
|
goto err_free_res;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -203,6 +207,12 @@ thunder_bgx_detach(device_t dev)
|
|||||||
for (lmacid = 0; lmacid < bgx->lmac_count; lmacid++)
|
for (lmacid = 0; lmacid < bgx->lmac_count; lmacid++)
|
||||||
bgx_lmac_disable(bgx, 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);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user