Move controller destruction code from nvme_detach() to new nvme_ctrlr_destruct()
function. Sponsored by: Intel
This commit is contained in:
parent
274b3a88fa
commit
990e741c18
@ -286,53 +286,8 @@ static int
|
||||
nvme_detach (device_t dev)
|
||||
{
|
||||
struct nvme_controller *ctrlr = DEVICE2SOFTC(dev);
|
||||
struct nvme_namespace *ns;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < NVME_MAX_NAMESPACES; i++) {
|
||||
ns = &ctrlr->ns[i];
|
||||
if (ns->cdev)
|
||||
destroy_dev(ns->cdev);
|
||||
}
|
||||
|
||||
if (ctrlr->cdev)
|
||||
destroy_dev(ctrlr->cdev);
|
||||
|
||||
for (i = 0; i < ctrlr->num_io_queues; i++) {
|
||||
nvme_io_qpair_destroy(&ctrlr->ioq[i]);
|
||||
}
|
||||
|
||||
free(ctrlr->ioq, M_NVME);
|
||||
|
||||
nvme_admin_qpair_destroy(&ctrlr->adminq);
|
||||
|
||||
if (ctrlr->resource != NULL) {
|
||||
bus_release_resource(dev, SYS_RES_MEMORY,
|
||||
ctrlr->resource_id, ctrlr->resource);
|
||||
}
|
||||
|
||||
if (ctrlr->bar4_resource != NULL) {
|
||||
bus_release_resource(dev, SYS_RES_MEMORY,
|
||||
ctrlr->bar4_resource_id, ctrlr->bar4_resource);
|
||||
}
|
||||
|
||||
#ifdef CHATHAM2
|
||||
if (ctrlr->chatham_resource != NULL) {
|
||||
bus_release_resource(dev, SYS_RES_MEMORY,
|
||||
ctrlr->chatham_resource_id, ctrlr->chatham_resource);
|
||||
}
|
||||
#endif
|
||||
|
||||
if (ctrlr->tag)
|
||||
bus_teardown_intr(ctrlr->dev, ctrlr->res, ctrlr->tag);
|
||||
|
||||
if (ctrlr->res)
|
||||
bus_release_resource(ctrlr->dev, SYS_RES_IRQ,
|
||||
rman_get_rid(ctrlr->res), ctrlr->res);
|
||||
|
||||
if (ctrlr->msix_enabled)
|
||||
pci_release_msi(dev);
|
||||
|
||||
nvme_ctrlr_destruct(ctrlr, dev);
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
@ -807,6 +807,57 @@ nvme_ctrlr_construct(struct nvme_controller *ctrlr, device_t dev)
|
||||
return (0);
|
||||
}
|
||||
|
||||
void
|
||||
nvme_ctrlr_destruct(struct nvme_controller *ctrlr, device_t dev)
|
||||
{
|
||||
struct nvme_namespace *ns;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < NVME_MAX_NAMESPACES; i++) {
|
||||
ns = &ctrlr->ns[i];
|
||||
if (ns->cdev)
|
||||
destroy_dev(ns->cdev);
|
||||
}
|
||||
|
||||
if (ctrlr->cdev)
|
||||
destroy_dev(ctrlr->cdev);
|
||||
|
||||
for (i = 0; i < ctrlr->num_io_queues; i++) {
|
||||
nvme_io_qpair_destroy(&ctrlr->ioq[i]);
|
||||
}
|
||||
|
||||
free(ctrlr->ioq, M_NVME);
|
||||
|
||||
nvme_admin_qpair_destroy(&ctrlr->adminq);
|
||||
|
||||
if (ctrlr->resource != NULL) {
|
||||
bus_release_resource(dev, SYS_RES_MEMORY,
|
||||
ctrlr->resource_id, ctrlr->resource);
|
||||
}
|
||||
|
||||
if (ctrlr->bar4_resource != NULL) {
|
||||
bus_release_resource(dev, SYS_RES_MEMORY,
|
||||
ctrlr->bar4_resource_id, ctrlr->bar4_resource);
|
||||
}
|
||||
|
||||
#ifdef CHATHAM2
|
||||
if (ctrlr->chatham_resource != NULL) {
|
||||
bus_release_resource(dev, SYS_RES_MEMORY,
|
||||
ctrlr->chatham_resource_id, ctrlr->chatham_resource);
|
||||
}
|
||||
#endif
|
||||
|
||||
if (ctrlr->tag)
|
||||
bus_teardown_intr(ctrlr->dev, ctrlr->res, ctrlr->tag);
|
||||
|
||||
if (ctrlr->res)
|
||||
bus_release_resource(ctrlr->dev, SYS_RES_IRQ,
|
||||
rman_get_rid(ctrlr->res), ctrlr->res);
|
||||
|
||||
if (ctrlr->msix_enabled)
|
||||
pci_release_msi(dev);
|
||||
}
|
||||
|
||||
void
|
||||
nvme_ctrlr_submit_admin_request(struct nvme_controller *ctrlr,
|
||||
struct nvme_request *req)
|
||||
|
@ -358,6 +358,7 @@ void nvme_payload_map_uio(void *arg, bus_dma_segment_t *seg, int nseg,
|
||||
bus_size_t mapsize, int error);
|
||||
|
||||
int nvme_ctrlr_construct(struct nvme_controller *ctrlr, device_t dev);
|
||||
void nvme_ctrlr_destruct(struct nvme_controller *ctrlr, device_t dev);
|
||||
int nvme_ctrlr_reset(struct nvme_controller *ctrlr);
|
||||
/* ctrlr defined as void * to allow use with config_intrhook. */
|
||||
void nvme_ctrlr_start(void *ctrlr_arg);
|
||||
|
Loading…
Reference in New Issue
Block a user