diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/scsi/gdth.c | 320 | ||||
-rw-r--r-- | drivers/scsi/gdth.h | 1 |
2 files changed, 157 insertions, 164 deletions
diff --git a/drivers/scsi/gdth.c b/drivers/scsi/gdth.c index ef67e664c9e6..11796e61a76b 100644 --- a/drivers/scsi/gdth.c +++ b/drivers/scsi/gdth.c | |||
@@ -119,6 +119,7 @@ | |||
119 | #include <linux/time.h> | 119 | #include <linux/time.h> |
120 | #include <linux/timer.h> | 120 | #include <linux/timer.h> |
121 | #include <linux/dma-mapping.h> | 121 | #include <linux/dma-mapping.h> |
122 | #include <linux/list.h> | ||
122 | 123 | ||
123 | #ifdef GDTH_RTC | 124 | #ifdef GDTH_RTC |
124 | #include <linux/mc146818rtc.h> | 125 | #include <linux/mc146818rtc.h> |
@@ -184,15 +185,6 @@ static void gdth_flush(gdth_ha_str *ha); | |||
184 | static int gdth_halt(struct notifier_block *nb, ulong event, void *buf); | 185 | static int gdth_halt(struct notifier_block *nb, ulong event, void *buf); |
185 | static int gdth_queuecommand(Scsi_Cmnd *scp,void (*done)(Scsi_Cmnd *)); | 186 | static int gdth_queuecommand(Scsi_Cmnd *scp,void (*done)(Scsi_Cmnd *)); |
186 | static void gdth_scsi_done(struct scsi_cmnd *scp); | 187 | static void gdth_scsi_done(struct scsi_cmnd *scp); |
187 | #ifdef CONFIG_ISA | ||
188 | static int gdth_isa_probe_one(struct scsi_host_template *, ulong32); | ||
189 | #endif | ||
190 | #ifdef CONFIG_EISA | ||
191 | static int gdth_eisa_probe_one(struct scsi_host_template *, ushort); | ||
192 | #endif | ||
193 | #ifdef CONFIG_PCI | ||
194 | static int gdth_pci_probe_one(struct scsi_host_template *, gdth_pci_str *, int); | ||
195 | #endif | ||
196 | 188 | ||
197 | #ifdef DEBUG_GDTH | 189 | #ifdef DEBUG_GDTH |
198 | static unchar DebugState = DEBUG_GDTH; | 190 | static unchar DebugState = DEBUG_GDTH; |
@@ -298,8 +290,8 @@ static unchar gdth_irq_tab[6] = {0,10,11,12,14,0}; /* IRQ table */ | |||
298 | #endif | 290 | #endif |
299 | static unchar gdth_polling; /* polling if TRUE */ | 291 | static unchar gdth_polling; /* polling if TRUE */ |
300 | static int gdth_ctr_count = 0; /* controller count */ | 292 | static int gdth_ctr_count = 0; /* controller count */ |
301 | static int gdth_ctr_released = 0; /* gdth_release() */ | ||
302 | static struct Scsi_Host *gdth_ctr_tab[MAXHA]; /* controller table */ | 293 | static struct Scsi_Host *gdth_ctr_tab[MAXHA]; /* controller table */ |
294 | static LIST_HEAD(gdth_instances); | ||
303 | static unchar gdth_write_through = FALSE; /* write through */ | 295 | static unchar gdth_write_through = FALSE; /* write through */ |
304 | static gdth_evt_str ebuffer[MAX_EVENTS]; /* event buffer */ | 296 | static gdth_evt_str ebuffer[MAX_EVENTS]; /* event buffer */ |
305 | static int elastidx; | 297 | static int elastidx; |
@@ -3872,145 +3864,6 @@ int __init option_setup(char *str) | |||
3872 | return 1; | 3864 | return 1; |
3873 | } | 3865 | } |
3874 | 3866 | ||
3875 | static int __init gdth_detect(struct scsi_host_template *shtp) | ||
3876 | { | ||
3877 | #ifdef DEBUG_GDTH | ||
3878 | printk("GDT: This driver contains debugging information !! Trace level = %d\n", | ||
3879 | DebugState); | ||
3880 | printk(" Destination of debugging information: "); | ||
3881 | #ifdef __SERIAL__ | ||
3882 | #ifdef __COM2__ | ||
3883 | printk("Serial port COM2\n"); | ||
3884 | #else | ||
3885 | printk("Serial port COM1\n"); | ||
3886 | #endif | ||
3887 | #else | ||
3888 | printk("Console\n"); | ||
3889 | #endif | ||
3890 | gdth_delay(3000); | ||
3891 | #endif | ||
3892 | |||
3893 | TRACE(("gdth_detect()\n")); | ||
3894 | |||
3895 | if (disable) { | ||
3896 | printk("GDT-HA: Controller driver disabled from command line !\n"); | ||
3897 | return 0; | ||
3898 | } | ||
3899 | |||
3900 | printk("GDT-HA: Storage RAID Controller Driver. Version: %s\n",GDTH_VERSION_STR); | ||
3901 | /* initializations */ | ||
3902 | gdth_polling = TRUE; | ||
3903 | gdth_clear_events(); | ||
3904 | |||
3905 | /* As default we do not probe for EISA or ISA controllers */ | ||
3906 | if (probe_eisa_isa) { | ||
3907 | /* scanning for controllers, at first: ISA controller */ | ||
3908 | #ifdef CONFIG_ISA | ||
3909 | ulong32 isa_bios; | ||
3910 | for (isa_bios = 0xc8000UL; isa_bios <= 0xd8000UL; | ||
3911 | isa_bios += 0x8000UL) { | ||
3912 | if (gdth_ctr_count >= MAXHA) | ||
3913 | break; | ||
3914 | gdth_isa_probe_one(shtp, isa_bios); | ||
3915 | } | ||
3916 | #endif | ||
3917 | #ifdef CONFIG_EISA | ||
3918 | { | ||
3919 | ushort eisa_slot; | ||
3920 | for (eisa_slot = 0x1000; eisa_slot <= 0x8000; eisa_slot += 0x1000) { | ||
3921 | if (gdth_ctr_count >= MAXHA) | ||
3922 | break; | ||
3923 | gdth_eisa_probe_one(shtp, eisa_slot); | ||
3924 | } | ||
3925 | } | ||
3926 | #endif | ||
3927 | } | ||
3928 | |||
3929 | #ifdef CONFIG_PCI | ||
3930 | /* scanning for PCI controllers */ | ||
3931 | { | ||
3932 | gdth_pci_str pcistr[MAXHA]; | ||
3933 | int cnt,ctr; | ||
3934 | |||
3935 | cnt = gdth_search_pci(pcistr); | ||
3936 | printk("GDT-HA: Found %d PCI Storage RAID Controllers\n",cnt); | ||
3937 | gdth_sort_pci(pcistr,cnt); | ||
3938 | for (ctr = 0; ctr < cnt; ++ctr) { | ||
3939 | if (gdth_ctr_count >= MAXHA) | ||
3940 | break; | ||
3941 | gdth_pci_probe_one(shtp, pcistr, ctr); | ||
3942 | } | ||
3943 | } | ||
3944 | #endif /* CONFIG_PCI */ | ||
3945 | |||
3946 | TRACE2(("gdth_detect() %d controller detected\n",gdth_ctr_count)); | ||
3947 | if (gdth_ctr_count > 0) { | ||
3948 | #ifdef GDTH_STATISTICS | ||
3949 | TRACE2(("gdth_detect(): Initializing timer !\n")); | ||
3950 | init_timer(&gdth_timer); | ||
3951 | gdth_timer.expires = jiffies + HZ; | ||
3952 | gdth_timer.data = 0L; | ||
3953 | gdth_timer.function = gdth_timeout; | ||
3954 | add_timer(&gdth_timer); | ||
3955 | #endif | ||
3956 | major = register_chrdev(0,"gdth",&gdth_fops); | ||
3957 | notifier_disabled = 0; | ||
3958 | register_reboot_notifier(&gdth_notifier); | ||
3959 | } | ||
3960 | gdth_polling = FALSE; | ||
3961 | return gdth_ctr_count; | ||
3962 | } | ||
3963 | |||
3964 | static int gdth_release(struct Scsi_Host *shp) | ||
3965 | { | ||
3966 | gdth_ha_str *ha = shost_priv(shp); | ||
3967 | |||
3968 | TRACE2(("gdth_release()\n")); | ||
3969 | if (ha->sdev) { | ||
3970 | scsi_free_host_dev(ha->sdev); | ||
3971 | ha->sdev = NULL; | ||
3972 | } | ||
3973 | gdth_flush(ha); | ||
3974 | |||
3975 | if (shp->irq) { | ||
3976 | free_irq(shp->irq,ha); | ||
3977 | } | ||
3978 | #ifdef CONFIG_ISA | ||
3979 | if (shp->dma_channel != 0xff) { | ||
3980 | free_dma(shp->dma_channel); | ||
3981 | } | ||
3982 | #endif | ||
3983 | #ifdef INT_COAL | ||
3984 | if (ha->coal_stat) | ||
3985 | pci_free_consistent(ha->pdev, sizeof(gdth_coal_status) * | ||
3986 | MAXOFFSETS, ha->coal_stat, ha->coal_stat_phys); | ||
3987 | #endif | ||
3988 | if (ha->pscratch) | ||
3989 | pci_free_consistent(ha->pdev, GDTH_SCRATCH, | ||
3990 | ha->pscratch, ha->scratch_phys); | ||
3991 | if (ha->pmsg) | ||
3992 | pci_free_consistent(ha->pdev, sizeof(gdth_msg_str), | ||
3993 | ha->pmsg, ha->msg_phys); | ||
3994 | if (ha->ccb_phys) | ||
3995 | pci_unmap_single(ha->pdev,ha->ccb_phys, | ||
3996 | sizeof(gdth_cmd_str),PCI_DMA_BIDIRECTIONAL); | ||
3997 | gdth_ctr_released++; | ||
3998 | TRACE2(("gdth_release(): HA %d of %d\n", | ||
3999 | gdth_ctr_released, gdth_ctr_count)); | ||
4000 | |||
4001 | if (gdth_ctr_released == gdth_ctr_count) { | ||
4002 | #ifdef GDTH_STATISTICS | ||
4003 | del_timer(&gdth_timer); | ||
4004 | #endif | ||
4005 | unregister_chrdev(major,"gdth"); | ||
4006 | unregister_reboot_notifier(&gdth_notifier); | ||
4007 | } | ||
4008 | |||
4009 | scsi_unregister(shp); | ||
4010 | return 0; | ||
4011 | } | ||
4012 | |||
4013 | |||
4014 | static const char *gdth_ctr_name(gdth_ha_str *ha) | 3867 | static const char *gdth_ctr_name(gdth_ha_str *ha) |
4015 | { | 3868 | { |
4016 | TRACE2(("gdth_ctr_name()\n")); | 3869 | TRACE2(("gdth_ctr_name()\n")); |
@@ -4819,10 +4672,8 @@ static int gdth_slave_configure(struct scsi_device *sdev) | |||
4819 | return 0; | 4672 | return 0; |
4820 | } | 4673 | } |
4821 | 4674 | ||
4822 | static struct scsi_host_template driver_template = { | 4675 | static struct scsi_host_template gdth_template = { |
4823 | .name = "GDT SCSI Disk Array Controller", | 4676 | .name = "GDT SCSI Disk Array Controller", |
4824 | .detect = gdth_detect, | ||
4825 | .release = gdth_release, | ||
4826 | .info = gdth_info, | 4677 | .info = gdth_info, |
4827 | .queuecommand = gdth_queuecommand, | 4678 | .queuecommand = gdth_queuecommand, |
4828 | .eh_bus_reset_handler = gdth_eh_bus_reset, | 4679 | .eh_bus_reset_handler = gdth_eh_bus_reset, |
@@ -4839,7 +4690,7 @@ static struct scsi_host_template driver_template = { | |||
4839 | }; | 4690 | }; |
4840 | 4691 | ||
4841 | #ifdef CONFIG_ISA | 4692 | #ifdef CONFIG_ISA |
4842 | static int gdth_isa_probe_one(struct scsi_host_template *shtp, ulong32 isa_bios) | 4693 | static int gdth_isa_probe_one(ulong32 isa_bios) |
4843 | { | 4694 | { |
4844 | struct Scsi_Host *shp; | 4695 | struct Scsi_Host *shp; |
4845 | gdth_ha_str *ha; | 4696 | gdth_ha_str *ha; |
@@ -4849,7 +4700,7 @@ static int gdth_isa_probe_one(struct scsi_host_template *shtp, ulong32 isa_bios) | |||
4849 | if (!gdth_search_isa(isa_bios)) | 4700 | if (!gdth_search_isa(isa_bios)) |
4850 | return -ENXIO; | 4701 | return -ENXIO; |
4851 | 4702 | ||
4852 | shp = scsi_register(shtp, sizeof(gdth_ha_str)); | 4703 | shp = scsi_host_alloc(&gdth_template, sizeof(gdth_ha_str)); |
4853 | if (!shp) | 4704 | if (!shp) |
4854 | return -ENOMEM; | 4705 | return -ENOMEM; |
4855 | ha = shost_priv(shp); | 4706 | ha = shost_priv(shp); |
@@ -4941,6 +4792,10 @@ static int gdth_isa_probe_one(struct scsi_host_template *shtp, ulong32 isa_bios) | |||
4941 | spin_lock_init(&ha->smp_lock); | 4792 | spin_lock_init(&ha->smp_lock); |
4942 | gdth_enable_int(ha); | 4793 | gdth_enable_int(ha); |
4943 | 4794 | ||
4795 | error = scsi_add_host(shp, NULL); | ||
4796 | if (error) | ||
4797 | goto out_free_coal_stat; | ||
4798 | list_add_tail(&ha->list, &gdth_instances); | ||
4944 | return 0; | 4799 | return 0; |
4945 | 4800 | ||
4946 | out_free_coal_stat: | 4801 | out_free_coal_stat: |
@@ -4959,14 +4814,13 @@ static int gdth_isa_probe_one(struct scsi_host_template *shtp, ulong32 isa_bios) | |||
4959 | out_free_irq: | 4814 | out_free_irq: |
4960 | free_irq(ha->irq, ha); | 4815 | free_irq(ha->irq, ha); |
4961 | out_host_put: | 4816 | out_host_put: |
4962 | scsi_unregister(shp); | 4817 | scsi_host_put(shp); |
4963 | return error; | 4818 | return error; |
4964 | } | 4819 | } |
4965 | #endif /* CONFIG_ISA */ | 4820 | #endif /* CONFIG_ISA */ |
4966 | 4821 | ||
4967 | #ifdef CONFIG_EISA | 4822 | #ifdef CONFIG_EISA |
4968 | static int gdth_eisa_probe_one(struct scsi_host_template *shtp, | 4823 | static int gdth_eisa_probe_one(ushort eisa_slot) |
4969 | ushort eisa_slot) | ||
4970 | { | 4824 | { |
4971 | struct Scsi_Host *shp; | 4825 | struct Scsi_Host *shp; |
4972 | gdth_ha_str *ha; | 4826 | gdth_ha_str *ha; |
@@ -4976,7 +4830,7 @@ static int gdth_eisa_probe_one(struct scsi_host_template *shtp, | |||
4976 | if (!gdth_search_eisa(eisa_slot)) | 4830 | if (!gdth_search_eisa(eisa_slot)) |
4977 | return -ENXIO; | 4831 | return -ENXIO; |
4978 | 4832 | ||
4979 | shp = scsi_register(shtp,sizeof(gdth_ha_str)); | 4833 | shp = scsi_host_alloc(&gdth_template, sizeof(gdth_ha_str)); |
4980 | if (!shp) | 4834 | if (!shp) |
4981 | return -ENOMEM; | 4835 | return -ENOMEM; |
4982 | ha = shost_priv(shp); | 4836 | ha = shost_priv(shp); |
@@ -5066,6 +4920,11 @@ static int gdth_eisa_probe_one(struct scsi_host_template *shtp, | |||
5066 | 4920 | ||
5067 | spin_lock_init(&ha->smp_lock); | 4921 | spin_lock_init(&ha->smp_lock); |
5068 | gdth_enable_int(ha); | 4922 | gdth_enable_int(ha); |
4923 | |||
4924 | error = scsi_add_host(shp, NULL); | ||
4925 | if (error) | ||
4926 | goto out_free_coal_stat; | ||
4927 | list_add_tail(&ha->list, &gdth_instances); | ||
5069 | return 0; | 4928 | return 0; |
5070 | 4929 | ||
5071 | out_free_ccb_phys: | 4930 | out_free_ccb_phys: |
@@ -5086,21 +4945,20 @@ static int gdth_eisa_probe_one(struct scsi_host_template *shtp, | |||
5086 | free_irq(ha->irq, ha); | 4945 | free_irq(ha->irq, ha); |
5087 | gdth_ctr_count--; | 4946 | gdth_ctr_count--; |
5088 | out_host_put: | 4947 | out_host_put: |
5089 | scsi_unregister(shp); | 4948 | scsi_host_put(shp); |
5090 | return error; | 4949 | return error; |
5091 | } | 4950 | } |
5092 | #endif /* CONFIG_EISA */ | 4951 | #endif /* CONFIG_EISA */ |
5093 | 4952 | ||
5094 | #ifdef CONFIG_PCI | 4953 | #ifdef CONFIG_PCI |
5095 | static int gdth_pci_probe_one(struct scsi_host_template *shtp, | 4954 | static int gdth_pci_probe_one(gdth_pci_str *pcistr, int ctr) |
5096 | gdth_pci_str *pcistr, int ctr) | ||
5097 | { | 4955 | { |
5098 | struct Scsi_Host *shp; | 4956 | struct Scsi_Host *shp; |
5099 | gdth_ha_str *ha; | 4957 | gdth_ha_str *ha; |
5100 | dma_addr_t scratch_dma_handle = 0; | 4958 | dma_addr_t scratch_dma_handle = 0; |
5101 | int error, hanum, i; | 4959 | int error, hanum, i; |
5102 | 4960 | ||
5103 | shp = scsi_register(shtp,sizeof(gdth_ha_str)); | 4961 | shp = scsi_host_alloc(&gdth_template, sizeof(gdth_ha_str)); |
5104 | if (!shp) | 4962 | if (!shp) |
5105 | return -ENOMEM; | 4963 | return -ENOMEM; |
5106 | ha = shost_priv(shp); | 4964 | ha = shost_priv(shp); |
@@ -5201,6 +5059,11 @@ static int gdth_pci_probe_one(struct scsi_host_template *shtp, | |||
5201 | 5059 | ||
5202 | spin_lock_init(&ha->smp_lock); | 5060 | spin_lock_init(&ha->smp_lock); |
5203 | gdth_enable_int(ha); | 5061 | gdth_enable_int(ha); |
5062 | |||
5063 | error = scsi_add_host(shp, &pcistr[ctr].pdev->dev); | ||
5064 | if (error) | ||
5065 | goto out_free_coal_stat; | ||
5066 | list_add_tail(&ha->list, &gdth_instances); | ||
5204 | return 0; | 5067 | return 0; |
5205 | 5068 | ||
5206 | out_free_coal_stat: | 5069 | out_free_coal_stat: |
@@ -5218,12 +5081,141 @@ static int gdth_pci_probe_one(struct scsi_host_template *shtp, | |||
5218 | free_irq(ha->irq, ha); | 5081 | free_irq(ha->irq, ha); |
5219 | gdth_ctr_count--; | 5082 | gdth_ctr_count--; |
5220 | out_host_put: | 5083 | out_host_put: |
5221 | scsi_unregister(shp); | 5084 | scsi_host_put(shp); |
5222 | return error; | 5085 | return error; |
5223 | } | 5086 | } |
5224 | #endif /* CONFIG_PCI */ | 5087 | #endif /* CONFIG_PCI */ |
5225 | 5088 | ||
5226 | #include "scsi_module.c" | 5089 | static void gdth_remove_one(gdth_ha_str *ha) |
5090 | { | ||
5091 | struct Scsi_Host *shp = ha->shost; | ||
5092 | |||
5093 | TRACE2(("gdth_remove_one()\n")); | ||
5094 | |||
5095 | scsi_remove_host(shp); | ||
5096 | |||
5097 | if (ha->sdev) { | ||
5098 | scsi_free_host_dev(ha->sdev); | ||
5099 | ha->sdev = NULL; | ||
5100 | } | ||
5101 | |||
5102 | gdth_flush(ha); | ||
5103 | |||
5104 | if (shp->irq) | ||
5105 | free_irq(shp->irq,ha); | ||
5106 | |||
5107 | #ifdef CONFIG_ISA | ||
5108 | if (shp->dma_channel != 0xff) | ||
5109 | free_dma(shp->dma_channel); | ||
5110 | #endif | ||
5111 | #ifdef INT_COAL | ||
5112 | if (ha->coal_stat) | ||
5113 | pci_free_consistent(ha->pdev, sizeof(gdth_coal_status) * | ||
5114 | MAXOFFSETS, ha->coal_stat, ha->coal_stat_phys); | ||
5115 | #endif | ||
5116 | if (ha->pscratch) | ||
5117 | pci_free_consistent(ha->pdev, GDTH_SCRATCH, | ||
5118 | ha->pscratch, ha->scratch_phys); | ||
5119 | if (ha->pmsg) | ||
5120 | pci_free_consistent(ha->pdev, sizeof(gdth_msg_str), | ||
5121 | ha->pmsg, ha->msg_phys); | ||
5122 | if (ha->ccb_phys) | ||
5123 | pci_unmap_single(ha->pdev,ha->ccb_phys, | ||
5124 | sizeof(gdth_cmd_str),PCI_DMA_BIDIRECTIONAL); | ||
5125 | |||
5126 | scsi_host_put(shp); | ||
5127 | } | ||
5128 | |||
5129 | static int __init gdth_init(void) | ||
5130 | { | ||
5131 | if (disable) { | ||
5132 | printk("GDT-HA: Controller driver disabled from" | ||
5133 | " command line !\n"); | ||
5134 | return 0; | ||
5135 | } | ||
5136 | |||
5137 | printk("GDT-HA: Storage RAID Controller Driver. Version: %s\n", | ||
5138 | GDTH_VERSION_STR); | ||
5139 | |||
5140 | /* initializations */ | ||
5141 | gdth_polling = TRUE; | ||
5142 | gdth_clear_events(); | ||
5143 | |||
5144 | /* As default we do not probe for EISA or ISA controllers */ | ||
5145 | if (probe_eisa_isa) { | ||
5146 | /* scanning for controllers, at first: ISA controller */ | ||
5147 | #ifdef CONFIG_ISA | ||
5148 | ulong32 isa_bios; | ||
5149 | for (isa_bios = 0xc8000UL; isa_bios <= 0xd8000UL; | ||
5150 | isa_bios += 0x8000UL) { | ||
5151 | if (gdth_ctr_count >= MAXHA) | ||
5152 | break; | ||
5153 | gdth_isa_probe_one(isa_bios); | ||
5154 | } | ||
5155 | #endif | ||
5156 | #ifdef CONFIG_EISA | ||
5157 | { | ||
5158 | ushort eisa_slot; | ||
5159 | for (eisa_slot = 0x1000; eisa_slot <= 0x8000; | ||
5160 | eisa_slot += 0x1000) { | ||
5161 | if (gdth_ctr_count >= MAXHA) | ||
5162 | break; | ||
5163 | gdth_eisa_probe_one(eisa_slot); | ||
5164 | } | ||
5165 | } | ||
5166 | #endif | ||
5167 | } | ||
5168 | |||
5169 | #ifdef CONFIG_PCI | ||
5170 | /* scanning for PCI controllers */ | ||
5171 | { | ||
5172 | gdth_pci_str pcistr[MAXHA]; | ||
5173 | int cnt,ctr; | ||
5174 | |||
5175 | cnt = gdth_search_pci(pcistr); | ||
5176 | printk("GDT-HA: Found %d PCI Storage RAID Controllers\n", cnt); | ||
5177 | gdth_sort_pci(pcistr,cnt); | ||
5178 | for (ctr = 0; ctr < cnt; ++ctr) { | ||
5179 | if (gdth_ctr_count >= MAXHA) | ||
5180 | break; | ||
5181 | gdth_pci_probe_one(pcistr, ctr); | ||
5182 | } | ||
5183 | } | ||
5184 | #endif /* CONFIG_PCI */ | ||
5185 | |||
5186 | TRACE2(("gdth_detect() %d controller detected\n", gdth_ctr_count)); | ||
5187 | #ifdef GDTH_STATISTICS | ||
5188 | TRACE2(("gdth_detect(): Initializing timer !\n")); | ||
5189 | init_timer(&gdth_timer); | ||
5190 | gdth_timer.expires = jiffies + HZ; | ||
5191 | gdth_timer.data = 0L; | ||
5192 | gdth_timer.function = gdth_timeout; | ||
5193 | add_timer(&gdth_timer); | ||
5194 | #endif | ||
5195 | major = register_chrdev(0,"gdth", &gdth_fops); | ||
5196 | notifier_disabled = 0; | ||
5197 | register_reboot_notifier(&gdth_notifier); | ||
5198 | gdth_polling = FALSE; | ||
5199 | return 0; | ||
5200 | } | ||
5201 | |||
5202 | static void __exit gdth_exit(void) | ||
5203 | { | ||
5204 | gdth_ha_str *ha; | ||
5205 | |||
5206 | list_for_each_entry(ha, &gdth_instances, list) | ||
5207 | gdth_remove_one(ha); | ||
5208 | |||
5209 | #ifdef GDTH_STATISTICS | ||
5210 | del_timer(&gdth_timer); | ||
5211 | #endif | ||
5212 | unregister_chrdev(major,"gdth"); | ||
5213 | unregister_reboot_notifier(&gdth_notifier); | ||
5214 | } | ||
5215 | |||
5216 | module_init(gdth_init); | ||
5217 | module_exit(gdth_exit); | ||
5218 | |||
5227 | #ifndef MODULE | 5219 | #ifndef MODULE |
5228 | __setup("gdth=", option_setup); | 5220 | __setup("gdth=", option_setup); |
5229 | #endif | 5221 | #endif |
diff --git a/drivers/scsi/gdth.h b/drivers/scsi/gdth.h index e8b9eb771d36..e6178c421855 100644 --- a/drivers/scsi/gdth.h +++ b/drivers/scsi/gdth.h | |||
@@ -854,6 +854,7 @@ typedef struct { | |||
854 | /* controller information structure */ | 854 | /* controller information structure */ |
855 | typedef struct { | 855 | typedef struct { |
856 | struct Scsi_Host *shost; | 856 | struct Scsi_Host *shost; |
857 | struct list_head list; | ||
857 | ushort hanum; | 858 | ushort hanum; |
858 | ushort oem_id; /* OEM */ | 859 | ushort oem_id; /* OEM */ |
859 | ushort type; /* controller class */ | 860 | ushort type; /* controller class */ |