aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/aacraid/linit.c
diff options
context:
space:
mode:
authorMark Haverkamp <markh@osdl.org>2005-08-03 18:39:01 -0400
committerJames Bottomley <jejb@mulgrave.(none)>2005-08-05 17:51:11 -0400
commitbd1aac809ddbcf7772cfd809d8cfb29c729c6cf9 (patch)
tree7ec25f58f22929ee48495addf8facda797668852 /drivers/scsi/aacraid/linit.c
parentc7f476023f57145357df32346b7de9202ce47d5f (diff)
[SCSI] aacraid: driver shutdown method
Add in pci shutdown method so that the adapter shuts down correctly and flushes its cache. Shutdown should also disable the adapter's interrupt when shutdown (in particularly if the driver is rmmod'd) to prevent spurious hardware activities. Signed-off-by: Mark Haverkamp <markh@osdl.org> Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
Diffstat (limited to 'drivers/scsi/aacraid/linit.c')
-rw-r--r--drivers/scsi/aacraid/linit.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/drivers/scsi/aacraid/linit.c b/drivers/scsi/aacraid/linit.c
index b6dda99f5083..41255f7893d0 100644
--- a/drivers/scsi/aacraid/linit.c
+++ b/drivers/scsi/aacraid/linit.c
@@ -849,11 +849,12 @@ static int __devinit aac_probe_one(struct pci_dev *pdev,
849 849
850 return 0; 850 return 0;
851 851
852out_deinit: 852 out_deinit:
853 kill_proc(aac->thread_pid, SIGKILL, 0); 853 kill_proc(aac->thread_pid, SIGKILL, 0);
854 wait_for_completion(&aac->aif_completion); 854 wait_for_completion(&aac->aif_completion);
855 855
856 aac_send_shutdown(aac); 856 aac_send_shutdown(aac);
857 aac_adapter_disable_int(aac);
857 fib_map_free(aac); 858 fib_map_free(aac);
858 pci_free_consistent(aac->pdev, aac->comm_size, aac->comm_addr, aac->comm_phys); 859 pci_free_consistent(aac->pdev, aac->comm_size, aac->comm_addr, aac->comm_phys);
859 kfree(aac->queues); 860 kfree(aac->queues);
@@ -870,6 +871,13 @@ out_deinit:
870 return error; 871 return error;
871} 872}
872 873
874static void aac_shutdown(struct pci_dev *dev)
875{
876 struct Scsi_Host *shost = pci_get_drvdata(dev);
877 struct aac_dev *aac = (struct aac_dev *)shost->hostdata;
878 aac_send_shutdown(aac);
879}
880
873static void __devexit aac_remove_one(struct pci_dev *pdev) 881static void __devexit aac_remove_one(struct pci_dev *pdev)
874{ 882{
875 struct Scsi_Host *shost = pci_get_drvdata(pdev); 883 struct Scsi_Host *shost = pci_get_drvdata(pdev);
@@ -881,6 +889,7 @@ static void __devexit aac_remove_one(struct pci_dev *pdev)
881 wait_for_completion(&aac->aif_completion); 889 wait_for_completion(&aac->aif_completion);
882 890
883 aac_send_shutdown(aac); 891 aac_send_shutdown(aac);
892 aac_adapter_disable_int(aac);
884 fib_map_free(aac); 893 fib_map_free(aac);
885 pci_free_consistent(aac->pdev, aac->comm_size, aac->comm_addr, 894 pci_free_consistent(aac->pdev, aac->comm_size, aac->comm_addr,
886 aac->comm_phys); 895 aac->comm_phys);
@@ -901,6 +910,7 @@ static struct pci_driver aac_pci_driver = {
901 .id_table = aac_pci_tbl, 910 .id_table = aac_pci_tbl,
902 .probe = aac_probe_one, 911 .probe = aac_probe_one,
903 .remove = __devexit_p(aac_remove_one), 912 .remove = __devexit_p(aac_remove_one),
913 .shutdown = aac_shutdown,
904}; 914};
905 915
906static int __init aac_init(void) 916static int __init aac_init(void)
@@ -919,6 +929,7 @@ static int __init aac_init(void)
919 printk(KERN_WARNING 929 printk(KERN_WARNING
920 "aacraid: unable to register \"aac\" device.\n"); 930 "aacraid: unable to register \"aac\" device.\n");
921 } 931 }
932
922 return 0; 933 return 0;
923} 934}
924 935