[SCSI] aacraid: fix shutdown handler to also disable interrupts.

Moves quiesce, thread and interrupt shutdown into aacraid drivers'
.shutdown handler. This fix to the aac_shutdown handler will remove the
superfluous reset of the adapter during a (clean) kexec.

This fix may mitigate the active investigation 'kexec and aacraid
broken' but it is unlikely to affect the root cause (issue likely
present in both kexec and kdump). This patch reduces the chance the
problem will occur with a kexec. The fix for root cause is currently
expected to be the minimum value check to the aacraid.startup_timeout
driver variable after an adapter reset within aacraid_commit_reset.patch
submitted on 05/22/2007 and awaiting testing by Yinghai to confirm.

Signed-off-by: Mark Salyzyn <aacraid@adaptec.com>
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>

authored by Salyzyn, Mark and committed by James Bottomley 94774a3a 88f5774b

+12 -10
+12 -10
drivers/scsi/aacraid/linit.c
··· 863 .emulated = 1, 864 }; 865 866 static int __devinit aac_probe_one(struct pci_dev *pdev, 867 const struct pci_device_id *id) 868 { ··· 1023 return 0; 1024 1025 out_deinit: 1026 - kthread_stop(aac->thread); 1027 - aac_send_shutdown(aac); 1028 - aac_adapter_disable_int(aac); 1029 - free_irq(pdev->irq, aac); 1030 out_unmap: 1031 aac_fib_map_free(aac); 1032 pci_free_consistent(aac->pdev, aac->comm_size, aac->comm_addr, aac->comm_phys); ··· 1043 { 1044 struct Scsi_Host *shost = pci_get_drvdata(dev); 1045 struct aac_dev *aac = (struct aac_dev *)shost->hostdata; 1046 - aac_send_shutdown(aac); 1047 } 1048 1049 static void __devexit aac_remove_one(struct pci_dev *pdev) ··· 1054 1055 scsi_remove_host(shost); 1056 1057 - kthread_stop(aac->thread); 1058 - 1059 - aac_send_shutdown(aac); 1060 - aac_adapter_disable_int(aac); 1061 aac_fib_map_free(aac); 1062 pci_free_consistent(aac->pdev, aac->comm_size, aac->comm_addr, 1063 aac->comm_phys); 1064 kfree(aac->queues); 1065 1066 - free_irq(pdev->irq, aac); 1067 aac_adapter_ioremap(aac, 0); 1068 1069 kfree(aac->fibs);
··· 863 .emulated = 1, 864 }; 865 866 + static void __aac_shutdown(struct aac_dev * aac) 867 + { 868 + kthread_stop(aac->thread); 869 + aac_send_shutdown(aac); 870 + aac_adapter_disable_int(aac); 871 + free_irq(aac->pdev->irq, aac); 872 + } 873 + 874 static int __devinit aac_probe_one(struct pci_dev *pdev, 875 const struct pci_device_id *id) 876 { ··· 1015 return 0; 1016 1017 out_deinit: 1018 + __aac_shutdown(aac); 1019 out_unmap: 1020 aac_fib_map_free(aac); 1021 pci_free_consistent(aac->pdev, aac->comm_size, aac->comm_addr, aac->comm_phys); ··· 1038 { 1039 struct Scsi_Host *shost = pci_get_drvdata(dev); 1040 struct aac_dev *aac = (struct aac_dev *)shost->hostdata; 1041 + scsi_block_requests(shost); 1042 + __aac_shutdown(aac); 1043 } 1044 1045 static void __devexit aac_remove_one(struct pci_dev *pdev) ··· 1048 1049 scsi_remove_host(shost); 1050 1051 + __aac_shutdown(aac); 1052 aac_fib_map_free(aac); 1053 pci_free_consistent(aac->pdev, aac->comm_size, aac->comm_addr, 1054 aac->comm_phys); 1055 kfree(aac->queues); 1056 1057 aac_adapter_ioremap(aac, 0); 1058 1059 kfree(aac->fibs);