diff options
author | Mark Haverkamp <markh@osdl.org> | 2005-08-03 18:39:01 -0400 |
---|---|---|
committer | James Bottomley <jejb@mulgrave.(none)> | 2005-08-05 17:51:11 -0400 |
commit | bd1aac809ddbcf7772cfd809d8cfb29c729c6cf9 (patch) | |
tree | 7ec25f58f22929ee48495addf8facda797668852 /drivers/scsi/aacraid/linit.c | |
parent | c7f476023f57145357df32346b7de9202ce47d5f (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.c | 13 |
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 | ||
852 | out_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 | ||
874 | static 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 | |||
873 | static void __devexit aac_remove_one(struct pci_dev *pdev) | 881 | static 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 | ||
906 | static int __init aac_init(void) | 916 | static 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 | ||