Commit 25602c97 authored by Jayamohan Kallickal's avatar Jayamohan Kallickal Committed by James Bottomley

[SCSI] be2iscsi: Adding a shutdown Routine

This patch adds a shutdown routine. It fixes a bug where when be2net
and be2iscsi are both used be2iscsi was not cleaning up its resources
properly causing be2net to fail to get loaded when the system is
rebooted.
Signed-off-by: default avatarJayamohan Kallickal <jayamohan.kallickal@emulex.com>
Signed-off-by: default avatarMike Christie <michaelc@cs.wisc.edu>
Signed-off-by: default avatarJames Bottomley <JBottomley@Parallels.com>
parent 8fcfb210
...@@ -4119,9 +4119,8 @@ static int beiscsi_task_xmit(struct iscsi_task *task) ...@@ -4119,9 +4119,8 @@ static int beiscsi_task_xmit(struct iscsi_task *task)
return beiscsi_iotask(task, sg, num_sg, xferlen, writedir); return beiscsi_iotask(task, sg, num_sg, xferlen, writedir);
} }
static void beiscsi_remove(struct pci_dev *pcidev) static void beiscsi_quiesce(struct beiscsi_hba *phba)
{ {
struct beiscsi_hba *phba = NULL;
struct hwi_controller *phwi_ctrlr; struct hwi_controller *phwi_ctrlr;
struct hwi_context_memory *phwi_context; struct hwi_context_memory *phwi_context;
struct be_eq_obj *pbe_eq; struct be_eq_obj *pbe_eq;
...@@ -4129,12 +4128,6 @@ static void beiscsi_remove(struct pci_dev *pcidev) ...@@ -4129,12 +4128,6 @@ static void beiscsi_remove(struct pci_dev *pcidev)
u8 *real_offset = 0; u8 *real_offset = 0;
u32 value = 0; u32 value = 0;
phba = (struct beiscsi_hba *)pci_get_drvdata(pcidev);
if (!phba) {
dev_err(&pcidev->dev, "beiscsi_remove called with no phba\n");
return;
}
phwi_ctrlr = phba->phwi_ctrlr; phwi_ctrlr = phba->phwi_ctrlr;
phwi_context = phwi_ctrlr->phwi_ctxt; phwi_context = phwi_ctrlr->phwi_ctxt;
hwi_disable_intr(phba); hwi_disable_intr(phba);
...@@ -4170,12 +4163,40 @@ static void beiscsi_remove(struct pci_dev *pcidev) ...@@ -4170,12 +4163,40 @@ static void beiscsi_remove(struct pci_dev *pcidev)
phba->ctrl.mbox_mem_alloced.size, phba->ctrl.mbox_mem_alloced.size,
phba->ctrl.mbox_mem_alloced.va, phba->ctrl.mbox_mem_alloced.va,
phba->ctrl.mbox_mem_alloced.dma); phba->ctrl.mbox_mem_alloced.dma);
}
static void beiscsi_remove(struct pci_dev *pcidev)
{
struct beiscsi_hba *phba = NULL;
phba = pci_get_drvdata(pcidev);
if (!phba) {
dev_err(&pcidev->dev, "beiscsi_remove called with no phba\n");
return;
}
beiscsi_quiesce(phba);
iscsi_boot_destroy_kset(phba->boot_kset); iscsi_boot_destroy_kset(phba->boot_kset);
iscsi_host_remove(phba->shost); iscsi_host_remove(phba->shost);
pci_dev_put(phba->pcidev); pci_dev_put(phba->pcidev);
iscsi_host_free(phba->shost); iscsi_host_free(phba->shost);
} }
static void beiscsi_shutdown(struct pci_dev *pcidev)
{
struct beiscsi_hba *phba = NULL;
phba = (struct beiscsi_hba *)pci_get_drvdata(pcidev);
if (!phba) {
dev_err(&pcidev->dev, "beiscsi_shutdown called with no phba\n");
return;
}
beiscsi_quiesce(phba);
}
static void beiscsi_msix_enable(struct beiscsi_hba *phba) static void beiscsi_msix_enable(struct beiscsi_hba *phba)
{ {
int i, status; int i, status;
...@@ -4411,6 +4432,7 @@ static struct pci_driver beiscsi_pci_driver = { ...@@ -4411,6 +4432,7 @@ static struct pci_driver beiscsi_pci_driver = {
.name = DRV_NAME, .name = DRV_NAME,
.probe = beiscsi_dev_probe, .probe = beiscsi_dev_probe,
.remove = beiscsi_remove, .remove = beiscsi_remove,
.shutdown = beiscsi_shutdown,
.id_table = beiscsi_pci_id_table .id_table = beiscsi_pci_id_table
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment