diff --git a/drivers/scsi/aacraid/linit.c b/drivers/scsi/aacraid/linit.c index 214ebb454283ff23b23da14ce15dfa1be80a9e13..197cc4f0e3e11b026586a81b0906ba300647b406 100644 --- a/drivers/scsi/aacraid/linit.c +++ b/drivers/scsi/aacraid/linit.c @@ -579,10 +579,6 @@ static int __devinit aac_probe_one(struct pci_dev *pdev, for (container = 0; container < MAXIMUM_NUM_CONTAINERS; container++) fsa_dev_ptr->devname[container][0] = '\0'; - error = scsi_add_host(shost, &pdev->dev); - if (error) - goto out_free_fibs; - if ((*aac_drivers[index].init)(aac)) goto out_free_fibs; @@ -619,12 +615,25 @@ static int __devinit aac_probe_one(struct pci_dev *pdev, shost->max_lun = AAC_MAX_LUN; pci_set_drvdata(pdev, shost); + + error = scsi_add_host(shost, &pdev->dev); + if (error) + goto out_deinit; scsi_scan_host(shost); return 0; +out_deinit: + kill_proc(aac->thread_pid, SIGKILL, 0); + wait_for_completion(&aac->aif_completion); + + aac_send_shutdown(aac); + fib_map_free(aac); + pci_free_consistent(aac->pdev, aac->comm_size, aac->comm_addr, aac->comm_phys); + kfree(aac->queues); + free_irq(pdev->irq, aac); + iounmap((void * )aac->regs.sa); out_free_fibs: - scsi_remove_host(shost); kfree(aac->fibs); out_free_host: scsi_host_put(shost);