gdth combined patchset & call for testers
cover gdth combined patchset & call for testers
Hi!
following is an attempted at unified patchset for the gdth driver.
They try to incorporate floating patches to gdth from:
Christoph Hellwig
Jeff Garzik
Matthew Wilcox
and Me Boaz Harrosh
They are done in the mindset of "likelihood of inducing breakage", hence the need for testers. Christoph & Jeff please review for any obvious easy-to-catch bugs. Also there was a massive code shifts and rebasing I hope nothing was lost.
The differences from last set are:
- Matthews patches are first so they can go in. They are a bit modified so please take these and not the original. Mainly they restrain from cleanups
- Fix Christoph bug that was spotted by jeff of the misplaced #endif. Also when compiling with out CONFIG_{ISA,EISA,PCI} compiler would complain about unused params, functions and so on so fixed that.
- More Aggressive fix for gdth_interrupt() and friends Christoph pleeeeeeease review.
- Rebasing to all above. I hope I'll get the From:
right this time
Some short explanations:
[01/16] gdth: Make one abuse of scsi_cmnd less obvious - Matthew Wilcox [02/16] gdth: Stop abusing ->done for internal commands - Matthew Wilcox
Patches from Matthew, but cleaned for future patchability.
[03/16] gdth: split out isa probing - Christoph Hellwig [04/16] gdth: split out eisa probing - Christoph Hellwig [05/16] gdth: split out pci probing - Christoph Hellwig
These three are from Christoph and where ACKed by Jeff at the time. Revised by me for warning fixes when one of the buses ISA/EISA/PCI is not defined.
[06/16] gdth: Remove 2.4.x support, in-kernel changelog - Jeff Garzik
Same but partial work was done both by Christoph and Matthew.
[07/16] gdth: kill gdth_{read,write}[bwl] wrappers - Jeff Garzik [08/16] Reorder scsi_host_template intitializers
[09/16] gdth: Remove virt hosts - Christoph && Boaz
Here we need an executive decision! The issue is as stated by Christoph:
"The virt_ctr option allows to register a new scsi_host for each bus on the raid controller. This non-default option makes no sense with the current scsi code and prevents cleaning up the host registration, so remove it."
I agree. This is just exactly the same as done buy scsi-ml scans but only more resource consuming. Unless I'm totally missing something, perhaps it is just a leftover from old kernels.
[10/16] gdth: clean up host private data - Christoph && Boaz
This is based on the same patch from Christoph, but taken one step farther, by just passing the ha pointer everywhere instead of hanum.
[11/16] gdth_interrupt gdth_get_status & gdth_wait fixes - Boaz
This logically belongs to [9/16] but is separated for reviewing and bisect-ability As it is a sensitive matter.
It is done aggressively this time around Please review!
[12/16] gdth: switch to modern scsi host registration - Christoph
Christoph what is missing from here is the remove of the deprecated pci_find_device() call. Can I Just use pci_get_device() of the same signature or do I need to call some other pci_ members after that?
[13/16] gdth: Remove gdth_ctr_tab[] - Boaz
I took Christoph's cleanup one step farther and got read of the statically allocated gdth_ctr_tab[]. In it's place I use the new link-list introduced by the [11/16] patch.
[14/16] gdth: Setup proper per-command private data - Boaz [15/16] gdth: Move members from SCp to gdth_cmndinfo, stage 2 - Boaz
These two move me much closer to the agenda I had in all this, which is: "gdth diss-abuse of of scsi_cmnd IO members". With these patches I also conform to Matthew's second patch:
"gdth: Stop abusing ->done for internal commands"
[16/16] gdth: !use_sg cleanup and use of scsi accessors
And finally this one.
Boaz
PATCH 1/16 gdth: Make one abuse of scsi_cmnd less obvious
From: Matthew Wilcox <[email protected]>
Rather than having internal commands abuse scsi_done to call gdth_scsi_done, have all the places that use to call scsi_done directly call gdth_scsi_done, which now checks whether the command was internal, and calls scsi_done if not.
--- drivers/scsi/gdth.c | 37 ++++++++++++++++++++----------------- 1 files changed, 20 insertions(+), 17 deletions(-)
drivers/scsi/gdth.c +20 -17
@@ -713,10 +713,12 @@ static void gdth_delay(int milliseconds)#if LINUX_VERSION_CODE >=KERNEL_VERSION (2 ,6 ,0 )static void gdth_scsi_done (struct scsi_cmnd *scp) { -TRACE2 (("gdth_scsi_done()\n" )); +TRACE2 (("gdth_scsi_done()\n" )); -if (scp->request) -complete ((struct completion *)scp->request); +if (scp->done == gdth_scsi_done) +complete ((struct completion *)scp->request); +else + scp->scsi_done (scp); } int __gdth_execute(struct scsi_device *sdev, gdth_cmd_str *gdtcmd, char *cmnd,
@@ -738,8 +740,8 @@ int __gdth_execute(struct scsi_device *sdev, gdth_cmd_str *gdtcmd, char *cmnd, scp->cmd_len =12 ;memcpy (scp->cmnd, cmnd,12 ); scp->SCp.this_residual =IOCTL_PRI ;/* priority */ - scp->done = gdth_scsi_done;/* some fn. test this */ -gdth_queuecommand (scp, gdth_scsi_done); + scp->done = gdth_scsi_done; +gdth_queuecommand (scp,NULL );wait_for_completion (&wait); rval = scp->SCp.Status;
@@ -2505,7 +2507,7 @@ static void gdth_next(int hanum)if (!nscp->SCp.have_data_in) nscp->SCp.have_data_in++;else - nscp->scsi_done (nscp); +gdth_scsi_done (nscp); } }else if (nscp->done == gdth_scsi_done) {if (!(cmd_index=gdth_special_cmd (hanum,nscp)))
@@ -2524,7 +2526,7 @@ static void gdth_next(int hanum)if (!nscp->SCp.have_data_in) nscp->SCp.have_data_in++;else - nscp->scsi_done (nscp); +gdth_scsi_done (nscp); }else {switch (nscp->cmnd[0 ]) {case TEST_UNIT_READY :
@@ -2550,9 +2552,9 @@ static void gdth_next(int hanum)if (!nscp->SCp.have_data_in) nscp->SCp.have_data_in++;else - nscp->scsi_done (nscp); - }else if (gdth_internal_cache_cmd (hanum,nscp)) - nscp->scsi_done (nscp); +gdth_scsi_done (nscp); + }else if (gdth_internal_cache_cmd (hanum, nscp)) +gdth_scsi_done (nscp);break ;case ALLOW_MEDIUM_REMOVAL :
@@ -2566,7 +2568,7 @@ static void gdth_next(int hanum)if (!nscp->SCp.have_data_in) nscp->SCp.have_data_in++;else - nscp->scsi_done (nscp); +gdth_scsi_done (nscp); }else { nscp->cmnd[3 ] = (ha->hdr[t].devtype&1 ) ?1 :0 ; TRACE(("Prevent/allow r. %d rem. drive %d\n",
@@ -2602,8 +2604,8 @@ static void gdth_next(int hanum)if (!nscp->SCp.have_data_in) nscp->SCp.have_data_in++;else - nscp->scsi_done (nscp); - }else if (!(cmd_index=gdth_fill_cache_cmd (hanum,nscp,t))) +gdth_scsi_done (nscp); + }else if (!(cmd_index=gdth_fill_cache_cmd (hanum, nscp, t))) this_cmd = FALSE;break ;
@@ -2617,7 +2619,7 @@ static void gdth_next(int hanum)if (!nscp->SCp.have_data_in) nscp->SCp.have_data_in++;else - nscp->scsi_done (nscp); +gdth_scsi_done (nscp);break ; } }
@@ -3630,7 +3632,7 @@ static irqreturn_t gdth_interrupt(int irq,void *dev_id)if (rval ==2 ) {gdth_putq (hanum,scp,scp->SCp.this_residual); }else if (rval ==1 ) { - scp->scsi_done (scp); +gdth_scsi_done (scp); }#ifdef INT_COAL
@@ -4925,14 +4927,15 @@ static int gdth_bios_param(Disk *disk,kdev_t dev,int *ip) } -static int gdth_queuecommand (Scsi_Cmnd *scp,void (*done)(Scsi_Cmnd *)) +static int gdth_queuecommand (struct scsi_cmnd *scp, +void (*done)(struct scsi_cmnd *)) {int hanum;int priority;TRACE (("gdth_queuecommand() cmd 0x%x\n" , scp->cmnd[0 ])); - scp->scsi_done = (void *)done; + scp->scsi_done = done; scp->SCp.have_data_in =1 ; scp->SCp.phase =-1 ; scp->SCp.sent_command =-1 ;
Signature · 1 line
1.5.3.1
PATCH 2/16 gdth: Stop abusing ->done for internal commands
In reply to Boaz HarroshFrom: Matthew Wilcox <[email protected]>
The ->done member was being used to mark commands as being internal. I decided to put a magic number in ->underflow instead. I believe this to be safe as no current user of ->underflow has any of the bottom 9 bits set.
--- drivers/scsi/gdth.c | 19 +++++++++++-------- drivers/scsi/gdth_proc.c | 4 ++-- 2 files changed, 13 insertions(+), 10 deletions(-)
drivers/scsi/gdth.c +11 -8
@@ -692,6 +692,9 @@ static const struct file_operations gdth_fops = { .release = gdth_close, }; +#define GDTH_MAGIC 0xc2e7c389/* I got it from /dev/urandom */ +#define IS_GDTH_INTERNAL_CMD (scp) (scp->underflow == GDTH_MAGIC) +#include "gdth_proc.h" #include "gdth_proc.c"
@@ -715,7 +718,7 @@ static void gdth_scsi_done(struct scsi_cmnd *scp) {TRACE2 (("gdth_scsi_done()\n" )); -if (scp->done == gdth_scsi_done) +if (IS_GDTH_INTERNAL_CMD (scp))complete ((struct completion *)scp->request);else scp->scsi_done (scp);
@@ -740,7 +743,7 @@ int __gdth_execute(struct scsi_device *sdev, gdth_cmd_str *gdtcmd, char *cmnd, scp->cmd_len =12 ;memcpy (scp->cmnd, cmnd,12 ); scp->SCp.this_residual =IOCTL_PRI ;/* priority */ - scp->done = gdth_scsi_done; + scp->underflow =GDTH_MAGIC ;gdth_queuecommand (scp,NULL );wait_for_completion (&wait);
@@ -2357,7 +2360,7 @@ static void gdth_putq(int hanum,Scsi_Cmnd *scp,unchar priority) ha =HADATA (gdth_ctr_tab[hanum]);spin_lock_irqsave (&ha->smp_lock, flags); -if (scp->done != gdth_scsi_done) { +if (!IS_GDTH_INTERNAL_CMD (scp)) { scp->SCp.this_residual = (int )priority; b = virt_ctr ?NUMDATA (scp->device->host)->busnum:scp->device->channel; t = scp->device->id;
@@ -2420,7 +2423,7 @@ static void gdth_next(int hanum)for (nscp = pscp = ha->req_first; nscp; nscp = (Scsi_Cmnd *)nscp->SCp.ptr) {if (nscp != pscp && nscp != (Scsi_Cmnd *)pscp->SCp.ptr) pscp = (Scsi_Cmnd *)pscp->SCp.ptr; -if (nscp->done != gdth_scsi_done) { +if (!IS_GDTH_INTERNAL_CMD (nscp)) { b = virt_ctr ?NUMDATA (nscp->device->host)->busnum : nscp->device->channel; t = nscp->device->id;
@@ -2446,7 +2449,7 @@ static void gdth_next(int hanum) firsttime = FALSE; } -if (nscp->done != gdth_scsi_done) { +if (!IS_GDTH_INTERNAL_CMD (nscp)) {if (nscp->SCp.phase ==-1 ) { nscp->SCp.phase =CACHESERVICE ;/* default: cache svc. */ if (nscp->cmnd[0 ] ==TEST_UNIT_READY ) {
@@ -2509,7 +2512,7 @@ static void gdth_next(int hanum)else gdth_scsi_done (nscp); } - }else if (nscp->done == gdth_scsi_done) { + }else if (IS_GDTH_INTERNAL_CMD (nscp)) {if (!(cmd_index=gdth_special_cmd (hanum,nscp))) this_cmd = FALSE; next_cmd = FALSE;
@@ -3850,7 +3853,7 @@ static int gdth_sync_event(int hanum,int service,unchar index,Scsi_Cmnd *scp) scp->sense_buffer[2 ] =NOT_READY ; scp->result = (DID_OK <<16 ) | (CHECK_CONDITION <<1 ); } -if (scp->done != gdth_scsi_done) { +if (!IS_GDTH_INTERNAL_CMD (scp)) { ha->dvr.size =sizeof (ha->dvr.eu.sync); ha->dvr.eu.sync.ionode = hanum; ha->dvr.eu.sync.service = service;
@@ -4948,7 +4951,7 @@ static int gdth_queuecommand(struct scsi_cmnd *scp,#endif priority =DEFAULT_PRI ; -if (scp->done == gdth_scsi_done) +if (IS_GDTH_INTERNAL_CMD (scp)) priority = scp->SCp.this_residual;else gdth_update_timeout (hanum, scp, scp->timeout_per_command *6 );
drivers/scsi/gdth_proc.c +2 -2
@@ -805,7 +805,7 @@ static void gdth_stop_timeout(int hanum, int busnum, int id)spin_lock_irqsave (&ha->smp_lock, flags);for (scp = ha->req_first; scp; scp = (Scsi_Cmnd *)scp->SCp.ptr) { -if (scp->done != gdth_scsi_done) { +if (IS_GDTH_INTERNAL_CMD (scp)) { b = virt_ctr ?NUMDATA (scp->device->host)->busnum : scp->device->channel; t = scp->device->id;
@@ -829,7 +829,7 @@ static void gdth_start_timeout(int hanum, int busnum, int id)spin_lock_irqsave (&ha->smp_lock, flags);for (scp = ha->req_first; scp; scp = (Scsi_Cmnd *)scp->SCp.ptr) { -if (scp->done != gdth_scsi_done) { +if (!IS_GDTH_INTERNAL_CMD (scp)) { b = virt_ctr ?NUMDATA (scp->device->host)->busnum : scp->device->channel; t = scp->device->id;
Signature · 1 line
1.5.3.1
PATCH 3/16 gdth: split out isa probing
In reply to Boaz HarroshFrom: Christoph Hellwig <[email protected]>
(note: this is ontop of Jeff's pci cleanup patch)
Split out isa probing into a helper of it's own. Error handling is cleaned up, but errors are not propagated yet. Also enclose the isa probe under the proper CONFIG_ISA symbol instead of the !IA64 hack.
--- drivers/scsi/gdth.c | 296 ++++++++++++++++++++++++++++----------------------- 1 files changed, 162 insertions(+), 134 deletions(-)
drivers/scsi/gdth.c +162 -134
@@ -445,13 +445,11 @@ static int gdth_internal_cache_cmd(int hanum,Scsi_Cmnd *scp);static int gdth_fill_cache_cmd (int hanum,Scsi_Cmnd *scp,ushort hdrive);static int gdth_search_eisa (ushort eisa_adr); -static int gdth_search_isa (ulong32 bios_adr);static int gdth_search_pci (gdth_pci_str *pcistr);static void gdth_search_dev (gdth_pci_str *pcistr,ushort *cnt,ushort vendor,ushort dev);static void gdth_sort_pci (gdth_pci_str *pcistr,int cnt);static int gdth_init_eisa (ushort eisa_adr,gdth_ha_str *ha); -static int gdth_init_isa (ulong32 bios_adr,gdth_ha_str *ha);static int gdth_init_pci (gdth_pci_str *pcistr,gdth_ha_str *ha);static void gdth_enable_int (int hanum);
@@ -476,6 +474,9 @@ static void gdth_flush(int hanum);static int gdth_halt (struct notifier_block *nb,ulong event,void *buf);static int gdth_queuecommand (Scsi_Cmnd *scp,void (*done)(Scsi_Cmnd *));static void gdth_scsi_done (struct scsi_cmnd *scp); +#ifdef CONFIG_ISA +static int gdth_isa_probe_one (struct scsi_host_template *,ulong32 ); +#endif #ifdef DEBUG_GDTH static unchar DebugState =DEBUG_GDTH ;
@@ -584,7 +585,10 @@ static struct timer_list gdth_timer;#define gdth_writew (b,addr) writew((b),(addr))#define gdth_writel (b,addr) writel((b),(addr)) +#ifdef CONFIG_ISA static unchar gdth_drq_tab[4 ] = {5 ,6 ,7 ,7 };/* DRQ table */ +#endif +static unchar gdth_irq_tab[6 ] = {0 ,10 ,11 ,12 ,14 ,0 };/* IRQ table */ static unchar gdth_polling;/* polling if TRUE */ static unchar gdth_from_wait = FALSE;/* gdth_wait() */
@@ -838,7 +842,7 @@ static int __init gdth_search_eisa(ushort eisa_adr)return 0 ; } - +#ifdef CONFIG_ISA static int __init gdth_search_isa (ulong32 bios_adr) {void __iomem *addr;
@@ -853,7 +857,7 @@ static int __init gdth_search_isa(ulong32 bios_adr) }return 0 ; } - +#endif /* CONFIG_ISA */ static int __init gdth_search_pci (gdth_pci_str *pcistr) {
@@ -1064,7 +1068,7 @@ static int __init gdth_init_eisa(ushort eisa_adr,gdth_ha_str *ha)return 1 ; } - +#ifdef CONFIG_ISA static int __init gdth_init_isa (ulong32 bios_adr,gdth_ha_str *ha) { registergdt2_dpram_str __iomem *dp2_ptr;
@@ -1163,7 +1167,7 @@ static int __init gdth_init_isa(ulong32 bios_adr,gdth_ha_str *ha) ha->dma64_support =0 ; return 1; } - +#endif /* CONFIG_ISA */ static int __init gdth_init_pci (gdth_pci_str *pcistr,gdth_ha_str *ha) {
@@ -4282,6 +4286,7 @@ int __init option_setup(char *str)return 1 ; } +#if LINUX_VERSION_CODE >=KERNEL_VERSION (2 ,6 ,0 )static int __init gdth_detect (struct scsi_host_template *shtp) #else
@@ -4291,7 +4296,6 @@ static int __init gdth_detect(Scsi_Host_Template *shtp)struct Scsi_Host *shp;gdth_pci_str pcistr[MAXHA ];gdth_ha_str *ha; -ulong32 isa_bios;ushort eisa_slot;int i,hanum,cnt,ctr,err;unchar b;
@@ -4328,135 +4332,16 @@ static int __init gdth_detect(Scsi_Host_Template *shtp)/* As default we do not probe for EISA or ISA controllers */ if (probe_eisa_isa) {/* scanning for controllers, at first: ISA controller */ -for (isa_bios=0xc8000UL ; isa_bios<=0xd8000UL ; isa_bios+=0x8000UL ) { -dma_addr_t scratch_dma_handle; - scratch_dma_handle =0 ; - -if (gdth_ctr_count >=MAXHA ) +#ifdef CONFIG_ISA +ulong32 isa_bios; +for (isa_bios =0xc8000UL ; isa_bios <=0xd8000UL ; + isa_bios +=0x8000UL ) { +if (gdth_ctr_count >=MAXHA )break ; -if (gdth_search_isa (isa_bios)) {/* controller found */ - shp =scsi_register (shtp,sizeof (gdth_ext_str)); -if (shp ==NULL ) -continue ; - - ha =HADATA (shp); -if (!gdth_init_isa (isa_bios,ha)) { -scsi_unregister (shp); -continue ; - } -#ifdef __ia64__ -break ; -#else -/* controller found and initialized */ -printk ("Configuring GDT-ISA HA at BIOS 0x%05X IRQ %u DRQ %u\n" , - isa_bios,ha->irq,ha->drq); - -if (request_irq (ha->irq,gdth_interrupt,IRQF_DISABLED ,"gdth" ,ha)) { -printk ("GDT-ISA: Unable to allocate IRQ\n" ); -scsi_unregister (shp); -continue ; - } -if (request_dma (ha->drq,"gdth" )) { -printk ("GDT-ISA: Unable to allocate DMA channel\n" ); -free_irq (ha->irq,ha); -scsi_unregister (shp); -continue ; - } -set_dma_mode (ha->drq,DMA_MODE_CASCADE ); -enable_dma (ha->drq); - shp->unchecked_isa_dma =1 ; - shp->irq = ha->irq; - shp->dma_channel = ha->drq; - hanum = gdth_ctr_count; - gdth_ctr_tab[gdth_ctr_count++] = shp; - gdth_ctr_vtab[gdth_ctr_vcount++] = shp; - -NUMDATA (shp)->hanum = (ushort )hanum; -NUMDATA (shp)->busnum=0 ; - - ha->pccb =CMDDATA (shp); - ha->ccb_phys =0L ; - ha->pdev =NULL ; - ha->pscratch =pci_alloc_consistent (ha->pdev,GDTH_SCRATCH , - &scratch_dma_handle); - ha->scratch_phys = scratch_dma_handle; - ha->pmsg =pci_alloc_consistent (ha->pdev,sizeof (gdth_msg_str), - &scratch_dma_handle); - ha->msg_phys = scratch_dma_handle; -#ifdef INT_COAL - ha->coal_stat = (gdth_coal_status *) -pci_alloc_consistent (ha->pdev,sizeof (gdth_coal_status) * -MAXOFFSETS , &scratch_dma_handle); - ha->coal_stat_phys = scratch_dma_handle; -#endif - - ha->scratch_busy = FALSE; - ha->req_first =NULL ; - ha->tid_cnt =MAX_HDRIVES ; -if (max_ids >0 && max_ids < ha->tid_cnt) - ha->tid_cnt = max_ids; -for (i=0 ; i<GDTH_MAXCMDS ; ++i) - ha->cmd_tab[i].cmnd =UNUSED_CMND ; - ha->scan_mode = rescan ?0x10 :0 ; - -if (ha->pscratch ==NULL || ha->pmsg ==NULL || - !gdth_search_drives (hanum)) { -printk ("GDT-ISA: Error during device scan\n" ); - --gdth_ctr_count; - --gdth_ctr_vcount; - -#ifdef INT_COAL -if (ha->coal_stat) -pci_free_consistent (ha->pdev,sizeof (gdth_coal_status) * -MAXOFFSETS , ha->coal_stat, - ha->coal_stat_phys); -#endif -if (ha->pscratch) -pci_free_consistent (ha->pdev,GDTH_SCRATCH , - ha->pscratch, ha->scratch_phys); -if (ha->pmsg) -pci_free_consistent (ha->pdev,sizeof (gdth_msg_str), - ha->pmsg, ha->msg_phys); - -free_irq (ha->irq,ha); -scsi_unregister (shp); -continue ; - } -if (hdr_channel <0 || hdr_channel > ha->bus_cnt) - hdr_channel = ha->bus_cnt; - ha->virt_bus = hdr_channel; - -#if LINUX_VERSION_CODE >=KERNEL_VERSION (2 ,4 ,20 ) && \ -LINUX_VERSION_CODE <KERNEL_VERSION (2 ,6 ,0 ) - shp->highmem_io =0 ; -#endif -if (ha->cache_feat & ha->raw_feat & ha->screen_feat &GDT_64BIT ) - shp->max_cmd_len =16 ; - - shp->max_id = ha->tid_cnt; - shp->max_lun =MAXLUN ; - shp->max_channel = virt_ctr ?0 : ha->bus_cnt; -if (virt_ctr) { - virt_ctr =1 ; -/* register addit. SCSI channels as virtual controllers */ -for (b =1 ; b < ha->bus_cnt +1 ; ++b) { - shp =scsi_register (shtp,sizeof (gdth_num_str)); - shp->unchecked_isa_dma =1 ; - shp->irq = ha->irq; - shp->dma_channel = ha->drq; - gdth_ctr_vtab[gdth_ctr_vcount++] = shp; -NUMDATA (shp)->hanum = (ushort )hanum; -NUMDATA (shp)->busnum = b; - } - } - -spin_lock_init (&ha->smp_lock); -gdth_enable_int (hanum); -#endif /* !__ia64__ */ - } +gdth_isa_probe_one (shtp, isa_bios); } +#endif -/* scanning for EISA controllers */ for (eisa_slot=0x1000 ; eisa_slot<=0x8000 ; eisa_slot+=0x1000 ) {dma_addr_t scratch_dma_handle; scratch_dma_handle =0 ;
@@ -4754,7 +4639,7 @@ static int gdth_release(struct Scsi_Host *shp)if (shp->irq) {free_irq (shp->irq,ha); } -#ifndef __ia64__ +#ifdef CONFIG_ISA if (shp->dma_channel !=0xff ) {free_dma (shp->dma_channel); }
@@ -5674,6 +5559,149 @@ static Scsi_Host_Template driver_template = {#endif }; +#ifdef CONFIG_ISA +static int gdth_isa_probe_one (struct scsi_host_template *shtp,ulong32 isa_bios) +{ +struct Scsi_Host *shp; +gdth_ha_str *ha; +dma_addr_t scratch_dma_handle =0 ; +int error, hanum, i; +u8 b; + +if (!gdth_search_isa (isa_bios)) +return -ENXIO ; + + shp =scsi_register (shtp,sizeof (gdth_ext_str)); +if (!shp) +return -ENOMEM ; + ha =HADATA (shp); + + error = -ENODEV ; +if (!gdth_init_isa (isa_bios,ha)) + goto out_host_put; + +/* controller found and initialized */ +printk ("Configuring GDT-ISA HA at BIOS 0x%05X IRQ %u DRQ %u\n" , + isa_bios, ha->irq, ha->drq); + + error =request_irq (ha->irq, gdth_interrupt,IRQF_DISABLED ,"gdth" , ha); +if (error) { +printk ("GDT-ISA: Unable to allocate IRQ\n" ); + goto out_host_put; + } + + error =request_dma (ha->drq,"gdth" ); +if (error) { +printk ("GDT-ISA: Unable to allocate DMA channel\n" ); + goto out_free_irq; + } + +set_dma_mode (ha->drq,DMA_MODE_CASCADE ); +enable_dma (ha->drq); + shp->unchecked_isa_dma =1 ; + shp->irq = ha->irq; + shp->dma_channel = ha->drq; + hanum = gdth_ctr_count; + gdth_ctr_tab[gdth_ctr_count++] = shp; + gdth_ctr_vtab[gdth_ctr_vcount++] = shp; + +NUMDATA (shp)->hanum = (ushort )hanum; +NUMDATA (shp)->busnum=0 ; + + ha->pccb =CMDDATA (shp); + ha->ccb_phys =0L ; + ha->pdev =NULL ; + + error = -ENOMEM ; + + ha->pscratch =pci_alloc_consistent (ha->pdev,GDTH_SCRATCH , + &scratch_dma_handle); +if (!ha->pscratch) + goto out_dec_counters; + ha->scratch_phys = scratch_dma_handle; + + ha->pmsg =pci_alloc_consistent (ha->pdev,sizeof (gdth_msg_str), + &scratch_dma_handle); +if (!ha->pmsg) + goto out_free_pscratch; + ha->msg_phys = scratch_dma_handle; + +#ifdef INT_COAL + ha->coal_stat =pci_alloc_consistent (ha->pdev, +sizeof (gdth_coal_status) *MAXOFFSETS , + &scratch_dma_handle); +if (!ha->coal_stat) + goto out_free_pmsg; + ha->coal_stat_phys = scratch_dma_handle; +#endif + + ha->scratch_busy = FALSE; + ha->req_first =NULL ; + ha->tid_cnt =MAX_HDRIVES ; +if (max_ids >0 && max_ids < ha->tid_cnt) + ha->tid_cnt = max_ids; +for (i =0 ; i <GDTH_MAXCMDS ; ++i) + ha->cmd_tab[i].cmnd =UNUSED_CMND ; + ha->scan_mode = rescan ?0x10 :0 ; + + error = -ENODEV ; +if (!gdth_search_drives (hanum)) { +printk ("GDT-ISA: Error during device scan\n" ); + goto out_free_coal_stat; + } + +if (hdr_channel <0 || hdr_channel > ha->bus_cnt) + hdr_channel = ha->bus_cnt; + ha->virt_bus = hdr_channel; + +if (ha->cache_feat & ha->raw_feat & ha->screen_feat &GDT_64BIT ) + shp->max_cmd_len =16 ; + + shp->max_id = ha->tid_cnt; + shp->max_lun =MAXLUN ; + shp->max_channel = virt_ctr ?0 : ha->bus_cnt; +if (virt_ctr) { + virt_ctr =1 ; +/* register addit. SCSI channels as virtual controllers */ +for (b =1 ; b < ha->bus_cnt +1 ; ++b) { + shp =scsi_register (shtp,sizeof (gdth_num_str)); + shp->unchecked_isa_dma =1 ; + shp->irq = ha->irq; + shp->dma_channel = ha->drq; + gdth_ctr_vtab[gdth_ctr_vcount++] = shp; +NUMDATA (shp)->hanum = (ushort )hanum; +NUMDATA (shp)->busnum = b; + } + } + +spin_lock_init (&ha->smp_lock); +gdth_enable_int (hanum); + +return 0 ; + + out_free_coal_stat: +#ifdef INT_COAL +pci_free_consistent (ha->pdev,sizeof (gdth_coal_status) *MAXOFFSETS , + ha->coal_stat, ha->coal_stat_phys); + out_free_pmsg: +#endif +pci_free_consistent (ha->pdev,sizeof (gdth_msg_str), + ha->pmsg, ha->msg_phys); + out_free_pscratch: +pci_free_consistent (ha->pdev,GDTH_SCRATCH , + ha->pscratch, ha->scratch_phys); + out_dec_counters: + gdth_ctr_count--; + gdth_ctr_vcount--; + out_free_irq: +free_irq (ha->irq, ha); + out_host_put: +scsi_unregister (shp); +return error; +} +#endif /* CONFIG_ISA */ + +#include "scsi_module.c" #ifndef MODULE __setup ("gdth=" , option_setup);
Signature · 1 line
1.5.3.1
PATCH 4/16 gdth: split out eisa probing
In reply to Boaz HarroshFrom: Christoph Hellwig <[email protected]>
Split eisa probing into it's own helper, and do proper error unwinding. Protect EISA probind by the proper CONFIG_EISA symbol.
--- drivers/scsi/gdth.c | 285 ++++++++++++++++++++++++++++----------------------- 1 files changed, 159 insertions(+), 126 deletions(-)
drivers/scsi/gdth.c +159 -126
@@ -444,12 +444,10 @@ static void gdth_copy_internal_data(int hanum,Scsi_Cmnd *scp,static int gdth_internal_cache_cmd (int hanum,Scsi_Cmnd *scp);static int gdth_fill_cache_cmd (int hanum,Scsi_Cmnd *scp,ushort hdrive); -static int gdth_search_eisa (ushort eisa_adr);static int gdth_search_pci (gdth_pci_str *pcistr);static void gdth_search_dev (gdth_pci_str *pcistr,ushort *cnt,ushort vendor,ushort dev);static void gdth_sort_pci (gdth_pci_str *pcistr,int cnt); -static int gdth_init_eisa (ushort eisa_adr,gdth_ha_str *ha);static int gdth_init_pci (gdth_pci_str *pcistr,gdth_ha_str *ha);static void gdth_enable_int (int hanum);
@@ -477,6 +475,9 @@ static void gdth_scsi_done(struct scsi_cmnd *scp);#ifdef CONFIG_ISA static int gdth_isa_probe_one (struct scsi_host_template *,ulong32 );#endif +#ifdef CONFIG_EISA +static int gdth_eisa_probe_one (struct scsi_host_template *,ushort ); +#endif #ifdef DEBUG_GDTH static unchar DebugState =DEBUG_GDTH ;
@@ -588,8 +589,9 @@ static struct timer_list gdth_timer;#ifdef CONFIG_ISA static unchar gdth_drq_tab[4 ] = {5 ,6 ,7 ,7 };/* DRQ table */ #endif - +#ifdef CONFIG_EISA static unchar gdth_irq_tab[6 ] = {0 ,10 ,11 ,12 ,14 ,0 };/* IRQ table */ +#endif static unchar gdth_polling;/* polling if TRUE */ static unchar gdth_from_wait = FALSE;/* gdth_wait() */ static int wait_index,wait_hanum;/* gdth_wait() */
@@ -824,7 +826,7 @@ static void gdth_eval_mapping(ulong32 size, ulong32 *cyls, int *heads, int *secs }/* controller search and initialization functions */ - +#ifdef CONFIG_EISA static int __init gdth_search_eisa (ushort eisa_adr) {ulong32 id;
@@ -841,6 +843,7 @@ static int __init gdth_search_eisa(ushort eisa_adr) return 0; } +#endif /* CONFIG_EISA */ #ifdef CONFIG_ISA static int __init gdth_search_isa (ulong32 bios_adr)
@@ -975,7 +978,7 @@ static void __init gdth_sort_pci(gdth_pci_str *pcistr, int cnt) }while (changed); } - +#ifdef CONFIG_EISA static int __init gdth_init_eisa (ushort eisa_adr,gdth_ha_str *ha) {ulong32 retries,id;
@@ -1067,6 +1070,7 @@ static int __init gdth_init_eisa(ushort eisa_adr,gdth_ha_str *ha) ha->dma64_support =0 ; return 1; } +#endif /* CONFIG_EISA */ #ifdef CONFIG_ISA static int __init gdth_init_isa (ulong32 bios_adr,gdth_ha_str *ha)
@@ -4296,7 +4300,6 @@ static int __init gdth_detect(Scsi_Host_Template *shtp)struct Scsi_Host *shp;gdth_pci_str pcistr[MAXHA ];gdth_ha_str *ha; -ushort eisa_slot;int i,hanum,cnt,ctr,err;unchar b;
@@ -4341,128 +4344,16 @@ static int __init gdth_detect(Scsi_Host_Template *shtp) gdth_isa_probe_one(shtp, isa_bios); }#endif - -for (eisa_slot=0x1000 ; eisa_slot<=0x8000 ; eisa_slot+=0x1000 ) { -dma_addr_t scratch_dma_handle; - scratch_dma_handle =0 ; - -if (gdth_ctr_count >=MAXHA ) +#ifdef CONFIG_EISA + { +ushort eisa_slot; +for (eisa_slot =0x1000 ; eisa_slot <=0x8000 ; eisa_slot +=0x1000 ) { +if (gdth_ctr_count >=MAXHA )break ; -if (gdth_search_eisa (eisa_slot)) {/* controller found */ - shp =scsi_register (shtp,sizeof (gdth_ext_str)); -if (shp ==NULL ) -continue ; - - ha =HADATA (shp); -if (!gdth_init_eisa (eisa_slot,ha)) { -scsi_unregister (shp); -continue ; - } -/* controller found and initialized */ -printk ("Configuring GDT-EISA HA at Slot %d IRQ %u\n" , - eisa_slot>>12 ,ha->irq); - -if (request_irq (ha->irq,gdth_interrupt,IRQF_DISABLED ,"gdth" ,ha)) { -printk ("GDT-EISA: Unable to allocate IRQ\n" ); -scsi_unregister (shp); -continue ; - } - shp->unchecked_isa_dma =0 ; - shp->irq = ha->irq; - shp->dma_channel =0xff ; - hanum = gdth_ctr_count; - gdth_ctr_tab[gdth_ctr_count++] = shp; - gdth_ctr_vtab[gdth_ctr_vcount++] = shp; - -NUMDATA (shp)->hanum = (ushort )hanum; -NUMDATA (shp)->busnum=0 ; -TRACE2 (("EISA detect Bus 0: hanum %d\n" , -NUMDATA (shp)->hanum)); - - ha->pccb =CMDDATA (shp); - ha->ccb_phys =0L ; - - ha->pdev =NULL ; - ha->pscratch =pci_alloc_consistent (ha->pdev,GDTH_SCRATCH , - &scratch_dma_handle); - ha->scratch_phys = scratch_dma_handle; - ha->pmsg =pci_alloc_consistent (ha->pdev,sizeof (gdth_msg_str), - &scratch_dma_handle); - ha->msg_phys = scratch_dma_handle; -#ifdef INT_COAL - ha->coal_stat = (gdth_coal_status *) -pci_alloc_consistent (ha->pdev,sizeof (gdth_coal_status) * -MAXOFFSETS , &scratch_dma_handle); - ha->coal_stat_phys = scratch_dma_handle; -#endif - ha->ccb_phys = -pci_map_single (ha->pdev,ha->pccb, -sizeof (gdth_cmd_str),PCI_DMA_BIDIRECTIONAL ); - ha->scratch_busy = FALSE; - ha->req_first =NULL ; - ha->tid_cnt =MAX_HDRIVES ; -if (max_ids >0 && max_ids < ha->tid_cnt) - ha->tid_cnt = max_ids; -for (i=0 ; i<GDTH_MAXCMDS ; ++i) - ha->cmd_tab[i].cmnd =UNUSED_CMND ; - ha->scan_mode = rescan ?0x10 :0 ; - -if (ha->pscratch ==NULL || ha->pmsg ==NULL || - !gdth_search_drives (hanum)) { -printk ("GDT-EISA: Error during device scan\n" ); - --gdth_ctr_count; - --gdth_ctr_vcount; -#ifdef INT_COAL -if (ha->coal_stat) -pci_free_consistent (ha->pdev,sizeof (gdth_coal_status) * -MAXOFFSETS , ha->coal_stat, - ha->coal_stat_phys); -#endif -if (ha->pscratch) -pci_free_consistent (ha->pdev,GDTH_SCRATCH , - ha->pscratch, ha->scratch_phys); -if (ha->pmsg) -pci_free_consistent (ha->pdev,sizeof (gdth_msg_str), - ha->pmsg, ha->msg_phys); -if (ha->ccb_phys) -pci_unmap_single (ha->pdev,ha->ccb_phys, -sizeof (gdth_cmd_str),PCI_DMA_BIDIRECTIONAL ); -free_irq (ha->irq,ha); -scsi_unregister (shp); -continue ; - } -if (hdr_channel <0 || hdr_channel > ha->bus_cnt) - hdr_channel = ha->bus_cnt; - ha->virt_bus = hdr_channel; - -#if LINUX_VERSION_CODE >=KERNEL_VERSION (2 ,4 ,20 ) && \ -LINUX_VERSION_CODE <KERNEL_VERSION (2 ,6 ,0 ) - shp->highmem_io =0 ; -#endif -if (ha->cache_feat & ha->raw_feat & ha->screen_feat &GDT_64BIT ) - shp->max_cmd_len =16 ; - - shp->max_id = ha->tid_cnt; - shp->max_lun =MAXLUN ; - shp->max_channel = virt_ctr ?0 : ha->bus_cnt; -if (virt_ctr) { - virt_ctr =1 ; -/* register addit. SCSI channels as virtual controllers */ -for (b =1 ; b < ha->bus_cnt +1 ; ++b) { - shp =scsi_register (shtp,sizeof (gdth_num_str)); - shp->unchecked_isa_dma =0 ; - shp->irq = ha->irq; - shp->dma_channel =0xff ; - gdth_ctr_vtab[gdth_ctr_vcount++] = shp; -NUMDATA (shp)->hanum = (ushort )hanum; -NUMDATA (shp)->busnum = b; - } - } - -spin_lock_init (&ha->smp_lock); -gdth_enable_int (hanum); - } +gdth_eisa_probe_one (shtp, eisa_slot); } + } +#endif }/* scanning for PCI controllers */
@@ -5701,6 +5592,148 @@ static int gdth_isa_probe_one(struct scsi_host_template *shtp, ulong32 isa_bios) }#endif /* CONFIG_ISA */ +#ifdef CONFIG_EISA +static int gdth_eisa_probe_one (struct scsi_host_template *shtp, +ushort eisa_slot) +{ +struct Scsi_Host *shp; +gdth_ha_str *ha; +dma_addr_t scratch_dma_handle =0 ; +int error, hanum, i; +u8 b; + +if (!gdth_search_eisa (eisa_slot)) +return -ENXIO ; + + shp =scsi_register (shtp,sizeof (gdth_ext_str)); +if (!shp) +return -ENOMEM ; + ha =HADATA (shp); + + error = -ENODEV ; +if (!gdth_init_eisa (eisa_slot,ha)) + goto out_host_put; + +/* controller found and initialized */ +printk ("Configuring GDT-EISA HA at Slot %d IRQ %u\n" , + eisa_slot >>12 , ha->irq); + + error =request_irq (ha->irq, gdth_interrupt,IRQF_DISABLED ,"gdth" , ha); +if (error) { +printk ("GDT-EISA: Unable to allocate IRQ\n" ); + goto out_host_put; + } + + shp->unchecked_isa_dma =0 ; + shp->irq = ha->irq; + shp->dma_channel =0xff ; + hanum = gdth_ctr_count; + gdth_ctr_tab[gdth_ctr_count++] = shp; + gdth_ctr_vtab[gdth_ctr_vcount++] = shp; + +NUMDATA (shp)->hanum = (ushort )hanum; +NUMDATA (shp)->busnum=0 ; +TRACE2 (("EISA detect Bus 0: hanum %d\n" , +NUMDATA (shp)->hanum)); + + ha->pccb =CMDDATA (shp); + ha->ccb_phys =0L ; + + error = -ENOMEM ; + + ha->pdev =NULL ; + ha->pscratch =pci_alloc_consistent (ha->pdev,GDTH_SCRATCH , + &scratch_dma_handle); +if (!ha->pscratch) + goto out_free_irq; + ha->scratch_phys = scratch_dma_handle; + + ha->pmsg =pci_alloc_consistent (ha->pdev,sizeof (gdth_msg_str), + &scratch_dma_handle); +if (!ha->pmsg) + goto out_free_pscratch; + ha->msg_phys = scratch_dma_handle; + +#ifdef INT_COAL + ha->coal_stat =pci_alloc_consistent (ha->pdev, +sizeof (gdth_coal_status) *MAXOFFSETS , + &scratch_dma_handle); +if (!ha->coal_stat) + goto out_free_pmsg; + ha->coal_stat_phys = scratch_dma_handle; +#endif + + ha->ccb_phys =pci_map_single (ha->pdev,ha->pccb, +sizeof (gdth_cmd_str),PCI_DMA_BIDIRECTIONAL ); +if (!ha->ccb_phys) + goto out_free_coal_stat; + + ha->scratch_busy = FALSE; + ha->req_first =NULL ; + ha->tid_cnt =MAX_HDRIVES ; +if (max_ids >0 && max_ids < ha->tid_cnt) + ha->tid_cnt = max_ids; +for (i =0 ; i <GDTH_MAXCMDS ; ++i) + ha->cmd_tab[i].cmnd =UNUSED_CMND ; + ha->scan_mode = rescan ?0x10 :0 ; + +if (!gdth_search_drives (hanum)) { +printk ("GDT-EISA: Error during device scan\n" ); + error = -ENODEV ; + goto out_free_ccb_phys; + } + +if (hdr_channel <0 || hdr_channel > ha->bus_cnt) + hdr_channel = ha->bus_cnt; + ha->virt_bus = hdr_channel; + +if (ha->cache_feat & ha->raw_feat & ha->screen_feat &GDT_64BIT ) + shp->max_cmd_len =16 ; + + shp->max_id = ha->tid_cnt; + shp->max_lun =MAXLUN ; + shp->max_channel = virt_ctr ?0 : ha->bus_cnt; +if (virt_ctr) { + virt_ctr =1 ; +/* register addit. SCSI channels as virtual controllers */ +for (b =1 ; b < ha->bus_cnt +1 ; ++b) { + shp =scsi_register (shtp,sizeof (gdth_num_str)); + shp->unchecked_isa_dma =0 ; + shp->irq = ha->irq; + shp->dma_channel =0xff ; + gdth_ctr_vtab[gdth_ctr_vcount++] = shp; +NUMDATA (shp)->hanum = (ushort )hanum; +NUMDATA (shp)->busnum = b; + } + } + +spin_lock_init (&ha->smp_lock); +gdth_enable_int (hanum); +return 0 ; + + out_free_ccb_phys: +pci_unmap_single (ha->pdev,ha->ccb_phys,sizeof (gdth_cmd_str), +PCI_DMA_BIDIRECTIONAL ); + out_free_coal_stat: +#ifdef INT_COAL +pci_free_consistent (ha->pdev,sizeof (gdth_coal_status) *MAXOFFSETS , + ha->coal_stat, ha->coal_stat_phys); + out_free_pmsg: +#endif +pci_free_consistent (ha->pdev,sizeof (gdth_msg_str), + ha->pmsg, ha->msg_phys); + out_free_pscratch: +pci_free_consistent (ha->pdev,GDTH_SCRATCH , + ha->pscratch, ha->scratch_phys); + out_free_irq: +free_irq (ha->irq, ha); + gdth_ctr_count--; + gdth_ctr_vcount--; + out_host_put: +scsi_unregister (shp); +return error; +} +#endif /* CONFIG_EISA */ #include "scsi_module.c" #ifndef MODULE
Signature · 1 line
1.5.3.1
PATCH 5/16 gdth: split out pci probing
In reply to Boaz HarroshFrom: Christoph Hellwig <[email protected]>
Split out per-device pci probing and put it under proper CONFIG_PCI.
--- drivers/scsi/gdth.c | 312 +++++++++++++++++++++++++++------------------------ 1 files changed, 167 insertions(+), 145 deletions(-)
drivers/scsi/gdth.c +167 -145
@@ -444,12 +444,6 @@ static void gdth_copy_internal_data(int hanum,Scsi_Cmnd *scp,static int gdth_internal_cache_cmd (int hanum,Scsi_Cmnd *scp);static int gdth_fill_cache_cmd (int hanum,Scsi_Cmnd *scp,ushort hdrive); -static int gdth_search_pci (gdth_pci_str *pcistr); -static void gdth_search_dev (gdth_pci_str *pcistr,ushort *cnt, -ushort vendor,ushort dev); -static void gdth_sort_pci (gdth_pci_str *pcistr,int cnt); -static int gdth_init_pci (gdth_pci_str *pcistr,gdth_ha_str *ha); -static void gdth_enable_int (int hanum);static int gdth_get_status (unchar *pIStatus,int irq);static int gdth_test_busy (int hanum);
@@ -478,6 +472,9 @@ static int gdth_isa_probe_one(struct scsi_host_template *, ulong32);#ifdef CONFIG_EISA static int gdth_eisa_probe_one (struct scsi_host_template *,ushort );#endif +#ifdef CONFIG_PCI +static int gdth_pci_probe_one (struct scsi_host_template *,gdth_pci_str *,int ); +#endif #ifdef DEBUG_GDTH static unchar DebugState =DEBUG_GDTH ;
@@ -862,6 +859,10 @@ static int __init gdth_search_isa(ulong32 bios_adr) }#endif /* CONFIG_ISA */ +#ifdef CONFIG_PCI +static void gdth_search_dev (gdth_pci_str *pcistr,ushort *cnt, +ushort vendor,ushort dev); +static int __init gdth_search_pci (gdth_pci_str *pcistr) {ushort device, cnt;
@@ -940,7 +941,6 @@ static void __init gdth_search_dev(gdth_pci_str *pcistr, ushort *cnt, } } -static void __init gdth_sort_pci (gdth_pci_str *pcistr,int cnt) {gdth_pci_str temp;
@@ -977,6 +977,7 @@ static void __init gdth_sort_pci(gdth_pci_str *pcistr, int cnt) } }while (changed); } +#endif /* CONFIG_PCI */ #ifdef CONFIG_EISA static int __init gdth_init_eisa (ushort eisa_adr,gdth_ha_str *ha)
@@ -1173,6 +1174,7 @@ static int __init gdth_init_isa(ulong32 bios_adr,gdth_ha_str *ha) }#endif /* CONFIG_ISA */ +#ifdef CONFIG_PCI static int __init gdth_init_pci (gdth_pci_str *pcistr,gdth_ha_str *ha) { registergdt6_dpram_str __iomem *dp6_ptr;
@@ -1555,7 +1557,7 @@ static int __init gdth_init_pci(gdth_pci_str *pcistr,gdth_ha_str *ha) return 1; } - +#endif /* CONFIG_PCI */ /* controller protocol functions */
@@ -4297,13 +4299,6 @@ static int __init gdth_detect(struct scsi_host_template *shtp) static int __init gdth_detect(Scsi_Host_Template *shtp)#endif { -struct Scsi_Host *shp; -gdth_pci_str pcistr[MAXHA ]; -gdth_ha_str *ha; -int i,hanum,cnt,ctr,err; -unchar b; - -#ifdef DEBUG_GDTH printk ("GDT: This driver contains debugging information !! Trace level = %d\n" , DebugState);
@@ -4329,7 +4324,7 @@ static int __init gdth_detect(Scsi_Host_Template *shtp)printk ("GDT-HA: Storage RAID Controller Driver. Version: %s\n" ,GDTH_VERSION_STR );/* initializations */ - gdth_polling = TRUE; b =0 ; + gdth_polling = TRUE;gdth_clear_events ();/* As default we do not probe for EISA or ISA controllers */
@@ -4356,143 +4351,22 @@ static int __init gdth_detect(Scsi_Host_Template *shtp)#endif } +#ifdef CONFIG_PCI /* scanning for PCI controllers */ + { +gdth_pci_str pcistr[MAXHA ]; +int cnt,ctr; + cnt =gdth_search_pci (pcistr);printk ("GDT-HA: Found %d PCI Storage RAID Controllers\n" ,cnt);gdth_sort_pci (pcistr,cnt);for (ctr =0 ; ctr < cnt; ++ctr) { -dma_addr_t scratch_dma_handle; - scratch_dma_handle =0 ; -if (gdth_ctr_count >=MAXHA )break ; - shp =scsi_register (shtp,sizeof (gdth_ext_str)); -if (shp ==NULL ) -continue ; - - ha =HADATA (shp); -if (!gdth_init_pci (&pcistr[ctr],ha)) { -scsi_unregister (shp); -continue ; - } -/* controller found and initialized */ -printk ("Configuring GDT-PCI HA at %d/%d IRQ %u\n" , - pcistr[ctr].pdev->bus->number, -PCI_SLOT (pcistr[ctr].pdev->devfn), ha->irq); - -if (request_irq (ha->irq, gdth_interrupt, -IRQF_DISABLED |IRQF_SHARED ,"gdth" , ha)) - { -printk ("GDT-PCI: Unable to allocate IRQ\n" ); -scsi_unregister (shp); -continue ; - } - shp->unchecked_isa_dma =0 ; - shp->irq = ha->irq; - shp->dma_channel =0xff ; - hanum = gdth_ctr_count; - gdth_ctr_tab[gdth_ctr_count++] = shp; - gdth_ctr_vtab[gdth_ctr_vcount++] = shp; - -NUMDATA (shp)->hanum = (ushort )hanum; -NUMDATA (shp)->busnum=0 ; - - ha->pccb =CMDDATA (shp); - ha->ccb_phys =0L ; - - ha->pscratch =pci_alloc_consistent (ha->pdev,GDTH_SCRATCH , - &scratch_dma_handle); - ha->scratch_phys = scratch_dma_handle; - ha->pmsg =pci_alloc_consistent (ha->pdev,sizeof (gdth_msg_str), - &scratch_dma_handle); - ha->msg_phys = scratch_dma_handle; -#ifdef INT_COAL - ha->coal_stat = (gdth_coal_status *) -pci_alloc_consistent (ha->pdev,sizeof (gdth_coal_status) * -MAXOFFSETS , &scratch_dma_handle); - ha->coal_stat_phys = scratch_dma_handle; -#endif - ha->scratch_busy = FALSE; - ha->req_first =NULL ; - ha->tid_cnt = pcistr[ctr].pdev->device >=0x200 ?MAXID :MAX_HDRIVES ; -if (max_ids >0 && max_ids < ha->tid_cnt) - ha->tid_cnt = max_ids; -for (i=0 ; i<GDTH_MAXCMDS ; ++i) - ha->cmd_tab[i].cmnd =UNUSED_CMND ; - ha->scan_mode = rescan ?0x10 :0 ; - - err = FALSE; -if (ha->pscratch ==NULL || ha->pmsg ==NULL || - !gdth_search_drives (hanum)) { - err = TRUE; - }else { -if (hdr_channel <0 || hdr_channel > ha->bus_cnt) - hdr_channel = ha->bus_cnt; - ha->virt_bus = hdr_channel; - - -#if LINUX_VERSION_CODE <KERNEL_VERSION (2 ,6 ,0 ) -scsi_set_pci_device (shp, pcistr[ctr].pdev); -#endif -if (!(ha->cache_feat & ha->raw_feat & ha->screen_feat &GDT_64BIT )|| -/* 64-bit DMA only supported from FW >= x.43 */ - (!ha->dma64_support)) { -if (pci_set_dma_mask (pcistr[ctr].pdev,DMA_32BIT_MASK )) { -printk (KERN_WARNING "GDT-PCI %d: Unable to set 32-bit DMA\n" , hanum); - err = TRUE; - } - }else { - shp->max_cmd_len =16 ; -if (!pci_set_dma_mask (pcistr[ctr].pdev,DMA_64BIT_MASK )) { -printk ("GDT-PCI %d: 64-bit DMA enabled\n" , hanum); - }else if (pci_set_dma_mask (pcistr[ctr].pdev,DMA_32BIT_MASK )) { -printk (KERN_WARNING "GDT-PCI %d: Unable to set 64/32-bit DMA\n" , hanum); - err = TRUE; - } - } - } - -if (err) { -printk ("GDT-PCI %d: Error during device scan\n" , hanum); - --gdth_ctr_count; - --gdth_ctr_vcount; -#ifdef INT_COAL -if (ha->coal_stat) -pci_free_consistent (ha->pdev,sizeof (gdth_coal_status) * -MAXOFFSETS , ha->coal_stat, - ha->coal_stat_phys); -#endif -if (ha->pscratch) -pci_free_consistent (ha->pdev,GDTH_SCRATCH , - ha->pscratch, ha->scratch_phys); -if (ha->pmsg) -pci_free_consistent (ha->pdev,sizeof (gdth_msg_str), - ha->pmsg, ha->msg_phys); -free_irq (ha->irq,ha); -scsi_unregister (shp); -continue ; - } - - shp->max_id = ha->tid_cnt; - shp->max_lun =MAXLUN ; - shp->max_channel = virt_ctr ?0 : ha->bus_cnt; -if (virt_ctr) { - virt_ctr =1 ; -/* register addit. SCSI channels as virtual controllers */ -for (b =1 ; b < ha->bus_cnt +1 ; ++b) { - shp =scsi_register (shtp,sizeof (gdth_num_str)); - shp->unchecked_isa_dma =0 ; - shp->irq = ha->irq; - shp->dma_channel =0xff ; - gdth_ctr_vtab[gdth_ctr_vcount++] = shp; -NUMDATA (shp)->hanum = (ushort )hanum; -NUMDATA (shp)->busnum = b; - } - } - -spin_lock_init (&ha->smp_lock); -gdth_enable_int (hanum); +gdth_pci_probe_one (shtp, pcistr, ctr); + } } +#endif /* CONFIG_PCI */ TRACE2 (("gdth_detect() %d controller detected\n" ,gdth_ctr_count));if (gdth_ctr_count >0 ) {
@@ -5735,6 +5609,154 @@ static int gdth_eisa_probe_one(struct scsi_host_template *shtp, }#endif /* CONFIG_EISA */ +#ifdef CONFIG_PCI +static int gdth_pci_probe_one (struct scsi_host_template *shtp, +gdth_pci_str *pcistr,int ctr) +{ +struct Scsi_Host *shp; +gdth_ha_str *ha; +dma_addr_t scratch_dma_handle =0 ; +int error, hanum, i; +u8 b; + + shp =scsi_register (shtp,sizeof (gdth_ext_str)); +if (!shp) +return -ENOMEM ; + ha =HADATA (shp); + + error = -ENODEV ; +if (!gdth_init_pci (&pcistr[ctr],ha)) + goto out_host_put; + +/* controller found and initialized */ +printk ("Configuring GDT-PCI HA at %d/%d IRQ %u\n" , + pcistr[ctr].pdev->bus->number, +PCI_SLOT (pcistr[ctr].pdev->devfn), + ha->irq); + + error =request_irq (ha->irq, gdth_interrupt, +IRQF_DISABLED |IRQF_SHARED ,"gdth" , ha); +if (error) { +printk ("GDT-PCI: Unable to allocate IRQ\n" ); + goto out_host_put; + } + + shp->unchecked_isa_dma =0 ; + shp->irq = ha->irq; + shp->dma_channel =0xff ; + hanum = gdth_ctr_count; + gdth_ctr_tab[gdth_ctr_count++] = shp; + gdth_ctr_vtab[gdth_ctr_vcount++] = shp; + +NUMDATA (shp)->hanum = (ushort )hanum; +NUMDATA (shp)->busnum=0 ; + + ha->pccb =CMDDATA (shp); + ha->ccb_phys =0L ; + + error = -ENOMEM ; + + ha->pscratch =pci_alloc_consistent (ha->pdev,GDTH_SCRATCH , + &scratch_dma_handle); +if (!ha->pscratch) + goto out_free_irq; + ha->scratch_phys = scratch_dma_handle; + + ha->pmsg =pci_alloc_consistent (ha->pdev,sizeof (gdth_msg_str), + &scratch_dma_handle); +if (!ha->pmsg) + goto out_free_pscratch; + ha->msg_phys = scratch_dma_handle; + +#ifdef INT_COAL + ha->coal_stat =pci_alloc_consistent (ha->pdev, +sizeof (gdth_coal_status) *MAXOFFSETS , + &scratch_dma_handle); +if (!ha->coal_stat) + goto out_free_pmsg; + ha->coal_stat_phys = scratch_dma_handle; +#endif + + ha->scratch_busy = FALSE; + ha->req_first =NULL ; + ha->tid_cnt = pcistr[ctr].pdev->device >=0x200 ?MAXID :MAX_HDRIVES ; +if (max_ids >0 && max_ids < ha->tid_cnt) + ha->tid_cnt = max_ids; +for (i =0 ; i <GDTH_MAXCMDS ; ++i) + ha->cmd_tab[i].cmnd =UNUSED_CMND ; + ha->scan_mode = rescan ?0x10 :0 ; + + error = -ENODEV ; +if (!gdth_search_drives (hanum)) { +printk ("GDT-PCI %d: Error during device scan\n" , hanum); + goto out_free_coal_stat; + } + +if (hdr_channel <0 || hdr_channel > ha->bus_cnt) + hdr_channel = ha->bus_cnt; + ha->virt_bus = hdr_channel; + +/* 64-bit DMA only supported from FW >= x.43 */ +if (!(ha->cache_feat & ha->raw_feat & ha->screen_feat &GDT_64BIT ) || + !ha->dma64_support) { +if (pci_set_dma_mask (pcistr[ctr].pdev,DMA_32BIT_MASK )) { +printk (KERN_WARNING "GDT-PCI %d: " +"Unable to set 32-bit DMA\n" , hanum); + goto out_free_coal_stat; + } + }else { + shp->max_cmd_len =16 ; +if (!pci_set_dma_mask (pcistr[ctr].pdev,DMA_64BIT_MASK )) { +printk ("GDT-PCI %d: 64-bit DMA enabled\n" , hanum); + }else if (pci_set_dma_mask (pcistr[ctr].pdev,DMA_32BIT_MASK )) { +printk (KERN_WARNING "GDT-PCI %d: " +"Unable to set 64/32-bit DMA\n" , hanum); + goto out_free_coal_stat; + } + } + + shp->max_id = ha->tid_cnt; + shp->max_lun =MAXLUN ; + shp->max_channel = virt_ctr ?0 : ha->bus_cnt; +if (virt_ctr) { + virt_ctr =1 ; +/* register addit. SCSI channels as virtual controllers */ +for (b =1 ; b < ha->bus_cnt +1 ; ++b) { + shp =scsi_register (shtp,sizeof (gdth_num_str)); + shp->unchecked_isa_dma =0 ; + shp->irq = ha->irq; + shp->dma_channel =0xff ; + gdth_ctr_vtab[gdth_ctr_vcount++] = shp; +NUMDATA (shp)->hanum = (ushort )hanum; +NUMDATA (shp)->busnum = b; + } + } + +spin_lock_init (&ha->smp_lock); +gdth_enable_int (hanum); +return 0 ; + + out_free_coal_stat: +#ifdef INT_COAL +pci_free_consistent (ha->pdev,sizeof (gdth_coal_status) *MAXOFFSETS , + ha->coal_stat, ha->coal_stat_phys); + out_free_pmsg: +#endif +pci_free_consistent (ha->pdev,sizeof (gdth_msg_str), + ha->pmsg, ha->msg_phys); + out_free_pscratch: +pci_free_consistent (ha->pdev,GDTH_SCRATCH , + ha->pscratch, ha->scratch_phys); + out_free_irq: +free_irq (ha->irq, ha); + gdth_ctr_count--; + gdth_ctr_vcount--; + out_host_put: +scsi_unregister (shp); +return error; +} +#endif /* CONFIG_PCI */ +#include "scsi_module.c" #ifndef MODULE __setup ("gdth=" , option_setup);
Signature · 1 line
1.5.3.1
PATCH 6/16 gdth: Remove 2.4.x support, in-kernel changelog
In reply to Boaz HarroshFrom: Jeff Garzik <[email protected]>
* Remove in-source changelog. It's archived permanently in git and various kernel archives, and changelogs should exist purely in git.
* Remove 2.4.x kernel support. It is an active obstacle to modernizing this driver, at this point. This includes killing gdth_kcompat.h which is 100% redundant in modern kernels.
--- drivers/scsi/gdth.c | 396 +------------------------------------------ drivers/scsi/gdth.h | 1 - drivers/scsi/gdth_kcompat.h | 31 ---- drivers/scsi/gdth_proc.c | 27 --- 4 files changed, 2 insertions(+), 453 deletions(-) delete mode 100644 drivers/scsi/gdth_kcompat.h
drivers/scsi/gdth.c +2 -394
@@ -27,280 +27,8 @@* along with this kernel; if not, write to the Free Software * * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * * -* Linux kernel 2.4.x, 2.6.x supported * +* Linux kernel 2.6.x supported * * * -* $Log: gdth.c,v $ -* Revision 1.74 2006/04/10 13:44:47 achim -* Community changes for 2.6.x -* Kernel 2.2.x no longer supported -* scsi_request interface removed, thanks to Christoph Hellwig -* -* Revision 1.73 2004/03/31 13:33:03 achim -* Special command 0xfd implemented to detect 64-bit DMA support -* -* Revision 1.72 2004/03/17 08:56:04 achim -* 64-bit DMA only enabled if FW >= x.43 -* -* Revision 1.71 2004/03/05 15:51:29 achim -* Screen service: separate message buffer, bugfixes -* -* Revision 1.70 2004/02/27 12:19:07 achim -* Bugfix: Reset bit in config (0xfe) call removed -* -* Revision 1.69 2004/02/20 09:50:24 achim -* Compatibility changes for kernels < 2.4.20 -* Bugfix screen service command size -* pci_set_dma_mask() error handling added -* -* Revision 1.68 2004/02/19 15:46:54 achim -* 64-bit DMA bugfixes -* Drive size bugfix for drives > 1TB -* -* Revision 1.67 2004/01/14 13:11:57 achim -* Tool access over /proc no longer supported -* Bugfixes IOCTLs -* -* Revision 1.66 2003/12/19 15:04:06 achim -* Bugfixes support for drives > 2TB -* -* Revision 1.65 2003/12/15 11:21:56 achim -* 64-bit DMA support added -* Support for drives > 2 TB implemented -* Kernels 2.2.x, 2.4.x, 2.6.x supported -* -* Revision 1.64 2003/09/17 08:30:26 achim -* EISA/ISA controller scan disabled -* Command line switch probe_eisa_isa added -* -* Revision 1.63 2003/07/12 14:01:00 Daniele Bellucci <[email protected]> -* Minor cleanups in gdth_ioctl. -* -* Revision 1.62 2003/02/27 15:01:59 achim -* Dynamic DMA mapping implemented -* New (character device) IOCTL interface added -* Other controller related changes made -* -* Revision 1.61 2002/11/08 13:09:52 boji -* Added support for XSCALE based RAID Controllers -* Fixed SCREENSERVICE initialization in SMP cases -* Added checks for gdth_polling before GDTH_HA_LOCK -* -* Revision 1.60 2002/02/05 09:35:22 achim -* MODULE_LICENSE only if kernel >= 2.4.11 -* -* Revision 1.59 2002/01/30 09:46:33 achim -* Small changes -* -* Revision 1.58 2002/01/29 15:30:02 achim -* Set default value of shared_access to Y -* New status S_CACHE_RESERV for clustering added -* -* Revision 1.57 2001/08/21 11:16:35 achim -* Bugfix free_irq() -* -* Revision 1.56 2001/08/09 11:19:39 achim -* Scsi_Host_Template changes -* -* Revision 1.55 2001/08/09 10:11:28 achim -* Command HOST_UNFREEZE_IO before cache service init. -* -* Revision 1.54 2001/07/20 13:48:12 achim -* Expand: gdth_analyse_hdrive() removed -* -* Revision 1.53 2001/07/17 09:52:49 achim -* Small OEM related change -* -* Revision 1.52 2001/06/19 15:06:20 achim -* New host command GDT_UNFREEZE_IO added -* -* Revision 1.51 2001/05/22 06:42:37 achim -* PCI: Subdevice ID added -* -* Revision 1.50 2001/05/17 13:42:16 achim -* Support for Intel Storage RAID Controllers added -* -* Revision 1.50 2001/05/17 12:12:34 achim -* Support for Intel Storage RAID Controllers added -* -* Revision 1.49 2001/03/15 15:07:17 achim -* New __setup interface for boot command line options added -* -* Revision 1.48 2001/02/06 12:36:28 achim -* Bugfix Cluster protocol -* -* Revision 1.47 2001/01/10 14:42:06 achim -* New switch shared_access added -* -* Revision 1.46 2001/01/09 08:11:35 achim -* gdth_command() removed -* meaning of Scsi_Pointer members changed -* -* Revision 1.45 2000/11/16 12:02:24 achim -* Changes for kernel 2.4 -* -* Revision 1.44 2000/10/11 08:44:10 achim -* Clustering changes: New flag media_changed added -* -* Revision 1.43 2000/09/20 12:59:01 achim -* DPMEM remap functions for all PCI controller types implemented -* Small changes for ia64 platform -* -* Revision 1.42 2000/07/20 09:04:50 achim -* Small changes for kernel 2.4 -* -* Revision 1.41 2000/07/04 14:11:11 achim -* gdth_analyse_hdrive() added to rescan drives after online expansion -* -* Revision 1.40 2000/06/27 11:24:16 achim -* Changes Clustering, Screenservice -* -* Revision 1.39 2000/06/15 13:09:04 achim -* Changes for gdth_do_cmd() -* -* Revision 1.38 2000/06/15 12:08:43 achim -* Bugfix gdth_sync_event(), service SCREENSERVICE -* Data direction for command 0xc2 changed to DOU -* -* Revision 1.37 2000/05/25 13:50:10 achim -* New driver parameter virt_ctr added -* -* Revision 1.36 2000/05/04 08:50:46 achim -* Event buffer now in gdth_ha_str -* -* Revision 1.35 2000/03/03 10:44:08 achim -* New event_string only valid for the RP controller family -* -* Revision 1.34 2000/03/02 14:55:29 achim -* New mechanism for async. event handling implemented -* -* Revision 1.33 2000/02/21 15:37:37 achim -* Bugfix Alpha platform + DPMEM above 4GB -* -* Revision 1.32 2000/02/14 16:17:37 achim -* Bugfix sense_buffer[] + raw devices -* -* Revision 1.31 2000/02/10 10:29:00 achim -* Delete sense_buffer[0], if command OK -* -* Revision 1.30 1999/11/02 13:42:39 achim -* ARRAY_DRV_LIST2 implemented -* Now 255 log. and 100 host drives supported -* -* Revision 1.29 1999/10/05 13:28:47 achim -* GDT_CLUST_RESET added -* -* Revision 1.28 1999/08/12 13:44:54 achim -* MOUNTALL removed -* Cluster drives -> removeable drives -* -* Revision 1.27 1999/06/22 07:22:38 achim -* Small changes -* -* Revision 1.26 1999/06/10 16:09:12 achim -* Cluster Host Drive support: Bugfixes -* -* Revision 1.25 1999/06/01 16:03:56 achim -* gdth_init_pci(): Manipulate config. space to start RP controller -* -* Revision 1.24 1999/05/26 11:53:06 achim -* Cluster Host Drive support added -* -* Revision 1.23 1999/03/26 09:12:31 achim -* Default value for hdr_channel set to 0 -* -* Revision 1.22 1999/03/22 16:27:16 achim -* Bugfix: gdth_store_event() must not be locked with GDTH_LOCK_HA() -* -* Revision 1.21 1999/03/16 13:40:34 achim -* Problems with reserved drives solved -* gdth_eh_bus_reset() implemented -* -* Revision 1.20 1999/03/10 09:08:13 achim -* Bugfix: Corrections in gdth_direction_tab[] made -* Bugfix: Increase command timeout (gdth_update_timeout()) NOT in gdth_putq() -* -* Revision 1.19 1999/03/05 14:38:16 achim -* Bugfix: Heads/Sectors mapping for reserved devices possibly wrong -* -> gdth_eval_mapping() implemented, changes in gdth_bios_param() -* INIT_RETRIES set to 100s to avoid DEINIT-Timeout for controllers -* with BIOS disabled and memory test set to Intensive -* Enhanced /proc support -* -* Revision 1.18 1999/02/24 09:54:33 achim -* Command line parameter hdr_channel implemented -* Bugfix for EISA controllers + Linux 2.2.x -* -* Revision 1.17 1998/12/17 15:58:11 achim -* Command line parameters implemented -* Changes for Alpha platforms -* PCI controller scan changed -* SMP support improved (spin_lock_irqsave(),...) -* New async. events, new scan/reserve commands included -* -* Revision 1.16 1998/09/28 16:08:46 achim -* GDT_PCIMPR: DPMEM remapping, if required -* mdelay() added -* -* Revision 1.15 1998/06/03 14:54:06 achim -* gdth_delay(), gdth_flush() implemented -* Bugfix: gdth_release() changed -* -* Revision 1.14 1998/05/22 10:01:17 achim -* mj: pcibios_strerror() removed -* Improved SMP support (if version >= 2.1.95) -* gdth_halt(): halt_called flag added (if version < 2.1) -* -* Revision 1.13 1998/04/16 09:14:57 achim -* Reserve drives (for raw service) implemented -* New error handling code enabled -* Get controller name from board_info() IOCTL -* Final round of PCI device driver patches by Martin Mares -* -* Revision 1.12 1998/03/03 09:32:37 achim -* Fibre channel controller support added -* -* Revision 1.11 1998/01/27 16:19:14 achim -* SA_SHIRQ added -* add_timer()/del_timer() instead of GDTH_TIMER -* scsi_add_timer()/scsi_del_timer() instead of SCSI_TIMER -* New error handling included -* -* Revision 1.10 1997/10/31 12:29:57 achim -* Read heads/sectors from host drive -* -* Revision 1.9 1997/09/04 10:07:25 achim -* IO-mapping with virt_to_bus(), gdth_readb(), gdth_writeb(), ... -* register_reboot_notifier() to get a notify on shutown used -* -* Revision 1.8 1997/04/02 12:14:30 achim -* Version 1.00 (see gdth.h), tested with kernel 2.0.29 -* -* Revision 1.7 1997/03/12 13:33:37 achim -* gdth_reset() changed, new async. events -* -* Revision 1.6 1997/03/04 14:01:11 achim -* Shutdown routine gdth_halt() implemented -* -* Revision 1.5 1997/02/21 09:08:36 achim -* New controller included (RP, RP1, RP2 series) -* IOCTL interface implemented -* -* Revision 1.4 1996/07/05 12:48:55 achim -* Function gdth_bios_param() implemented -* New constant GDTH_MAXC_P_L inserted -* GDT_WRITE_THR, GDT_EXT_INFO implemented -* Function gdth_reset() changed -* -* Revision 1.3 1996/05/10 09:04:41 achim -* Small changes for Linux 1.2.13 -* -* Revision 1.2 1996/05/09 12:45:27 achim -* Loadable module support implemented -* /proc support corrections made -* -* Revision 1.1 1996/04/11 07:35:57 achim -* Initial revision -* ************************************************************************/ /* All GDT Disk Array Controllers are fully supported by this driver.
@@ -392,12 +120,7 @@#include <linux/proc_fs.h> #include <linux/time.h> #include <linux/timer.h> -#if LINUX_VERSION_CODE >=KERNEL_VERSION (2 ,6 ,6 )#include <linux/dma-mapping.h> -#else -#define DMA_32BIT_MASK 0x00000000ffffffffULL -#define DMA_64BIT_MASK 0xffffffffffffffffULL -#endif #ifdef GDTH_RTC #include <linux/mc146818rtc.h>
@@ -409,16 +132,10 @@#include <asm/io.h> #include <asm/uaccess.h> #include <linux/spinlock.h> -#if LINUX_VERSION_CODE >=KERNEL_VERSION (2 ,6 ,0 )#include <linux/blkdev.h> -#else -#include <linux/blk.h> -#include "sd.h" -#endif #include "scsi.h" #include <scsi/scsi_host.h> -#include "gdth_kcompat.h" #include "gdth.h" static void gdth_delay (int milliseconds);
@@ -658,7 +375,6 @@ static int probe_eisa_isa = 0;static int force_dma32 =0 ;/* parameters for modprobe/insmod */ -#if LINUX_VERSION_CODE >=KERNEL_VERSION (2 ,6 ,11 )module_param_array (irq, int,NULL ,0 );module_param (disable, int,0 );module_param (reserve_mode, int,0 );
@@ -671,20 +387,6 @@ module_param(virt_ctr, int, 0);module_param (shared_access, int,0 );module_param (probe_eisa_isa, int,0 );module_param (force_dma32, int,0 ); -#else -MODULE_PARM (irq,"i" ); -MODULE_PARM (disable,"i" ); -MODULE_PARM (reserve_mode,"i" ); -MODULE_PARM(reserve_list, "4-" __MODULE_STRING(MAX_RES_ARGS) "i"); -MODULE_PARM (reverse_scan,"i" ); -MODULE_PARM (hdr_channel,"i" ); -MODULE_PARM (max_ids,"i" ); -MODULE_PARM (rescan,"i" ); -MODULE_PARM (virt_ctr,"i" ); -MODULE_PARM (shared_access,"i" ); -MODULE_PARM (probe_eisa_isa,"i" ); -MODULE_PARM (force_dma32,"i" ); -#endif MODULE_AUTHOR ("Achim Leubner" );MODULE_LICENSE ("GPL" );
@@ -716,7 +418,6 @@ static void gdth_delay(int milliseconds) } } -#if LINUX_VERSION_CODE >=KERNEL_VERSION (2 ,6 ,0 )static void gdth_scsi_done (struct scsi_cmnd *scp) {TRACE2 (("gdth_scsi_done()\n" ));
@@ -756,42 +457,6 @@ int __gdth_execute(struct scsi_device *sdev, gdth_cmd_str *gdtcmd, char *cmnd,kfree (scp);return rval; } -#else -static void gdth_scsi_done (Scsi_Cmnd *scp) -{ -TRACE2 (("gdth_scsi_done()\n" )); - - scp->request.rq_status =RQ_SCSI_DONE ; -if (scp->request.waiting) -complete (scp->request.waiting); -} - -int __gdth_execute (struct scsi_device *sdev,gdth_cmd_str *gdtcmd,char *cmnd, -int timeout,u32 *info) -{ -Scsi_Cmnd *scp =scsi_allocate_device (sdev,1 , FALSE); -unsigned bufflen = gdtcmd ?sizeof (gdth_cmd_str) :0 ; -DECLARE_COMPLETION_ONSTACK (wait); -int rval; - -if (!scp) -return -ENOMEM ; - scp->cmd_len =12 ; - scp->use_sg =0 ; - scp->SCp.this_residual =IOCTL_PRI ;/* priority */ - scp->request.rq_status =RQ_SCSI_BUSY ; - scp->request.waiting = &wait; -scsi_do_cmd (scp, cmnd, gdtcmd, bufflen, gdth_scsi_done, timeout*HZ ,1 ); -wait_for_completion (&wait); - - rval = scp->SCp.Status; -if (info) - *info = scp->SCp.Message; - -scsi_release_command (scp); -return rval; -} -#endif int gdth_execute (struct Scsi_Host *shost,gdth_cmd_str *gdtcmd,char *cmnd,int timeout,u32 *info)
@@ -2258,29 +1923,17 @@ static int __init gdth_search_drives(int hanum)printk ("GDT-HA %d: Vendor: %s Name: %s\n" , hanum,oemstr->text.oem_company_name,ha->binfo.type_string);/* Save the Host Drive inquiry data */ -#if LINUX_VERSION_CODE >=KERNEL_VERSION (2 ,6 ,0 )strlcpy (ha->oem_name,oemstr->text.scsi_host_drive_inquiry_vendor_id,sizeof (ha->oem_name)); -#else -strncpy (ha->oem_name,oemstr->text.scsi_host_drive_inquiry_vendor_id,7 ); - ha->oem_name[7 ] ='\0' ; -#endif }else {/* Old method, based on PCI ID */ TRACE2 (("gdth_search_drives(): CACHE_READ_OEM_STRING_RECORD failed\n" ));printk ("GDT-HA %d: Name: %s\n" , hanum,ha->binfo.type_string); -#if LINUX_VERSION_CODE >=KERNEL_VERSION (2 ,6 ,0 )if (ha->oem_id ==OEM_ID_INTEL )strlcpy (ha->oem_name,"Intel " ,sizeof (ha->oem_name));else strlcpy (ha->oem_name,"ICP " ,sizeof (ha->oem_name)); -#else -if (ha->oem_id ==OEM_ID_INTEL ) -strcpy (ha->oem_name,"Intel " ); -else -strcpy (ha->oem_name,"ICP " ); -#endif }/* scanning for host drives */
@@ -2689,17 +2342,10 @@ static void gdth_copy_internal_data(int hanum,Scsi_Cmnd *scp,return ; }local_irq_save (flags); -#if LINUX_VERSION_CODE >=KERNEL_VERSION (2 ,6 ,0 ) address =kmap_atomic (sl->page,KM_BIO_SRC_IRQ ) + sl->offset;memcpy (address,buffer,cpnow);flush_dcache_page (sl->page);kunmap_atomic (address,KM_BIO_SRC_IRQ ); -#else - address =kmap_atomic (sl->page,KM_BH_IRQ ) + sl->offset; -memcpy (address,buffer,cpnow); -flush_dcache_page (sl->page); -kunmap_atomic (address,KM_BH_IRQ ); -#endif local_irq_restore (flags);if (cpsum == cpcount)break ;
@@ -4293,11 +3939,7 @@ int __init option_setup(char *str) } -#if LINUX_VERSION_CODE >=KERNEL_VERSION (2 ,6 ,0 )static int __init gdth_detect (struct scsi_host_template *shtp) -#else -static int __init gdth_detect (Scsi_Host_Template *shtp) -#endif {#ifdef DEBUG_GDTH printk("GDT: This driver contains debugging information !! Trace level = %d\n",
@@ -4539,11 +4181,7 @@ static int gdth_eh_bus_reset(Scsi_Cmnd *scp)return SUCCESS ; } -#if LINUX_VERSION_CODE >=KERNEL_VERSION (2 ,6 ,0 )static int gdth_bios_param (struct scsi_device *sdev,struct block_device *bdev,sector_t cap,int *ip) -#else -static int gdth_bios_param(Disk *disk,kdev_t dev,int *ip) -#endif {unchar b, t;int hanum;
@@ -4551,13 +4189,8 @@ static int gdth_bios_param(Disk *disk,kdev_t dev,int *ip)struct scsi_device *sd;unsigned capacity; -#if LINUX_VERSION_CODE >=KERNEL_VERSION (2 ,6 ,0 ) sd = sdev; capacity = cap; -#else - sd = disk->device; - capacity = disk->capacity; -#endif hanum =NUMDATA (sd->host)->hanum; b = virt_ctr ?NUMDATA (sd->host)->busnum : sd->channel; t = sd->id;
@@ -5173,7 +4806,6 @@ static int gdth_ioctl(struct inode *inode, struct file *filep, hanum = res.ionode; ha =HADATA (gdth_ctr_tab[hanum]); -#if LINUX_VERSION_CODE >=KERNEL_VERSION (2 ,6 ,0 ) scp =kzalloc (sizeof (*scp),GFP_KERNEL );if (!scp)return -ENOMEM ;
@@ -5184,17 +4816,7 @@ static int gdth_ioctl(struct inode *inode, struct file *filep, rval =gdth_eh_bus_reset (scp); res.status = (rval ==SUCCESS ?S_OK :S_GENERR );kfree (scp); -#else - scp =scsi_allocate_device (ha->sdev,1 , FALSE); -if (!scp) -return -ENOMEM ; - scp->cmd_len =12 ; - scp->use_sg =0 ; - scp->channel = virt_ctr ?0 : res.number; - rval =gdth_eh_bus_reset (scp); - res.status = (rval ==SUCCESS ?S_OK :S_GENERR ); -scsi_release_command (scp); -#endif +if (copy_to_user (argp, &res,sizeof (gdth_ioctl_reset)))return -EFAULT ;break ;
@@ -5282,7 +4904,6 @@ static int gdth_halt(struct notifier_block *nb, ulong event, void *buf)return NOTIFY_OK ; } -#if LINUX_VERSION_CODE >=KERNEL_VERSION (2 ,6 ,0 )/* configure lun */ static int gdth_slave_configure (struct scsi_device *sdev) {
@@ -5291,13 +4912,8 @@ static int gdth_slave_configure(struct scsi_device *sdev) sdev->skip_ms_page_8 =1 ;return 0 ; } -#endif -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)static struct scsi_host_template driver_template = { -#else -static Scsi_Host_Template driver_template = { -#endif .proc_name ="gdth" , .proc_info = gdth_proc_info, .name ="GDT SCSI Disk Array Controller" ,
@@ -5308,20 +4924,12 @@ static Scsi_Host_Template driver_template = { .eh_bus_reset_handler = gdth_eh_bus_reset, .bios_param = gdth_bios_param, .can_queue = GDTH_MAXCMDS, -#if LINUX_VERSION_CODE >=KERNEL_VERSION (2 ,6 ,0 ) .slave_configure = gdth_slave_configure, -#endif .this_id = -1, .sg_tablesize = GDTH_MAXSG, .cmd_per_lun = GDTH_MAXC_P_L, .unchecked_isa_dma = 1, .use_clustering = ENABLE_CLUSTERING, -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0) - .use_new_eh_code =1 , -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,20) - .highmem_io = 1, -#endif -#endif };#ifdef CONFIG_ISA
drivers/scsi/gdth.h +0 -1
@@ -13,7 +13,6 @@* $Id: gdth.h,v 1.58 2006/01/11 16:14:09 achim Exp $ */ -#include <linux/version.h> #include <linux/types.h> #ifndef TRUE
drivers/scsi/gdth_kcompat.h deleted +0 -31
@@ -1,31 +0,0 @@ -#ifndef IRQ_HANDLED -typedef void irqreturn_t ; -#define IRQ_NONE -#define IRQ_HANDLED -#endif - -#ifndef MODULE_LICENSE -#define MODULE_LICENSE (x) -#endif - -#ifndef __iomem -#define __iomem -#endif - -#ifndef __attribute_used__ -#define __attribute_used__ __devinitdata -#endif - -#ifndef __user -#define __user -#endif - -#ifndef SERVICE_ACTION_IN -#define SERVICE_ACTION_IN 0x9e -#endif -#ifndef READ_16 -#define READ_16 0x88 -#endif -#ifndef WRITE_16 -#define WRITE_16 0x8a -#endif
drivers/scsi/gdth_proc.c +0 -27
@@ -4,7 +4,6 @@#include <linux/completion.h> -#if LINUX_VERSION_CODE >=KERNEL_VERSION (2 ,6 ,0 )int gdth_proc_info (struct Scsi_Host *host,char *buffer,char **start,off_t offset,int length,int inout) {
@@ -21,32 +20,6 @@ int gdth_proc_info(struct Scsi_Host *host, char *buffer,char **start,off_t offseelse return (gdth_get_info (buffer,start,offset,length,host,hanum,busnum)); } -#else -int gdth_proc_info (char *buffer,char **start,off_t offset,int length,int hostno, -int inout) -{ -int hanum,busnum,i; - -TRACE2 (("gdth_proc_info() length %d offs %d inout %d\n" , - length,(int )offset,inout)); - -for (i =0 ; i < gdth_ctr_vcount; ++i) { -if (gdth_ctr_vtab[i]->host_no == hostno) -break ; - } -if (i == gdth_ctr_vcount) -return (-EINVAL ); - - hanum =NUMDATA (gdth_ctr_vtab[i])->hanum; - busnum=NUMDATA (gdth_ctr_vtab[i])->busnum; - -if (inout) -return (gdth_set_info (buffer,length,gdth_ctr_vtab[i],hanum,busnum)); -else -return (gdth_get_info (buffer,start,offset,length, - gdth_ctr_vtab[i],hanum,busnum)); -} -#endif static int gdth_set_info (char *buffer,int length,struct Scsi_Host *host,int hanum,int busnum)
Signature · 1 line
1.5.3.1
PATCH 7/16 gdth: kill gdth_{read,write}[bwl] wrappers
In reply to Boaz HarroshFrom: Jeff Garzik <[email protected]>
They are direct equivalents to {read,write}[bwl].
--- drivers/scsi/gdth.c | 313 +++++++++++++++++++++++++-------------------------- 1 files changed, 153 insertions(+), 160 deletions(-)
drivers/scsi/gdth.c +153 -160
@@ -293,13 +293,6 @@ static struct timer_list gdth_timer;#define BUS_L2P (a,b) ((b)>(a)->virt_bus ? (b-1):(b)) -#define gdth_readb (addr) readb(addr) -#define gdth_readw (addr) readw(addr) -#define gdth_readl (addr) readl(addr) -#define gdth_writeb (b,addr) writeb((b),(addr)) -#define gdth_writew (b,addr) writew((b),(addr)) -#define gdth_writel (b,addr) writel((b),(addr)) -#ifdef CONFIG_ISA static unchar gdth_drq_tab[4 ] = {5 ,6 ,7 ,7 };/* DRQ table */ #endif
@@ -515,7 +508,7 @@ static int __init gdth_search_isa(ulong32 bios_adr)TRACE (("gdth_search_isa() bios adr. %x\n" ,bios_adr));if ((addr =ioremap (bios_adr+BIOS_ID_OFFS ,sizeof (ulong32))) !=NULL ) { - id =gdth_readl (addr); + id =readl (addr);iounmap (addr);if (id ==GDT2_ID )/* GDT2000 */ return 1 ;
@@ -754,22 +747,22 @@ static int __init gdth_init_isa(ulong32 bios_adr,gdth_ha_str *ha)return 0 ; } dp2_ptr = ha->brd; -gdth_writeb (1 , &dp2_ptr->io.memlock);/* switch off write protection */ +writeb (1 , &dp2_ptr->io.memlock);/* switch off write protection */ /* reset interface area */ memset_io (&dp2_ptr->u,0 ,sizeof (dp2_ptr->u)); -if (gdth_readl (&dp2_ptr->u) !=0 ) { +if (readl (&dp2_ptr->u) !=0 ) {printk ("GDT-ISA: Initialization error (DPMEM write error)\n" );iounmap (ha->brd);return 0 ; }/* disable board interrupts, read DRQ and IRQ */ -gdth_writeb (0xff , &dp2_ptr->io.irqdel); -gdth_writeb (0x00 , &dp2_ptr->io.irqen); -gdth_writeb (0x00 , &dp2_ptr->u.ic.S_Status); -gdth_writeb (0x00 , &dp2_ptr->u.ic.Cmd_Index); +writeb (0xff , &dp2_ptr->io.irqdel); +writeb (0x00 , &dp2_ptr->io.irqen); +writeb (0x00 , &dp2_ptr->u.ic.S_Status); +writeb (0x00 , &dp2_ptr->u.ic.Cmd_Index); - irq_drq =gdth_readb (&dp2_ptr->io.rq); + irq_drq =readb (&dp2_ptr->io.rq);for (i=0 ; i<3 ; ++i) {if ((irq_drq &1 )==0 )break ;
@@ -777,7 +770,7 @@ static int __init gdth_init_isa(ulong32 bios_adr,gdth_ha_str *ha) } ha->drq = gdth_drq_tab[i]; - irq_drq =gdth_readb (&dp2_ptr->io.rq) >>3 ; + irq_drq =readb (&dp2_ptr->io.rq) >>3 ;for (i=1 ; i<5 ; ++i) {if ((irq_drq &1 )==0 )break ;
@@ -786,12 +779,12 @@ static int __init gdth_init_isa(ulong32 bios_adr,gdth_ha_str *ha) ha->irq = gdth_irq_tab[i];/* deinitialize services */ -gdth_writel (bios_adr, &dp2_ptr->u.ic.S_Info[0 ]); -gdth_writeb (0xff , &dp2_ptr->u.ic.S_Cmd_Indx); -gdth_writeb (0 , &dp2_ptr->io.event); +writel (bios_adr, &dp2_ptr->u.ic.S_Info[0 ]); +writeb (0xff , &dp2_ptr->u.ic.S_Cmd_Indx); +writeb (0 , &dp2_ptr->io.event); retries =INIT_RETRIES ;gdth_delay (20 ); -while (gdth_readb (&dp2_ptr->u.ic.S_Status) !=0xff ) { +while (readb (&dp2_ptr->u.ic.S_Status) !=0xff ) {if (--retries ==0 ) {printk ("GDT-ISA: Initialization error (DEINIT failed)\n" );iounmap (ha->brd);
@@ -799,9 +792,9 @@ static int __init gdth_init_isa(ulong32 bios_adr,gdth_ha_str *ha) }gdth_delay (1 ); } - prot_ver = (unchar )gdth_readl (&dp2_ptr->u.ic.S_Info[0 ]); -gdth_writeb (0 , &dp2_ptr->u.ic.Status); -gdth_writeb (0xff , &dp2_ptr->io.irqdel); + prot_ver = (unchar )readl (&dp2_ptr->u.ic.S_Info[0 ]); +writeb (0 , &dp2_ptr->u.ic.Status); +writeb (0xff , &dp2_ptr->io.irqdel);if (prot_ver !=PROTOCOL_VERSION ) {printk ("GDT-ISA: Illegal protocol version\n" );iounmap (ha->brd);
@@ -815,15 +808,15 @@ static int __init gdth_init_isa(ulong32 bios_adr,gdth_ha_str *ha) ha->brd_phys = bios_adr >>4 ;/* special request to controller BIOS */ -gdth_writel (0x00 , &dp2_ptr->u.ic.S_Info[0 ]); -gdth_writel (0x00 , &dp2_ptr->u.ic.S_Info[1 ]); -gdth_writel (0x01 , &dp2_ptr->u.ic.S_Info[2 ]); -gdth_writel (0x00 , &dp2_ptr->u.ic.S_Info[3 ]); -gdth_writeb (0xfe , &dp2_ptr->u.ic.S_Cmd_Indx); -gdth_writeb (0 , &dp2_ptr->io.event); +writel (0x00 , &dp2_ptr->u.ic.S_Info[0 ]); +writel (0x00 , &dp2_ptr->u.ic.S_Info[1 ]); +writel (0x01 , &dp2_ptr->u.ic.S_Info[2 ]); +writel (0x00 , &dp2_ptr->u.ic.S_Info[3 ]); +writeb (0xfe , &dp2_ptr->u.ic.S_Cmd_Indx); +writeb (0 , &dp2_ptr->io.event); retries =INIT_RETRIES ;gdth_delay (20 ); -while (gdth_readb (&dp2_ptr->u.ic.S_Status) !=0xfe ) { +while (readb (&dp2_ptr->u.ic.S_Status) !=0xfe ) {if (--retries ==0 ) {printk ("GDT-ISA: Initialization error\n" );iounmap (ha->brd);
@@ -831,8 +824,8 @@ static int __init gdth_init_isa(ulong32 bios_adr,gdth_ha_str *ha) }gdth_delay (1 ); } -gdth_writeb (0 , &dp2_ptr->u.ic.Status); -gdth_writeb (0xff , &dp2_ptr->io.irqdel); +writeb (0 , &dp2_ptr->u.ic.Status); +writeb (0xff , &dp2_ptr->io.irqdel); ha->dma64_support =0 ;return 1 ;
@@ -870,8 +863,8 @@ static int __init gdth_init_pci(gdth_pci_str *pcistr,gdth_ha_str *ha) }/* check and reset interface area */ dp6_ptr = ha->brd; -gdth_writel (DPMEM_MAGIC , &dp6_ptr->u); -if (gdth_readl (&dp6_ptr->u) !=DPMEM_MAGIC ) { +writel (DPMEM_MAGIC , &dp6_ptr->u); +if (readl (&dp6_ptr->u) !=DPMEM_MAGIC ) {printk ("GDT-PCI: Cannot access DPMEM at 0x%lx (shadowed?)\n" , pcistr->dpmem); found = FALSE;
@@ -882,7 +875,7 @@ static int __init gdth_init_pci(gdth_pci_str *pcistr,gdth_ha_str *ha)printk ("GDT-PCI: Initialization error (DPMEM remap error)\n" );return 0 ; } -if (gdth_readw (ha->brd) !=0xffff ) { +if (readw (ha->brd) !=0xffff ) {TRACE2 (("init_pci_old() address 0x%x busy\n" , i));continue ; }
@@ -895,8 +888,8 @@ static int __init gdth_init_pci(gdth_pci_str *pcistr,gdth_ha_str *ha)return 0 ; } dp6_ptr = ha->brd; -gdth_writel (DPMEM_MAGIC , &dp6_ptr->u); -if (gdth_readl (&dp6_ptr->u) ==DPMEM_MAGIC ) { +writel (DPMEM_MAGIC , &dp6_ptr->u); +if (readl (&dp6_ptr->u) ==DPMEM_MAGIC ) {printk ("GDT-PCI: Use free address at 0x%x\n" , i); found = TRUE;break ;
@@ -909,24 +902,24 @@ static int __init gdth_init_pci(gdth_pci_str *pcistr,gdth_ha_str *ha) } }memset_io (&dp6_ptr->u,0 ,sizeof (dp6_ptr->u)); -if (gdth_readl (&dp6_ptr->u) !=0 ) { +if (readl (&dp6_ptr->u) !=0 ) {printk ("GDT-PCI: Initialization error (DPMEM write error)\n" );iounmap (ha->brd);return 0 ; }/* disable board interrupts, deinit services */ -gdth_writeb (0xff , &dp6_ptr->io.irqdel); -gdth_writeb (0x00 , &dp6_ptr->io.irqen); -gdth_writeb (0x00 , &dp6_ptr->u.ic.S_Status); -gdth_writeb (0x00 , &dp6_ptr->u.ic.Cmd_Index); - -gdth_writel (pcistr->dpmem, &dp6_ptr->u.ic.S_Info[0 ]); -gdth_writeb (0xff , &dp6_ptr->u.ic.S_Cmd_Indx); -gdth_writeb (0 , &dp6_ptr->io.event); +writeb (0xff , &dp6_ptr->io.irqdel); +writeb (0x00 , &dp6_ptr->io.irqen); +writeb (0x00 , &dp6_ptr->u.ic.S_Status); +writeb (0x00 , &dp6_ptr->u.ic.Cmd_Index); + +writel (pcistr->dpmem, &dp6_ptr->u.ic.S_Info[0 ]); +writeb (0xff , &dp6_ptr->u.ic.S_Cmd_Indx); +writeb (0 , &dp6_ptr->io.event); retries =INIT_RETRIES ;gdth_delay (20 ); -while (gdth_readb (&dp6_ptr->u.ic.S_Status) !=0xff ) { +while (readb (&dp6_ptr->u.ic.S_Status) !=0xff ) {if (--retries ==0 ) {printk ("GDT-PCI: Initialization error (DEINIT failed)\n" );iounmap (ha->brd);
@@ -934,9 +927,9 @@ static int __init gdth_init_pci(gdth_pci_str *pcistr,gdth_ha_str *ha) }gdth_delay (1 ); } - prot_ver = (unchar )gdth_readl (&dp6_ptr->u.ic.S_Info[0 ]); -gdth_writeb (0 , &dp6_ptr->u.ic.S_Status); -gdth_writeb (0xff , &dp6_ptr->io.irqdel); + prot_ver = (unchar )readl (&dp6_ptr->u.ic.S_Info[0 ]); +writeb (0 , &dp6_ptr->u.ic.S_Status); +writeb (0xff , &dp6_ptr->io.irqdel);if (prot_ver !=PROTOCOL_VERSION ) {printk ("GDT-PCI: Illegal protocol version\n" );iounmap (ha->brd);
@@ -947,15 +940,15 @@ static int __init gdth_init_pci(gdth_pci_str *pcistr,gdth_ha_str *ha) ha->ic_all_size =sizeof (dp6_ptr->u);/* special command to controller BIOS */ -gdth_writel (0x00 , &dp6_ptr->u.ic.S_Info[0 ]); -gdth_writel (0x00 , &dp6_ptr->u.ic.S_Info[1 ]); -gdth_writel (0x00 , &dp6_ptr->u.ic.S_Info[2 ]); -gdth_writel (0x00 , &dp6_ptr->u.ic.S_Info[3 ]); -gdth_writeb (0xfe , &dp6_ptr->u.ic.S_Cmd_Indx); -gdth_writeb (0 , &dp6_ptr->io.event); +writel (0x00 , &dp6_ptr->u.ic.S_Info[0 ]); +writel (0x00 , &dp6_ptr->u.ic.S_Info[1 ]); +writel (0x00 , &dp6_ptr->u.ic.S_Info[2 ]); +writel (0x00 , &dp6_ptr->u.ic.S_Info[3 ]); +writeb (0xfe , &dp6_ptr->u.ic.S_Cmd_Indx); +writeb (0 , &dp6_ptr->io.event); retries =INIT_RETRIES ;gdth_delay (20 ); -while (gdth_readb (&dp6_ptr->u.ic.S_Status) !=0xfe ) { +while (readb (&dp6_ptr->u.ic.S_Status) !=0xfe ) {if (--retries ==0 ) {printk ("GDT-PCI: Initialization error\n" );iounmap (ha->brd);
@@ -963,8 +956,8 @@ static int __init gdth_init_pci(gdth_pci_str *pcistr,gdth_ha_str *ha) }gdth_delay (1 ); } -gdth_writeb (0 , &dp6_ptr->u.ic.S_Status); -gdth_writeb (0xff , &dp6_ptr->io.irqdel); +writeb (0 , &dp6_ptr->u.ic.S_Status); +writeb (0xff , &dp6_ptr->io.irqdel); ha->dma64_support =0 ;
@@ -980,8 +973,8 @@ static int __init gdth_init_pci(gdth_pci_str *pcistr,gdth_ha_str *ha) }/* check and reset interface area */ dp6c_ptr = ha->brd; -gdth_writel (DPMEM_MAGIC , &dp6c_ptr->u); -if (gdth_readl (&dp6c_ptr->u) !=DPMEM_MAGIC ) { +writel (DPMEM_MAGIC , &dp6c_ptr->u); +if (readl (&dp6c_ptr->u) !=DPMEM_MAGIC ) {printk ("GDT-PCI: Cannot access DPMEM at 0x%lx (shadowed?)\n" , pcistr->dpmem); found = FALSE;
@@ -992,7 +985,7 @@ static int __init gdth_init_pci(gdth_pci_str *pcistr,gdth_ha_str *ha)printk ("GDT-PCI: Initialization error (DPMEM remap error)\n" );return 0 ; } -if (gdth_readw (ha->brd) !=0xffff ) { +if (readw (ha->brd) !=0xffff ) {TRACE2 (("init_pci_plx() address 0x%x busy\n" , i));continue ; }
@@ -1005,8 +998,8 @@ static int __init gdth_init_pci(gdth_pci_str *pcistr,gdth_ha_str *ha)return 0 ; } dp6c_ptr = ha->brd; -gdth_writel (DPMEM_MAGIC , &dp6c_ptr->u); -if (gdth_readl (&dp6c_ptr->u) ==DPMEM_MAGIC ) { +writel (DPMEM_MAGIC , &dp6c_ptr->u); +if (readl (&dp6c_ptr->u) ==DPMEM_MAGIC ) {printk ("GDT-PCI: Use free address at 0x%x\n" , i); found = TRUE;break ;
@@ -1019,7 +1012,7 @@ static int __init gdth_init_pci(gdth_pci_str *pcistr,gdth_ha_str *ha) } }memset_io (&dp6c_ptr->u,0 ,sizeof (dp6c_ptr->u)); -if (gdth_readl (&dp6c_ptr->u) !=0 ) { +if (readl (&dp6c_ptr->u) !=0 ) {printk ("GDT-PCI: Initialization error (DPMEM write error)\n" );iounmap (ha->brd);return 0 ;
@@ -1029,17 +1022,17 @@ static int __init gdth_init_pci(gdth_pci_str *pcistr,gdth_ha_str *ha)outb (0x00 ,PTR2USHORT (&ha->plx->control1));outb (0xff ,PTR2USHORT (&ha->plx->edoor_reg)); -gdth_writeb (0x00 , &dp6c_ptr->u.ic.S_Status); -gdth_writeb (0x00 , &dp6c_ptr->u.ic.Cmd_Index); +writeb (0x00 , &dp6c_ptr->u.ic.S_Status); +writeb (0x00 , &dp6c_ptr->u.ic.Cmd_Index); -gdth_writel (pcistr->dpmem, &dp6c_ptr->u.ic.S_Info[0 ]); -gdth_writeb (0xff , &dp6c_ptr->u.ic.S_Cmd_Indx); +writel (pcistr->dpmem, &dp6c_ptr->u.ic.S_Info[0 ]); +writeb (0xff , &dp6c_ptr->u.ic.S_Cmd_Indx);outb (1 ,PTR2USHORT (&ha->plx->ldoor_reg)); retries =INIT_RETRIES ;gdth_delay (20 ); -while (gdth_readb (&dp6c_ptr->u.ic.S_Status) !=0xff ) { +while (readb (&dp6c_ptr->u.ic.S_Status) !=0xff ) {if (--retries ==0 ) {printk ("GDT-PCI: Initialization error (DEINIT failed)\n" );iounmap (ha->brd);
@@ -1047,8 +1040,8 @@ static int __init gdth_init_pci(gdth_pci_str *pcistr,gdth_ha_str *ha) }gdth_delay (1 ); } - prot_ver = (unchar )gdth_readl (&dp6c_ptr->u.ic.S_Info[0 ]); -gdth_writeb (0 , &dp6c_ptr->u.ic.Status); + prot_ver = (unchar )readl (&dp6c_ptr->u.ic.S_Info[0 ]); +writeb (0 , &dp6c_ptr->u.ic.Status);if (prot_ver !=PROTOCOL_VERSION ) {printk ("GDT-PCI: Illegal protocol version\n" );iounmap (ha->brd);
@@ -1059,17 +1052,17 @@ static int __init gdth_init_pci(gdth_pci_str *pcistr,gdth_ha_str *ha) ha->ic_all_size =sizeof (dp6c_ptr->u);/* special command to controller BIOS */ -gdth_writel (0x00 , &dp6c_ptr->u.ic.S_Info[0 ]); -gdth_writel (0x00 , &dp6c_ptr->u.ic.S_Info[1 ]); -gdth_writel (0x00 , &dp6c_ptr->u.ic.S_Info[2 ]); -gdth_writel (0x00 , &dp6c_ptr->u.ic.S_Info[3 ]); -gdth_writeb (0xfe , &dp6c_ptr->u.ic.S_Cmd_Indx); +writel (0x00 , &dp6c_ptr->u.ic.S_Info[0 ]); +writel (0x00 , &dp6c_ptr->u.ic.S_Info[1 ]); +writel (0x00 , &dp6c_ptr->u.ic.S_Info[2 ]); +writel (0x00 , &dp6c_ptr->u.ic.S_Info[3 ]); +writeb (0xfe , &dp6c_ptr->u.ic.S_Cmd_Indx);outb (1 ,PTR2USHORT (&ha->plx->ldoor_reg)); retries =INIT_RETRIES ;gdth_delay (20 ); -while (gdth_readb (&dp6c_ptr->u.ic.S_Status) !=0xfe ) { +while (readb (&dp6c_ptr->u.ic.S_Status) !=0xfe ) {if (--retries ==0 ) {printk ("GDT-PCI: Initialization error\n" );iounmap (ha->brd);
@@ -1077,7 +1070,7 @@ static int __init gdth_init_pci(gdth_pci_str *pcistr,gdth_ha_str *ha) }gdth_delay (1 ); } -gdth_writeb (0 , &dp6c_ptr->u.ic.S_Status); +writeb (0 , &dp6c_ptr->u.ic.S_Status); ha->dma64_support =0 ;
@@ -1105,12 +1098,12 @@ static int __init gdth_init_pci(gdth_pci_str *pcistr,gdth_ha_str *ha)/* Ensure that it is safe to access the non HW portions of DPMEM. * Aditional check needed for Xscale based RAID controllers */ -while ( ((int )gdth_readb (&dp6m_ptr->i960r.sema0_reg) ) &3 ) +while ( ((int )readb (&dp6m_ptr->i960r.sema0_reg) ) &3 )gdth_delay (1 );/* check and reset interface area */ -gdth_writel (DPMEM_MAGIC , &dp6m_ptr->u); -if (gdth_readl (&dp6m_ptr->u) !=DPMEM_MAGIC ) { +writel (DPMEM_MAGIC , &dp6m_ptr->u); +if (readl (&dp6m_ptr->u) !=DPMEM_MAGIC ) {printk ("GDT-PCI: Cannot access DPMEM at 0x%lx (shadowed?)\n" , pcistr->dpmem); found = FALSE;
@@ -1121,7 +1114,7 @@ static int __init gdth_init_pci(gdth_pci_str *pcistr,gdth_ha_str *ha)printk ("GDT-PCI: Initialization error (DPMEM remap error)\n" );return 0 ; } -if (gdth_readw (ha->brd) !=0xffff ) { +if (readw (ha->brd) !=0xffff ) {TRACE2 (("init_pci_mpr() address 0x%x busy\n" , i));continue ; }
@@ -1134,8 +1127,8 @@ static int __init gdth_init_pci(gdth_pci_str *pcistr,gdth_ha_str *ha)return 0 ; } dp6m_ptr = ha->brd; -gdth_writel (DPMEM_MAGIC , &dp6m_ptr->u); -if (gdth_readl (&dp6m_ptr->u) ==DPMEM_MAGIC ) { +writel (DPMEM_MAGIC , &dp6m_ptr->u); +if (readl (&dp6m_ptr->u) ==DPMEM_MAGIC ) {printk ("GDT-PCI: Use free address at 0x%x\n" , i); found = TRUE;break ;
@@ -1150,18 +1143,18 @@ static int __init gdth_init_pci(gdth_pci_str *pcistr,gdth_ha_str *ha)memset_io (&dp6m_ptr->u,0 ,sizeof (dp6m_ptr->u));/* disable board interrupts, deinit services */ -gdth_writeb (gdth_readb (&dp6m_ptr->i960r.edoor_en_reg) |4 , +writeb (readb (&dp6m_ptr->i960r.edoor_en_reg) |4 , &dp6m_ptr->i960r.edoor_en_reg); -gdth_writeb (0xff , &dp6m_ptr->i960r.edoor_reg); -gdth_writeb (0x00 , &dp6m_ptr->u.ic.S_Status); -gdth_writeb (0x00 , &dp6m_ptr->u.ic.Cmd_Index); +writeb (0xff , &dp6m_ptr->i960r.edoor_reg); +writeb (0x00 , &dp6m_ptr->u.ic.S_Status); +writeb (0x00 , &dp6m_ptr->u.ic.Cmd_Index); -gdth_writel (pcistr->dpmem, &dp6m_ptr->u.ic.S_Info[0 ]); -gdth_writeb (0xff , &dp6m_ptr->u.ic.S_Cmd_Indx); -gdth_writeb (1 , &dp6m_ptr->i960r.ldoor_reg); +writel (pcistr->dpmem, &dp6m_ptr->u.ic.S_Info[0 ]); +writeb (0xff , &dp6m_ptr->u.ic.S_Cmd_Indx); +writeb (1 , &dp6m_ptr->i960r.ldoor_reg); retries =INIT_RETRIES ;gdth_delay (20 ); -while (gdth_readb (&dp6m_ptr->u.ic.S_Status) !=0xff ) { +while (readb (&dp6m_ptr->u.ic.S_Status) !=0xff ) {if (--retries ==0 ) {printk ("GDT-PCI: Initialization error (DEINIT failed)\n" );iounmap (ha->brd);
@@ -1169,8 +1162,8 @@ static int __init gdth_init_pci(gdth_pci_str *pcistr,gdth_ha_str *ha) }gdth_delay (1 ); } - prot_ver = (unchar )gdth_readl (&dp6m_ptr->u.ic.S_Info[0 ]); -gdth_writeb (0 , &dp6m_ptr->u.ic.S_Status); + prot_ver = (unchar )readl (&dp6m_ptr->u.ic.S_Info[0 ]); +writeb (0 , &dp6m_ptr->u.ic.S_Status);if (prot_ver !=PROTOCOL_VERSION ) {printk ("GDT-PCI: Illegal protocol version\n" );iounmap (ha->brd);
@@ -1181,15 +1174,15 @@ static int __init gdth_init_pci(gdth_pci_str *pcistr,gdth_ha_str *ha) ha->ic_all_size =sizeof (dp6m_ptr->u);/* special command to controller BIOS */ -gdth_writel (0x00 , &dp6m_ptr->u.ic.S_Info[0 ]); -gdth_writel (0x00 , &dp6m_ptr->u.ic.S_Info[1 ]); -gdth_writel (0x00 , &dp6m_ptr->u.ic.S_Info[2 ]); -gdth_writel (0x00 , &dp6m_ptr->u.ic.S_Info[3 ]); -gdth_writeb (0xfe , &dp6m_ptr->u.ic.S_Cmd_Indx); -gdth_writeb (1 , &dp6m_ptr->i960r.ldoor_reg); +writel (0x00 , &dp6m_ptr->u.ic.S_Info[0 ]); +writel (0x00 , &dp6m_ptr->u.ic.S_Info[1 ]); +writel (0x00 , &dp6m_ptr->u.ic.S_Info[2 ]); +writel (0x00 , &dp6m_ptr->u.ic.S_Info[3 ]); +writeb (0xfe , &dp6m_ptr->u.ic.S_Cmd_Indx); +writeb (1 , &dp6m_ptr->i960r.ldoor_reg); retries =INIT_RETRIES ;gdth_delay (20 ); -while (gdth_readb (&dp6m_ptr->u.ic.S_Status) !=0xfe ) { +while (readb (&dp6m_ptr->u.ic.S_Status) !=0xfe ) {if (--retries ==0 ) {printk ("GDT-PCI: Initialization error\n" );iounmap (ha->brd);
@@ -1197,14 +1190,14 @@ static int __init gdth_init_pci(gdth_pci_str *pcistr,gdth_ha_str *ha) }gdth_delay (1 ); } -gdth_writeb (0 , &dp6m_ptr->u.ic.S_Status); +writeb (0 , &dp6m_ptr->u.ic.S_Status);/* read FW version to detect 64-bit DMA support */ -gdth_writeb (0xfd , &dp6m_ptr->u.ic.S_Cmd_Indx); -gdth_writeb (1 , &dp6m_ptr->i960r.ldoor_reg); +writeb (0xfd , &dp6m_ptr->u.ic.S_Cmd_Indx); +writeb (1 , &dp6m_ptr->i960r.ldoor_reg); retries =INIT_RETRIES ;gdth_delay (20 ); -while (gdth_readb (&dp6m_ptr->u.ic.S_Status) !=0xfd ) { +while (readb (&dp6m_ptr->u.ic.S_Status) !=0xfd ) {if (--retries ==0 ) {printk ("GDT-PCI: Initialization error (DEINIT failed)\n" );iounmap (ha->brd);
@@ -1212,8 +1205,8 @@ static int __init gdth_init_pci(gdth_pci_str *pcistr,gdth_ha_str *ha) }gdth_delay (1 ); } - prot_ver = (unchar)(gdth_readl (&dp6m_ptr->u.ic.S_Info[0 ]) >>16 ); -gdth_writeb (0 , &dp6m_ptr->u.ic.S_Status); + prot_ver = (unchar)(readl (&dp6m_ptr->u.ic.S_Info[0 ]) >>16 ); +writeb (0 , &dp6m_ptr->u.ic.S_Status);if (prot_ver <0x2b )/* FW < x.43: no 64-bit DMA support */ ha->dma64_support =0 ;else
@@ -1244,21 +1237,21 @@ static void __init gdth_enable_int(int hanum)outb (0x01 , ha->bmic +EINTENABREG ); }else if (ha->type ==GDT_ISA ) { dp2_ptr = ha->brd; -gdth_writeb (1 , &dp2_ptr->io.irqdel); -gdth_writeb (0 , &dp2_ptr->u.ic.Cmd_Index); -gdth_writeb (1 , &dp2_ptr->io.irqen); +writeb (1 , &dp2_ptr->io.irqdel); +writeb (0 , &dp2_ptr->u.ic.Cmd_Index); +writeb (1 , &dp2_ptr->io.irqen); }else if (ha->type ==GDT_PCI ) { dp6_ptr = ha->brd; -gdth_writeb (1 , &dp6_ptr->io.irqdel); -gdth_writeb (0 , &dp6_ptr->u.ic.Cmd_Index); -gdth_writeb (1 , &dp6_ptr->io.irqen); +writeb (1 , &dp6_ptr->io.irqdel); +writeb (0 , &dp6_ptr->u.ic.Cmd_Index); +writeb (1 , &dp6_ptr->io.irqen); }else if (ha->type ==GDT_PCINEW ) {outb (0xff ,PTR2USHORT (&ha->plx->edoor_reg));outb (0x03 ,PTR2USHORT (&ha->plx->control1)); }else if (ha->type ==GDT_PCIMPR ) { dp6m_ptr = ha->brd; -gdth_writeb (0xff , &dp6m_ptr->i960r.edoor_reg); -gdth_writeb (gdth_readb (&dp6m_ptr->i960r.edoor_en_reg) & ~4 , +writeb (0xff , &dp6m_ptr->i960r.edoor_reg); +writeb (readb (&dp6m_ptr->i960r.edoor_en_reg) & ~4 , &dp6m_ptr->i960r.edoor_en_reg); }spin_unlock_irqrestore (&ha->smp_lock, flags);
@@ -1282,15 +1275,15 @@ static int gdth_get_status(unchar *pIStatus,int irq) *pIStatus =inb ((ushort )ha->bmic +EDOORREG ); else if (ha->type == GDT_ISA) *pIStatus = -gdth_readb (&((gdt2_dpram_str __iomem *)ha->brd)->u.ic.Cmd_Index); +readb (&((gdt2_dpram_str __iomem *)ha->brd)->u.ic.Cmd_Index); else if (ha->type == GDT_PCI) *pIStatus = -gdth_readb (&((gdt6_dpram_str __iomem *)ha->brd)->u.ic.Cmd_Index); +readb (&((gdt6_dpram_str __iomem *)ha->brd)->u.ic.Cmd_Index); else if (ha->type == GDT_PCINEW) *pIStatus = inb(PTR2USHORT(&ha->plx->edoor_reg)); else if (ha->type == GDT_PCIMPR) *pIStatus = -gdth_readb (&((gdt6m_dpram_str __iomem *)ha->brd)->i960r.edoor_reg); +readb (&((gdt6m_dpram_str __iomem *)ha->brd)->i960r.edoor_reg);if (*pIStatus)return i;/* board found */
@@ -1310,14 +1303,14 @@ static int gdth_test_busy(int hanum)if (ha->type ==GDT_EISA ) gdtsema0 = (int )inb (ha->bmic +SEMA0REG );else if (ha->type ==GDT_ISA ) - gdtsema0 = (int )gdth_readb (&((gdt2_dpram_str __iomem *)ha->brd)->u.ic.Sema0); + gdtsema0 = (int )readb (&((gdt2_dpram_str __iomem *)ha->brd)->u.ic.Sema0);else if (ha->type ==GDT_PCI ) - gdtsema0 = (int )gdth_readb (&((gdt6_dpram_str __iomem *)ha->brd)->u.ic.Sema0); + gdtsema0 = (int )readb (&((gdt6_dpram_str __iomem *)ha->brd)->u.ic.Sema0);else if (ha->type ==GDT_PCINEW ) gdtsema0 = (int )inb (PTR2USHORT (&ha->plx->sema0_reg));else if (ha->type ==GDT_PCIMPR ) gdtsema0 = - (int )gdth_readb (&((gdt6m_dpram_str __iomem *)ha->brd)->i960r.sema0_reg); + (int )readb (&((gdt6m_dpram_str __iomem *)ha->brd)->i960r.sema0_reg);return (gdtsema0 &1 ); }
@@ -1353,13 +1346,13 @@ static void gdth_set_sema0(int hanum)if (ha->type ==GDT_EISA ) {outb (1 , ha->bmic +SEMA0REG ); }else if (ha->type ==GDT_ISA ) { -gdth_writeb (1 , &((gdt2_dpram_str __iomem *)ha->brd)->u.ic.Sema0); +writeb (1 , &((gdt2_dpram_str __iomem *)ha->brd)->u.ic.Sema0); }else if (ha->type ==GDT_PCI ) { -gdth_writeb (1 , &((gdt6_dpram_str __iomem *)ha->brd)->u.ic.Sema0); +writeb (1 , &((gdt6_dpram_str __iomem *)ha->brd)->u.ic.Sema0); }else if (ha->type ==GDT_PCINEW ) {outb (1 ,PTR2USHORT (&ha->plx->sema0_reg)); }else if (ha->type ==GDT_PCIMPR ) { -gdth_writeb (1 , &((gdt6m_dpram_str __iomem *)ha->brd)->i960r.sema0_reg); +writeb (1 , &((gdt6m_dpram_str __iomem *)ha->brd)->i960r.sema0_reg); } }
@@ -1395,30 +1388,30 @@ static void gdth_copy_command(int hanum)/* set offset and service, copy command to DPMEM */ if (ha->type ==GDT_ISA ) { dp2_ptr = ha->brd; -gdth_writew (dp_offset +DPMEM_COMMAND_OFFSET , +writew (dp_offset +DPMEM_COMMAND_OFFSET , &dp2_ptr->u.ic.comm_queue[cmd_no].offset); -gdth_writew ((ushort )cmd_ptr->Service, +writew ((ushort )cmd_ptr->Service, &dp2_ptr->u.ic.comm_queue[cmd_no].serv_id);memcpy_toio (&dp2_ptr->u.ic.gdt_dpr_cmd[dp_offset],cmd_ptr,cp_count); }else if (ha->type ==GDT_PCI ) { dp6_ptr = ha->brd; -gdth_writew (dp_offset +DPMEM_COMMAND_OFFSET , +writew (dp_offset +DPMEM_COMMAND_OFFSET , &dp6_ptr->u.ic.comm_queue[cmd_no].offset); -gdth_writew ((ushort )cmd_ptr->Service, +writew ((ushort )cmd_ptr->Service, &dp6_ptr->u.ic.comm_queue[cmd_no].serv_id);memcpy_toio (&dp6_ptr->u.ic.gdt_dpr_cmd[dp_offset],cmd_ptr,cp_count); }else if (ha->type ==GDT_PCINEW ) { dp6c_ptr = ha->brd; -gdth_writew (dp_offset +DPMEM_COMMAND_OFFSET , +writew (dp_offset +DPMEM_COMMAND_OFFSET , &dp6c_ptr->u.ic.comm_queue[cmd_no].offset); -gdth_writew ((ushort )cmd_ptr->Service, +writew ((ushort )cmd_ptr->Service, &dp6c_ptr->u.ic.comm_queue[cmd_no].serv_id);memcpy_toio (&dp6c_ptr->u.ic.gdt_dpr_cmd[dp_offset],cmd_ptr,cp_count); }else if (ha->type ==GDT_PCIMPR ) { dp6m_ptr = ha->brd; -gdth_writew (dp_offset +DPMEM_COMMAND_OFFSET , +writew (dp_offset +DPMEM_COMMAND_OFFSET , &dp6m_ptr->u.ic.comm_queue[cmd_no].offset); -gdth_writew ((ushort )cmd_ptr->Service, +writew ((ushort )cmd_ptr->Service, &dp6m_ptr->u.ic.comm_queue[cmd_no].serv_id);memcpy_toio (&dp6m_ptr->u.ic.gdt_dpr_cmd[dp_offset],cmd_ptr,cp_count); }
@@ -1454,13 +1447,13 @@ static void gdth_release_event(int hanum)outl (ha->ccb_phys, ha->bmic +MAILBOXREG );outb (ha->pccb->Service, ha->bmic +LDOORREG ); }else if (ha->type ==GDT_ISA ) { -gdth_writeb (0 , &((gdt2_dpram_str __iomem *)ha->brd)->io.event); +writeb (0 , &((gdt2_dpram_str __iomem *)ha->brd)->io.event); }else if (ha->type ==GDT_PCI ) { -gdth_writeb (0 , &((gdt6_dpram_str __iomem *)ha->brd)->io.event); +writeb (0 , &((gdt6_dpram_str __iomem *)ha->brd)->io.event); }else if (ha->type ==GDT_PCINEW ) {outb (1 ,PTR2USHORT (&ha->plx->ldoor_reg)); }else if (ha->type ==GDT_PCIMPR ) { -gdth_writeb (1 , &((gdt6m_dpram_str __iomem *)ha->brd)->i960r.ldoor_reg); +writeb (1 , &((gdt6m_dpram_str __iomem *)ha->brd)->i960r.ldoor_reg); } }
@@ -3143,32 +3136,32 @@ static irqreturn_t gdth_interrupt(int irq,void *dev_id) dp2_ptr = ha->brd;if (IStatus &0x80 ) {/* error flag */ IStatus &= ~0x80 ; - ha->status =gdth_readw (&dp2_ptr->u.ic.Status); + ha->status =readw (&dp2_ptr->u.ic.Status);TRACE2 (("gdth_interrupt() error %d/%d\n" ,IStatus,ha->status)); }else /* no error */ ha->status =S_OK ; - ha->info =gdth_readl (&dp2_ptr->u.ic.Info[0 ]); - ha->service =gdth_readw (&dp2_ptr->u.ic.Service); - ha->info2 =gdth_readl (&dp2_ptr->u.ic.Info[1 ]); + ha->info =readl (&dp2_ptr->u.ic.Info[0 ]); + ha->service =readw (&dp2_ptr->u.ic.Service); + ha->info2 =readl (&dp2_ptr->u.ic.Info[1 ]); -gdth_writeb (0xff , &dp2_ptr->io.irqdel);/* acknowledge interrupt */ -gdth_writeb (0 , &dp2_ptr->u.ic.Cmd_Index);/* reset command index */ -gdth_writeb (0 , &dp2_ptr->io.Sema1);/* reset status semaphore */ +writeb (0xff , &dp2_ptr->io.irqdel);/* acknowledge interrupt */ +writeb (0 , &dp2_ptr->u.ic.Cmd_Index);/* reset command index */ +writeb (0 , &dp2_ptr->io.Sema1);/* reset status semaphore */ }else if (ha->type ==GDT_PCI ) { dp6_ptr = ha->brd;if (IStatus &0x80 ) {/* error flag */ IStatus &= ~0x80 ; - ha->status =gdth_readw (&dp6_ptr->u.ic.Status); + ha->status =readw (&dp6_ptr->u.ic.Status);TRACE2 (("gdth_interrupt() error %d/%d\n" ,IStatus,ha->status)); }else /* no error */ ha->status =S_OK ; - ha->info =gdth_readl (&dp6_ptr->u.ic.Info[0 ]); - ha->service =gdth_readw (&dp6_ptr->u.ic.Service); - ha->info2 =gdth_readl (&dp6_ptr->u.ic.Info[1 ]); + ha->info =readl (&dp6_ptr->u.ic.Info[0 ]); + ha->service =readw (&dp6_ptr->u.ic.Service); + ha->info2 =readl (&dp6_ptr->u.ic.Info[1 ]); -gdth_writeb (0xff , &dp6_ptr->io.irqdel);/* acknowledge interrupt */ -gdth_writeb (0 , &dp6_ptr->u.ic.Cmd_Index);/* reset command index */ -gdth_writeb (0 , &dp6_ptr->io.Sema1);/* reset status semaphore */ +writeb (0xff , &dp6_ptr->io.irqdel);/* acknowledge interrupt */ +writeb (0 , &dp6_ptr->u.ic.Cmd_Index);/* reset command index */ +writeb (0 , &dp6_ptr->io.Sema1);/* reset status semaphore */ }else if (ha->type ==GDT_PCINEW ) {if (IStatus &0x80 ) {/* error flag */ IStatus &= ~0x80 ;
@@ -3191,7 +3184,7 @@ static irqreturn_t gdth_interrupt(int irq,void *dev_id) ha->status = pcs->ext_status &0xffff ; else#endif - ha->status =gdth_readw (&dp6m_ptr->i960r.status); + ha->status =readw (&dp6m_ptr->i960r.status);TRACE2 (("gdth_interrupt() error %d/%d\n" ,IStatus,ha->status)); }else /* no error */ ha->status =S_OK ;
@@ -3204,18 +3197,18 @@ static irqreturn_t gdth_interrupt(int irq,void *dev_id) } else#endif { - ha->info =gdth_readl (&dp6m_ptr->i960r.info[0 ]); - ha->service =gdth_readw (&dp6m_ptr->i960r.service); - ha->info2 =gdth_readl (&dp6m_ptr->i960r.info[1 ]); + ha->info =readl (&dp6m_ptr->i960r.info[0 ]); + ha->service =readw (&dp6m_ptr->i960r.service); + ha->info2 =readl (&dp6m_ptr->i960r.info[1 ]); }/* event string */ if (IStatus ==ASYNCINDEX ) {if (ha->service !=SCREENSERVICE && (ha->fw_vers &0xff ) >=0x1a ) { - ha->dvr.severity =gdth_readb + ha->dvr.severity =readb (&((gdt6m_dpram_str __iomem *)ha->brd)->i960r.severity);for (i =0 ; i <256 ; ++i) { - ha->dvr.event_string[i] =gdth_readb + ha->dvr.event_string[i] =readb (&((gdt6m_dpram_str __iomem *)ha->brd)->i960r.evt_str[i]);if (ha->dvr.event_string[i] ==0 )break ;
@@ -3228,8 +3221,8 @@ static irqreturn_t gdth_interrupt(int irq,void *dev_id) if (!coalesced)#endif { -gdth_writeb (0xff , &dp6m_ptr->i960r.edoor_reg); -gdth_writeb (0 , &dp6m_ptr->i960r.sema1_reg); +writeb (0xff , &dp6m_ptr->i960r.edoor_reg); +writeb (0 , &dp6m_ptr->i960r.sema1_reg); } }else {TRACE2 (("gdth_interrupt() unknown controller type\n" ));
@@ -3314,8 +3307,8 @@ static irqreturn_t gdth_interrupt(int irq,void *dev_id)/* coalescing only for new GDT_PCIMPR controllers available */ if (ha->type ==GDT_PCIMPR && coalesced) { -gdth_writeb (0xff , &dp6m_ptr->i960r.edoor_reg); -gdth_writeb (0 , &dp6m_ptr->i960r.sema1_reg); +writeb (0xff , &dp6m_ptr->i960r.edoor_reg); +writeb (0 , &dp6m_ptr->i960r.sema1_reg); }#endif
Signature · 1 line
1.5.3.1
PATCH 8/16 gdth: Reorder scsi_host_template intitializers
In reply to Boaz HarroshFrom: Jeff Garzik <[email protected]>
* shuffle scsi_host_template members such that they appear in the order in which they are defined in the header. this makes is easier to verify when initializers are missing members.
--- drivers/scsi/gdth.c | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-)
drivers/scsi/gdth.c +3 -3
@@ -4907,17 +4907,17 @@ static int gdth_slave_configure(struct scsi_device *sdev) }static struct scsi_host_template driver_template = { - .proc_name ="gdth" , - .proc_info = gdth_proc_info, .name ="GDT SCSI Disk Array Controller" , .detect = gdth_detect, .release = gdth_release, .info = gdth_info, .queuecommand = gdth_queuecommand, .eh_bus_reset_handler = gdth_eh_bus_reset, + .slave_configure = gdth_slave_configure, .bios_param = gdth_bios_param, + .proc_info = gdth_proc_info, + .proc_name ="gdth" , .can_queue =GDTH_MAXCMDS , - .slave_configure = gdth_slave_configure, .this_id =-1 , .sg_tablesize =GDTH_MAXSG , .cmd_per_lun =GDTH_MAXC_P_L ,
Signature · 1 line
1.5.3.1
PATCH 9/16 gdth: Remove virt hosts
In reply to Boaz HarroshFrom: Christoph Hellwig <[email protected]>
The virt_ctr option allows to register a new scsi_host for each bus on the raid controller. This non-default option makes no sense with the current scsi code and prevents cleaning up the host registration, so remove it.
--- drivers/scsi/gdth.c | 88 ++++++--------------------------------------- drivers/scsi/gdth_proc.c | 28 ++++++--------- drivers/scsi/gdth_proc.h | 4 +- 3 files changed, 25 insertions(+), 95 deletions(-)
drivers/scsi/gdth.c +12 -76
@@ -56,8 +56,6 @@* max_ids:x x - target ID count per channel (1..MAXID) * rescan:Y rescan all channels/IDs * rescan:N use all devices found until now -* virt_ctr:Y map every channel to a virtual controller -* virt_ctr:N use multi channel support * hdr_channel:x x - number of virtual bus for host drives * shared_access:Y disable driver reserve/release protocol to * access a shared resource from several nodes,
@@ -69,7 +67,7 @@* force_dma32:N use 64 bit DMA mode, if supported * * The default values are: "gdth=disable:N,reserve_mode:1,reverse_scan:N, -* max_ids:127,rescan:N,virt_ctr:N,hdr_channel:0, +* max_ids:127,rescan:N,hdr_channel:0, * shared_access:Y,probe_eisa_isa:N,force_dma32:N". * Here is another example: "gdth=reserve_list:0,1,2,0,0,1,3,0,rescan:Y". *
@@ -80,7 +78,7 @@* '1' in place of 'Y' and '0' in place of 'N'. * * Default: "modprobe gdth disable=0 reserve_mode=1 reverse_scan=0 -* max_ids=127 rescan=0 virt_ctr=0 hdr_channel=0 shared_access=0 +* max_ids=127 rescan=0 hdr_channel=0 shared_access=0 * probe_eisa_isa=0 force_dma32=0" * The other example: "modprobe gdth reserve_list=0,1,2,0,0,1,3,0 rescan=1". */
@@ -303,10 +301,8 @@ static unchar gdth_polling; /* polling if TRUE */static unchar gdth_from_wait = FALSE;/* gdth_wait() */ static int wait_index,wait_hanum;/* gdth_wait() */ static int gdth_ctr_count =0 ;/* controller count */ -static int gdth_ctr_vcount =0 ;/* virt. ctr. count */ static int gdth_ctr_released =0 ;/* gdth_release() */ static struct Scsi_Host *gdth_ctr_tab[MAXHA ];/* controller table */ -static struct Scsi_Host *gdth_ctr_vtab[MAXHA *MAXBUS ];/* virt. ctr. table */ static unchar gdth_write_through = FALSE;/* write through */ static gdth_evt_str ebuffer[MAX_EVENTS ];/* event buffer */ static int elastidx;
@@ -358,8 +354,6 @@ static int hdr_channel = 0;static int max_ids =MAXID ;/* rescan all IDs */ static int rescan =0 ; -/* map channels to virtual controllers */ -static int virt_ctr =0 ;/* shared access */ static int shared_access =1 ;/* enable support for EISA and ISA controllers */
@@ -376,7 +370,6 @@ module_param(reverse_scan, int, 0);module_param (hdr_channel, int,0 );module_param (max_ids, int,0 );module_param (rescan, int,0 ); -module_param (virt_ctr, int,0 );module_param (shared_access, int,0 );module_param (probe_eisa_isa, int,0 );module_param (force_dma32, int,0 );
@@ -2018,7 +2011,7 @@ static void gdth_putq(int hanum,Scsi_Cmnd *scp,unchar priority)if (!IS_GDTH_INTERNAL_CMD (scp)) { scp->SCp.this_residual = (int )priority; - b = virt_ctr ?NUMDATA (scp->device->host)->busnum:scp->device->channel; + b = scp->device->channel; t = scp->device->id;if (priority >=DEFAULT_PRI ) { if ((b != ha->virt_bus && ha->raw[BUS_L2P(ha,b)].lock) ||
@@ -2080,8 +2073,7 @@ static void gdth_next(int hanum)if (nscp != pscp && nscp != (Scsi_Cmnd *)pscp->SCp.ptr) pscp = (Scsi_Cmnd *)pscp->SCp.ptr;if (!IS_GDTH_INTERNAL_CMD (nscp)) { - b = virt_ctr ? -NUMDATA (nscp->device->host)->busnum : nscp->device->channel; + b = nscp->device->channel; t = nscp->device->id; l = nscp->device->lun;if (nscp->SCp.this_residual >=DEFAULT_PRI ) {
@@ -3397,7 +3389,7 @@ static int gdth_sync_event(int hanum,int service,unchar index,Scsi_Cmnd *scp)printk ("\n" ); }else { - b = virt_ctr ?NUMDATA (scp->device->host)->busnum : scp->device->channel; + b = scp->device->channel; t = scp->device->id;if (scp->SCp.sent_command ==-1 && b != ha->virt_bus) { ha->raw[BUS_L2P (ha,b)].io_cnt[t]--;
@@ -3883,8 +3875,6 @@ static void __init internal_setup(char *str,int *ints) max_ids = val; else if (!strncmp(argv, "rescan:", 7)) rescan = val; - else if (!strncmp(argv, "virt_ctr:", 9)) - virt_ctr = val; else if (!strncmp(argv, "shared_access:", 14)) shared_access = val; else if (!strncmp(argv, "probe_eisa_isa:", 15))
@@ -3931,7 +3921,6 @@ int __init option_setup(char *str)return 1 ; } -static int __init gdth_detect (struct scsi_host_template *shtp) {#ifdef DEBUG_GDTH
@@ -4018,7 +4007,7 @@ static int __init gdth_detect(struct scsi_host_template *shtp)register_reboot_notifier (&gdth_notifier); } gdth_polling = FALSE; -return gdth_ctr_vcount; +return gdth_ctr_count; }static int gdth_release (struct Scsi_Host *shp)
@@ -4027,7 +4016,6 @@ static int gdth_release(struct Scsi_Host *shp)gdth_ha_str *ha;TRACE2 (("gdth_release()\n" )); -if (NUMDATA (shp)->busnum ==0 ) { hanum =NUMDATA (shp)->hanum; ha =HADATA (gdth_ctr_tab[hanum]);if (ha->sdev) {
@@ -4069,7 +4057,6 @@ static int gdth_release(struct Scsi_Host *shp)unregister_chrdev (major,"gdth" );unregister_reboot_notifier (&gdth_notifier); } - }scsi_unregister (shp);return 0 ;
@@ -4131,7 +4118,7 @@ static int gdth_eh_bus_reset(Scsi_Cmnd *scp)TRACE2 (("gdth_eh_bus_reset()\n" )); hanum =NUMDATA (scp->device->host)->hanum; - b = virt_ctr ?NUMDATA (scp->device->host)->busnum : scp->device->channel; + b = scp->device->channel; ha =HADATA (gdth_ctr_tab[hanum]);/* clear command tab */
@@ -4185,7 +4172,7 @@ static int gdth_bios_param(struct scsi_device *sdev,struct block_device *bdev,se sd = sdev; capacity = cap; hanum =NUMDATA (sd->host)->hanum; - b = virt_ctr ?NUMDATA (sd->host)->busnum : sd->channel; + b = sd->channel; t = sd->id;TRACE2 (("gdth_bios_param() ha %d bus %d target %d\n" , hanum, b, t)); ha =HADATA (gdth_ctr_tab[hanum]);
@@ -4805,7 +4792,7 @@ static int gdth_ioctl(struct inode *inode, struct file *filep, scp->device = ha->sdev; scp->cmd_len =12 ; scp->use_sg =0 ; - scp->device->channel = virt_ctr ?0 : res.number; + scp->device->channel = res.number; rval =gdth_eh_bus_reset (scp); res.status = (rval ==SUCCESS ?S_OK :S_GENERR );kfree (scp);
@@ -4932,7 +4919,6 @@ static int gdth_isa_probe_one(struct scsi_host_template *shtp, ulong32 isa_bios)gdth_ha_str *ha;dma_addr_t scratch_dma_handle =0 ;int error, hanum, i; -u8 b;if (!gdth_search_isa (isa_bios))return -ENXIO ;
@@ -4969,10 +4955,8 @@ static int gdth_isa_probe_one(struct scsi_host_template *shtp, ulong32 isa_bios) shp->dma_channel = ha->drq; hanum = gdth_ctr_count; gdth_ctr_tab[gdth_ctr_count++] = shp; - gdth_ctr_vtab[gdth_ctr_vcount++] = shp;NUMDATA (shp)->hanum = (ushort )hanum; -NUMDATA (shp)->busnum=0 ; ha->pccb =CMDDATA (shp); ha->ccb_phys =0L ;
@@ -5025,20 +5009,7 @@ static int gdth_isa_probe_one(struct scsi_host_template *shtp, ulong32 isa_bios) shp->max_id = ha->tid_cnt; shp->max_lun =MAXLUN ; - shp->max_channel = virt_ctr ?0 : ha->bus_cnt; -if (virt_ctr) { - virt_ctr =1 ; -/* register addit. SCSI channels as virtual controllers */ -for (b =1 ; b < ha->bus_cnt +1 ; ++b) { - shp =scsi_register (shtp,sizeof (gdth_num_str)); - shp->unchecked_isa_dma =1 ; - shp->irq = ha->irq; - shp->dma_channel = ha->drq; - gdth_ctr_vtab[gdth_ctr_vcount++] = shp; -NUMDATA (shp)->hanum = (ushort )hanum; -NUMDATA (shp)->busnum = b; - } - } + shp->max_channel = ha->bus_cnt;spin_lock_init (&ha->smp_lock);gdth_enable_int (hanum);
@@ -5058,7 +5029,6 @@ static int gdth_isa_probe_one(struct scsi_host_template *shtp, ulong32 isa_bios) ha->pscratch, ha->scratch_phys); out_dec_counters: gdth_ctr_count--; - gdth_ctr_vcount--; out_free_irq:free_irq (ha->irq, ha); out_host_put:
@@ -5075,7 +5045,6 @@ static int gdth_eisa_probe_one(struct scsi_host_template *shtp,gdth_ha_str *ha;dma_addr_t scratch_dma_handle =0 ;int error, hanum, i; -u8 b;if (!gdth_search_eisa (eisa_slot))return -ENXIO ;
@@ -5104,10 +5073,8 @@ static int gdth_eisa_probe_one(struct scsi_host_template *shtp, shp->dma_channel =0xff ; hanum = gdth_ctr_count; gdth_ctr_tab[gdth_ctr_count++] = shp; - gdth_ctr_vtab[gdth_ctr_vcount++] = shp;NUMDATA (shp)->hanum = (ushort )hanum; -NUMDATA (shp)->busnum=0 ;TRACE2 (("EISA detect Bus 0: hanum %d\n" ,NUMDATA (shp)->hanum));
@@ -5167,20 +5134,7 @@ static int gdth_eisa_probe_one(struct scsi_host_template *shtp, shp->max_id = ha->tid_cnt; shp->max_lun =MAXLUN ; - shp->max_channel = virt_ctr ?0 : ha->bus_cnt; -if (virt_ctr) { - virt_ctr =1 ; -/* register addit. SCSI channels as virtual controllers */ -for (b =1 ; b < ha->bus_cnt +1 ; ++b) { - shp =scsi_register (shtp,sizeof (gdth_num_str)); - shp->unchecked_isa_dma =0 ; - shp->irq = ha->irq; - shp->dma_channel =0xff ; - gdth_ctr_vtab[gdth_ctr_vcount++] = shp; -NUMDATA (shp)->hanum = (ushort )hanum; -NUMDATA (shp)->busnum = b; - } - } + shp->max_channel = ha->bus_cnt;spin_lock_init (&ha->smp_lock);gdth_enable_int (hanum);
@@ -5203,7 +5157,6 @@ static int gdth_eisa_probe_one(struct scsi_host_template *shtp, out_free_irq:free_irq (ha->irq, ha); gdth_ctr_count--; - gdth_ctr_vcount--; out_host_put:scsi_unregister (shp);return error;
@@ -5218,7 +5171,6 @@ static int gdth_pci_probe_one(struct scsi_host_template *shtp,gdth_ha_str *ha;dma_addr_t scratch_dma_handle =0 ;int error, hanum, i; -u8 b; shp =scsi_register (shtp,sizeof (gdth_ext_str));if (!shp)
@@ -5247,10 +5199,8 @@ static int gdth_pci_probe_one(struct scsi_host_template *shtp, shp->dma_channel =0xff ; hanum = gdth_ctr_count; gdth_ctr_tab[gdth_ctr_count++] = shp; - gdth_ctr_vtab[gdth_ctr_vcount++] = shp;NUMDATA (shp)->hanum = (ushort )hanum; -NUMDATA (shp)->busnum=0 ; ha->pccb =CMDDATA (shp); ha->ccb_phys =0L ;
@@ -5318,20 +5268,7 @@ static int gdth_pci_probe_one(struct scsi_host_template *shtp, shp->max_id = ha->tid_cnt; shp->max_lun =MAXLUN ; - shp->max_channel = virt_ctr ?0 : ha->bus_cnt; -if (virt_ctr) { - virt_ctr =1 ; -/* register addit. SCSI channels as virtual controllers */ -for (b =1 ; b < ha->bus_cnt +1 ; ++b) { - shp =scsi_register (shtp,sizeof (gdth_num_str)); - shp->unchecked_isa_dma =0 ; - shp->irq = ha->irq; - shp->dma_channel =0xff ; - gdth_ctr_vtab[gdth_ctr_vcount++] = shp; -NUMDATA (shp)->hanum = (ushort )hanum; -NUMDATA (shp)->busnum = b; - } - } + shp->max_channel = ha->bus_cnt;spin_lock_init (&ha->smp_lock);gdth_enable_int (hanum);
@@ -5351,7 +5288,6 @@ static int gdth_pci_probe_one(struct scsi_host_template *shtp, out_free_irq:free_irq (ha->irq, ha); gdth_ctr_count--; - gdth_ctr_vcount--; out_host_put:scsi_unregister (shp);return error;
drivers/scsi/gdth_proc.c +11 -17
@@ -7,26 +7,25 @@int gdth_proc_info (struct Scsi_Host *host,char *buffer,char **start,off_t offset,int length,int inout) { -int hanum,busnum; +int hanum;TRACE2 (("gdth_proc_info() length %d offs %d inout %d\n" , length,(int )offset,inout)); hanum =NUMDATA (host)->hanum; - busnum=NUMDATA (host)->busnum;if (inout) -return (gdth_set_info (buffer,length,host,hanum,busnum)); +return (gdth_set_info (buffer,length,host,hanum));else -return (gdth_get_info (buffer,start,offset,length,host,hanum,busnum)); +return (gdth_get_info (buffer,start,offset,length,host,hanum)); }static int gdth_set_info (char *buffer,int length,struct Scsi_Host *host, -int hanum,int busnum) +int hanum) {int ret_val = -EINVAL ; -TRACE2 (("gdth_set_info() ha %d bus %d\n" ,hanum,busnum)); + TRACE2(("gdth_set_info() ha %d\n",hanum,));if (length >=4 ) {if (strncmp (buffer,"gdth" ,4 ) ==0 ) {
@@ -154,7 +153,7 @@ static int gdth_set_asc_info(struct Scsi_Host *host, char *buffer, }static int gdth_get_info (char *buffer,char **start,off_t offset,int length, -struct Scsi_Host *host,int hanum,int busnum) +struct Scsi_Host *host,int hanum) {int size =0 ,len =0 ;off_t begin =0 ,pos =0 ;
@@ -187,7 +186,7 @@ static int gdth_get_info(char *buffer,char **start,off_t offset,int length,memset (cmnd,0xff ,12 );memset (gdtcmd,0 ,sizeof (gdth_cmd_str)); -TRACE2 (("gdth_get_info() ha %d bus %d\n" ,hanum,busnum)); +TRACE2 (("gdth_get_info() ha %d\n" ,hanum)); ha =HADATA (gdth_ctr_tab[hanum]);
@@ -218,10 +217,7 @@ static int gdth_get_info(char *buffer,char **start,off_t offset,int length,/* controller information */ size =sprintf (buffer+len,"\nDisk Array Controller Information:\n" ); len += size; pos = begin + len; -if (virt_ctr) -sprintf (hrec,"%s (Bus %d)" , ha->binfo.type_string, busnum); -else -strcpy (hrec, ha->binfo.type_string); +strcpy (hrec, ha->binfo.type_string); size =sprintf (buffer+len," Number: \t%d \tName: \t%s\n" , hanum, hrec);
@@ -753,7 +749,7 @@ static void gdth_wait_completion(int hanum, int busnum, int id)for (i =0 ; i <GDTH_MAXCMDS ; ++i) { scp = ha->cmd_tab[i].cmnd; - b = virt_ctr ?NUMDATA (scp->device->host)->busnum : scp->device->channel; + b = scp->device->channel; t = scp->device->id;if (!SPECIAL_SCP (scp) && t == (unchar )id && b == (unchar )busnum) {
@@ -779,8 +775,7 @@ static void gdth_stop_timeout(int hanum, int busnum, int id)for (scp = ha->req_first; scp; scp = (Scsi_Cmnd *)scp->SCp.ptr) {if (IS_GDTH_INTERNAL_CMD (scp)) { - b = virt_ctr ? -NUMDATA (scp->device->host)->busnum : scp->device->channel; + b = scp->device->channel; t = scp->device->id;if (t == (unchar )id && b == (unchar )busnum) {TRACE2 (("gdth_stop_timeout(): update_timeout()\n" ));
@@ -803,8 +798,7 @@ static void gdth_start_timeout(int hanum, int busnum, int id)for (scp = ha->req_first; scp; scp = (Scsi_Cmnd *)scp->SCp.ptr) {if (!IS_GDTH_INTERNAL_CMD (scp)) { - b = virt_ctr ? -NUMDATA (scp->device->host)->busnum : scp->device->channel; + b = scp->device->channel; t = scp->device->id;if (t == (unchar )id && b == (unchar )busnum) {TRACE2 (("gdth_start_timeout(): update_timeout()\n" ));
drivers/scsi/gdth_proc.h +2 -2
@@ -9,9 +9,9 @@ int gdth_execute(struct Scsi_Host *shost, gdth_cmd_str *gdtcmd, char *cmnd, int timeout, u32 *info);static int gdth_set_info (char *buffer,int length,struct Scsi_Host *host, -int hanum,int busnum); +int hanum);static int gdth_get_info (char *buffer,char **start,off_t offset,int length, -struct Scsi_Host *host,int hanum,int busnum); +struct Scsi_Host *host,int hanum);static int gdth_set_asc_info (struct Scsi_Host *host,char *buffer,int length,int hanum);
Signature · 1 line
1.5.3.1
PATCH 10/16 gdth: clean up host private data
In reply to Boaz Harrosh- Based on same patch from Christoph Hellwig <[email protected]>
- Get rid of all the indirection in the Scsi_Host private data and always put the gdth_ha_str directly into it.
- Change all internal functions prototype to recieve an "gdth_ha_str *ha"
pointer directlly and kill all that redundent access to the "gdth_ctr_tab[]"
controller-table.--- drivers/scsi/gdth.c | 558 ++++++++++++++++++++-------------------------- drivers/scsi/gdth.h | 17 +-- drivers/scsi/gdth_proc.c | 80 +++---- drivers/scsi/gdth_proc.h | 20 +- 4 files changed, 291 insertions(+), 384 deletions(-)
drivers/scsi/gdth.c +247 -311
@@ -139,14 +139,15 @@static void gdth_delay (int milliseconds);static void gdth_eval_mapping (ulong32 size,ulong32 *cyls,int *heads,int *secs);static irqreturn_t gdth_interrupt (int irq,void *dev_id); -static int gdth_sync_event (int hanum,int service,unchar index,Scsi_Cmnd *scp); -static int gdth_async_event (int hanum); +static int gdth_sync_event (gdth_ha_str *ha,int service,unchar index, +Scsi_Cmnd *scp); +static int gdth_async_event (gdth_ha_str *ha);static void gdth_log_event (gdth_evt_data *dvr,char *buffer); -static void gdth_putq (int hanum,Scsi_Cmnd *scp,unchar priority); -static void gdth_next (int hanum); -static int gdth_fill_raw_cmd (int hanum,Scsi_Cmnd *scp,unchar b); -static int gdth_special_cmd (int hanum,Scsi_Cmnd *scp); +static void gdth_putq (gdth_ha_str *ha,Scsi_Cmnd *scp,unchar priority); +static void gdth_next (gdth_ha_str *ha); +static int gdth_fill_raw_cmd (gdth_ha_str *ha,Scsi_Cmnd *scp,unchar b); +static int gdth_special_cmd (gdth_ha_str *ha,Scsi_Cmnd *scp);static gdth_evt_str *gdth_store_event (gdth_ha_str *ha,ushort source,ushort idx,gdth_evt_data *evt);static int gdth_read_event (gdth_ha_str *ha,int handle,gdth_evt_str *estr);
@@ -154,30 +155,30 @@ static void gdth_readapp_event(gdth_ha_str *ha, unchar application, gdth_evt_str *estr);static void gdth_clear_events (void ); -static void gdth_copy_internal_data (int hanum,Scsi_Cmnd *scp, +static void gdth_copy_internal_data (gdth_ha_str *ha,Scsi_Cmnd *scp,char *buffer,ushort count); -static int gdth_internal_cache_cmd (int hanum,Scsi_Cmnd *scp); -static int gdth_fill_cache_cmd (int hanum,Scsi_Cmnd *scp,ushort hdrive); +static int gdth_internal_cache_cmd (gdth_ha_str *ha,Scsi_Cmnd *scp); +static int gdth_fill_cache_cmd (gdth_ha_str *ha,Scsi_Cmnd *scp,ushort hdrive); -static void gdth_enable_int (int hanum); +static void gdth_enable_int (gdth_ha_str *ha);static int gdth_get_status (unchar *pIStatus,int irq); -static int gdth_test_busy (int hanum); -static int gdth_get_cmd_index (int hanum); -static void gdth_release_event (int hanum); -static int gdth_wait (int hanum,int index,ulong32 time); -static int gdth_internal_cmd (int hanum,unchar service,ushort opcode,ulong32 p1, -ulong64 p2,ulong64 p3); -static int gdth_search_drives (int hanum); -static int gdth_analyse_hdrive (int hanum,ushort hdrive); +static int gdth_test_busy (gdth_ha_str *ha); +static int gdth_get_cmd_index (gdth_ha_str *ha); +static void gdth_release_event (gdth_ha_str *ha); +static int gdth_wait (gdth_ha_str *ha,int index,ulong32 time); +static int gdth_internal_cmd (gdth_ha_str *ha,unchar service,ushort opcode, +ulong32 p1,ulong64 p2,ulong64 p3); +static int gdth_search_drives (gdth_ha_str *ha); +static int gdth_analyse_hdrive (gdth_ha_str *ha,ushort hdrive); -static const char *gdth_ctr_name (int hanum); +static const char *gdth_ctr_name (gdth_ha_str *ha);static int gdth_open (struct inode *inode,struct file *filep);static int gdth_close (struct inode *inode,struct file *filep);static int gdth_ioctl (struct inode *inode,struct file *filep,unsigned int cmd,unsigned long arg); -static void gdth_flush (int hanum); +static void gdth_flush (gdth_ha_str *ha);static int gdth_halt (struct notifier_block *nb,ulong event,void *buf);static int gdth_queuecommand (Scsi_Cmnd *scp,void (*done)(Scsi_Cmnd *));static void gdth_scsi_done (struct scsi_cmnd *scp);
@@ -285,10 +286,6 @@ static struct timer_list gdth_timer;#define GDTOFFSOF (a,b) (size_t)&(((a*)0)->b)#define INDEX_OK (i,t) ((i)<ARRAY_SIZE(t)) -#define NUMDATA (a) ( (gdth_num_str *)((a)->hostdata)) -#define HADATA (a) (&((gdth_ext_str *)((a)->hostdata))->haext) -#define CMDDATA (a) (&((gdth_ext_str *)((a)->hostdata))->cmdext) -#define BUS_L2P (a,b) ((b)>(a)->virt_bus ? (b-1):(b))#ifdef CONFIG_ISA
@@ -1212,16 +1209,14 @@ static int __init gdth_init_pci(gdth_pci_str *pcistr,gdth_ha_str *ha)/* controller protocol functions */ -static void __init gdth_enable_int (int hanum) +static void __init gdth_enable_int (gdth_ha_str *ha) { -gdth_ha_str *ha;ulong flags;gdt2_dpram_str __iomem *dp2_ptr;gdt6_dpram_str __iomem *dp6_ptr;gdt6m_dpram_str __iomem *dp6m_ptr; -TRACE (("gdth_enable_int() hanum %d\n" ,hanum)); - ha =HADATA (gdth_ctr_tab[hanum]); +TRACE (("gdth_enable_int() hanum %d\n" ,ha->hanum));spin_lock_irqsave (&ha->smp_lock, flags);if (ha->type ==GDT_EISA ) {
@@ -1261,7 +1256,7 @@ static int gdth_get_status(unchar *pIStatus,int irq) *pIStatus =0 ;for (i=0 ; i<gdth_ctr_count; ++i) { - ha =HADATA (gdth_ctr_tab[i]); + ha =shost_priv (gdth_ctr_tab[i]);if (ha->irq != (unchar )irq)/* check IRQ */ continue ;if (ha->type ==GDT_EISA )
@@ -1285,14 +1280,12 @@ static int gdth_get_status(unchar *pIStatus,int irq) } -static int gdth_test_busy (int hanum) +static int gdth_test_busy (gdth_ha_str *ha) { - registergdth_ha_str *ha; registerint gdtsema0 =0 ; -TRACE (("gdth_test_busy() hanum %d\n" ,hanum)); - - ha =HADATA (gdth_ctr_tab[hanum]); +TRACE (("gdth_test_busy() hanum %d\n" , ha->hanum)); +if (ha->type ==GDT_EISA ) gdtsema0 = (int )inb (ha->bmic +SEMA0REG );else if (ha->type ==GDT_ISA )
@@ -1309,14 +1302,12 @@ static int gdth_test_busy(int hanum) } -static int gdth_get_cmd_index (int hanum) +static int gdth_get_cmd_index (gdth_ha_str *ha) { - registergdth_ha_str *ha;int i; -TRACE (("gdth_get_cmd_index() hanum %d\n" ,hanum)); +TRACE (("gdth_get_cmd_index() hanum %d\n" , ha->hanum)); - ha =HADATA (gdth_ctr_tab[hanum]);for (i=0 ; i<GDTH_MAXCMDS ; ++i) {if (ha->cmd_tab[i].cmnd ==UNUSED_CMND ) { ha->cmd_tab[i].cmnd = ha->pccb->RequestBuffer;
@@ -1329,13 +1320,10 @@ static int gdth_get_cmd_index(int hanum) } -static void gdth_set_sema0 (int hanum) +static void gdth_set_sema0 (gdth_ha_str *ha) { - registergdth_ha_str *ha; - -TRACE (("gdth_set_sema0() hanum %d\n" ,hanum)); +TRACE (("gdth_set_sema0() hanum %d\n" , ha->hanum)); - ha =HADATA (gdth_ctr_tab[hanum]);if (ha->type ==GDT_EISA ) {outb (1 , ha->bmic +SEMA0REG ); }else if (ha->type ==GDT_ISA ) {
@@ -1350,9 +1338,8 @@ static void gdth_set_sema0(int hanum) } -static void gdth_copy_command (int hanum) +static void gdth_copy_command (gdth_ha_str *ha) { - registergdth_ha_str *ha; registergdth_cmd_str *cmd_ptr; registergdt6m_dpram_str __iomem *dp6m_ptr; registergdt6c_dpram_str __iomem *dp6c_ptr;
@@ -1360,9 +1347,8 @@ static void gdth_copy_command(int hanum)gdt2_dpram_str __iomem *dp2_ptr;ushort cp_count,dp_offset,cmd_no; -TRACE (("gdth_copy_command() hanum %d\n" ,hanum)); +TRACE (("gdth_copy_command() hanum %d\n" , ha->hanum)); - ha =HADATA (gdth_ctr_tab[hanum]); cp_count = ha->cmd_len; dp_offset= ha->cmd_offs_dpmem; cmd_no = ha->cmd_cnt;
@@ -1411,12 +1397,9 @@ static void gdth_copy_command(int hanum) } -static void gdth_release_event (int hanum) +static void gdth_release_event (gdth_ha_str *ha) { - registergdth_ha_str *ha; - -TRACE (("gdth_release_event() hanum %d\n" ,hanum)); - ha =HADATA (gdth_ctr_tab[hanum]); +TRACE (("gdth_release_event() hanum %d\n" , ha->hanum));#ifdef GDTH_STATISTICS {
@@ -1450,46 +1433,41 @@ static void gdth_release_event(int hanum) } } - -static int gdth_wait (int hanum,int index,ulong32 time) +static int gdth_wait (gdth_ha_str *ha,int index,ulong32 time) { -gdth_ha_str *ha;int answer_found = FALSE; -TRACE (("gdth_wait() hanum %d index %d time %d\n" ,hanum,index,time)); +TRACE (("gdth_wait() hanum %d index %d time %d\n" , ha->hanum, index, time)); - ha =HADATA (gdth_ctr_tab[hanum]);if (index ==0 )return 1 ;/* no wait required */ gdth_from_wait = TRUE;do {gdth_interrupt ((int )ha->irq,ha); -if (wait_hanum==hanum && wait_index==index) { +if (wait_hanum==ha->hanum && wait_index==index) { answer_found = TRUE;break ; }gdth_delay (1 ); }while (--time); gdth_from_wait = FALSE; - -while (gdth_test_busy (hanum)) + +while (gdth_test_busy (ha))gdth_delay (0 );return (answer_found); } -static int gdth_internal_cmd (int hanum,unchar service,ushort opcode,ulong32 p1, -ulong64 p2,ulong64 p3) +static int gdth_internal_cmd (gdth_ha_str *ha,unchar service,ushort opcode, +ulong32 p1,ulong64 p2,ulong64 p3) { - registergdth_ha_str *ha; registergdth_cmd_str *cmd_ptr;int retries,index;TRACE2 (("gdth_internal_cmd() service %d opcode %d\n" ,service,opcode)); - ha =HADATA (gdth_ctr_tab[hanum]); cmd_ptr = ha->pccb;memset ((char *)cmd_ptr,0 ,sizeof (gdth_cmd_str));
@@ -1497,11 +1475,11 @@ static int gdth_internal_cmd(int hanum,unchar service,ushort opcode,ulong32 p1,for (retries =INIT_RETRIES ;;) { cmd_ptr->Service = service; cmd_ptr->RequestBuffer =INTERNAL_CMND ; -if (!(index=gdth_get_cmd_index (hanum))) { +if (!(index=gdth_get_cmd_index (ha))) {TRACE (("GDT: No free command index found\n" ));return 0 ; } -gdth_set_sema0 (hanum); +gdth_set_sema0 (ha); cmd_ptr->OpCode = opcode; cmd_ptr->BoardNode =LOCALBOARD ;if (service ==CACHESERVICE ) {
@@ -1541,10 +1519,10 @@ static int gdth_internal_cmd(int hanum,unchar service,ushort opcode,ulong32 p1, ha->cmd_len =sizeof (gdth_cmd_str); ha->cmd_offs_dpmem =0 ; ha->cmd_cnt =0 ; -gdth_copy_command (hanum); -gdth_release_event (hanum); +gdth_copy_command (ha); +gdth_release_event (ha);gdth_delay (20 ); -if (!gdth_wait (hanum,index,INIT_TIMEOUT )) { +if (!gdth_wait (ha, index,INIT_TIMEOUT )) {printk ("GDT: Initialization error (timeout service %d)\n" ,service);return 0 ; }
@@ -1559,9 +1537,8 @@ static int gdth_internal_cmd(int hanum,unchar service,ushort opcode,ulong32 p1,/* search for devices */ -static int __init gdth_search_drives (int hanum) +static int __init gdth_search_drives (gdth_ha_str *ha) { - registergdth_ha_str *ha;ushort cdev_cnt, i;int ok;ulong32 bus_no, drv_cnt, drv_no, j;
@@ -1581,22 +1558,21 @@ static int __init gdth_search_drives(int hanum)ulong flags;#endif -TRACE (("gdth_search_drives() hanum %d\n" ,hanum)); - ha =HADATA (gdth_ctr_tab[hanum]); +TRACE (("gdth_search_drives() hanum %d\n" , ha->hanum)); ok =0 ;/* initialize controller services, at first: screen service */ ha->screen_feat =0 ;if (!force_dma32) { - ok =gdth_internal_cmd (hanum,SCREENSERVICE ,GDT_X_INIT_SCR ,0 ,0 ,0 ); + ok =gdth_internal_cmd (ha,SCREENSERVICE ,GDT_X_INIT_SCR ,0 ,0 ,0 );if (ok) ha->screen_feat =GDT_64BIT ; }if (force_dma32 || (!ok && ha->status == (ushort )S_NOFUNC )) - ok =gdth_internal_cmd (hanum,SCREENSERVICE ,GDT_INIT ,0 ,0 ,0 ); + ok =gdth_internal_cmd (ha,SCREENSERVICE ,GDT_INIT ,0 ,0 ,0 );if (!ok) {printk ("GDT-HA %d: Initialization error screen service (code %d)\n" , - hanum, ha->status); + ha->hanum, ha->status);return 0 ; }TRACE2 (("gdth_search_drives(): SCREENSERVICE initialized\n" ));
@@ -1620,25 +1596,26 @@ static int __init gdth_search_drives(int hanum)TRACE2 (("gdth_search_drives(): RTC: %x/%x/%x\n" ,*(ulong32 *)&rtc[0 ], *(ulong32 *)&rtc[4 ], *(ulong32 *)&rtc[8 ]));/* 3. send to controller firmware */ -gdth_internal_cmd (hanum,SCREENSERVICE ,GDT_REALTIME , *(ulong32 *)&rtc[0 ], +gdth_internal_cmd (ha,SCREENSERVICE ,GDT_REALTIME , *(ulong32 *)&rtc[0 ], *(ulong32 *)&rtc[4 ], *(ulong32 *)&rtc[8 ]);#endif /* unfreeze all IOs */ -gdth_internal_cmd (hanum,CACHESERVICE ,GDT_UNFREEZE_IO ,0 ,0 ,0 ); +gdth_internal_cmd (ha,CACHESERVICE ,GDT_UNFREEZE_IO ,0 ,0 ,0 );/* initialize cache service */ ha->cache_feat =0 ;if (!force_dma32) { - ok =gdth_internal_cmd (hanum,CACHESERVICE ,GDT_X_INIT_HOST ,LINUX_OS ,0 ,0 ); + ok =gdth_internal_cmd (ha,CACHESERVICE ,GDT_X_INIT_HOST ,LINUX_OS , +0 ,0 );if (ok) ha->cache_feat =GDT_64BIT ; }if (force_dma32 || (!ok && ha->status == (ushort )S_NOFUNC )) - ok =gdth_internal_cmd (hanum,CACHESERVICE ,GDT_INIT ,LINUX_OS ,0 ,0 ); + ok =gdth_internal_cmd (ha,CACHESERVICE ,GDT_INIT ,LINUX_OS ,0 ,0 );if (!ok) {printk ("GDT-HA %d: Initialization error cache service (code %d)\n" , - hanum, ha->status); + ha->hanum, ha->status);return 0 ; }TRACE2 (("gdth_search_drives(): CACHESERVICE initialized\n" ));
@@ -1667,9 +1644,9 @@ static int __init gdth_search_drives(int hanum) pmod->cmd_buff_size =0 ; pmod->reserved1 =0 ; pmod->reserved2 =0 ; -if (gdth_internal_cmd (hanum,CACHESERVICE ,GDT_IOCTL ,SET_PERF_MODES , +if (gdth_internal_cmd (ha,CACHESERVICE ,GDT_IOCTL ,SET_PERF_MODES ,INVALID_CHANNEL ,sizeof (gdth_perf_modes))) { -printk ("GDT-HA %d: Interrupt coalescing activated\n" , hanum); +printk ("GDT-HA %d: Interrupt coalescing activated\n" , ha->hanum); } }#endif
@@ -1681,7 +1658,7 @@ static int __init gdth_search_drives(int hanum) iocr->hdr.first_chan =0 ; iocr->hdr.last_chan =MAXBUS -1 ; iocr->hdr.list_offset =GDTOFFSOF (gdth_raw_iochan_str, list[0 ]); -if (gdth_internal_cmd (hanum,CACHESERVICE ,GDT_IOCTL ,IOCHAN_RAW_DESC , +if (gdth_internal_cmd (ha,CACHESERVICE ,GDT_IOCTL ,IOCHAN_RAW_DESC ,INVALID_CHANNEL ,sizeof (gdth_raw_iochan_str))) {TRACE2 (("IOCHAN_RAW_DESC supported!\n" )); ha->bus_cnt = iocr->hdr.chan_count;
@@ -1696,13 +1673,13 @@ static int __init gdth_search_drives(int hanum) chn = (gdth_getch_str *)ha->pscratch;for (bus_no =0 ; bus_no <MAXBUS ; ++bus_no) { chn->channel_no = bus_no; -if (!gdth_internal_cmd (hanum,CACHESERVICE ,GDT_IOCTL , +if (!gdth_internal_cmd (ha,CACHESERVICE ,GDT_IOCTL ,SCSI_CHAN_CNT |L_CTRL_PATTERN ,IO_CHANNEL |INVALID_CHANNEL ,sizeof (gdth_getch_str))) {if (bus_no ==0 ) {printk ("GDT-HA %d: Error detecting channel count (0x%x)\n" , - hanum, ha->status); + ha->hanum, ha->status);return 0 ; }break ;
@@ -1717,10 +1694,10 @@ static int __init gdth_search_drives(int hanum)TRACE2 (("gdth_search_drives() %d channels\n" ,ha->bus_cnt));/* read cache configuration */ -if (!gdth_internal_cmd (hanum,CACHESERVICE ,GDT_IOCTL ,CACHE_INFO , +if (!gdth_internal_cmd (ha,CACHESERVICE ,GDT_IOCTL ,CACHE_INFO ,INVALID_CHANNEL ,sizeof (gdth_cinfo_str))) {printk ("GDT-HA %d: Initialization error cache service (code %d)\n" , - hanum, ha->status); + ha->hanum, ha->status);return 0 ; } ha->cpar = ((gdth_cinfo_str *)ha->pscratch)->cpar;
@@ -1730,11 +1707,11 @@ static int __init gdth_search_drives(int hanum)/* read board info and features */ ha->more_proc = FALSE; -if (gdth_internal_cmd (hanum,CACHESERVICE ,GDT_IOCTL ,BOARD_INFO , +if (gdth_internal_cmd (ha,CACHESERVICE ,GDT_IOCTL ,BOARD_INFO ,INVALID_CHANNEL ,sizeof (gdth_binfo_str))) {memcpy (&ha->binfo, (gdth_binfo_str *)ha->pscratch,sizeof (gdth_binfo_str)); -if (gdth_internal_cmd (hanum,CACHESERVICE ,GDT_IOCTL ,BOARD_FEATURES , +if (gdth_internal_cmd (ha,CACHESERVICE ,GDT_IOCTL ,BOARD_FEATURES ,INVALID_CHANNEL ,sizeof (gdth_bfeat_str))) {TRACE2 (("BOARD_INFO/BOARD_FEATURES supported\n" )); ha->bfeat = *(gdth_bfeat_str *)ha->pscratch;
@@ -1742,7 +1719,7 @@ static int __init gdth_search_drives(int hanum) } }else {TRACE2 (("BOARD_INFO requires firmware >= 1.10/2.08\n" )); -strcpy (ha->binfo.type_string,gdth_ctr_name (hanum)); +strcpy (ha->binfo.type_string,gdth_ctr_name (ha)); }TRACE2 (("Controller name: %s\n" ,ha->binfo.type_string));
@@ -1755,7 +1732,7 @@ static int __init gdth_search_drives(int hanum) ioc->hdr.first_chan =0 ; ioc->hdr.last_chan =MAXBUS -1 ; ioc->hdr.list_offset =GDTOFFSOF (gdth_iochan_str, list[0 ]); -if (gdth_internal_cmd (hanum,CACHESERVICE ,GDT_IOCTL ,IOCHAN_DESC , +if (gdth_internal_cmd (ha,CACHESERVICE ,GDT_IOCTL ,IOCHAN_DESC ,INVALID_CHANNEL ,sizeof (gdth_iochan_str))) {for (bus_no =0 ; bus_no < ha->bus_cnt; ++bus_no) { ha->raw[bus_no].address = ioc->list[bus_no].address;
@@ -1770,7 +1747,7 @@ static int __init gdth_search_drives(int hanum)for (bus_no =0 ; bus_no < ha->bus_cnt; ++bus_no) { chn = (gdth_getch_str *)ha->pscratch; chn->channel_no = ha->raw[bus_no].local_no; -if (gdth_internal_cmd (hanum,CACHESERVICE ,GDT_IOCTL , +if (gdth_internal_cmd (ha,CACHESERVICE ,GDT_IOCTL ,SCSI_CHAN_CNT |L_CTRL_PATTERN , ha->raw[bus_no].address |INVALID_CHANNEL ,sizeof (gdth_getch_str))) {
@@ -1782,7 +1759,7 @@ static int __init gdth_search_drives(int hanum) drl = (gdth_drlist_str *)ha->pscratch; drl->sc_no = ha->raw[bus_no].local_no; drl->sc_cnt = ha->raw[bus_no].pdev_cnt; -if (gdth_internal_cmd (hanum,CACHESERVICE ,GDT_IOCTL , +if (gdth_internal_cmd (ha,CACHESERVICE ,GDT_IOCTL ,SCSI_DR_LIST |L_CTRL_PATTERN , ha->raw[bus_no].address |INVALID_CHANNEL ,sizeof (gdth_drlist_str))) {
@@ -1795,10 +1772,10 @@ static int __init gdth_search_drives(int hanum) }/* logical drives */ -if (gdth_internal_cmd (hanum,CACHESERVICE ,GDT_IOCTL ,CACHE_DRV_CNT , +if (gdth_internal_cmd (ha,CACHESERVICE ,GDT_IOCTL ,CACHE_DRV_CNT ,INVALID_CHANNEL ,sizeof (ulong32))) { drv_cnt = *(ulong32 *)ha->pscratch; -if (gdth_internal_cmd (hanum,CACHESERVICE ,GDT_IOCTL ,CACHE_DRV_LIST , +if (gdth_internal_cmd (ha,CACHESERVICE ,GDT_IOCTL ,CACHE_DRV_LIST ,INVALID_CHANNEL ,drv_cnt *sizeof (ulong32))) {for (j =0 ; j < drv_cnt; ++j) { drv_no = ((ulong32 *)ha->pscratch)[j];
@@ -1812,7 +1789,7 @@ static int __init gdth_search_drives(int hanum) alst->entries_avail =MAX_LDRIVES ; alst->first_entry =0 ; alst->list_offset =GDTOFFSOF (gdth_arcdl_str, list[0 ]); -if (gdth_internal_cmd (hanum,CACHESERVICE ,GDT_IOCTL , +if (gdth_internal_cmd (ha,CACHESERVICE ,GDT_IOCTL ,ARRAY_DRV_LIST2 |LA_CTRL_PATTERN ,INVALID_CHANNEL ,sizeof (gdth_arcdl_str) + (alst->entries_avail-1 ) *sizeof (gdth_alist_str))) {
@@ -1823,7 +1800,7 @@ static int __init gdth_search_drives(int hanum) ha->hdr[j].is_hotfix = alst->list[j].is_hotfix; ha->hdr[j].master_no = alst->list[j].cd_handle; } - }else if (gdth_internal_cmd (hanum,CACHESERVICE ,GDT_IOCTL , + }else if (gdth_internal_cmd (ha,CACHESERVICE ,GDT_IOCTL ,ARRAY_DRV_LIST |LA_CTRL_PATTERN ,0 ,35 *sizeof (gdth_alist_str))) {for (j =0 ; j <35 ; ++j) {
@@ -1841,24 +1818,24 @@ static int __init gdth_search_drives(int hanum)/* initialize raw service */ ha->raw_feat =0 ;if (!force_dma32) { - ok =gdth_internal_cmd (hanum,SCSIRAWSERVICE ,GDT_X_INIT_RAW ,0 ,0 ,0 ); + ok =gdth_internal_cmd (ha,SCSIRAWSERVICE ,GDT_X_INIT_RAW ,0 ,0 ,0 );if (ok) ha->raw_feat =GDT_64BIT ; }if (force_dma32 || (!ok && ha->status == (ushort )S_NOFUNC )) - ok =gdth_internal_cmd (hanum,SCSIRAWSERVICE ,GDT_INIT ,0 ,0 ,0 ); + ok =gdth_internal_cmd (ha,SCSIRAWSERVICE ,GDT_INIT ,0 ,0 ,0 );if (!ok) {printk ("GDT-HA %d: Initialization error raw service (code %d)\n" , - hanum, ha->status); + ha->hanum, ha->status);return 0 ; }TRACE2 (("gdth_search_drives(): RAWSERVICE initialized\n" ));/* set/get features raw service (scatter/gather) */ -if (gdth_internal_cmd (hanum,SCSIRAWSERVICE ,GDT_SET_FEAT ,SCATTER_GATHER , -0 ,0 )) { +if (gdth_internal_cmd (ha,SCSIRAWSERVICE ,GDT_SET_FEAT ,SCATTER_GATHER , +0 ,0 )) {TRACE2 (("gdth_search_drives(): set features RAWSERVICE OK\n" )); -if (gdth_internal_cmd (hanum,SCSIRAWSERVICE ,GDT_GET_FEAT ,0 ,0 ,0 )) { +if (gdth_internal_cmd (ha,SCSIRAWSERVICE ,GDT_GET_FEAT ,0 ,0 ,0 )) {TRACE2 (("gdth_search_dr(): get feat RAWSERVICE %d\n" , ha->info)); ha->raw_feat |= (ushort )ha->info;
@@ -1866,10 +1843,10 @@ static int __init gdth_search_drives(int hanum) }/* set/get features cache service (equal to raw service) */ -if (gdth_internal_cmd (hanum,CACHESERVICE ,GDT_SET_FEAT ,0 , +if (gdth_internal_cmd (ha,CACHESERVICE ,GDT_SET_FEAT ,0 ,SCATTER_GATHER ,0 )) {TRACE2 (("gdth_search_drives(): set features CACHESERVICE OK\n" )); -if (gdth_internal_cmd (hanum,CACHESERVICE ,GDT_GET_FEAT ,0 ,0 ,0 )) { +if (gdth_internal_cmd (ha,CACHESERVICE ,GDT_GET_FEAT ,0 ,0 ,0 )) {TRACE2 (("gdth_search_dr(): get feat CACHESERV. %d\n" , ha->info)); ha->cache_feat |= (ushort )ha->info;
@@ -1878,22 +1855,22 @@ static int __init gdth_search_drives(int hanum)/* reserve drives for raw service */ if (reserve_mode !=0 ) { -gdth_internal_cmd (hanum,SCSIRAWSERVICE ,GDT_RESERVE_ALL , +gdth_internal_cmd (ha,SCSIRAWSERVICE ,GDT_RESERVE_ALL , reserve_mode ==1 ?1 :3 ,0 ,0 );TRACE2 (("gdth_search_drives(): RESERVE_ALL code %d\n" , ha->status)); }for (i =0 ; i <MAX_RES_ARGS ; i +=4 ) { -if (reserve_list[i] == hanum && reserve_list[i+1 ] < ha->bus_cnt && +if (reserve_list[i] == ha->hanum && reserve_list[i+1 ] < ha->bus_cnt && reserve_list[i+2 ] < ha->tid_cnt && reserve_list[i+3 ] <MAXLUN ) {TRACE2 (("gdth_search_drives(): reserve ha %d bus %d id %d lun %d\n" , reserve_list[i], reserve_list[i+1 ], reserve_list[i+2 ], reserve_list[i+3 ])); -if (!gdth_internal_cmd (hanum,SCSIRAWSERVICE ,GDT_RESERVE ,0 , +if (!gdth_internal_cmd (ha,SCSIRAWSERVICE ,GDT_RESERVE ,0 , reserve_list[i+1 ], reserve_list[i+2 ] | (reserve_list[i+3 ] <<8 ))) {printk ("GDT-HA %d: Error raw service (RESERVE, code %d)\n" , - hanum, ha->status); + ha->hanum, ha->status); } } }
@@ -1902,12 +1879,12 @@ static int __init gdth_search_drives(int hanum) oemstr = (gdth_oem_str_ioctl *)ha->pscratch; oemstr->params.ctl_version =0x01 ; oemstr->params.buffer_size =sizeof (oemstr->text); -if (gdth_internal_cmd (hanum,CACHESERVICE ,GDT_IOCTL , +if (gdth_internal_cmd (ha,CACHESERVICE ,GDT_IOCTL ,CACHE_READ_OEM_STRING_RECORD ,INVALID_CHANNEL ,sizeof (gdth_oem_str_ioctl))) {TRACE2 (("gdth_search_drives(): CACHE_READ_OEM_STRING_RECORD OK\n" ));printk ("GDT-HA %d: Vendor: %s Name: %s\n" , - hanum,oemstr->text.oem_company_name,ha->binfo.type_string); + ha->hanum, oemstr->text.oem_company_name, ha->binfo.type_string);/* Save the Host Drive inquiry data */ strlcpy (ha->oem_name,oemstr->text.scsi_host_drive_inquiry_vendor_id,sizeof (ha->oem_name));
@@ -1915,7 +1892,7 @@ static int __init gdth_search_drives(int hanum)/* Old method, based on PCI ID */ TRACE2 (("gdth_search_drives(): CACHE_READ_OEM_STRING_RECORD failed\n" ));printk ("GDT-HA %d: Name: %s\n" , - hanum,ha->binfo.type_string); + ha->hanum, ha->binfo.type_string);if (ha->oem_id ==OEM_ID_INTEL )strlcpy (ha->oem_name,"Intel " ,sizeof (ha->oem_name));else
@@ -1924,24 +1901,22 @@ static int __init gdth_search_drives(int hanum)/* scanning for host drives */ for (i =0 ; i < cdev_cnt; ++i) -gdth_analyse_hdrive (hanum,i); +gdth_analyse_hdrive (ha, i);TRACE (("gdth_search_drives() OK\n" ));return 1 ; } -static int gdth_analyse_hdrive (int hanum,ushort hdrive) +static int gdth_analyse_hdrive (gdth_ha_str *ha,ushort hdrive) { - registergdth_ha_str *ha;ulong32 drv_cyls;int drv_hds, drv_secs; -TRACE (("gdth_analyse_hdrive() hanum %d drive %d\n" ,hanum,hdrive)); +TRACE (("gdth_analyse_hdrive() hanum %d drive %d\n" , ha->hanum, hdrive));if (hdrive >=MAX_HDRIVES )return 0 ; - ha =HADATA (gdth_ctr_tab[hanum]); -if (!gdth_internal_cmd (hanum,CACHESERVICE ,GDT_INFO ,hdrive,0 ,0 )) +if (!gdth_internal_cmd (ha,CACHESERVICE ,GDT_INFO , hdrive,0 ,0 ))return 0 ; ha->hdr[hdrive].present = TRUE; ha->hdr[hdrive].size = ha->info;
@@ -1961,7 +1936,7 @@ static int gdth_analyse_hdrive(int hanum,ushort hdrive) ha->hdr[hdrive].size = drv_cyls * drv_hds * drv_secs;if (ha->cache_feat &GDT_64BIT ) { -if (gdth_internal_cmd (hanum,CACHESERVICE ,GDT_X_INFO ,hdrive,0 ,0 ) +if (gdth_internal_cmd (ha,CACHESERVICE ,GDT_X_INFO , hdrive,0 ,0 ) && ha->info2 !=0 ) { ha->hdr[hdrive].size = ((ulong64 )ha->info2 <<32 ) | ha->info; }
@@ -1970,14 +1945,14 @@ static int gdth_analyse_hdrive(int hanum,ushort hdrive) hdrive,ha->hdr[hdrive].size,drv_hds,drv_secs));/* get informations about device */ -if (gdth_internal_cmd (hanum,CACHESERVICE ,GDT_DEVTYPE ,hdrive,0 ,0 )) { +if (gdth_internal_cmd (ha,CACHESERVICE ,GDT_DEVTYPE , hdrive,0 ,0 )) {TRACE2 (("gdth_search_dr() cache drive %d devtype %d\n" , hdrive,ha->info)); ha->hdr[hdrive].devtype = (ushort )ha->info; }/* cluster info */ -if (gdth_internal_cmd (hanum,CACHESERVICE ,GDT_CLUST_INFO ,hdrive,0 ,0 )) { +if (gdth_internal_cmd (ha,CACHESERVICE ,GDT_CLUST_INFO , hdrive,0 ,0 )) {TRACE2 (("gdth_search_dr() cache drive %d cluster info %d\n" , hdrive,ha->info));if (!shared_access)
@@ -1985,7 +1960,7 @@ static int gdth_analyse_hdrive(int hanum,ushort hdrive) }/* R/W attributes */ -if (gdth_internal_cmd (hanum,CACHESERVICE ,GDT_RW_ATTRIBS ,hdrive,0 ,0 )) { +if (gdth_internal_cmd (ha,CACHESERVICE ,GDT_RW_ATTRIBS , hdrive,0 ,0 )) {TRACE2 (("gdth_search_dr() cache drive %d r/w attrib. %d\n" , hdrive,ha->info)); ha->hdr[hdrive].rw_attribs = (unchar )ha->info;
@@ -1997,16 +1972,14 @@ static int gdth_analyse_hdrive(int hanum,ushort hdrive)/* command queueing/sending functions */ -static void gdth_putq (int hanum,Scsi_Cmnd *scp,unchar priority) +static void gdth_putq (gdth_ha_str *ha,Scsi_Cmnd *scp,unchar priority) { - registergdth_ha_str *ha; registerScsi_Cmnd *pscp; registerScsi_Cmnd *nscp;ulong flags;unchar b, t;TRACE (("gdth_putq() priority %d\n" ,priority)); - ha =HADATA (gdth_ctr_tab[hanum]);spin_lock_irqsave (&ha->smp_lock, flags);if (!IS_GDTH_INTERNAL_CMD (scp)) {
@@ -2017,7 +1990,7 @@ static void gdth_putq(int hanum,Scsi_Cmnd *scp,unchar priority)if ((b != ha->virt_bus && ha->raw[BUS_L2P (ha,b)].lock) || (b==ha->virt_bus && t<MAX_HDRIVES && ha->hdr[t].lock)) {TRACE2 (("gdth_putq(): locked IO ->update_timeout()\n" )); - scp->SCp.buffers_residual =gdth_update_timeout (hanum, scp,0 ); + scp->SCp.buffers_residual =gdth_update_timeout (scp,0 ); } } }
@@ -2049,9 +2022,8 @@ static void gdth_putq(int hanum,Scsi_Cmnd *scp,unchar priority)#endif } -static void gdth_next (int hanum) +static void gdth_next (gdth_ha_str *ha) { - registergdth_ha_str *ha; registerScsi_Cmnd *pscp; registerScsi_Cmnd *nscp;unchar b, t, l, firsttime;
@@ -2059,8 +2031,7 @@ static void gdth_next(int hanum)ulong flags =0 ;int cmd_index; -TRACE (("gdth_next() hanum %d\n" ,hanum)); - ha =HADATA (gdth_ctr_tab[hanum]); +TRACE (("gdth_next() hanum %d\n" , ha->hanum));if (!gdth_polling)spin_lock_irqsave (&ha->smp_lock, flags);
@@ -2085,13 +2056,13 @@ static void gdth_next(int hanum) b = t = l =0 ;if (firsttime) { -if (gdth_test_busy (hanum)) {/* controller busy ? */ -TRACE (("gdth_next() controller %d busy !\n" ,hanum)); +if (gdth_test_busy (ha)) {/* controller busy ? */ +TRACE (("gdth_next() controller %d busy !\n" , ha->hanum));if (!gdth_polling) {spin_unlock_irqrestore (&ha->smp_lock, flags);return ; } -while (gdth_test_busy (hanum)) +while (gdth_test_busy (ha))gdth_delay (1 ); } firsttime = FALSE;
@@ -2143,11 +2114,11 @@ static void gdth_next(int hanum)if (nscp->SCp.sent_command !=-1 ) {if ((nscp->SCp.phase &0xff ) ==CACHESERVICE ) { -if (!(cmd_index=gdth_fill_cache_cmd (hanum,nscp,t))) +if (!(cmd_index=gdth_fill_cache_cmd (ha, nscp, t))) this_cmd = FALSE; next_cmd = FALSE; }else if ((nscp->SCp.phase &0xff ) ==SCSIRAWSERVICE ) { -if (!(cmd_index=gdth_fill_raw_cmd (hanum,nscp,BUS_L2P (ha,b)))) +if (!(cmd_index=gdth_fill_raw_cmd (ha, nscp,BUS_L2P (ha, b)))) this_cmd = FALSE; next_cmd = FALSE; }else {
@@ -2161,12 +2132,12 @@ static void gdth_next(int hanum)gdth_scsi_done (nscp); } }else if (IS_GDTH_INTERNAL_CMD (nscp)) { -if (!(cmd_index=gdth_special_cmd (hanum,nscp))) +if (!(cmd_index=gdth_special_cmd (ha, nscp))) this_cmd = FALSE; next_cmd = FALSE; }else if (b != ha->virt_bus) {if (ha->raw[BUS_L2P (ha,b)].io_cnt[t] >=GDTH_MAX_RAW || - !(cmd_index=gdth_fill_raw_cmd (hanum,nscp,BUS_L2P (ha,b)))) + !(cmd_index=gdth_fill_raw_cmd (ha, nscp,BUS_L2P (ha, b)))) this_cmd = FALSE;else ha->raw[BUS_L2P (ha,b)].io_cnt[t]++;
@@ -2204,7 +2175,7 @@ static void gdth_next(int hanum) nscp->SCp.have_data_in++; elsegdth_scsi_done (nscp ); - }else if (gdth_internal_cache_cmd (hanum, nscp)) + }else if (gdth_internal_cache_cmd (ha, nscp))gdth_scsi_done (nscp);break ;
@@ -2224,7 +2195,7 @@ static void gdth_next(int hanum) nscp->cmnd[3 ] = (ha->hdr[t].devtype&1 ) ?1 :0 ;TRACE (("Prevent/allow r. %d rem. drive %d\n" , nscp->cmnd[4 ],nscp->cmnd[3 ])); -if (!(cmd_index=gdth_fill_cache_cmd (hanum,nscp,t))) +if (!(cmd_index=gdth_fill_cache_cmd (ha, nscp, t))) this_cmd = FALSE; }break ;
@@ -2233,7 +2204,7 @@ static void gdth_next(int hanum)case RELEASE :TRACE2 (("cache cmd %s\n" ,nscp->cmnd[0 ] ==RESERVE ?"RESERVE" :"RELEASE" )); -if (!(cmd_index=gdth_fill_cache_cmd (hanum,nscp,t))) +if (!(cmd_index=gdth_fill_cache_cmd (ha, nscp, t))) this_cmd = FALSE;break ;
@@ -2256,7 +2227,7 @@ static void gdth_next(int hanum) nscp->SCp.have_data_in++; elsegdth_scsi_done (nscp ); - }else if (!(cmd_index=gdth_fill_cache_cmd (hanum, nscp, t))) + }else if (!(cmd_index=gdth_fill_cache_cmd (ha, nscp, t))) this_cmd = FALSE;break ;
@@ -2265,7 +2236,7 @@ static void gdth_next(int hanum) nscp->cmnd[1 ],nscp->cmnd[2 ],nscp->cmnd[3 ], nscp->cmnd[4],nscp->cmnd[5]));printk ("GDT-HA %d: Unknown SCSI command 0x%x to cache service !\n" , - hanum, nscp->cmnd[0 ]); + ha->hanum, nscp->cmnd[0 ]); nscp->result =DID_ABORT <<16 ;if (!nscp->SCp.have_data_in) nscp->SCp.have_data_in++;
@@ -2286,30 +2257,28 @@ static void gdth_next(int hanum) }if (ha->cmd_cnt >0 ) { -gdth_release_event (hanum); +gdth_release_event (ha); }if (!gdth_polling)spin_unlock_irqrestore (&ha->smp_lock, flags);if (gdth_polling && ha->cmd_cnt >0 ) { -if (!gdth_wait (hanum,cmd_index,POLL_TIMEOUT )) +if (!gdth_wait (ha, cmd_index,POLL_TIMEOUT ))printk ("GDT-HA %d: Command %d timed out !\n" , - hanum,cmd_index); + ha->hanum, cmd_index); } } -static void gdth_copy_internal_data (int hanum,Scsi_Cmnd *scp, +static void gdth_copy_internal_data (gdth_ha_str *ha,Scsi_Cmnd *scp,char *buffer,ushort count) {ushort cpcount,i;ushort cpsum,cpnow;struct scatterlist *sl; -gdth_ha_str *ha;char *address; cpcount = count<=(ushort )scp->request_bufflen ? count:(ushort )scp->request_bufflen; - ha =HADATA (gdth_ctr_tab[hanum]);if (scp->use_sg) { sl = (struct scatterlist *)scp->request_buffer;
@@ -2323,7 +2292,7 @@ static void gdth_copy_internal_data(int hanum,Scsi_Cmnd *scp, cpsum += cpnow;if (!sl->page) {printk ("GDT-HA %d: invalid sc/gt element in gdth_copy_internal_data()\n" , - hanum); + ha->hanum);return ; }local_irq_save (flags);
@@ -2342,16 +2311,14 @@ static void gdth_copy_internal_data(int hanum,Scsi_Cmnd *scp, } } -static int gdth_internal_cache_cmd (int hanum,Scsi_Cmnd *scp) +static int gdth_internal_cache_cmd (gdth_ha_str *ha,Scsi_Cmnd *scp) { - registergdth_ha_str *ha;unchar t;gdth_inq_data inq;gdth_rdcap_data rdc;gdth_sense_data sd;gdth_modep_data mpd; - ha =HADATA (gdth_ctr_tab[hanum]); t = scp->device->id;TRACE (("gdth_internal_cache_cmd() cmd 0x%x hdrive %d\n" , scp->cmnd[0 ],t));
@@ -2382,7 +2349,7 @@ static int gdth_internal_cache_cmd(int hanum,Scsi_Cmnd *scp)strcpy (inq.vendor,ha->oem_name);sprintf (inq.product,"Host Drive #%02d" ,t);strcpy (inq.revision," " ); -gdth_copy_internal_data (hanum,scp,(char *)&inq,sizeof (gdth_inq_data)); +gdth_copy_internal_data (ha, scp, (char *)&inq,sizeof (gdth_inq_data));break ;case REQUEST_SENSE :
@@ -2392,7 +2359,7 @@ static int gdth_internal_cache_cmd(int hanum,Scsi_Cmnd *scp) sd.key =NO_SENSE ; sd.info =0 ; sd.add_length=0 ; -gdth_copy_internal_data (hanum,scp,(char *)&sd,sizeof (gdth_sense_data)); +gdth_copy_internal_data (ha, scp, (char *)&sd,sizeof (gdth_sense_data));break ;case MODE_SENSE :
@@ -2404,7 +2371,7 @@ static int gdth_internal_cache_cmd(int hanum,Scsi_Cmnd *scp) mpd.bd.block_length[0 ] = (SECTOR_SIZE &0x00ff0000 ) >>16 ; mpd.bd.block_length[1 ] = (SECTOR_SIZE &0x0000ff00 ) >>8 ; mpd.bd.block_length[2 ] = (SECTOR_SIZE &0x000000ff ); -gdth_copy_internal_data (hanum,scp,(char *)&mpd,sizeof (gdth_modep_data)); +gdth_copy_internal_data (ha, scp, (char *)&mpd,sizeof (gdth_modep_data));break ;case READ_CAPACITY :
@@ -2414,7 +2381,7 @@ static int gdth_internal_cache_cmd(int hanum,Scsi_Cmnd *scp)else rdc.last_block_no =cpu_to_be32 (ha->hdr[t].size-1 ); rdc.block_length =cpu_to_be32 (SECTOR_SIZE ); -gdth_copy_internal_data (hanum,scp,(char *)&rdc,sizeof (gdth_rdcap_data)); +gdth_copy_internal_data (ha, scp, (char *)&rdc,sizeof (gdth_rdcap_data));break ;case SERVICE_ACTION_IN :
@@ -2425,7 +2392,8 @@ static int gdth_internal_cache_cmd(int hanum,Scsi_Cmnd *scp)TRACE2 (("Read capacity (16) hdrive %d\n" ,t)); rdc16.last_block_no =cpu_to_be64 (ha->hdr[t].size-1 ); rdc16.block_length =cpu_to_be32 (SECTOR_SIZE ); -gdth_copy_internal_data (hanum,scp,(char *)&rdc16,sizeof (gdth_rdcap16_data)); +gdth_copy_internal_data (ha, scp, (char *)&rdc16, +sizeof (gdth_rdcap16_data)); }else { scp->result =DID_ABORT <<16 ; }
@@ -2443,10 +2411,9 @@ static int gdth_internal_cache_cmd(int hanum,Scsi_Cmnd *scp)return 0 ; } - -static int gdth_fill_cache_cmd (int hanum,Scsi_Cmnd *scp,ushort hdrive) + +static int gdth_fill_cache_cmd (gdth_ha_str *ha,Scsi_Cmnd *scp,ushort hdrive) { - registergdth_ha_str *ha; registergdth_cmd_str *cmdp;struct scatterlist *sl;ulong32 cnt, blockcnt;
@@ -2456,7 +2423,6 @@ static int gdth_fill_cache_cmd(int hanum,Scsi_Cmnd *scp,ushort hdrive)struct page *page;ulong offset; - ha =HADATA (gdth_ctr_tab[hanum]); cmdp = ha->pccb;TRACE (("gdth_fill_cache_cmd() cmd 0x%x cmdsize %d hdrive %d\n" , scp->cmnd[0 ],scp->cmd_len,hdrive));
@@ -2472,13 +2438,13 @@ static int gdth_fill_cache_cmd(int hanum,Scsi_Cmnd *scp,ushort hdrive) cmdp->Service =CACHESERVICE ; cmdp->RequestBuffer = scp;/* search free command index */ -if (!(cmd_index=gdth_get_cmd_index (hanum))) { +if (!(cmd_index=gdth_get_cmd_index (ha))) {TRACE (("GDT: No free command index found\n" ));return 0 ; }/* if it's the first command, set command semaphore */ if (ha->cmd_cnt ==0 ) -gdth_set_sema0 (hanum); +gdth_set_sema0 (ha);/* fill command */ read_write =0 ;
@@ -2650,13 +2616,12 @@ static int gdth_fill_cache_cmd(int hanum,Scsi_Cmnd *scp,ushort hdrive) }/* copy command */ -gdth_copy_command (hanum); +gdth_copy_command (ha);return cmd_index; } -static int gdth_fill_raw_cmd (int hanum,Scsi_Cmnd *scp,unchar b) +static int gdth_fill_raw_cmd (gdth_ha_str *ha,Scsi_Cmnd *scp,unchar b) { - registergdth_ha_str *ha; registergdth_cmd_str *cmdp;struct scatterlist *sl;ushort i;
@@ -2666,7 +2631,6 @@ static int gdth_fill_raw_cmd(int hanum,Scsi_Cmnd *scp,unchar b)struct page *page;ulong offset; - ha =HADATA (gdth_ctr_tab[hanum]); t = scp->device->id; l = scp->device->lun; cmdp = ha->pccb;
@@ -2681,13 +2645,13 @@ static int gdth_fill_raw_cmd(int hanum,Scsi_Cmnd *scp,unchar b) cmdp->Service =SCSIRAWSERVICE ; cmdp->RequestBuffer = scp;/* search free command index */ -if (!(cmd_index=gdth_get_cmd_index (hanum))) { +if (!(cmd_index=gdth_get_cmd_index (ha))) {TRACE (("GDT: No free command index found\n" ));return 0 ; }/* if it's the first command, set command semaphore */ if (ha->cmd_cnt ==0 ) -gdth_set_sema0 (hanum); +gdth_set_sema0 (ha);/* fill command */ if (scp->SCp.sent_command !=-1 ) {
@@ -2855,17 +2819,15 @@ static int gdth_fill_raw_cmd(int hanum,Scsi_Cmnd *scp,unchar b) }/* copy command */ -gdth_copy_command (hanum); +gdth_copy_command (ha);return cmd_index; } -static int gdth_special_cmd (int hanum,Scsi_Cmnd *scp) +static int gdth_special_cmd (gdth_ha_str *ha,Scsi_Cmnd *scp) { - registergdth_ha_str *ha; registergdth_cmd_str *cmdp;int cmd_index; - ha =HADATA (gdth_ctr_tab[hanum]); cmdp= ha->pccb;TRACE2 (("gdth_special_cmd(): " ));
@@ -2876,14 +2838,14 @@ static int gdth_special_cmd(int hanum,Scsi_Cmnd *scp) cmdp->RequestBuffer = scp;/* search free command index */ -if (!(cmd_index=gdth_get_cmd_index (hanum))) { +if (!(cmd_index=gdth_get_cmd_index (ha))) {TRACE (("GDT: No free command index found\n" ));return 0 ; }/* if it's the first command, set command semaphore */ if (ha->cmd_cnt ==0 ) -gdth_set_sema0 (hanum); +gdth_set_sema0 (ha);/* evaluate command size, check space */ if (cmdp->OpCode ==GDT_IOCTL ) {
@@ -2921,7 +2883,7 @@ static int gdth_special_cmd(int hanum,Scsi_Cmnd *scp) }/* copy command */ -gdth_copy_command (hanum); +gdth_copy_command (ha);return cmd_index; }
@@ -3087,7 +3049,7 @@ static irqreturn_t gdth_interrupt(int irq,void *dev_id)spin_unlock_irqrestore (&ha2->smp_lock, flags);return IRQ_HANDLED ; } - ha =HADATA (gdth_ctr_tab[hanum]); + ha =shost_priv (gdth_ctr_tab[hanum]);#ifdef GDTH_STATISTICS ++act_ints;
@@ -3233,10 +3195,10 @@ static irqreturn_t gdth_interrupt(int irq,void *dev_id)if (IStatus ==ASYNCINDEX ) {TRACE2 (("gdth_interrupt() async. event\n" )); -gdth_async_event (hanum); +gdth_async_event (ha);if (!gdth_polling)spin_unlock_irqrestore (&ha2->smp_lock, flags); -gdth_next (hanum); +gdth_next (ha);return IRQ_HANDLED ; }
@@ -3270,11 +3232,11 @@ static irqreturn_t gdth_interrupt(int irq,void *dev_id) }TRACE (("gdth_interrupt() sync. status\n" )); - rval =gdth_sync_event (hanum,Service,IStatus,scp); + rval =gdth_sync_event (ha,Service,IStatus,scp);if (!gdth_polling)spin_unlock_irqrestore (&ha2->smp_lock, flags);if (rval ==2 ) { -gdth_putq (hanum,scp,scp->SCp.this_residual); +gdth_putq (ha, scp,scp->SCp.this_residual); }else if (rval ==1 ) {gdth_scsi_done (scp); }
@@ -3304,18 +3266,17 @@ static irqreturn_t gdth_interrupt(int irq,void *dev_id) }#endif -gdth_next (hanum); +gdth_next (ha);return IRQ_HANDLED ; } -static int gdth_sync_event (int hanum,int service,unchar index,Scsi_Cmnd *scp) +static int gdth_sync_event (gdth_ha_str *ha,int service,unchar index, +Scsi_Cmnd *scp) { - registergdth_ha_str *ha;gdth_msg_str *msg;gdth_cmd_str *cmdp;unchar b, t; - ha =HADATA (gdth_ctr_tab[hanum]); cmdp = ha->pccb;TRACE (("gdth_sync_event() serv %d status %d\n" , service,ha->status));
@@ -3333,12 +3294,12 @@ static int gdth_sync_event(int hanum,int service,unchar index,Scsi_Cmnd *scp) }if (msg->msg_ext && !msg->msg_answer) { -while (gdth_test_busy (hanum)) +while (gdth_test_busy (ha))gdth_delay (0 ); cmdp->Service =SCREENSERVICE ; cmdp->RequestBuffer =SCREEN_CMND ; -gdth_get_cmd_index (hanum); -gdth_set_sema0 (hanum); +gdth_get_cmd_index (ha); +gdth_set_sema0 (ha); cmdp->OpCode =GDT_READ ; cmdp->BoardNode =LOCALBOARD ; cmdp->u.screen.reserved =0 ;
@@ -3348,8 +3309,8 @@ static int gdth_sync_event(int hanum,int service,unchar index,Scsi_Cmnd *scp) ha->cmd_len =GDTOFFSOF (gdth_cmd_str,u.screen.su.msg.msg_addr) +sizeof (ulong64); ha->cmd_cnt =0 ; -gdth_copy_command (hanum); -gdth_release_event (hanum); +gdth_copy_command (ha); +gdth_release_event (ha);return 0 ; }
@@ -3367,12 +3328,12 @@ static int gdth_sync_event(int hanum,int service,unchar index,Scsi_Cmnd *scp) } msg->msg_ext =0 ; msg->msg_answer =0 ; -while (gdth_test_busy (hanum)) +while (gdth_test_busy (ha))gdth_delay (0 ); cmdp->Service =SCREENSERVICE ; cmdp->RequestBuffer =SCREEN_CMND ; -gdth_get_cmd_index (hanum); -gdth_set_sema0 (hanum); +gdth_get_cmd_index (ha); +gdth_set_sema0 (ha); cmdp->OpCode =GDT_WRITE ; cmdp->BoardNode =LOCALBOARD ; cmdp->u.screen.reserved =0 ;
@@ -3382,8 +3343,8 @@ static int gdth_sync_event(int hanum,int service,unchar index,Scsi_Cmnd *scp) ha->cmd_len =GDTOFFSOF (gdth_cmd_str,u.screen.su.msg.msg_addr) +sizeof (ulong64); ha->cmd_cnt =0 ; -gdth_copy_command (hanum); -gdth_release_event (hanum); +gdth_copy_command (ha); +gdth_release_event (ha);return 0 ; }printk ("\n" );
@@ -3496,7 +3457,7 @@ static int gdth_sync_event(int hanum,int service,unchar index,Scsi_Cmnd *scp) }if (!IS_GDTH_INTERNAL_CMD (scp)) { ha->dvr.size =sizeof (ha->dvr.eu.sync); - ha->dvr.eu.sync.ionode = hanum; + ha->dvr.eu.sync.ionode = ha->hanum; ha->dvr.eu.sync.service = service; ha->dvr.eu.sync.status = ha->status; ha->dvr.eu.sync.info = ha->info;
@@ -3680,25 +3641,23 @@ static char *async_cache_tab[] = { }; -static int gdth_async_event (int hanum) +static int gdth_async_event (gdth_ha_str *ha) { -gdth_ha_str *ha;gdth_cmd_str *cmdp;int cmd_index; - ha =HADATA (gdth_ctr_tab[hanum]); cmdp= ha->pccb;TRACE2 (("gdth_async_event() ha %d serv %d\n" , - hanum,ha->service)); + ha->hanum, ha->service));if (ha->service ==SCREENSERVICE ) {if (ha->status ==MSG_REQUEST ) { -while (gdth_test_busy (hanum)) +while (gdth_test_busy (ha))gdth_delay (0 ); cmdp->Service =SCREENSERVICE ; cmdp->RequestBuffer =SCREEN_CMND ; - cmd_index =gdth_get_cmd_index (hanum); -gdth_set_sema0 (hanum); + cmd_index =gdth_get_cmd_index (ha); +gdth_set_sema0 (ha); cmdp->OpCode =GDT_READ ; cmdp->BoardNode =LOCALBOARD ; cmdp->u.screen.reserved =0 ;
@@ -3708,7 +3667,7 @@ static int gdth_async_event(int hanum) ha->cmd_len =GDTOFFSOF (gdth_cmd_str,u.screen.su.msg.msg_addr) +sizeof (ulong64); ha->cmd_cnt =0 ; -gdth_copy_command (hanum); +gdth_copy_command (ha);if (ha->type ==GDT_EISA )printk ("[EISA slot %d] " ,(ushort )ha->brd_phys);else if (ha->type ==GDT_ISA )
@@ -3716,19 +3675,19 @@ static int gdth_async_event(int hanum)else printk ("[PCI %d/%d] " ,(ushort)(ha->brd_phys>>8 ), (ushort)((ha->brd_phys>>3 )&0x1f )); -gdth_release_event (hanum); +gdth_release_event (ha); } }else {if (ha->type ==GDT_PCIMPR && (ha->fw_vers &0xff ) >=0x1a ) { ha->dvr.size =0 ; - ha->dvr.eu.async.ionode = hanum; + ha->dvr.eu.async.ionode = ha->hanum; ha->dvr.eu.async.status = ha->status;/* severity and event_string already set! */ }else { ha->dvr.size =sizeof (ha->dvr.eu.async); - ha->dvr.eu.async.ionode = hanum; + ha->dvr.eu.async.ionode = ha->hanum; ha->dvr.eu.async.service = ha->service; ha->dvr.eu.async.status = ha->status; ha->dvr.eu.async.info = ha->info;
@@ -3810,9 +3769,8 @@ static void gdth_timeout(ulong data)Scsi_Cmnd *nscp;gdth_ha_str *ha;ulong flags; -int hanum =0 ; - ha =HADATA (gdth_ctr_tab[hanum]); + ha =shost_priv (gdth_ctr_tab[0 ]);spin_lock_irqsave (&ha->smp_lock, flags);for (act_stats=0 ,i=0 ; i<GDTH_MAXCMDS ; ++i)
@@ -4012,17 +3970,14 @@ static int __init gdth_detect(struct scsi_host_template *shtp)static int gdth_release (struct Scsi_Host *shp) { -int hanum; -gdth_ha_str *ha; +gdth_ha_str *ha =shost_priv (shp);TRACE2 (("gdth_release()\n" )); - hanum =NUMDATA (shp)->hanum; - ha =HADATA (gdth_ctr_tab[hanum]);if (ha->sdev) {scsi_free_host_dev (ha->sdev); ha->sdev =NULL ; } -gdth_flush (hanum); +gdth_flush (ha);if (shp->irq) {free_irq (shp->irq,ha);
@@ -4063,14 +4018,10 @@ static int gdth_release(struct Scsi_Host *shp) } -static const char *gdth_ctr_name (int hanum) +static const char *gdth_ctr_name (gdth_ha_str *ha) { -gdth_ha_str *ha; -TRACE2 (("gdth_ctr_name()\n" )); - ha =HADATA (gdth_ctr_tab[hanum]); -if (ha->type ==GDT_EISA ) {switch (ha->stype) {case GDT3_ID :
@@ -4097,29 +4048,23 @@ static const char *gdth_ctr_name(int hanum)static const char *gdth_info (struct Scsi_Host *shp) { -int hanum; -gdth_ha_str *ha; +gdth_ha_str *ha =shost_priv (shp);TRACE2 (("gdth_info()\n" )); - hanum =NUMDATA (shp)->hanum; - ha =HADATA (gdth_ctr_tab[hanum]); -return ((const char *)ha->binfo.type_string); }static int gdth_eh_bus_reset (Scsi_Cmnd *scp) { -int i, hanum; -gdth_ha_str *ha; +gdth_ha_str *ha =shost_priv (scp->device->host); +int i;ulong flags;Scsi_Cmnd *cmnd;unchar b;TRACE2 (("gdth_eh_bus_reset()\n" )); - hanum =NUMDATA (scp->device->host)->hanum; b = scp->device->channel; - ha =HADATA (gdth_ctr_tab[hanum]);/* clear command tab */ spin_lock_irqsave (&ha->smp_lock, flags);
@@ -4136,9 +4081,9 @@ static int gdth_eh_bus_reset(Scsi_Cmnd *scp)if (ha->hdr[i].present) {spin_lock_irqsave (&ha->smp_lock, flags); gdth_polling = TRUE; -while (gdth_test_busy (hanum)) +while (gdth_test_busy (ha))gdth_delay (0 ); -if (gdth_internal_cmd (hanum,CACHESERVICE , +if (gdth_internal_cmd (ha,CACHESERVICE ,GDT_CLUST_RESET , i,0 ,0 )) ha->hdr[i].cluster_type &= ~CLUSTER_RESERVED ; gdth_polling = FALSE;
@@ -4151,9 +4096,9 @@ static int gdth_eh_bus_reset(Scsi_Cmnd *scp)for (i =0 ; i <MAXID ; ++i) ha->raw[BUS_L2P (ha,b)].io_cnt[i] =0 ; gdth_polling = TRUE; -while (gdth_test_busy (hanum)) +while (gdth_test_busy (ha))gdth_delay (0 ); -gdth_internal_cmd (hanum,SCSIRAWSERVICE ,GDT_RESET_BUS , +gdth_internal_cmd (ha,SCSIRAWSERVICE ,GDT_RESET_BUS ,BUS_L2P (ha,b),0 ,0 ); gdth_polling = FALSE;spin_unlock_irqrestore (&ha->smp_lock, flags);
@@ -4164,18 +4109,15 @@ static int gdth_eh_bus_reset(Scsi_Cmnd *scp)static int gdth_bios_param (struct scsi_device *sdev,struct block_device *bdev,sector_t cap,int *ip) {unchar b, t; -int hanum; -gdth_ha_str *ha; +gdth_ha_str *ha =shost_priv (sdev->host);struct scsi_device *sd;unsigned capacity; sd = sdev; capacity = cap; - hanum =NUMDATA (sd->host)->hanum; b = sd->channel; t = sd->id; -TRACE2 (("gdth_bios_param() ha %d bus %d target %d\n" , hanum, b, t)); - ha =HADATA (gdth_ctr_tab[hanum]); +TRACE2 (("gdth_bios_param() ha %d bus %d target %d\n" , ha->hanum, b, t));if (b != ha->virt_bus || ha->hdr[t].heads ==0 ) {/* raw device or host drive without mapping information */
@@ -4196,7 +4138,7 @@ static int gdth_bios_param(struct scsi_device *sdev,struct block_device *bdev,sestatic int gdth_queuecommand (struct scsi_cmnd *scp,void (*done)(struct scsi_cmnd *)) { -int hanum; +gdth_ha_str *ha =shost_priv (scp->device->host);int priority;TRACE (("gdth_queuecommand() cmd 0x%x\n" , scp->cmnd[0 ]));
@@ -4208,7 +4150,6 @@ static int gdth_queuecommand(struct scsi_cmnd *scp, scp->SCp.Status =GDTH_MAP_NONE ; scp->SCp.buffer = (struct scatterlist *)NULL ; - hanum =NUMDATA (scp->device->host)->hanum;#ifdef GDTH_STATISTICS ++act_ios;#endif
@@ -4217,10 +4158,10 @@ static int gdth_queuecommand(struct scsi_cmnd *scp,if (IS_GDTH_INTERNAL_CMD (scp)) priority = scp->SCp.this_residual;else -gdth_update_timeout (hanum, scp, scp->timeout_per_command *6 ); +gdth_update_timeout (scp, scp->timeout_per_command *6 ); -gdth_putq ( hanum, scp, priority ); -gdth_next ( hanum ); +gdth_putq (ha, scp, priority); +gdth_next (ha);return 0 ; }
@@ -4231,7 +4172,7 @@ static int gdth_open(struct inode *inode, struct file *filep)int i;for (i =0 ; i < gdth_ctr_count; i++) { - ha =HADATA (gdth_ctr_tab[i]); + ha =shost_priv (gdth_ctr_tab[i]);if (!ha->sdev) ha->sdev =scsi_get_host_dev (gdth_ctr_tab[i]); }
@@ -4255,7 +4196,7 @@ static int ioc_event(void __user *arg)if (copy_from_user (&evt, arg,sizeof (gdth_ioctl_event)) || evt.ionode >= gdth_ctr_count)return -EFAULT ; - ha =HADATA (gdth_ctr_tab[evt.ionode]); + ha =shost_priv (gdth_ctr_tab[evt.ionode]);if (evt.erase ==0xff ) {if (evt.event.event_source ==ES_TEST )
@@ -4292,7 +4233,7 @@ static int ioc_lockdrv(void __user *arg)if (copy_from_user (&ldrv, arg,sizeof (gdth_ioctl_lockdrv)) || ldrv.ionode >= gdth_ctr_count)return -EFAULT ; - ha =HADATA (gdth_ctr_tab[ldrv.ionode]); + ha =shost_priv (gdth_ctr_tab[ldrv.ionode]);for (i =0 ; i < ldrv.drive_cnt && i <MAX_HDRIVES ; ++i) { j = ldrv.drives[i];
@@ -4302,14 +4243,14 @@ static int ioc_lockdrv(void __user *arg)spin_lock_irqsave (&ha->smp_lock, flags); ha->hdr[j].lock =1 ;spin_unlock_irqrestore (&ha->smp_lock, flags); -gdth_wait_completion (ldrv.ionode, ha->bus_cnt, j); -gdth_stop_timeout (ldrv.ionode, ha->bus_cnt, j); +gdth_wait_completion (ha, ha->bus_cnt, j); +gdth_stop_timeout (ha, ha->bus_cnt, j); }else {spin_lock_irqsave (&ha->smp_lock, flags); ha->hdr[j].lock =0 ;spin_unlock_irqrestore (&ha->smp_lock, flags); -gdth_start_timeout (ldrv.ionode, ha->bus_cnt, j); -gdth_next (ldrv.ionode); +gdth_start_timeout (ha, ha->bus_cnt, j); +gdth_next (ha); } }return 0 ;
@@ -4319,16 +4260,14 @@ static int ioc_resetdrv(void __user *arg, char *cmnd) {gdth_ioctl_reset res;gdth_cmd_str cmd; -int hanum;gdth_ha_str *ha;int rval;if (copy_from_user (&res, arg,sizeof (gdth_ioctl_reset)) || res.ionode >= gdth_ctr_count || res.number >=MAX_HDRIVES )return -EFAULT ; - hanum = res.ionode; - ha =HADATA (gdth_ctr_tab[hanum]); - + ha =shost_priv (gdth_ctr_tab[res.ionode]); +if (!ha->hdr[res.number].present)return 0 ;memset (&cmd,0 ,sizeof (gdth_cmd_str));
@@ -4354,22 +4293,20 @@ static int ioc_general(void __user *arg, char *cmnd)gdth_ioctl_general gen;char *buf =NULL ;ulong64 paddr; -int hanum;gdth_ha_str *ha;int rval;if (copy_from_user (&gen, arg,sizeof (gdth_ioctl_general)) || gen.ionode >= gdth_ctr_count)return -EFAULT ; - hanum = gen.ionode; - ha =HADATA (gdth_ctr_tab[hanum]); + ha =shost_priv (gdth_ctr_tab[gen.ionode]);if (gen.data_len + gen.sense_len !=0 ) { -if (!(buf =gdth_ioctl_alloc (hanum, gen.data_len + gen.sense_len, +if (!(buf =gdth_ioctl_alloc (ha, gen.data_len + gen.sense_len, FALSE, &paddr)))return -EFAULT ;if (copy_from_user (buf, arg +sizeof (gdth_ioctl_general), gen.data_len + gen.sense_len)) { -gdth_ioctl_free (hanum, gen.data_len+gen.sense_len, buf, paddr); +gdth_ioctl_free (ha, gen.data_len+gen.sense_len, buf, paddr);return -EFAULT ; }
@@ -4443,7 +4380,7 @@ static int ioc_general(void __user *arg, char *cmnd) gen.command.u.raw.sense_data = (ulong32 )paddr + gen.data_len; } }else { -gdth_ioctl_free (hanum, gen.data_len+gen.sense_len, buf, paddr); +gdth_ioctl_free (ha, gen.data_len+gen.sense_len, buf, paddr);return -EFAULT ; } }
@@ -4455,15 +4392,15 @@ static int ioc_general(void __user *arg, char *cmnd)if (copy_to_user (arg +sizeof (gdth_ioctl_general), buf, gen.data_len + gen.sense_len)) { -gdth_ioctl_free (hanum, gen.data_len+gen.sense_len, buf, paddr); +gdth_ioctl_free (ha, gen.data_len+gen.sense_len, buf, paddr);return -EFAULT ; }if (copy_to_user (arg, &gen,sizeof (gdth_ioctl_general) -sizeof (gdth_cmd_str))) { -gdth_ioctl_free (hanum, gen.data_len+gen.sense_len, buf, paddr); +gdth_ioctl_free (ha, gen.data_len+gen.sense_len, buf, paddr);return -EFAULT ; } -gdth_ioctl_free (hanum, gen.data_len+gen.sense_len, buf, paddr); +gdth_ioctl_free (ha, gen.data_len+gen.sense_len, buf, paddr);return 0 ; }
@@ -4473,7 +4410,7 @@ static int ioc_hdrlist(void __user *arg, char *cmnd)gdth_cmd_str *cmd;gdth_ha_str *ha;unchar i; -int hanum, rc = -ENOMEM ; +int rc = -ENOMEM ;u32 cluster_type =0 ; rsc =kmalloc (sizeof (*rsc),GFP_KERNEL );
@@ -4486,8 +4423,7 @@ static int ioc_hdrlist(void __user *arg, char *cmnd) rc = -EFAULT ; goto free_fail; } - hanum = rsc->ionode; - ha =HADATA (gdth_ctr_tab[hanum]); + ha =shost_priv (gdth_ctr_tab[rsc->ionode]);memset (cmd,0 ,sizeof (gdth_cmd_str));for (i =0 ; i <MAX_HDRIVES ; ++i) {
@@ -4528,7 +4464,7 @@ static int ioc_rescan(void __user *arg, char *cmnd)gdth_cmd_str *cmd;ushort i, status, hdr_cnt;ulong32 info; -int hanum, cyls, hds, secs; +int cyls, hds, secs;int rc = -ENOMEM ;ulong flags;gdth_ha_str *ha;
@@ -4543,8 +4479,7 @@ static int ioc_rescan(void __user *arg, char *cmnd) rc = -EFAULT ; goto free_fail; } - hanum = rsc->ionode; - ha =HADATA (gdth_ctr_tab[hanum]); + ha =shost_priv (gdth_ctr_tab[rsc->ionode]);memset (cmd,0 ,sizeof (gdth_cmd_str));if (rsc->flag ==0 ) {
@@ -4703,7 +4638,7 @@ static int gdth_ioctl(struct inode *inode, struct file *filep,if (copy_from_user (&ctrt, argp,sizeof (gdth_ioctl_ctrtype)) || ctrt.ionode >= gdth_ctr_count)return -EFAULT ; - ha =HADATA (gdth_ctr_tab[ctrt.ionode]); + ha =shost_priv (gdth_ctr_tab[ctrt.ionode]);if (ha->type ==GDT_ISA || ha->type ==GDT_EISA ) { ctrt.type = (unchar)((ha->stype>>20 ) -0x10 ); }else {
@@ -4744,7 +4679,7 @@ static int gdth_ioctl(struct inode *inode, struct file *filep,if (copy_from_user (&lchn, argp,sizeof (gdth_ioctl_lockchn)) || lchn.ionode >= gdth_ctr_count)return -EFAULT ; - ha =HADATA (gdth_ctr_tab[lchn.ionode]); + ha =shost_priv (gdth_ctr_tab[lchn.ionode]); i = lchn.channel;if (i < ha->bus_cnt) {
@@ -4753,16 +4688,16 @@ static int gdth_ioctl(struct inode *inode, struct file *filep, ha->raw[i].lock =1 ;spin_unlock_irqrestore (&ha->smp_lock, flags);for (j =0 ; j < ha->tid_cnt; ++j) { -gdth_wait_completion (lchn.ionode, i, j); -gdth_stop_timeout (lchn.ionode, i, j); +gdth_wait_completion (ha, i, j); +gdth_stop_timeout (ha, i, j); } }else {spin_lock_irqsave (&ha->smp_lock, flags); ha->raw[i].lock =0 ;spin_unlock_irqrestore (&ha->smp_lock, flags);for (j =0 ; j < ha->tid_cnt; ++j) { -gdth_start_timeout (lchn.ionode, i, j); -gdth_next (lchn.ionode); +gdth_start_timeout (ha, i, j); +gdth_next (ha); } } }
@@ -4778,13 +4713,12 @@ static int gdth_ioctl(struct inode *inode, struct file *filep,case GDTIOCTL_RESET_BUS : {gdth_ioctl_reset res; -int hanum, rval; +int rval;if (copy_from_user (&res, argp,sizeof (gdth_ioctl_reset)) || res.ionode >= gdth_ctr_count)return -EFAULT ; - hanum = res.ionode; - ha =HADATA (gdth_ctr_tab[hanum]); + ha =shost_priv (gdth_ctr_tab[res.ionode]); scp =kzalloc (sizeof (*scp),GFP_KERNEL );if (!scp)
@@ -4813,16 +4747,14 @@ static int gdth_ioctl(struct inode *inode, struct file *filep,/* flush routine */ -static void gdth_flush (int hanum) +static void gdth_flush (gdth_ha_str *ha) {int i; -gdth_ha_str *ha;gdth_cmd_str gdtcmd;char cmnd[MAX_COMMAND_SIZE ];memset (cmnd,0xff ,MAX_COMMAND_SIZE ); -TRACE2 (("gdth_flush() hanum %d\n" ,hanum)); - ha =HADATA (gdth_ctr_tab[hanum]); +TRACE2 (("gdth_flush() hanum %d\n" , ha->hanum));for (i =0 ; i <MAX_HDRIVES ; ++i) {if (ha->hdr[i].present) {
@@ -4838,9 +4770,9 @@ static void gdth_flush(int hanum) gdtcmd.u.cache.BlockNo =1 ; gdtcmd.u.cache.sg_canz =0 ; } -TRACE2 (("gdth_flush(): flush ha %d drive %d\n" , hanum, i)); +TRACE2 (("gdth_flush(): flush ha %d drive %d\n" , ha->hanum, i)); -gdth_execute (gdth_ctr_tab[hanum], &gdtcmd, cmnd,30 ,NULL ); +gdth_execute (ha->shost, &gdtcmd, cmnd,30 ,NULL ); } } }
@@ -4864,7 +4796,8 @@ static int gdth_halt(struct notifier_block *nb, ulong event, void *buf) notifier_disabled =1 ;printk ("GDT-HA: Flushing all host drives .. " );for (hanum =0 ; hanum < gdth_ctr_count; ++hanum) { -gdth_flush (hanum); +gdth_ha_str *ha =shost_priv (gdth_ctr_tab[hanum]); +gdth_flush (ha);#ifndef __alpha__/* controller reset */
@@ -4872,8 +4805,8 @@ static int gdth_halt(struct notifier_block *nb, ulong event, void *buf) gdtcmd.BoardNode =LOCALBOARD ; gdtcmd.Service =CACHESERVICE ; gdtcmd.OpCode =GDT_RESET ; -TRACE2 (("gdth_halt(): reset controller %d\n" , hanum)); -gdth_execute (gdth_ctr_tab[hanum], &gdtcmd, cmnd,10 ,NULL ); +TRACE2 (("gdth_halt(): reset controller %d\n" , ha->hanum)); +gdth_execute (ha->shost, &gdtcmd, cmnd,10 ,NULL );#endif }printk ("Done.\n" );
@@ -4923,10 +4856,10 @@ static int gdth_isa_probe_one(struct scsi_host_template *shtp, ulong32 isa_bios)if (!gdth_search_isa (isa_bios))return -ENXIO ; - shp =scsi_register (shtp,sizeof (gdth_ext_str)); + shp =scsi_register (shtp,sizeof (gdth_ha_str));if (!shp)return -ENOMEM ; - ha =HADATA (shp); + ha =shost_priv (shp); error = -ENODEV ;if (!gdth_init_isa (isa_bios,ha))
@@ -4956,9 +4889,10 @@ static int gdth_isa_probe_one(struct scsi_host_template *shtp, ulong32 isa_bios) hanum = gdth_ctr_count; gdth_ctr_tab[gdth_ctr_count++] = shp; -NUMDATA (shp)->hanum = (ushort )hanum; + ha->hanum = (ushort )hanum; + ha->shost = shp; - ha->pccb =CMDDATA (shp); + ha->pccb = &ha->cmdext; ha->ccb_phys =0L ; ha->pdev =NULL ;
@@ -4995,7 +4929,7 @@ static int gdth_isa_probe_one(struct scsi_host_template *shtp, ulong32 isa_bios) ha->scan_mode = rescan ?0x10 :0 ; error = -ENODEV ; -if (!gdth_search_drives (hanum)) { +if (!gdth_search_drives (ha)) {printk ("GDT-ISA: Error during device scan\n" ); goto out_free_coal_stat; }
@@ -5012,7 +4946,7 @@ static int gdth_isa_probe_one(struct scsi_host_template *shtp, ulong32 isa_bios) shp->max_channel = ha->bus_cnt;spin_lock_init (&ha->smp_lock); -gdth_enable_int (hanum); +gdth_enable_int (ha);return 0 ;
@@ -5049,10 +4983,10 @@ static int gdth_eisa_probe_one(struct scsi_host_template *shtp,if (!gdth_search_eisa (eisa_slot))return -ENXIO ; - shp =scsi_register (shtp,sizeof (gdth_ext_str)); + shp =scsi_register (shtp,sizeof (gdth_ha_str));if (!shp)return -ENOMEM ; - ha =HADATA (shp); + ha =shost_priv (shp); error = -ENODEV ;if (!gdth_init_eisa (eisa_slot,ha))
@@ -5074,11 +5008,12 @@ static int gdth_eisa_probe_one(struct scsi_host_template *shtp, hanum = gdth_ctr_count; gdth_ctr_tab[gdth_ctr_count++] = shp; -NUMDATA (shp)->hanum = (ushort )hanum; -TRACE2 (("EISA detect Bus 0: hanum %d\n" , -NUMDATA (shp)->hanum)); + ha->hanum = (ushort )hanum; + ha->shost = shp; + +TRACE2 (("EISA detect Bus 0: hanum %d\n" , ha->hanum)); - ha->pccb =CMDDATA (shp); + ha->pccb = &ha->cmdext; ha->ccb_phys =0L ; error = -ENOMEM ;
@@ -5119,7 +5054,7 @@ static int gdth_eisa_probe_one(struct scsi_host_template *shtp, ha->cmd_tab[i].cmnd =UNUSED_CMND ; ha->scan_mode = rescan ?0x10 :0 ; -if (!gdth_search_drives (hanum)) { +if (!gdth_search_drives (ha)) {printk ("GDT-EISA: Error during device scan\n" ); error = -ENODEV ; goto out_free_ccb_phys;
@@ -5137,7 +5072,7 @@ static int gdth_eisa_probe_one(struct scsi_host_template *shtp, shp->max_channel = ha->bus_cnt;spin_lock_init (&ha->smp_lock); -gdth_enable_int (hanum); +gdth_enable_int (ha);return 0 ; out_free_ccb_phys:
@@ -5172,10 +5107,10 @@ static int gdth_pci_probe_one(struct scsi_host_template *shtp,dma_addr_t scratch_dma_handle =0 ;int error, hanum, i; - shp =scsi_register (shtp,sizeof (gdth_ext_str)); + shp =scsi_register (shtp,sizeof (gdth_ha_str));if (!shp)return -ENOMEM ; - ha =HADATA (shp); + ha =shost_priv (shp); error = -ENODEV ;if (!gdth_init_pci (&pcistr[ctr],ha))
@@ -5200,9 +5135,10 @@ static int gdth_pci_probe_one(struct scsi_host_template *shtp, hanum = gdth_ctr_count; gdth_ctr_tab[gdth_ctr_count++] = shp; -NUMDATA (shp)->hanum = (ushort )hanum; + ha->hanum = (ushort )hanum; + ha->shost = shp; - ha->pccb =CMDDATA (shp); + ha->pccb = &ha->cmdext; ha->ccb_phys =0L ; error = -ENOMEM ;
@@ -5238,8 +5174,8 @@ static int gdth_pci_probe_one(struct scsi_host_template *shtp, ha->scan_mode = rescan ?0x10 :0 ; error = -ENODEV ; -if (!gdth_search_drives (hanum)) { -printk ("GDT-PCI %d: Error during device scan\n" , hanum); +if (!gdth_search_drives (ha)) { +printk ("GDT-PCI %d: Error during device scan\n" , ha->hanum); goto out_free_coal_stat; }
@@ -5252,16 +5188,16 @@ static int gdth_pci_probe_one(struct scsi_host_template *shtp, !ha->dma64_support) { if (pci_set_dma_mask(pcistr[ctr].pdev, DMA_32BIT_MASK)) { printk(KERN_WARNING "GDT-PCI %d: " - "Unable to set 32-bit DMA\n", hanum); + "Unable to set 32-bit DMA\n", ha->hanum); goto out_free_coal_stat; } } else { shp->max_cmd_len =16 ;if (!pci_set_dma_mask (pcistr[ctr].pdev,DMA_64BIT_MASK )) { -printk ("GDT-PCI %d: 64-bit DMA enabled\n" , hanum); +printk ("GDT-PCI %d: 64-bit DMA enabled\n" , ha->hanum); }else if (pci_set_dma_mask (pcistr[ctr].pdev,DMA_32BIT_MASK )) {printk (KERN_WARNING "GDT-PCI %d: " -"Unable to set 64/32-bit DMA\n" , hanum); +"Unable to set 64/32-bit DMA\n" , ha->hanum); goto out_free_coal_stat; } }
@@ -5271,7 +5207,7 @@ static int gdth_pci_probe_one(struct scsi_host_template *shtp, shp->max_channel = ha->bus_cnt;spin_lock_init (&ha->smp_lock); -gdth_enable_int (hanum); +gdth_enable_int (ha);return 0 ; out_free_coal_stat:
drivers/scsi/gdth.h +3 -14
@@ -853,6 +853,8 @@ typedef struct {/* controller information structure */ typedef struct { + struct Scsi_Host *shost; + ushort hanum; ushort oem_id; /* OEM */ ushort type; /* controller class */ ulong32 stype; /* subtype (PCI: device ID) */
@@ -864,6 +866,7 @@ typedef struct {void __iomem *brd;/* DPRAM address */ ulong32 brd_phys;/* slot number/BIOS address */ gdt6c_plx_regs *plx;/* PLX regs (new PCI contr.) */ +gdth_cmd_str cmdext;gdth_cmd_str *pccb;/* address command structure */ ulong32 ccb_phys;/* phys. address */ #ifdef INT_COAL
@@ -937,20 +940,6 @@ typedef struct {struct scsi_device *sdev; } gdth_ha_str; -/* structure for scsi_register(), SCSI bus != 0 */ -typedef struct { -ushort hanum; -ushort busnum; -}gdth_num_str ; - -/* structure for scsi_register() */ -typedef struct { -gdth_num_str numext;/* must be the first element */ -gdth_ha_str haext; -gdth_cmd_str cmdext; -}gdth_ext_str ; - -/* INQUIRY data format */ typedef struct { unchar type_qual;
drivers/scsi/gdth_proc.c +31 -49
290 lines not on this page · raw message
drivers/scsi/gdth_proc.h +10 -10
@@ -9,20 +9,20 @@ int gdth_execute(struct Scsi_Host *shost, gdth_cmd_str *gdtcmd, char *cmnd, int timeout, u32 *info);static int gdth_set_info (char *buffer,int length,struct Scsi_Host *host, -int hanum); +gdth_ha_str *ha);static int gdth_get_info (char *buffer,char **start,off_t offset,int length, -struct Scsi_Host *host,int hanum); +struct Scsi_Host *host,gdth_ha_str *ha);static int gdth_set_asc_info (struct Scsi_Host *host,char *buffer, -int length,int hanum); +int length,gdth_ha_str *ha); -static char *gdth_ioctl_alloc (int hanum,int size,int scratch, -ulong64 *paddr); -static void gdth_ioctl_free (int hanum,int size,char *buf,ulong64 paddr); -static void gdth_wait_completion (int hanum,int busnum,int id); -static void gdth_stop_timeout (int hanum,int busnum,int id); -static void gdth_start_timeout (int hanum,int busnum,int id); -static int gdth_update_timeout (int hanum,Scsi_Cmnd *scp,int timeout); +static char *gdth_ioctl_alloc (gdth_ha_str *ha,int size,int scratch, +ulong64 *paddr); +static void gdth_ioctl_free (gdth_ha_str *ha,int size,char *buf,ulong64 paddr); +static void gdth_wait_completion (gdth_ha_str *ha,int busnum,int id); +static void gdth_stop_timeout (gdth_ha_str *ha,int busnum,int id); +static void gdth_start_timeout (gdth_ha_str *ha,int busnum,int id); +static int gdth_update_timeout (Scsi_Cmnd *scp,int timeout);#endif
Signature · 1 line
1.5.3.1
PATCH 11/16 gdth: gdth_interrupt() gdth_get_status() & gdth_wait() fixes
In reply to Boaz Harrosh - gdth_get_status() returns a single device interrupt IStatus
- gdth_interrupt split to __gdth_interrupt() that receives flags if is called from gdth_wait().
- Use dev_id passed from kernel and do not loop on all controllers.
- gdth_wait(), get read of all global variables and call the new __gdth_interrupt with these variables on the stack
Signed-off-by Boaz Harrosh <[email protected]>
--- drivers/scsi/gdth.c | 93 +++++++++++++++++++++++--------------------------- 1 files changed, 43 insertions(+), 50 deletions(-)
drivers/scsi/gdth.c +43 -50
@@ -139,6 +139,8 @@static void gdth_delay (int milliseconds);static void gdth_eval_mapping (ulong32 size,ulong32 *cyls,int *heads,int *secs);static irqreturn_t gdth_interrupt (int irq,void *dev_id); +static irqreturn_t __gdth_interrupt (gdth_ha_str *ha,int irq, +int gdth_from_wait,int * pIndex);static int gdth_sync_event (gdth_ha_str *ha,int service,unchar index,Scsi_Cmnd *scp);static int gdth_async_event (gdth_ha_str *ha);
@@ -161,7 +163,7 @@ static int gdth_internal_cache_cmd(gdth_ha_str *ha, Scsi_Cmnd *scp);static int gdth_fill_cache_cmd (gdth_ha_str *ha,Scsi_Cmnd *scp,ushort hdrive);static void gdth_enable_int (gdth_ha_str *ha); -static int gdth_get_status (unchar *pIStatus,int irq); +static unchar gdth_get_status (gdth_ha_str *ha,int irq);static int gdth_test_busy (gdth_ha_str *ha);static int gdth_get_cmd_index (gdth_ha_str *ha);static void gdth_release_event (gdth_ha_str *ha);
@@ -295,8 +297,6 @@ static unchar gdth_drq_tab[4] = {5,6,7,7}; /* DRQ table */static unchar gdth_irq_tab[6 ] = {0 ,10 ,11 ,12 ,14 ,0 };/* IRQ table */ #endif static unchar gdth_polling;/* polling if TRUE */ -static unchar gdth_from_wait = FALSE;/* gdth_wait() */ -static int wait_index,wait_hanum;/* gdth_wait() */ static int gdth_ctr_count =0 ;/* controller count */ static int gdth_ctr_released =0 ;/* gdth_release() */ static struct Scsi_Host *gdth_ctr_tab[MAXHA ];/* controller table */
@@ -1245,41 +1245,32 @@ static void __init gdth_enable_int(gdth_ha_str *ha)spin_unlock_irqrestore (&ha->smp_lock, flags); } - -static int gdth_get_status (unchar *pIStatus,int irq) +/* return IStatus if interrupt was from this card else 0 */ +static unchar gdth_get_status (gdth_ha_str *ha,int irq) { - registergdth_ha_str *ha; -int i; +unchar IStatus =0 ; + +TRACE (("gdth_get_status() irq %d ctr_count %d\n" , irq, gdth_ctr_count)); -TRACE (("gdth_get_status() irq %d ctr_count %d\n" , - irq,gdth_ctr_count)); - - *pIStatus =0 ; -for (i=0 ; i<gdth_ctr_count; ++i) { - ha =shost_priv (gdth_ctr_tab[i]);if (ha->irq != (unchar )irq)/* check IRQ */ -continue ; +return false;if (ha->type ==GDT_EISA ) - *pIStatus =inb ((ushort )ha->bmic +EDOORREG ); + IStatus =inb ((ushort )ha->bmic +EDOORREG );else if (ha->type ==GDT_ISA ) - *pIStatus = + IStatus =readb (&((gdt2_dpram_str __iomem *)ha->brd)->u.ic.Cmd_Index);else if (ha->type ==GDT_PCI ) - *pIStatus = + IStatus =readb (&((gdt6_dpram_str __iomem *)ha->brd)->u.ic.Cmd_Index);else if (ha->type ==GDT_PCINEW ) - *pIStatus =inb (PTR2USHORT (&ha->plx->edoor_reg)); + IStatus =inb (PTR2USHORT (&ha->plx->edoor_reg));else if (ha->type ==GDT_PCIMPR ) - *pIStatus = + IStatus =readb (&((gdt6m_dpram_str __iomem *)ha->brd)->i960r.edoor_reg); - -if (*pIStatus) -return i;/* board found */ - } -return -1 ; + +return IStatus; } - - +static int gdth_test_busy (gdth_ha_str *ha) { registerint gdtsema0 =0 ;
@@ -1436,22 +1427,21 @@ static void gdth_release_event(gdth_ha_str *ha)static int gdth_wait (gdth_ha_str *ha,int index,ulong32 time) {int answer_found = FALSE; +int wait_index =0 ;TRACE (("gdth_wait() hanum %d index %d time %d\n" , ha->hanum, index, time));if (index ==0 )return 1 ;/* no wait required */ - gdth_from_wait = TRUE;do { -gdth_interrupt ((int )ha->irq,ha); -if (wait_hanum==ha->hanum && wait_index==index) { +__gdth_interrupt (ha, (int )ha->irq, true, &wait_index); +if (wait_index == index) { answer_found = TRUE;break ; }gdth_delay (1 ); }while (--time); - gdth_from_wait = FALSE;while (gdth_test_busy (ha))gdth_delay (0 );
@@ -3010,15 +3000,14 @@ static void gdth_clear_events(void)/* SCSI interface functions */ -static irqreturn_t gdth_interrupt (int irq,void *dev_id) +static irqreturn_t __gdth_interrupt (gdth_ha_str *ha,int irq, +int gdth_from_wait,int * pIndex) { -gdth_ha_str *ha2 = (gdth_ha_str *)dev_id; - registergdth_ha_str *ha;gdt6m_dpram_str __iomem *dp6m_ptr =NULL ;gdt6_dpram_str __iomem *dp6_ptr;gdt2_dpram_str __iomem *dp2_ptr;Scsi_Cmnd *scp; -int hanum, rval, i; +int rval, i;unchar IStatus;ushort Service;ulong flags =0 ;
@@ -3039,17 +3028,15 @@ static irqreturn_t gdth_interrupt(int irq,void *dev_id) }if (!gdth_polling) -spin_lock_irqsave (&ha2->smp_lock, flags); - wait_index =0 ; +spin_lock_irqsave (&ha->smp_lock, flags);/* search controller */ -if ((hanum =gdth_get_status (&IStatus,irq)) ==-1 ) { +if (0 == (IStatus =gdth_get_status (ha, irq))) {/* spurious interrupt */ if (!gdth_polling) -spin_unlock_irqrestore (&ha2->smp_lock, flags); -return IRQ_HANDLED ; +spin_unlock_irqrestore (&ha->smp_lock, flags); +return IRQ_HANDLED ; } - ha =shost_priv (gdth_ctr_tab[hanum]);#ifdef GDTH_STATISTICS ++act_ints;
@@ -3181,7 +3168,7 @@ static irqreturn_t gdth_interrupt(int irq,void *dev_id) }else {TRACE2 (("gdth_interrupt() unknown controller type\n" ));if (!gdth_polling) -spin_unlock_irqrestore (&ha2->smp_lock, flags); +spin_unlock_irqrestore (&ha->smp_lock, flags);return IRQ_HANDLED ; }
@@ -3189,15 +3176,14 @@ static irqreturn_t gdth_interrupt(int irq,void *dev_id) IStatus,ha->status,ha->info));if (gdth_from_wait) { - wait_hanum = hanum; - wait_index = (int )IStatus; + *pIndex = (int )IStatus; }if (IStatus ==ASYNCINDEX ) {TRACE2 (("gdth_interrupt() async. event\n" ));gdth_async_event (ha);if (!gdth_polling) -spin_unlock_irqrestore (&ha2->smp_lock, flags); +spin_unlock_irqrestore (&ha->smp_lock, flags);gdth_next (ha);return IRQ_HANDLED ; }
@@ -3205,10 +3191,10 @@ static irqreturn_t gdth_interrupt(int irq,void *dev_id)if (IStatus ==SPEZINDEX ) {TRACE2 (("Service unknown or not initialized !\n" )); ha->dvr.size =sizeof (ha->dvr.eu.driver); - ha->dvr.eu.driver.ionode = hanum; + ha->dvr.eu.driver.ionode = ha->hanum;gdth_store_event (ha,ES_DRIVER ,4 , &ha->dvr);if (!gdth_polling) -spin_unlock_irqrestore (&ha2->smp_lock, flags); +spin_unlock_irqrestore (&ha->smp_lock, flags);return IRQ_HANDLED ; } scp = ha->cmd_tab[IStatus-2 ].cmnd;
@@ -3217,24 +3203,24 @@ static irqreturn_t gdth_interrupt(int irq,void *dev_id)if (scp ==UNUSED_CMND ) {TRACE2 (("gdth_interrupt() index to unused command (%d)\n" ,IStatus)); ha->dvr.size =sizeof (ha->dvr.eu.driver); - ha->dvr.eu.driver.ionode = hanum; + ha->dvr.eu.driver.ionode = ha->hanum; ha->dvr.eu.driver.index = IStatus;gdth_store_event (ha,ES_DRIVER ,1 , &ha->dvr);if (!gdth_polling) -spin_unlock_irqrestore (&ha2->smp_lock, flags); +spin_unlock_irqrestore (&ha->smp_lock, flags);return IRQ_HANDLED ; }if (scp ==INTERNAL_CMND ) {TRACE (("gdth_interrupt() answer to internal command\n" ));if (!gdth_polling) -spin_unlock_irqrestore (&ha2->smp_lock, flags); +spin_unlock_irqrestore (&ha->smp_lock, flags);return IRQ_HANDLED ; }TRACE (("gdth_interrupt() sync. status\n" )); rval =gdth_sync_event (ha,Service,IStatus,scp);if (!gdth_polling) -spin_unlock_irqrestore (&ha2->smp_lock, flags); +spin_unlock_irqrestore (&ha->smp_lock, flags);if (rval ==2 ) {gdth_putq (ha, scp,scp->SCp.this_residual); }else if (rval ==1 ) {
@@ -3270,6 +3256,13 @@ static irqreturn_t gdth_interrupt(int irq,void *dev_id)return IRQ_HANDLED ; } +static irqreturn_t gdth_interrupt (int irq,void *dev_id) +{ +gdth_ha_str *ha = (gdth_ha_str *)dev_id; + +return __gdth_interrupt (ha, irq, false,NULL ); +} +static int gdth_sync_event (gdth_ha_str *ha,int service,unchar index,Scsi_Cmnd *scp) {
Signature · 1 line
1.5.3.1
PATCH 12/16 gdth: switch to modern scsi host registration
In reply to Boaz HarroshFrom: Christoph Hellwig <[email protected]>
- Use scsi_add_host and friends and track instances ourselves. And generally modernize the driver's structure.
- TODO: Next we can remove the controller table
- TODO: Fix use of deprecated pci_find_device()
--- drivers/scsi/gdth.c | 320 +++++++++++++++++++++++++-------------------------- drivers/scsi/gdth.h | 1 + 2 files changed, 157 insertions(+), 164 deletions(-)
drivers/scsi/gdth.c +156 -164
@@ -119,6 +119,7 @@#include <linux/time.h> #include <linux/timer.h> #include <linux/dma-mapping.h> +#include <linux/list.h> #ifdef GDTH_RTC #include <linux/mc146818rtc.h>
@@ -184,15 +185,6 @@ static void gdth_flush(gdth_ha_str *ha);static int gdth_halt (struct notifier_block *nb,ulong event,void *buf);static int gdth_queuecommand (Scsi_Cmnd *scp,void (*done)(Scsi_Cmnd *));static void gdth_scsi_done (struct scsi_cmnd *scp); -#ifdef CONFIG_ISA -static int gdth_isa_probe_one (struct scsi_host_template *,ulong32 ); -#endif -#ifdef CONFIG_EISA -static int gdth_eisa_probe_one (struct scsi_host_template *,ushort ); -#endif -#ifdef CONFIG_PCI -static int gdth_pci_probe_one (struct scsi_host_template *,gdth_pci_str *,int ); -#endif #ifdef DEBUG_GDTH static unchar DebugState =DEBUG_GDTH ;
@@ -298,8 +290,8 @@ static unchar gdth_irq_tab[6] = {0,10,11,12,14,0}; /* IRQ table */#endif static unchar gdth_polling;/* polling if TRUE */ static int gdth_ctr_count =0 ;/* controller count */ -static int gdth_ctr_released =0 ;/* gdth_release() */ static struct Scsi_Host *gdth_ctr_tab[MAXHA ];/* controller table */ +static LIST_HEAD (gdth_instances);static unchar gdth_write_through = FALSE;/* write through */ static gdth_evt_str ebuffer[MAX_EVENTS ];/* event buffer */ static int elastidx;
@@ -3872,145 +3864,6 @@ int __init option_setup(char *str)return 1 ; } -static int __init gdth_detect (struct scsi_host_template *shtp) -{ -#ifdef DEBUG_GDTH -printk ("GDT: This driver contains debugging information !! Trace level = %d\n" , - DebugState); -printk (" Destination of debugging information: " ); -#ifdef __SERIAL__ -#ifdef __COM2__ -printk ("Serial port COM2\n" ); -#else -printk ("Serial port COM1\n" ); -#endif -#else -printk ("Console\n" ); -#endif -gdth_delay (3000 ); -#endif - -TRACE (("gdth_detect()\n" )); - -if (disable) { -printk ("GDT-HA: Controller driver disabled from command line !\n" ); -return 0 ; - } - -printk ("GDT-HA: Storage RAID Controller Driver. Version: %s\n" ,GDTH_VERSION_STR ); -/* initializations */ - gdth_polling = TRUE; -gdth_clear_events (); - -/* As default we do not probe for EISA or ISA controllers */ -if (probe_eisa_isa) { -/* scanning for controllers, at first: ISA controller */ -#ifdef CONFIG_ISA -ulong32 isa_bios; -for (isa_bios =0xc8000UL ; isa_bios <=0xd8000UL ; - isa_bios +=0x8000UL ) { -if (gdth_ctr_count >=MAXHA ) -break ; -gdth_isa_probe_one (shtp, isa_bios); - } -#endif -#ifdef CONFIG_EISA - { -ushort eisa_slot; -for (eisa_slot =0x1000 ; eisa_slot <=0x8000 ; eisa_slot +=0x1000 ) { -if (gdth_ctr_count >=MAXHA ) -break ; -gdth_eisa_probe_one (shtp, eisa_slot); - } - } -#endif - } - -#ifdef CONFIG_PCI -/* scanning for PCI controllers */ - { -gdth_pci_str pcistr[MAXHA ]; -int cnt,ctr; - - cnt =gdth_search_pci (pcistr); -printk ("GDT-HA: Found %d PCI Storage RAID Controllers\n" ,cnt); -gdth_sort_pci (pcistr,cnt); -for (ctr =0 ; ctr < cnt; ++ctr) { -if (gdth_ctr_count >=MAXHA ) -break ; -gdth_pci_probe_one (shtp, pcistr, ctr); - } - } -#endif /* CONFIG_PCI */ - -TRACE2 (("gdth_detect() %d controller detected\n" ,gdth_ctr_count)); -if (gdth_ctr_count >0 ) { -#ifdef GDTH_STATISTICS -TRACE2 (("gdth_detect(): Initializing timer !\n" )); -init_timer (&gdth_timer); - gdth_timer.expires = jiffies +HZ ; - gdth_timer.data =0L ; - gdth_timer.function = gdth_timeout; -add_timer (&gdth_timer); -#endif - major =register_chrdev (0 ,"gdth" ,&gdth_fops); - notifier_disabled =0 ; -register_reboot_notifier (&gdth_notifier); - } - gdth_polling = FALSE; -return gdth_ctr_count; -} - -static int gdth_release (struct Scsi_Host *shp) -{ -gdth_ha_str *ha =shost_priv (shp); - -TRACE2 (("gdth_release()\n" )); -if (ha->sdev) { -scsi_free_host_dev (ha->sdev); - ha->sdev =NULL ; - } -gdth_flush (ha); - -if (shp->irq) { -free_irq (shp->irq,ha); - } -#ifdef CONFIG_ISA -if (shp->dma_channel !=0xff ) { -free_dma (shp->dma_channel); - } -#endif -#ifdef INT_COAL -if (ha->coal_stat) -pci_free_consistent (ha->pdev,sizeof (gdth_coal_status) * -MAXOFFSETS , ha->coal_stat, ha->coal_stat_phys); -#endif -if (ha->pscratch) -pci_free_consistent (ha->pdev,GDTH_SCRATCH , - ha->pscratch, ha->scratch_phys); -if (ha->pmsg) -pci_free_consistent (ha->pdev,sizeof (gdth_msg_str), - ha->pmsg, ha->msg_phys); -if (ha->ccb_phys) -pci_unmap_single (ha->pdev,ha->ccb_phys, -sizeof (gdth_cmd_str),PCI_DMA_BIDIRECTIONAL ); - gdth_ctr_released++; -TRACE2 (("gdth_release(): HA %d of %d\n" , - gdth_ctr_released, gdth_ctr_count)); - -if (gdth_ctr_released == gdth_ctr_count) { -#ifdef GDTH_STATISTICS -del_timer (&gdth_timer); -#endif -unregister_chrdev (major,"gdth" ); -unregister_reboot_notifier (&gdth_notifier); - } - -scsi_unregister (shp); -return 0 ; -} - -static const char *gdth_ctr_name (gdth_ha_str *ha) {TRACE2 (("gdth_ctr_name()\n" ));
@@ -4819,10 +4672,8 @@ static int gdth_slave_configure(struct scsi_device *sdev)return 0 ; } -static struct scsi_host_template driver_template = { +static struct scsi_host_template gdth_template = { .name ="GDT SCSI Disk Array Controller" , - .detect = gdth_detect, - .release = gdth_release, .info = gdth_info, .queuecommand = gdth_queuecommand, .eh_bus_reset_handler = gdth_eh_bus_reset,
@@ -4839,7 +4690,7 @@ static struct scsi_host_template driver_template = { };#ifdef CONFIG_ISA -static int gdth_isa_probe_one (struct scsi_host_template *shtp,ulong32 isa_bios) +static int gdth_isa_probe_one (ulong32 isa_bios) {struct Scsi_Host *shp;gdth_ha_str *ha;
@@ -4849,7 +4700,7 @@ static int gdth_isa_probe_one(struct scsi_host_template *shtp, ulong32 isa_bios)if (!gdth_search_isa (isa_bios))return -ENXIO ; - shp =scsi_register (shtp,sizeof (gdth_ha_str)); + shp =scsi_host_alloc (&gdth_template,sizeof (gdth_ha_str));if (!shp)return -ENOMEM ; ha =shost_priv (shp);
@@ -4941,6 +4792,10 @@ static int gdth_isa_probe_one(struct scsi_host_template *shtp, ulong32 isa_bios)spin_lock_init (&ha->smp_lock);gdth_enable_int (ha); + error =scsi_add_host (shp,NULL ); +if (error) + goto out_free_coal_stat; +list_add_tail (&ha->list, &gdth_instances);return 0 ; out_free_coal_stat:
@@ -4959,14 +4814,13 @@ static int gdth_isa_probe_one(struct scsi_host_template *shtp, ulong32 isa_bios) out_free_irq:free_irq (ha->irq, ha); out_host_put: -scsi_unregister (shp); +scsi_host_put (shp);return error; }#endif /* CONFIG_ISA */ #ifdef CONFIG_EISA -static int gdth_eisa_probe_one (struct scsi_host_template *shtp, -ushort eisa_slot) +static int gdth_eisa_probe_one (ushort eisa_slot) {struct Scsi_Host *shp;gdth_ha_str *ha;
@@ -4976,7 +4830,7 @@ static int gdth_eisa_probe_one(struct scsi_host_template *shtp,if (!gdth_search_eisa (eisa_slot))return -ENXIO ; - shp =scsi_register (shtp,sizeof (gdth_ha_str)); + shp =scsi_host_alloc (&gdth_template,sizeof (gdth_ha_str));if (!shp)return -ENOMEM ; ha =shost_priv (shp);
@@ -5066,6 +4920,11 @@ static int gdth_eisa_probe_one(struct scsi_host_template *shtp,spin_lock_init (&ha->smp_lock);gdth_enable_int (ha); + + error =scsi_add_host (shp,NULL ); +if (error) + goto out_free_coal_stat; +list_add_tail (&ha->list, &gdth_instances);return 0 ; out_free_ccb_phys:
@@ -5086,21 +4945,20 @@ static int gdth_eisa_probe_one(struct scsi_host_template *shtp,free_irq (ha->irq, ha); gdth_ctr_count--; out_host_put: -scsi_unregister (shp); +scsi_host_put (shp);return error; }#endif /* CONFIG_EISA */ #ifdef CONFIG_PCI -static int gdth_pci_probe_one (struct scsi_host_template *shtp, -gdth_pci_str *pcistr,int ctr) +static int gdth_pci_probe_one (gdth_pci_str *pcistr,int ctr) {struct Scsi_Host *shp;gdth_ha_str *ha;dma_addr_t scratch_dma_handle =0 ;int error, hanum, i; - shp =scsi_register (shtp,sizeof (gdth_ha_str)); + shp =scsi_host_alloc (&gdth_template,sizeof (gdth_ha_str));if (!shp)return -ENOMEM ; ha =shost_priv (shp);
@@ -5201,6 +5059,11 @@ static int gdth_pci_probe_one(struct scsi_host_template *shtp,spin_lock_init (&ha->smp_lock);gdth_enable_int (ha); + + error =scsi_add_host (shp, &pcistr[ctr].pdev->dev); +if (error) + goto out_free_coal_stat; +list_add_tail (&ha->list, &gdth_instances);return 0 ; out_free_coal_stat:
@@ -5218,12 +5081,141 @@ static int gdth_pci_probe_one(struct scsi_host_template *shtp,free_irq (ha->irq, ha); gdth_ctr_count--; out_host_put: -scsi_unregister (shp); +scsi_host_put (shp);return error; }#endif /* CONFIG_PCI */ -#include "scsi_module.c" +static void gdth_remove_one (gdth_ha_str *ha) +{ +struct Scsi_Host *shp = ha->shost; + +TRACE2 (("gdth_remove_one()\n" )); + +scsi_remove_host (shp); + +if (ha->sdev) { +scsi_free_host_dev (ha->sdev); + ha->sdev =NULL ; + } + +gdth_flush (ha); + +if (shp->irq) +free_irq (shp->irq,ha); + +#ifdef CONFIG_ISA +if (shp->dma_channel !=0xff ) +free_dma (shp->dma_channel); +#endif +#ifdef INT_COAL +if (ha->coal_stat) +pci_free_consistent (ha->pdev,sizeof (gdth_coal_status) * +MAXOFFSETS , ha->coal_stat, ha->coal_stat_phys); +#endif +if (ha->pscratch) +pci_free_consistent (ha->pdev,GDTH_SCRATCH , + ha->pscratch, ha->scratch_phys); +if (ha->pmsg) +pci_free_consistent (ha->pdev,sizeof (gdth_msg_str), + ha->pmsg, ha->msg_phys); +if (ha->ccb_phys) +pci_unmap_single (ha->pdev,ha->ccb_phys, +sizeof (gdth_cmd_str),PCI_DMA_BIDIRECTIONAL ); + +scsi_host_put (shp); +} + +static int __init gdth_init (void ) +{ +if (disable) { +printk ("GDT-HA: Controller driver disabled from" +" command line !\n" ); +return 0 ; + } + +printk ("GDT-HA: Storage RAID Controller Driver. Version: %s\n" , +GDTH_VERSION_STR ); + +/* initializations */ + gdth_polling = TRUE; +gdth_clear_events (); + +/* As default we do not probe for EISA or ISA controllers */ +if (probe_eisa_isa) { +/* scanning for controllers, at first: ISA controller */ +#ifdef CONFIG_ISA +ulong32 isa_bios; +for (isa_bios =0xc8000UL ; isa_bios <=0xd8000UL ; + isa_bios +=0x8000UL ) { +if (gdth_ctr_count >=MAXHA ) +break ; +gdth_isa_probe_one (isa_bios); + } +#endif +#ifdef CONFIG_EISA + { +ushort eisa_slot; +for (eisa_slot =0x1000 ; eisa_slot <=0x8000 ; + eisa_slot +=0x1000 ) { +if (gdth_ctr_count >=MAXHA ) +break ; +gdth_eisa_probe_one (eisa_slot); + } + } +#endif + } + +#ifdef CONFIG_PCI +/* scanning for PCI controllers */ + { +gdth_pci_str pcistr[MAXHA ]; +int cnt,ctr; + + cnt =gdth_search_pci (pcistr); +printk ("GDT-HA: Found %d PCI Storage RAID Controllers\n" , cnt); +gdth_sort_pci (pcistr,cnt); +for (ctr =0 ; ctr < cnt; ++ctr) { +if (gdth_ctr_count >=MAXHA ) +break ; +gdth_pci_probe_one (pcistr, ctr); + } + } +#endif /* CONFIG_PCI */ + +TRACE2 (("gdth_detect() %d controller detected\n" , gdth_ctr_count)); +#ifdef GDTH_STATISTICS +TRACE2 (("gdth_detect(): Initializing timer !\n" )); +init_timer (&gdth_timer); + gdth_timer.expires = jiffies +HZ ; + gdth_timer.data =0L ; + gdth_timer.function = gdth_timeout; +add_timer (&gdth_timer); +#endif + major =register_chrdev (0 ,"gdth" , &gdth_fops); + notifier_disabled =0 ; +register_reboot_notifier (&gdth_notifier); + gdth_polling = FALSE; +return 0 ; +} + +static void __exit gdth_exit(void) +{ +gdth_ha_str *ha; + +list_for_each_entry (ha, &gdth_instances, list) +gdth_remove_one (ha); + +#ifdef GDTH_STATISTICS +del_timer (&gdth_timer); +#endif +unregister_chrdev (major,"gdth" ); +unregister_reboot_notifier (&gdth_notifier); +} + +module_init (gdth_init); +module_exit (gdth_exit); +#ifndef MODULE __setup ("gdth=" , option_setup);#endif
drivers/scsi/gdth.h +1 -0
@@ -854,6 +854,7 @@ typedef struct {/* controller information structure */ typedef struct { struct Scsi_Host *shost; + struct list_head list; ushort hanum; ushort oem_id; /* OEM */ ushort type; /* controller class */
Signature · 1 line
1.5.3.1
PATCH 13/16 gdth: Remove gdth_ctr_tab[]
In reply to Boaz Harrosh - Places like Initialization and Reset that Just loop on all devices can use the link list with the list_for_each_entry macro.
But the io_ctrl from user mode now suffers performance-wise because code has to do a sequential search for the requested host number. I have isolated this search in a gdth_find_ha(int hanum) member for future enhancement if needed.
Signed-off-by Boaz Harrosh <[email protected]>
--- drivers/scsi/gdth.c | 107 ++++++++++++++++++++++++--------------------------- 1 files changed, 50 insertions(+), 57 deletions(-)
drivers/scsi/gdth.c +50 -57
@@ -290,8 +290,7 @@ static unchar gdth_irq_tab[6] = {0,10,11,12,14,0}; /* IRQ table */#endif static unchar gdth_polling;/* polling if TRUE */ static int gdth_ctr_count =0 ;/* controller count */ -static struct Scsi_Host *gdth_ctr_tab[MAXHA ];/* controller table */ -static LIST_HEAD (gdth_instances); +static LIST_HEAD (gdth_instances);/* controller list */ static unchar gdth_write_through = FALSE;/* write through */ static gdth_evt_str ebuffer[MAX_EVENTS ];/* event buffer */ static int elastidx;
@@ -384,6 +383,17 @@ static struct notifier_block gdth_notifier = { };static int notifier_disabled =0 ; +static gdth_ha_str *gdth_find_ha (int hanum) +{ +gdth_ha_str *ha; + +list_for_each_entry (ha, &gdth_instances, list) +if (hanum == ha->hanum) +return ha; + +return NULL ; +} +static void gdth_delay (int milliseconds) {if (milliseconds ==0 ) {
@@ -3755,7 +3765,7 @@ static void gdth_timeout(ulong data)gdth_ha_str *ha;ulong flags; - ha =shost_priv (gdth_ctr_tab[0 ]); + ha =list_first_entry (&gdth_instances, gdth_ha_str, list);spin_lock_irqsave (&ha->smp_lock, flags);for (act_stats=0 ,i=0 ; i<GDTH_MAXCMDS ; ++i)
@@ -4015,12 +4025,10 @@ static int gdth_queuecommand(struct scsi_cmnd *scp,static int gdth_open (struct inode *inode,struct file *filep) {gdth_ha_str *ha; -int i; -for (i =0 ; i < gdth_ctr_count; i++) { - ha =shost_priv (gdth_ctr_tab[i]); +list_for_each_entry (ha, &gdth_instances, list) {if (!ha->sdev) - ha->sdev =scsi_get_host_dev (gdth_ctr_tab[i]); + ha->sdev =scsi_get_host_dev (ha->shost); }TRACE (("gdth_open()\n" ));
@@ -4039,10 +4047,11 @@ static int ioc_event(void __user *arg)gdth_ha_str *ha;ulong flags; -if (copy_from_user (&evt, arg,sizeof (gdth_ioctl_event)) || - evt.ionode >= gdth_ctr_count) +if (copy_from_user (&evt, arg,sizeof (gdth_ioctl_event))) +return -EFAULT ; + ha =gdth_find_ha (evt.ionode); +if (!ha)return -EFAULT ; - ha =shost_priv (gdth_ctr_tab[evt.ionode]);if (evt.erase ==0xff ) {if (evt.event.event_source ==ES_TEST )
@@ -4076,11 +4085,12 @@ static int ioc_lockdrv(void __user *arg)ulong flags;gdth_ha_str *ha; -if (copy_from_user (&ldrv, arg,sizeof (gdth_ioctl_lockdrv)) || - ldrv.ionode >= gdth_ctr_count) +if (copy_from_user (&ldrv, arg,sizeof (gdth_ioctl_lockdrv)))return -EFAULT ; - ha =shost_priv (gdth_ctr_tab[ldrv.ionode]); - + ha =gdth_find_ha (ldrv.ionode); +if (!ha) +return -EFAULT ; +for (i =0 ; i < ldrv.drive_cnt && i <MAX_HDRIVES ; ++i) { j = ldrv.drives[i];if (j >=MAX_HDRIVES || !ha->hdr[j].present)
@@ -4110,9 +4120,11 @@ static int ioc_resetdrv(void __user *arg, char *cmnd)int rval;if (copy_from_user (&res, arg,sizeof (gdth_ioctl_reset)) || - res.ionode >= gdth_ctr_count || res.number >=MAX_HDRIVES ) + res.number >=MAX_HDRIVES ) +return -EFAULT ; + ha =gdth_find_ha (res.ionode); +if (!ha)return -EFAULT ; - ha =shost_priv (gdth_ctr_tab[res.ionode]);if (!ha->hdr[res.number].present)return 0 ;
@@ -4141,11 +4153,12 @@ static int ioc_general(void __user *arg, char *cmnd)ulong64 paddr;gdth_ha_str *ha;int rval; - -if (copy_from_user (&gen, arg,sizeof (gdth_ioctl_general)) || - gen.ionode >= gdth_ctr_count) + +if (copy_from_user (&gen, arg,sizeof (gdth_ioctl_general))) +return -EFAULT ; + ha =gdth_find_ha (gen.ionode); +if (!ha)return -EFAULT ; - ha =shost_priv (gdth_ctr_tab[gen.ionode]);if (gen.data_len + gen.sense_len !=0 ) {if (!(buf =gdth_ioctl_alloc (ha, gen.data_len + gen.sense_len, FALSE, &paddr)))
@@ -4265,11 +4278,10 @@ static int ioc_hdrlist(void __user *arg, char *cmnd) goto free_fail;if (copy_from_user (rsc, arg,sizeof (gdth_ioctl_rescan)) || - rsc->ionode >= gdth_ctr_count) { + (NULL == (ha =gdth_find_ha (rsc->ionode)))) { rc = -EFAULT ; goto free_fail; } - ha =shost_priv (gdth_ctr_tab[rsc->ionode]);memset (cmd,0 ,sizeof (gdth_cmd_str));for (i =0 ; i <MAX_HDRIVES ; ++i) {
@@ -4321,11 +4333,10 @@ static int ioc_rescan(void __user *arg, char *cmnd) goto free_fail;if (copy_from_user (rsc, arg,sizeof (gdth_ioctl_rescan)) || - rsc->ionode >= gdth_ctr_count) { + (NULL == (ha =gdth_find_ha (rsc->ionode)))) { rc = -EFAULT ; goto free_fail; } - ha =shost_priv (gdth_ctr_tab[rsc->ionode]);memset (cmd,0 ,sizeof (gdth_cmd_str));if (rsc->flag ==0 ) {
@@ -4482,9 +4493,9 @@ static int gdth_ioctl(struct inode *inode, struct file *filep,gdth_ioctl_ctrtype ctrt;if (copy_from_user (&ctrt, argp,sizeof (gdth_ioctl_ctrtype)) || - ctrt.ionode >= gdth_ctr_count) + (NULL == (ha =gdth_find_ha (ctrt.ionode))))return -EFAULT ; - ha =shost_priv (gdth_ctr_tab[ctrt.ionode]); +if (ha->type ==GDT_ISA || ha->type ==GDT_EISA ) { ctrt.type = (unchar)((ha->stype>>20 ) -0x10 ); }else {
@@ -4523,10 +4534,9 @@ static int gdth_ioctl(struct inode *inode, struct file *filep,unchar i, j;if (copy_from_user (&lchn, argp,sizeof (gdth_ioctl_lockchn)) || - lchn.ionode >= gdth_ctr_count) + (NULL == (ha =gdth_find_ha (lchn.ionode))))return -EFAULT ; - ha =shost_priv (gdth_ctr_tab[lchn.ionode]); - + i = lchn.channel;if (i < ha->bus_cnt) {if (lchn.lock) {
@@ -4562,9 +4572,8 @@ static int gdth_ioctl(struct inode *inode, struct file *filep,int rval;if (copy_from_user (&res, argp,sizeof (gdth_ioctl_reset)) || - res.ionode >= gdth_ctr_count) + (NULL == (ha =gdth_find_ha (res.ionode))))return -EFAULT ; - ha =shost_priv (gdth_ctr_tab[res.ionode]); scp =kzalloc (sizeof (*scp),GFP_KERNEL );if (!scp)
@@ -4626,7 +4635,7 @@ static void gdth_flush(gdth_ha_str *ha)/* shutdown routine */ static int gdth_halt (struct notifier_block *nb,ulong event,void *buf) { -int hanum; +gdth_ha_str *ha;#ifndef __alpha__gdth_cmd_str gdtcmd;char cmnd[MAX_COMMAND_SIZE ];
@@ -4641,8 +4650,7 @@ static int gdth_halt(struct notifier_block *nb, ulong event, void *buf) notifier_disabled =1 ;printk ("GDT-HA: Flushing all host drives .. " ); -for (hanum =0 ; hanum < gdth_ctr_count; ++hanum) { -gdth_ha_str *ha =shost_priv (gdth_ctr_tab[hanum]); +list_for_each_entry (ha, &gdth_instances, list) {gdth_flush (ha);#ifndef __alpha__
@@ -4695,7 +4703,7 @@ static int gdth_isa_probe_one(ulong32 isa_bios)struct Scsi_Host *shp;gdth_ha_str *ha;dma_addr_t scratch_dma_handle =0 ; -int error, hanum, i; +int error, i;if (!gdth_search_isa (isa_bios))return -ENXIO ;
@@ -4730,10 +4738,8 @@ static int gdth_isa_probe_one(ulong32 isa_bios) shp->unchecked_isa_dma =1 ; shp->irq = ha->irq; shp->dma_channel = ha->drq; - hanum = gdth_ctr_count; - gdth_ctr_tab[gdth_ctr_count++] = shp; - ha->hanum = (ushort )hanum; + ha->hanum = gdth_ctr_count++; ha->shost = shp; ha->pccb = &ha->cmdext;
@@ -4825,7 +4831,7 @@ static int gdth_eisa_probe_one(ushort eisa_slot)struct Scsi_Host *shp;gdth_ha_str *ha;dma_addr_t scratch_dma_handle =0 ; -int error, hanum, i; +int error, i;if (!gdth_search_eisa (eisa_slot))return -ENXIO ;
@@ -4852,10 +4858,8 @@ static int gdth_eisa_probe_one(ushort eisa_slot) shp->unchecked_isa_dma =0 ; shp->irq = ha->irq; shp->dma_channel =0xff ; - hanum = gdth_ctr_count; - gdth_ctr_tab[gdth_ctr_count++] = shp; - ha->hanum = (ushort )hanum; + ha->hanum = gdth_ctr_count++; ha->shost = shp;TRACE2 (("EISA detect Bus 0: hanum %d\n" , ha->hanum));
@@ -4956,7 +4960,7 @@ static int gdth_pci_probe_one(gdth_pci_str *pcistr, int ctr)struct Scsi_Host *shp;gdth_ha_str *ha;dma_addr_t scratch_dma_handle =0 ; -int error, hanum, i; +int error, i; shp =scsi_host_alloc (&gdth_template,sizeof (gdth_ha_str));if (!shp)
@@ -4983,10 +4987,8 @@ static int gdth_pci_probe_one(gdth_pci_str *pcistr, int ctr) shp->unchecked_isa_dma =0 ; shp->irq = ha->irq; shp->dma_channel =0xff ; - hanum = gdth_ctr_count; - gdth_ctr_tab[gdth_ctr_count++] = shp; - ha->hanum = (ushort )hanum; + ha->hanum = gdth_ctr_count++; ha->shost = shp; ha->pccb = &ha->cmdext;
@@ -5148,20 +5150,14 @@ static int __init gdth_init(void)ulong32 isa_bios;for (isa_bios =0xc8000UL ; isa_bios <=0xd8000UL ; isa_bios +=0x8000UL ) { -if (gdth_ctr_count >=MAXHA ) -break ;gdth_isa_probe_one (isa_bios); - }#endif #ifdef CONFIG_EISA {ushort eisa_slot;for (eisa_slot =0x1000 ; eisa_slot <=0x8000 ; - eisa_slot +=0x1000 ) { -if (gdth_ctr_count >=MAXHA ) -break ; + eisa_slot +=0x1000 )gdth_eisa_probe_one (eisa_slot); - } }#endif }
@@ -5175,11 +5171,8 @@ static int __init gdth_init(void) cnt =gdth_search_pci (pcistr);printk ("GDT-HA: Found %d PCI Storage RAID Controllers\n" , cnt);gdth_sort_pci (pcistr,cnt); -for (ctr =0 ; ctr < cnt; ++ctr) { -if (gdth_ctr_count >=MAXHA ) -break ; +for (ctr =0 ; ctr < cnt; ++ctr) gdth_pci_probe_one(pcistr, ctr); - } }#endif /* CONFIG_PCI */
Signature · 1 line
1.5.3.1
PATCH 14/16 gdth: Setup proper per-command private data
In reply to Boaz Harrosh - scsi_cmnd and specifically ->SCp of, where heavily abused with internal meaning members and flags. So introduce a new struct gdth_cmndinfo, put it on ->host_scribble and define a gdth_cmnd_priv() accessor to retrieve it from a scsi_cmnd.
- The structure now holds two members:
internal_command - replaces the IS_GDTH_INTERNAL_CMD() croft. sense_paddr - which was a 64-bit spanning on 2 32-bit members of SCp. More overloaded members from SCp and scsi_cmnd will be moved in a later patch (For easy review).
- Split up gdth_queuecommand to an additional internal_function. The later is the one called by gdth_execute(). This will be more evident later in the scsi accessors patch, but it also facilitates in the differentiation between internal_command and external. And the setup of gdth_cmndinfo of each command.
Signed-off-by Boaz Harrosh <[email protected]>
--- drivers/scsi/gdth.c | 111 ++++++++++++++++++++++++++++++++-------------- drivers/scsi/gdth.h | 10 ++++ drivers/scsi/gdth_proc.c | 6 ++- 3 files changed, 91 insertions(+), 36 deletions(-)
drivers/scsi/gdth.c +77 -34
@@ -86,8 +86,8 @@/* The meaning of the Scsi_Pointer members in this driver is as follows: * ptr: Chaining * this_residual: Command priority -* buffer: phys. DMA sense buffer -* dma_handle: phys. DMA buffer (kernel >= 2.4.0) +* buffer: unused +* dma_handle: will drop in !use_sg patch. * buffers_residual: Timeout value * Status: Command status (gdth_do_cmd()), DMA mem. mappings * Message: Additional info (gdth_do_cmd()), DMA direction
@@ -184,6 +184,8 @@ static int gdth_ioctl(struct inode *inode, struct file *filep,static void gdth_flush (gdth_ha_str *ha);static int gdth_halt (struct notifier_block *nb,ulong event,void *buf);static int gdth_queuecommand (Scsi_Cmnd *scp,void (*done)(Scsi_Cmnd *)); +static int __gdth_queuecommand (gdth_ha_str *ha,struct scsi_cmnd *scp, +struct gdth_cmndinfo *cmndinfo);static void gdth_scsi_done (struct scsi_cmnd *scp);#ifdef DEBUG_GDTH
@@ -371,9 +373,6 @@ static const struct file_operations gdth_fops = { .release = gdth_close, }; -#define GDTH_MAGIC 0xc2e7c389/* I got it from /dev/urandom */ -#define IS_GDTH_INTERNAL_CMD (scp) (scp->underflow == GDTH_MAGIC) -#include "gdth_proc.h" #include "gdth_proc.c"
@@ -394,6 +393,34 @@ static gdth_ha_str *gdth_find_ha(int hanum)return NULL ; } +static struct gdth_cmndinfo *gdth_get_cmndinfo (gdth_ha_str *ha) +{ +struct gdth_cmndinfo *priv =NULL ; +ulong flags; +int i; + +spin_lock_irqsave (&ha->smp_lock, flags); + +for (i=0 ; i<GDTH_MAXCMDS ; ++i) { +if (ha->cmndinfo[i].index ==0 ) { + priv = &ha->cmndinfo[i]; + priv->index = i; +memset (priv,0 ,sizeof (*priv)); +break ; + } + } + +spin_unlock_irqrestore (&ha->smp_lock, flags); + +return priv; +} + +static void gdth_put_cmndinfo (struct gdth_cmndinfo *priv) +{ +BUG_ON (!priv); + priv->index =0 ; +} +static void gdth_delay (int milliseconds) {if (milliseconds ==0 ) {
@@ -405,9 +432,15 @@ static void gdth_delay(int milliseconds)static void gdth_scsi_done (struct scsi_cmnd *scp) { +struct gdth_cmndinfo *cmndinfo =gdth_cmnd_priv (scp); +int internal_command = cmndinfo->internal_command; +TRACE2 (("gdth_scsi_done()\n" )); -if (IS_GDTH_INTERNAL_CMD (scp)) +gdth_put_cmndinfo (cmndinfo); + scp->host_scribble =NULL ; + +if (internal_command)complete ((struct completion *)scp->request);else scp->scsi_done (scp);
@@ -416,7 +449,9 @@ static void gdth_scsi_done(struct scsi_cmnd *scp)int __gdth_execute (struct scsi_device *sdev,gdth_cmd_str *gdtcmd,char *cmnd,int timeout,u32 *info) { +gdth_ha_str *ha =shost_priv (sdev->host);Scsi_Cmnd *scp; +struct gdth_cmndinfo cmndinfo;DECLARE_COMPLETION_ONSTACK (wait);int rval;
@@ -425,6 +460,8 @@ int __gdth_execute(struct scsi_device *sdev, gdth_cmd_str *gdtcmd, char *cmnd,return -ENOMEM ; scp->device = sdev; +memset (&cmndinfo,0 ,sizeof (cmndinfo)); +/* use request field to save the ptr. to completion struct. */ scp->request = (struct request *)&wait; scp->timeout_per_command = timeout*HZ ;
@@ -432,8 +469,11 @@ int __gdth_execute(struct scsi_device *sdev, gdth_cmd_str *gdtcmd, char *cmnd, scp->cmd_len =12 ;memcpy (scp->cmnd, cmnd,12 ); scp->SCp.this_residual =IOCTL_PRI ;/* priority */ - scp->underflow =GDTH_MAGIC ; -gdth_queuecommand (scp,NULL ); + cmndinfo.internal_command =1 ; + +TRACE (("__gdth_execute() cmd 0x%x\n" , scp->cmnd[0 ])); +__gdth_queuecommand (ha, scp, &cmndinfo); +wait_for_completion (&wait); rval = scp->SCp.Status;
@@ -1966,6 +2006,7 @@ static int gdth_analyse_hdrive(gdth_ha_str *ha, ushort hdrive)static void gdth_putq (gdth_ha_str *ha,Scsi_Cmnd *scp,unchar priority) { +struct gdth_cmndinfo *cmndinfo =gdth_cmnd_priv (scp); registerScsi_Cmnd *pscp; registerScsi_Cmnd *nscp;ulong flags;
@@ -1974,7 +2015,7 @@ static void gdth_putq(gdth_ha_str *ha, Scsi_Cmnd *scp, unchar priority)TRACE (("gdth_putq() priority %d\n" ,priority));spin_lock_irqsave (&ha->smp_lock, flags); -if (!IS_GDTH_INTERNAL_CMD (scp)) { +if (!cmndinfo->internal_command) { scp->SCp.this_residual = (int )priority; b = scp->device->channel; t = scp->device->id;
@@ -2035,7 +2076,7 @@ static void gdth_next(gdth_ha_str *ha)for (nscp = pscp = ha->req_first; nscp; nscp = (Scsi_Cmnd *)nscp->SCp.ptr) {if (nscp != pscp && nscp != (Scsi_Cmnd *)pscp->SCp.ptr) pscp = (Scsi_Cmnd *)pscp->SCp.ptr; -if (!IS_GDTH_INTERNAL_CMD (nscp)) { +if (!gdth_cmnd_priv (nscp)->internal_command) { b = nscp->device->channel; t = nscp->device->id; l = nscp->device->lun;
@@ -2060,7 +2101,7 @@ static void gdth_next(gdth_ha_str *ha) firsttime = FALSE; } -if (!IS_GDTH_INTERNAL_CMD (nscp)) { +if (!gdth_cmnd_priv (nscp)->internal_command) {if (nscp->SCp.phase ==-1 ) { nscp->SCp.phase =CACHESERVICE ;/* default: cache svc. */ if (nscp->cmnd[0 ] ==TEST_UNIT_READY ) {
@@ -2123,7 +2164,7 @@ static void gdth_next(gdth_ha_str *ha)else gdth_scsi_done (nscp); } - }else if (IS_GDTH_INTERNAL_CMD (nscp)) { + }else if (gdth_cmnd_priv (nscp)->internal_command) {if (!(cmd_index=gdth_special_cmd (ha, nscp))) this_cmd = FALSE; next_cmd = FALSE;
@@ -2622,6 +2663,7 @@ static int gdth_fill_raw_cmd(gdth_ha_str *ha, Scsi_Cmnd *scp, unchar b)unchar t,l;struct page *page;ulong offset; +struct gdth_cmndinfo *cmndinfo; t = scp->device->id; l = scp->device->lun;
@@ -2645,6 +2687,7 @@ static int gdth_fill_raw_cmd(gdth_ha_str *ha, Scsi_Cmnd *scp, unchar b)if (ha->cmd_cnt ==0 )gdth_set_sema0 (ha); + cmndinfo =gdth_cmnd_priv (scp);/* fill command */ if (scp->SCp.sent_command !=-1 ) { cmdp->OpCode = scp->SCp.sent_command;/* special raw cmd. */
@@ -2668,9 +2711,8 @@ static int gdth_fill_raw_cmd(gdth_ha_str *ha, Scsi_Cmnd *scp, unchar b) offset = (ulong )scp->sense_buffer & ~PAGE_MASK ; sense_paddr =pci_map_page (ha->pdev,page,offset,16 ,PCI_DMA_FROMDEVICE ); - *(ulong32 *)&scp->SCp.buffer = (ulong32 )sense_paddr; -/* high part, if 64bit */ - *(ulong32 *)&scp->host_scribble = (ulong32)((ulong64 )sense_paddr >>32 ); + + cmndinfo->sense_paddr = sense_paddr; cmdp->OpCode =GDT_WRITE ;/* always */ cmdp->BoardNode =LOCALBOARD ;if (mode64) {
@@ -3271,6 +3313,7 @@ static int gdth_sync_event(gdth_ha_str *ha, int service, unchar index,gdth_msg_str *msg;gdth_cmd_str *cmdp;unchar b, t; +struct gdth_cmndinfo *cmndinfo =gdth_cmnd_priv (scp); cmdp = ha->pccb; TRACE(("gdth_sync_event() serv %d status %d\n",
@@ -3364,14 +3407,9 @@ static int gdth_sync_event(gdth_ha_str *ha, int service, unchar index,else if (scp->SCp.Status ==GDTH_MAP_SINGLE )pci_unmap_page (ha->pdev,scp->SCp.dma_handle, scp->request_bufflen,scp->SCp.Message); -if (scp->SCp.buffer) { -dma_addr_t addr; - addr = (dma_addr_t)*(ulong32 *)&scp->SCp.buffer; -if (scp->host_scribble) - addr += (dma_addr_t) - ((ulong64)(*(ulong32 *)&scp->host_scribble) <<32 ); -pci_unmap_page (ha->pdev,addr,16 ,PCI_DMA_FROMDEVICE ); - } +if (cmndinfo->sense_paddr) +pci_unmap_page (ha->pdev, cmndinfo->sense_paddr,16 , +PCI_DMA_FROMDEVICE );if (ha->status ==S_OK ) { scp->SCp.Status =S_OK ;
@@ -3450,7 +3488,7 @@ static int gdth_sync_event(gdth_ha_str *ha, int service, unchar index, scp->sense_buffer[2 ] =NOT_READY ; scp->result = (DID_OK <<16 ) | (CHECK_CONDITION <<1 ); } -if (!IS_GDTH_INTERNAL_CMD (scp)) { +if (!cmndinfo->internal_command) { ha->dvr.size =sizeof (ha->dvr.eu.sync); ha->dvr.eu.sync.ionode = ha->hanum; ha->dvr.eu.sync.service = service;
@@ -3995,28 +4033,33 @@ static int gdth_queuecommand(struct scsi_cmnd *scp, void (*done)(struct scsi_cmnd *)) {gdth_ha_str *ha =shost_priv (scp->device->host); -int priority; +struct gdth_cmndinfo *cmndinfo;TRACE (("gdth_queuecommand() cmd 0x%x\n" , scp->cmnd[0 ])); - + + cmndinfo =gdth_get_cmndinfo (ha); +BUG_ON (!cmndinfo); + scp->scsi_done = done; +gdth_update_timeout (scp, scp->timeout_per_command *6 ); + scp->SCp.this_residual =DEFAULT_PRI ; +return __gdth_queuecommand (ha, scp, cmndinfo); +} + +static int __gdth_queuecommand (gdth_ha_str *ha,struct scsi_cmnd *scp, +struct gdth_cmndinfo *cmndinfo) +{ + scp->host_scribble = (unsigned char *)cmndinfo; scp->SCp.have_data_in =1 ; scp->SCp.phase =-1 ; scp->SCp.sent_command =-1 ; scp->SCp.Status =GDTH_MAP_NONE ; - scp->SCp.buffer = (struct scatterlist *)NULL ;#ifdef GDTH_STATISTICS ++act_ios;#endif - priority =DEFAULT_PRI ; -if (IS_GDTH_INTERNAL_CMD (scp)) - priority = scp->SCp.this_residual; -else -gdth_update_timeout (scp, scp->timeout_per_command *6 ); - -gdth_putq (ha, scp, priority); +gdth_putq (ha, scp, scp->SCp.this_residual);gdth_next (ha);return 0 ; }
drivers/scsi/gdth.h +10 -0
@@ -919,6 +919,11 @@ typedef struct {Scsi_Cmnd *cmnd;/* pending request */ ushort service;/* service */ } cmd_tab[GDTH_MAXCMDS ];/* table of pend. requests */ +struct gdth_cmndinfo {/* per-command private info */ +int index; +int internal_command;/* don't call scsi_done */ +dma_addr_t sense_paddr;/* sense dma-addr */ + } cmndinfo[GDTH_MAXCMDS ];/* index==0 is free */ unchar bus_cnt;/* SCSI bus count */ unchar tid_cnt;/* Target ID count */ unchar bus_id[MAXBUS ];/* IOP IDs */
@@ -941,6 +946,11 @@ typedef struct {struct scsi_device *sdev; } gdth_ha_str; +static inline struct gdth_cmndinfo *gdth_cmnd_priv (struct scsi_cmnd * cmd) +{ +return (struct gdth_cmndinfo *)cmd->host_scribble; +} +/* INQUIRY data format */ typedef struct { unchar type_qual;
drivers/scsi/gdth_proc.c +4 -2
@@ -758,7 +758,8 @@ static void gdth_stop_timeout(gdth_ha_str *ha, int busnum, int id)spin_lock_irqsave (&ha->smp_lock, flags);for (scp = ha->req_first; scp; scp = (Scsi_Cmnd *)scp->SCp.ptr) { -if (IS_GDTH_INTERNAL_CMD (scp)) { +struct gdth_cmndinfo *cmndinfo =gdth_cmnd_priv (scp); +if (!cmndinfo->internal_command) { b = scp->device->channel; t = scp->device->id;if (t == (unchar )id && b == (unchar )busnum) {
@@ -779,7 +780,8 @@ static void gdth_start_timeout(gdth_ha_str *ha, int busnum, int id)spin_lock_irqsave (&ha->smp_lock, flags);for (scp = ha->req_first; scp; scp = (Scsi_Cmnd *)scp->SCp.ptr) { -if (!IS_GDTH_INTERNAL_CMD (scp)) { +struct gdth_cmndinfo *cmndinfo =gdth_cmnd_priv (scp); +if (!cmndinfo->internal_command) { b = scp->device->channel; t = scp->device->id;if (t == (unchar )id && b == (unchar )busnum) {
Signature · 1 line
1.5.3.1
PATCH 15/16 gdth: Move members from SCp to gdth_cmndinfo, stage 2
In reply to Boaz Harrosh - Cleanup the rest of the scsi_cmnd->SCp members and move them to gdth_cmndinfo:
SCp.this_residual => priority
SCp.buffers_residual => timeout
SCp.Status => status and dma_dir
SCp.Message => info
SCp.have_data_in => volatile wait_for_completion
SCp.sent_command => OpCode
SCp.phase => phase
- Two more members will be naturally removed in the !use_sg cleanup
TODO: What is the meaning of gdth_cmndinfo.phase? (rhetorically)
Signed-off-by Boaz Harrosh <[email protected]>
--- drivers/scsi/gdth.c | 177 +++++++++++++++++++++++---------------------- drivers/scsi/gdth.h | 8 ++ drivers/scsi/gdth_proc.c | 10 ++- 3 files changed, 104 insertions(+), 91 deletions(-)
drivers/scsi/gdth.c +90 -87
@@ -85,15 +85,15 @@/* The meaning of the Scsi_Pointer members in this driver is as follows: * ptr: Chaining -* this_residual: Command priority +* this_residual: unused * buffer: unused * dma_handle: will drop in !use_sg patch. -* buffers_residual: Timeout value -* Status: Command status (gdth_do_cmd()), DMA mem. mappings -* Message: Additional info (gdth_do_cmd()), DMA direction -* have_data_in: Flag for gdth_wait_completion() -* sent_command: Opcode special command -* phase: Service/parameter/return code special command +* buffers_residual: unused +* Status: DMA mem. mappings (FIXME: drop in !use_sg patch.) +* Message: unused +* have_data_in: unused +* sent_command: unused +* phase: unused */
@@ -468,7 +468,7 @@ int __gdth_execute(struct scsi_device *sdev, gdth_cmd_str *gdtcmd, char *cmnd, scp->request_buffer = gdtcmd; scp->cmd_len =12 ;memcpy (scp->cmnd, cmnd,12 ); - scp->SCp.this_residual =IOCTL_PRI ;/* priority */ + cmndinfo.priority =IOCTL_PRI ; cmndinfo.internal_command =1 ;TRACE (("__gdth_execute() cmd 0x%x\n" , scp->cmnd[0 ]));
@@ -476,9 +476,9 @@ int __gdth_execute(struct scsi_device *sdev, gdth_cmd_str *gdtcmd, char *cmnd,wait_for_completion (&wait); - rval = scp->SCp.Status; + rval = cmndinfo.status;if (info) - *info = scp->SCp.Message; + *info = cmndinfo.info;kfree (scp);return rval; }
@@ -2016,14 +2016,14 @@ static void gdth_putq(gdth_ha_str *ha, Scsi_Cmnd *scp, unchar priority)spin_lock_irqsave (&ha->smp_lock, flags);if (!cmndinfo->internal_command) { - scp->SCp.this_residual = (int )priority; + cmndinfo->priority = priority; b = scp->device->channel; t = scp->device->id;if (priority >=DEFAULT_PRI ) {if ((b != ha->virt_bus && ha->raw[BUS_L2P (ha,b)].lock) || (b==ha->virt_bus && t<MAX_HDRIVES && ha->hdr[t].lock)) {TRACE2 (("gdth_putq(): locked IO ->update_timeout()\n" )); - scp->SCp.buffers_residual =gdth_update_timeout (scp,0 ); + cmndinfo->timeout =gdth_update_timeout (scp,0 ); } } }
@@ -2035,7 +2035,7 @@ static void gdth_putq(gdth_ha_str *ha, Scsi_Cmnd *scp, unchar priority) pscp = ha->req_first; nscp = (Scsi_Cmnd *)pscp->SCp.ptr;/* priority: 0-highest,..,0xff-lowest */ -while (nscp && (unchar )nscp->SCp.this_residual <= priority) { +while (nscp &&gdth_cmnd_priv (nscp)->priority <= priority) { pscp = nscp; nscp = (Scsi_Cmnd *)pscp->SCp.ptr; }
@@ -2074,13 +2074,14 @@ static void gdth_next(gdth_ha_str *ha) cmd_index =0 ;for (nscp = pscp = ha->req_first; nscp; nscp = (Scsi_Cmnd *)nscp->SCp.ptr) { +struct gdth_cmndinfo *nscp_cmndinfo =gdth_cmnd_priv (nscp);if (nscp != pscp && nscp != (Scsi_Cmnd *)pscp->SCp.ptr) pscp = (Scsi_Cmnd *)pscp->SCp.ptr; -if (!gdth_cmnd_priv (nscp)->internal_command) { +if (!nscp_cmndinfo->internal_command) { b = nscp->device->channel; t = nscp->device->id; l = nscp->device->lun; -if (nscp->SCp.this_residual >=DEFAULT_PRI ) { +if (nscp_cmndinfo->priority >=DEFAULT_PRI ) {if ((b != ha->virt_bus && ha->raw[BUS_L2P (ha,b)].lock) || (b == ha->virt_bus && t <MAX_HDRIVES && ha->hdr[t].lock))continue ;
@@ -2101,9 +2102,9 @@ static void gdth_next(gdth_ha_str *ha) firsttime = FALSE; } -if (!gdth_cmnd_priv (nscp)->internal_command) { -if (nscp->SCp.phase ==-1 ) { - nscp->SCp.phase =CACHESERVICE ;/* default: cache svc. */ +if (!nscp_cmndinfo->internal_command) { +if (nscp_cmndinfo->phase ==-1 ) { + nscp_cmndinfo->phase =CACHESERVICE ;/* default: cache svc. */ if (nscp->cmnd[0 ] ==TEST_UNIT_READY ) {TRACE2 (("TEST_UNIT_READY Bus %d Id %d LUN %d\n" , b, t, l));
@@ -2116,8 +2117,8 @@ static void gdth_next(gdth_ha_str *ha) }else if ((ha->scan_mode &0x0f ) ==1 ) {if (b ==0 && ((t ==0 && l ==1 ) || (t ==1 && l ==0 ))) { - nscp->SCp.sent_command =GDT_SCAN_START ; - nscp->SCp.phase = ((ha->scan_mode &0x10 ?1 :0 ) <<8 ) + nscp_cmndinfo->OpCode =GDT_SCAN_START ; + nscp_cmndinfo->phase = ((ha->scan_mode &0x10 ?1 :0 ) <<8 ) |SCSIRAWSERVICE ; ha->scan_mode =0x12 ; TRACE2(("Scan mode: 0x%x (SCAN_START)\n",
@@ -2128,8 +2129,8 @@ static void gdth_next(gdth_ha_str *ha) } }else if (ha->scan_mode ==0x12 ) {if (b == ha->bus_cnt && t == ha->tid_cnt-1 ) { - nscp->SCp.phase =SCSIRAWSERVICE ; - nscp->SCp.sent_command =GDT_SCAN_END ; + nscp_cmndinfo->phase =SCSIRAWSERVICE ; + nscp_cmndinfo->OpCode =GDT_SCAN_END ; ha->scan_mode &=0x10 ;TRACE2 (("Scan mode: 0x%x (SCAN_END)\n" , ha->scan_mode));
@@ -2140,17 +2141,17 @@ static void gdth_next(gdth_ha_str *ha) nscp->cmnd[0] != READ_CAPACITY && nscp->cmnd[0] != MODE_SENSE && (ha->hdr[t].cluster_type & CLUSTER_DRIVE)) {/* always GDT_CLUST_INFO! */ - nscp->SCp.sent_command =GDT_CLUST_INFO ; + nscp_cmndinfo->OpCode =GDT_CLUST_INFO ; } } } -if (nscp->SCp.sent_command !=-1 ) { -if ((nscp->SCp.phase &0xff ) ==CACHESERVICE ) { +if (nscp_cmndinfo->OpCode !=-1 ) { +if ((nscp_cmndinfo->phase &0xff ) ==CACHESERVICE ) {if (!(cmd_index=gdth_fill_cache_cmd (ha, nscp, t))) this_cmd = FALSE; next_cmd = FALSE; - }else if ((nscp->SCp.phase &0xff ) ==SCSIRAWSERVICE ) { + }else if ((nscp_cmndinfo->phase &0xff ) ==SCSIRAWSERVICE ) {if (!(cmd_index=gdth_fill_raw_cmd (ha, nscp,BUS_L2P (ha, b)))) this_cmd = FALSE; next_cmd = FALSE;
@@ -2159,8 +2160,8 @@ static void gdth_next(gdth_ha_str *ha) nscp->sense_buffer[0 ] =0x70 ; nscp->sense_buffer[2 ] =NOT_READY ; nscp->result = (DID_OK <<16 ) | (CHECK_CONDITION <<1 ); -if (!nscp->SCp.have_data_in) - nscp->SCp.have_data_in++; +if (!nscp_cmndinfo->wait_for_completion) + nscp_cmndinfo->wait_for_completion++;else gdth_scsi_done (nscp); }
@@ -2178,8 +2179,8 @@ static void gdth_next(gdth_ha_str *ha)TRACE2 (("Command 0x%x to bus %d id %d lun %d -> IGNORE\n" , nscp->cmnd[0 ], b, t, l)); nscp->result =DID_BAD_TARGET <<16 ; -if (!nscp->SCp.have_data_in) - nscp->SCp.have_data_in++; +if (!nscp_cmndinfo->wait_for_completion) + nscp_cmndinfo->wait_for_completion++;else gdth_scsi_done (nscp); }else {
@@ -2204,8 +2205,8 @@ static void gdth_next(gdth_ha_str *ha) nscp->sense_buffer[0 ] =0x70 ; nscp->sense_buffer[2 ] =UNIT_ATTENTION ; nscp->result = (DID_OK <<16 ) | (CHECK_CONDITION <<1 ); -if (!nscp->SCp.have_data_in) - nscp->SCp.have_data_in++; +if (!nscp_cmndinfo->wait_for_completion) + nscp_cmndinfo->wait_for_completion++;else gdth_scsi_done (nscp); }else if (gdth_internal_cache_cmd (ha, nscp))
@@ -2220,8 +2221,8 @@ static void gdth_next(gdth_ha_str *ha)TRACE (("Prevent r. nonremov. drive->do nothing\n" )); nscp->result =DID_OK <<16 ; nscp->sense_buffer[0 ] =0 ; -if (!nscp->SCp.have_data_in) - nscp->SCp.have_data_in++; +if (!nscp_cmndinfo->wait_for_completion) + nscp_cmndinfo->wait_for_completion++;else gdth_scsi_done (nscp); }else {
@@ -2256,8 +2257,8 @@ static void gdth_next(gdth_ha_str *ha) nscp->sense_buffer[0 ] =0x70 ; nscp->sense_buffer[2 ] =UNIT_ATTENTION ; nscp->result = (DID_OK <<16 ) | (CHECK_CONDITION <<1 ); -if (!nscp->SCp.have_data_in) - nscp->SCp.have_data_in++; +if (!nscp_cmndinfo->wait_for_completion) + nscp_cmndinfo->wait_for_completion++;else gdth_scsi_done (nscp); }else if (!(cmd_index=gdth_fill_cache_cmd (ha, nscp, t)))
@@ -2271,8 +2272,8 @@ static void gdth_next(gdth_ha_str *ha)printk ("GDT-HA %d: Unknown SCSI command 0x%x to cache service !\n" , ha->hanum, nscp->cmnd[0 ]); nscp->result =DID_ABORT <<16 ; -if (!nscp->SCp.have_data_in) - nscp->SCp.have_data_in++; +if (!nscp_cmndinfo->wait_for_completion) + nscp_cmndinfo->wait_for_completion++;else gdth_scsi_done (nscp);break ;
@@ -2351,6 +2352,7 @@ static int gdth_internal_cache_cmd(gdth_ha_str *ha, Scsi_Cmnd *scp)gdth_rdcap_data rdc;gdth_sense_data sd;gdth_modep_data mpd; +struct gdth_cmndinfo *cmndinfo =gdth_cmnd_priv (scp); t = scp->device->id; TRACE(("gdth_internal_cache_cmd() cmd 0x%x hdrive %d\n",
@@ -2437,8 +2439,8 @@ static int gdth_internal_cache_cmd(gdth_ha_str *ha, Scsi_Cmnd *scp)break ; } -if (!scp->SCp.have_data_in) - scp->SCp.have_data_in++; +if (!cmndinfo->wait_for_completion) + cmndinfo->wait_for_completion++;else return 1 ;
@@ -2448,6 +2450,7 @@ static int gdth_internal_cache_cmd(gdth_ha_str *ha, Scsi_Cmnd *scp)static int gdth_fill_cache_cmd (gdth_ha_str *ha,Scsi_Cmnd *scp,ushort hdrive) { registergdth_cmd_str *cmdp; +struct gdth_cmndinfo *cmndinfo =gdth_cmnd_priv (scp);struct scatterlist *sl;ulong32 cnt, blockcnt;ulong64 no, blockno;
@@ -2481,8 +2484,8 @@ static int gdth_fill_cache_cmd(gdth_ha_str *ha, Scsi_Cmnd *scp, ushort hdrive)/* fill command */ read_write =0 ; -if (scp->SCp.sent_command !=-1 ) - cmdp->OpCode = scp->SCp.sent_command;/* special cache cmd. */ +if (cmndinfo->OpCode !=-1 ) + cmdp->OpCode = cmndinfo->OpCode;/* special cache cmd. */ else if (scp->cmnd[0 ] ==RESERVE ) cmdp->OpCode =GDT_RESERVE_DRV ;else if (scp->cmnd[0 ] ==RELEASE )
@@ -2547,9 +2550,9 @@ static int gdth_fill_cache_cmd(gdth_ha_str *ha, Scsi_Cmnd *scp, ushort hdrive) sl = (struct scatterlist *)scp->request_buffer; sgcnt = scp->use_sg; scp->SCp.Status =GDTH_MAP_SG ; - scp->SCp.Message = (read_write ==1 ? + cmndinfo->dma_dir = (read_write ==1 ?PCI_DMA_TODEVICE :PCI_DMA_FROMDEVICE ); - sgcnt =pci_map_sg (ha->pdev,sl,scp->use_sg,scp->SCp.Message); + sgcnt =pci_map_sg (ha->pdev, sl, scp->use_sg, cmndinfo->dma_dir);if (mode64) { cmdp->u.cache64.DestAddr= (ulong64)-1 ; cmdp->u.cache64.sg_canz = sgcnt;
@@ -2584,12 +2587,12 @@ static int gdth_fill_cache_cmd(gdth_ha_str *ha, Scsi_Cmnd *scp, ushort hdrive) }else if (scp->request_bufflen) { scp->SCp.Status =GDTH_MAP_SINGLE ; - scp->SCp.Message = (read_write ==1 ? + cmndinfo->dma_dir = (read_write ==1 ?PCI_DMA_TODEVICE :PCI_DMA_FROMDEVICE ); page =virt_to_page (scp->request_buffer); offset = (ulong )scp->request_buffer & ~PAGE_MASK ; phys_addr =pci_map_page (ha->pdev,page,offset, - scp->request_bufflen,scp->SCp.Message); + scp->request_bufflen, cmndinfo->dma_dir); scp->SCp.dma_handle = phys_addr;if (mode64) {if (ha->cache_feat &SCATTER_GATHER ) {
@@ -2689,17 +2692,17 @@ static int gdth_fill_raw_cmd(gdth_ha_str *ha, Scsi_Cmnd *scp, unchar b) cmndinfo =gdth_cmnd_priv (scp);/* fill command */ -if (scp->SCp.sent_command !=-1 ) { - cmdp->OpCode = scp->SCp.sent_command;/* special raw cmd. */ +if (cmndinfo->OpCode !=-1 ) { + cmdp->OpCode = cmndinfo->OpCode;/* special raw cmd. */ cmdp->BoardNode =LOCALBOARD ;if (mode64) { - cmdp->u.raw64.direction = (scp->SCp.phase >>8 ); + cmdp->u.raw64.direction = (cmndinfo->phase >>8 );TRACE2 (("special raw cmd 0x%x param 0x%x\n" , cmdp->OpCode, cmdp->u.raw64.direction));/* evaluate command size */ ha->cmd_len =GDTOFFSOF (gdth_cmd_str,u.raw64.sg_lst); }else { - cmdp->u.raw.direction = (scp->SCp.phase >>8 ); + cmdp->u.raw.direction = (cmndinfo->phase >>8 );TRACE2 (("special raw cmd 0x%x param 0x%x\n" , cmdp->OpCode, cmdp->u.raw.direction));/* evaluate command size */
@@ -2754,8 +2757,8 @@ static int gdth_fill_raw_cmd(gdth_ha_str *ha, Scsi_Cmnd *scp, unchar b) sl = (struct scatterlist *)scp->request_buffer; sgcnt = scp->use_sg; scp->SCp.Status =GDTH_MAP_SG ; - scp->SCp.Message =PCI_DMA_BIDIRECTIONAL ; - sgcnt =pci_map_sg (ha->pdev,sl,scp->use_sg,scp->SCp.Message); + cmndinfo->dma_dir =PCI_DMA_BIDIRECTIONAL ; + sgcnt =pci_map_sg (ha->pdev,sl, scp->use_sg, cmndinfo->dma_dir);if (mode64) { cmdp->u.raw64.sdata = (ulong64)-1 ; cmdp->u.raw64.sg_ranz = sgcnt;
@@ -2790,11 +2793,11 @@ static int gdth_fill_raw_cmd(gdth_ha_str *ha, Scsi_Cmnd *scp, unchar b) }else if (scp->request_bufflen) { scp->SCp.Status =GDTH_MAP_SINGLE ; - scp->SCp.Message =PCI_DMA_BIDIRECTIONAL ; + cmndinfo->dma_dir =PCI_DMA_BIDIRECTIONAL ; page =virt_to_page (scp->request_buffer); offset = (ulong )scp->request_buffer & ~PAGE_MASK ; phys_addr =pci_map_page (ha->pdev,page,offset, - scp->request_bufflen,scp->SCp.Message); + scp->request_bufflen, cmndinfo->dma_dir); scp->SCp.dma_handle = phys_addr;if (mode64) {
@@ -3266,7 +3269,7 @@ static irqreturn_t __gdth_interrupt(gdth_ha_str *ha, int irq,if (!gdth_polling)spin_unlock_irqrestore (&ha->smp_lock, flags);if (rval ==2 ) { -gdth_putq (ha, scp,scp->SCp.this_residual); +gdth_putq (ha, scp,gdth_cmnd_priv (scp)->priority); }else if (rval ==1 ) {gdth_scsi_done (scp); }
@@ -3390,60 +3393,60 @@ static int gdth_sync_event(gdth_ha_str *ha, int service, unchar index, }else { b = scp->device->channel; t = scp->device->id; -if (scp->SCp.sent_command ==-1 && b != ha->virt_bus) { +if (cmndinfo->OpCode ==-1 && b != ha->virt_bus) { ha->raw[BUS_L2P (ha,b)].io_cnt[t]--; }/* cache or raw service */ if (ha->status ==S_BSY ) {TRACE2 (("Controller busy -> retry !\n" )); -if (scp->SCp.sent_command ==GDT_MOUNT ) - scp->SCp.sent_command =GDT_CLUST_INFO ; +if (cmndinfo->OpCode ==GDT_MOUNT ) + cmndinfo->OpCode =GDT_CLUST_INFO ;/* retry */ return 2 ; }if (scp->SCp.Status ==GDTH_MAP_SG )pci_unmap_sg (ha->pdev,scp->request_buffer, - scp->use_sg,scp->SCp.Message); + scp->use_sg, cmndinfo->dma_dir);else if (scp->SCp.Status ==GDTH_MAP_SINGLE )pci_unmap_page (ha->pdev,scp->SCp.dma_handle, - scp->request_bufflen,scp->SCp.Message); + scp->request_bufflen, cmndinfo->dma_dir);if (cmndinfo->sense_paddr)pci_unmap_page (ha->pdev, cmndinfo->sense_paddr,16 ,PCI_DMA_FROMDEVICE );if (ha->status ==S_OK ) { - scp->SCp.Status =S_OK ; - scp->SCp.Message = ha->info; -if (scp->SCp.sent_command !=-1 ) { + cmndinfo->status =S_OK ; + cmndinfo->info = ha->info; +if (cmndinfo->OpCode !=-1 ) {TRACE2 (("gdth_sync_event(): special cmd 0x%x OK\n" , - scp->SCp.sent_command)); + cmndinfo->OpCode));/* special commands GDT_CLUST_INFO/GDT_MOUNT ? */ -if (scp->SCp.sent_command ==GDT_CLUST_INFO ) { +if (cmndinfo->OpCode ==GDT_CLUST_INFO ) { ha->hdr[t].cluster_type = (unchar )ha->info;if (!(ha->hdr[t].cluster_type &CLUSTER_MOUNTED )) {/* NOT MOUNTED -> MOUNT */ - scp->SCp.sent_command =GDT_MOUNT ; + cmndinfo->OpCode =GDT_MOUNT ;if (ha->hdr[t].cluster_type &CLUSTER_RESERVED ) {/* cluster drive RESERVED (on the other node) */ - scp->SCp.phase =-2 ;/* reservation conflict */ + cmndinfo->phase =-2 ;/* reservation conflict */ } }else { - scp->SCp.sent_command =-1 ; + cmndinfo->OpCode =-1 ; } }else { -if (scp->SCp.sent_command ==GDT_MOUNT ) { +if (cmndinfo->OpCode ==GDT_MOUNT ) { ha->hdr[t].cluster_type |=CLUSTER_MOUNTED ; ha->hdr[t].media_changed = TRUE; - }else if (scp->SCp.sent_command ==GDT_UNMOUNT ) { + }else if (cmndinfo->OpCode ==GDT_UNMOUNT ) { ha->hdr[t].cluster_type &= ~CLUSTER_MOUNTED ; ha->hdr[t].media_changed = TRUE; } - scp->SCp.sent_command =-1 ; + cmndinfo->OpCode =-1 ; }/* retry */ - scp->SCp.this_residual =HIGH_PRI ; + cmndinfo->priority =HIGH_PRI ;return 2 ; }else {/* RESERVE/RELEASE ? */
@@ -3456,17 +3459,17 @@ static int gdth_sync_event(gdth_ha_str *ha, int service, unchar index, scp->sense_buffer[0 ] =0 ; } }else { - scp->SCp.Status = ha->status; - scp->SCp.Message = ha->info; + cmndinfo->status = ha->status; + cmndinfo->info = ha->info; -if (scp->SCp.sent_command !=-1 ) { +if (cmndinfo->OpCode !=-1 ) {TRACE2 (("gdth_sync_event(): special cmd 0x%x error 0x%x\n" , - scp->SCp.sent_command, ha->status)); -if (scp->SCp.sent_command ==GDT_SCAN_START || - scp->SCp.sent_command ==GDT_SCAN_END ) { - scp->SCp.sent_command =-1 ; + cmndinfo->OpCode, ha->status)); +if (cmndinfo->OpCode ==GDT_SCAN_START || + cmndinfo->OpCode ==GDT_SCAN_END ) { + cmndinfo->OpCode =-1 ;/* retry */ - scp->SCp.this_residual =HIGH_PRI ; + cmndinfo->priority =HIGH_PRI ;return 2 ; }memset ((char *)scp->sense_buffer,0 ,16 );
@@ -3509,8 +3512,8 @@ static int gdth_sync_event(gdth_ha_str *ha, int service, unchar index, } } } -if (!scp->SCp.have_data_in) - scp->SCp.have_data_in++; +if (!cmndinfo->wait_for_completion) + cmndinfo->wait_for_completion++;else return 1 ; }
@@ -4042,7 +4045,7 @@ static int gdth_queuecommand(struct scsi_cmnd *scp, scp->scsi_done = done;gdth_update_timeout (scp, scp->timeout_per_command *6 ); - scp->SCp.this_residual =DEFAULT_PRI ; + cmndinfo->priority =DEFAULT_PRI ;return __gdth_queuecommand (ha, scp, cmndinfo); }
@@ -4050,16 +4053,16 @@ static int __gdth_queuecommand(gdth_ha_str *ha, struct scsi_cmnd *scp, struct gdth_cmndinfo *cmndinfo) { scp->host_scribble = (unsigned char *)cmndinfo; - scp->SCp.have_data_in =1 ; - scp->SCp.phase =-1 ; - scp->SCp.sent_command =-1 ; + cmndinfo->wait_for_completion =1 ; + cmndinfo->phase =-1 ; + cmndinfo->OpCode =-1 ; scp->SCp.Status =GDTH_MAP_NONE ;#ifdef GDTH_STATISTICS ++act_ios;#endif -gdth_putq (ha, scp, scp->SCp.this_residual); +gdth_putq (ha, scp, cmndinfo->priority);gdth_next (ha);return 0 ; }
drivers/scsi/gdth.h +8 -0
@@ -923,6 +923,14 @@ typedef struct {int index;int internal_command;/* don't call scsi_done */ dma_addr_t sense_paddr;/* sense dma-addr */ +unchar priority; +int timeout; +volatile int wait_for_completion; +ushort status; +ulong32 info; +enum dma_data_direction dma_dir; +int phase;/* ???? */ +int OpCode; } cmndinfo[GDTH_MAXCMDS ];/* index==0 is free */ unchar bus_cnt;/* SCSI bus count */ unchar tid_cnt;/* Target ID count */
drivers/scsi/gdth_proc.c +6 -4
@@ -728,20 +728,22 @@ static void gdth_wait_completion(gdth_ha_str *ha, int busnum, int id)ulong flags;int i;Scsi_Cmnd *scp; +struct gdth_cmndinfo *cmndinfo;unchar b, t;spin_lock_irqsave (&ha->smp_lock, flags);for (i =0 ; i <GDTH_MAXCMDS ; ++i) { scp = ha->cmd_tab[i].cmnd; + cmndinfo =gdth_cmnd_priv (scp); b = scp->device->channel; t = scp->device->id;if (!SPECIAL_SCP (scp) && t == (unchar )id && b == (unchar )busnum) { - scp->SCp.have_data_in =0 ; + cmndinfo->wait_for_completion =0 ;spin_unlock_irqrestore (&ha->smp_lock, flags); -while (!scp->SCp.have_data_in) +while (!cmndinfo->wait_for_completion)barrier ();spin_lock_irqsave (&ha->smp_lock, flags); }
@@ -764,7 +766,7 @@ static void gdth_stop_timeout(gdth_ha_str *ha, int busnum, int id) t = scp->device->id;if (t == (unchar )id && b == (unchar )busnum) {TRACE2 (("gdth_stop_timeout(): update_timeout()\n" )); - scp->SCp.buffers_residual =gdth_update_timeout (scp,0 ); + cmndinfo->timeout =gdth_update_timeout (scp,0 ); } } }
@@ -786,7 +788,7 @@ static void gdth_start_timeout(gdth_ha_str *ha, int busnum, int id) t = scp->device->id;if (t == (unchar )id && b == (unchar )busnum) {TRACE2 (("gdth_start_timeout(): update_timeout()\n" )); -gdth_update_timeout (scp, scp->SCp.buffers_residual); +gdth_update_timeout (scp, cmndinfo->timeout); } } }
Signature · 1 line
1.5.3.1
PATCH 16/16 gdth: !use_sg cleanup and use of scsi accessors
In reply to Boaz Harrosh gdth_execute() will issue an internal, none scsi-standard commands onto __gdth_queuecommand(). Since it is not recommended to set struct scsi_cmnd IO members in llds, gdth now uses internal IO members for IO. In the case of gdth_execute() these members will be set properly. In case the command was issued from scsi-ml (by gdth_queuecommand) they will be set from scsi IO accessors.
* define gdth IO accessors and use them throughout the driver.
* use an sg-of-one in gdth_execute() and fix gdth_special_cmd() accordingly.
* Clean the not use_sg code path and company
Signed-off-by Boaz Harrosh <[email protected]>
--- drivers/scsi/gdth.c | 228 ++++++++++++++++++++++++-------------------------- drivers/scsi/gdth.h | 7 -- 2 files changed, 109 insertions(+), 126 deletions(-)
drivers/scsi/gdth.c +109 -119
@@ -85,11 +85,11 @@/* The meaning of the Scsi_Pointer members in this driver is as follows: * ptr: Chaining -* this_residual: unused -* buffer: unused -* dma_handle: will drop in !use_sg patch. -* buffers_residual: unused -* Status: DMA mem. mappings (FIXME: drop in !use_sg patch.) +* this_residual: gdth_bufflen +* buffer: gdth_sglist +* dma_handle: unused +* buffers_residual: gdth_sg_count +* Status: unused * Message: unused * have_data_in: unused * sent_command: unused
@@ -132,6 +132,7 @@#include <asm/uaccess.h> #include <linux/spinlock.h> #include <linux/blkdev.h> +#include <linux/scatterlist.h> #include "scsi.h" #include <scsi/scsi_host.h>
@@ -159,7 +160,7 @@ static void gdth_readapp_event(gdth_ha_str *ha, unchar application,static void gdth_clear_events (void );static void gdth_copy_internal_data (gdth_ha_str *ha,Scsi_Cmnd *scp, -char *buffer,ushort count); +char *buffer,ushort count,int to_buffer);static int gdth_internal_cache_cmd (gdth_ha_str *ha,Scsi_Cmnd *scp);static int gdth_fill_cache_cmd (gdth_ha_str *ha,Scsi_Cmnd *scp,ushort hdrive);
@@ -373,6 +374,47 @@ static const struct file_operations gdth_fops = { .release = gdth_close, }; +/* +* gdth scsi_command access wrappers. +* below 6 functions are used throughout the driver to access scsi_command's +* io parameters. The reason we do not use the regular accessors from +* scsi_cmnd.h is because of gdth_execute(). Since it is unrecommended for +* llds to directly set scsi_cmnd's IO members. This driver will use SCp +* members for IO parameters, and will copy scsi_cmnd's members to Scp +* members in queuecommand. For internal commands through gdth_execute() +* SCp's members will be set directly. +*/ +static inline unsigned gdth_bufflen (struct scsi_cmnd *cmd) +{ +return (unsigned )cmd->SCp.this_residual; +} + +static inline void gdth_set_bufflen (struct scsi_cmnd *cmd,unsigned bufflen) +{ + cmd->SCp.this_residual = bufflen; +} + +static inline unsigned gdth_sg_count (struct scsi_cmnd *cmd) +{ +return (unsigned )cmd->SCp.buffers_residual; +} + +static inline void gdth_set_sg_count (struct scsi_cmnd *cmd,unsigned sg_count) +{ + cmd->SCp.buffers_residual = sg_count; +} + +static inline struct scatterlist *gdth_sglist (struct scsi_cmnd *cmd) +{ +return cmd->SCp.buffer; +} + +static inline void gdth_set_sglist (struct scsi_cmnd *cmd, +struct scatterlist *sglist) +{ + cmd->SCp.buffer = sglist; +} +#include "gdth_proc.h" #include "gdth_proc.c"
@@ -452,6 +494,7 @@ int __gdth_execute(struct scsi_device *sdev, gdth_cmd_str *gdtcmd, char *cmnd,gdth_ha_str *ha =shost_priv (sdev->host);Scsi_Cmnd *scp;struct gdth_cmndinfo cmndinfo; +struct scatterlist one_sg;DECLARE_COMPLETION_ONSTACK (wait);int rval;
@@ -465,7 +508,10 @@ int __gdth_execute(struct scsi_device *sdev, gdth_cmd_str *gdtcmd, char *cmnd,/* use request field to save the ptr. to completion struct. */ scp->request = (struct request *)&wait; scp->timeout_per_command = timeout*HZ ; - scp->request_buffer = gdtcmd; +sg_init_one (&one_sg, gdtcmd,sizeof (*gdtcmd)); +gdth_set_sglist (scp, &one_sg); +gdth_set_sg_count (scp,1 ); +gdth_set_bufflen (scp,sizeof (*gdtcmd)); scp->cmd_len =12 ;memcpy (scp->cmnd, cmnd,12 ); cmndinfo.priority =IOCTL_PRI ;
@@ -2303,24 +2349,28 @@ static void gdth_next(gdth_ha_str *ha) ha->hanum, cmd_index); } } - + +/* +* gdth_copy_internal_data() - copy to/from a buffer onto a scsi_cmnd's +* buffers, kmap_atomic() as needed. +*/ static void gdth_copy_internal_data (gdth_ha_str *ha,Scsi_Cmnd *scp, -char *buffer,ushort count) +char *buffer,ushort count,int to_buffer) { -ushort cpcount,i; +ushort cpcount,i, max_sg =gdth_sg_count (scp);ushort cpsum,cpnow;struct scatterlist *sl;char *address; - cpcount = count<=(ushort )scp->request_bufflen ? count:(ushort )scp->request_bufflen; + cpcount =min_t (ushort, count,gdth_bufflen (scp)); -if (scp->use_sg) { - sl = (struct scatterlist *)scp->request_buffer; -for (i=0 ,cpsum=0 ; i<scp->use_sg; ++i,++sl) { +if (cpcount) { + cpsum=0 ; +scsi_for_each_sg (scp, sl, max_sg, i) {unsigned long flags; cpnow = (ushort )sl->length;TRACE (("copy_internal() now %d sum %d count %d %d\n" , - cpnow,cpsum,cpcount,(ushort )scp->bufflen)); + cpnow, cpsum, cpcount,gdth_bufflen (scp)));if (cpsum+cpnow > cpcount) cpnow = cpcount - cpsum; cpsum += cpnow;
@@ -2331,7 +2381,10 @@ static void gdth_copy_internal_data(gdth_ha_str *ha, Scsi_Cmnd *scp, }local_irq_save (flags); address =kmap_atomic (sl->page,KM_BIO_SRC_IRQ ) + sl->offset; -memcpy (address,buffer,cpnow); +if (to_buffer) +memcpy (buffer, address, cpnow); +else +memcpy (address, buffer, cpnow);flush_dcache_page (sl->page);kunmap_atomic (address,KM_BIO_SRC_IRQ );local_irq_restore (flags);
@@ -2339,9 +2392,10 @@ static void gdth_copy_internal_data(gdth_ha_str *ha, Scsi_Cmnd *scp,break ; buffer += cpnow; } - }else { -TRACE (("copy_internal() count %d\n" ,cpcount)); -memcpy ((char *)scp->request_buffer,buffer,cpcount); + }else if (count) { +printk ("GDT-HA %d: SCSI command with no buffers but data transfer expected!\n" , + ha->hanum); +WARN_ON (1 ); } }
@@ -2384,7 +2438,7 @@ static int gdth_internal_cache_cmd(gdth_ha_str *ha, Scsi_Cmnd *scp)strcpy (inq.vendor,ha->oem_name);sprintf (inq.product,"Host Drive #%02d" ,t);strcpy (inq.revision," " ); -gdth_copy_internal_data (ha, scp, (char *)&inq,sizeof (gdth_inq_data)); +gdth_copy_internal_data (ha, scp, (char *)&inq,sizeof (gdth_inq_data),0 );break ;case REQUEST_SENSE :
@@ -2394,7 +2448,7 @@ static int gdth_internal_cache_cmd(gdth_ha_str *ha, Scsi_Cmnd *scp) sd.key =NO_SENSE ; sd.info =0 ; sd.add_length=0 ; -gdth_copy_internal_data (ha, scp, (char *)&sd,sizeof (gdth_sense_data)); +gdth_copy_internal_data (ha, scp, (char *)&sd,sizeof (gdth_sense_data),0 );break ;case MODE_SENSE :
@@ -2406,7 +2460,7 @@ static int gdth_internal_cache_cmd(gdth_ha_str *ha, Scsi_Cmnd *scp) mpd.bd.block_length[0 ] = (SECTOR_SIZE &0x00ff0000 ) >>16 ; mpd.bd.block_length[1 ] = (SECTOR_SIZE &0x0000ff00 ) >>8 ; mpd.bd.block_length[2 ] = (SECTOR_SIZE &0x000000ff ); -gdth_copy_internal_data (ha, scp, (char *)&mpd,sizeof (gdth_modep_data)); +gdth_copy_internal_data (ha, scp, (char *)&mpd,sizeof (gdth_modep_data),0 );break ;case READ_CAPACITY :
@@ -2416,7 +2470,7 @@ static int gdth_internal_cache_cmd(gdth_ha_str *ha, Scsi_Cmnd *scp)else rdc.last_block_no =cpu_to_be32 (ha->hdr[t].size-1 ); rdc.block_length =cpu_to_be32 (SECTOR_SIZE ); -gdth_copy_internal_data (ha, scp, (char *)&rdc,sizeof (gdth_rdcap_data)); +gdth_copy_internal_data (ha, scp, (char *)&rdc,sizeof (gdth_rdcap_data),0 );break ;case SERVICE_ACTION_IN :
@@ -2428,7 +2482,7 @@ static int gdth_internal_cache_cmd(gdth_ha_str *ha, Scsi_Cmnd *scp) rdc16.last_block_no =cpu_to_be64 (ha->hdr[t].size-1 ); rdc16.block_length =cpu_to_be32 (SECTOR_SIZE );gdth_copy_internal_data (ha, scp, (char *)&rdc16, -sizeof (gdth_rdcap16_data)); +sizeof (gdth_rdcap16_data),0 ); }else { scp->result =DID_ABORT <<16 ; }
@@ -2451,13 +2505,9 @@ static int gdth_fill_cache_cmd(gdth_ha_str *ha, Scsi_Cmnd *scp, ushort hdrive) { registergdth_cmd_str *cmdp;struct gdth_cmndinfo *cmndinfo =gdth_cmnd_priv (scp); -struct scatterlist *sl;ulong32 cnt, blockcnt;ulong64 no, blockno; -dma_addr_t phys_addr;int i, cmd_index, read_write, sgcnt, mode64; -struct page *page; -ulong offset; cmdp = ha->pccb; TRACE(("gdth_fill_cache_cmd() cmd 0x%x cmdsize %d hdrive %d\n",
@@ -2546,17 +2596,17 @@ static int gdth_fill_cache_cmd(gdth_ha_str *ha, Scsi_Cmnd *scp, ushort hdrive) cmdp->u.cache.BlockCnt = blockcnt; } -if (scp->use_sg) { - sl = (struct scatterlist *)scp->request_buffer; - sgcnt = scp->use_sg; - scp->SCp.Status =GDTH_MAP_SG ; +if (gdth_bufflen (scp)) { cmndinfo->dma_dir = (read_write ==1 ?PCI_DMA_TODEVICE :PCI_DMA_FROMDEVICE ); - sgcnt =pci_map_sg (ha->pdev, sl, scp->use_sg, cmndinfo->dma_dir); + sgcnt =pci_map_sg (ha->pdev,gdth_sglist (scp),gdth_sg_count (scp), + cmndinfo->dma_dir);if (mode64) { +struct scatterlist *sl; + cmdp->u.cache64.DestAddr= (ulong64)-1 ; cmdp->u.cache64.sg_canz = sgcnt; -for (i=0 ; i<sgcnt; ++i,++sl) { +scsi_for_each_sg (scp, sl, sgcnt, i) { cmdp->u.cache64.sg_lst[i].sg_ptr =sg_dma_address (sl);#ifdef GDTH_DMA_STATISTICS if (cmdp->u.cache64.sg_lst[i].sg_ptr > (ulong64 )0xffffffff )
@@ -2567,9 +2617,11 @@ static int gdth_fill_cache_cmd(gdth_ha_str *ha, Scsi_Cmnd *scp, ushort hdrive) cmdp->u.cache64.sg_lst[i].sg_len =sg_dma_len (sl); } }else { +struct scatterlist *sl; + cmdp->u.cache.DestAddr=0xffffffff ; cmdp->u.cache.sg_canz = sgcnt; -for (i=0 ; i<sgcnt; ++i,++sl) { +scsi_for_each_sg (scp, sl, sgcnt, i) { cmdp->u.cache.sg_lst[i].sg_ptr =sg_dma_address (sl);#ifdef GDTH_DMA_STATISTICS ha->dma32_cnt++;
@@ -2585,38 +2637,6 @@ static int gdth_fill_cache_cmd(gdth_ha_str *ha, Scsi_Cmnd *scp, ushort hdrive) }#endif - }else if (scp->request_bufflen) { - scp->SCp.Status =GDTH_MAP_SINGLE ; - cmndinfo->dma_dir = (read_write ==1 ? -PCI_DMA_TODEVICE :PCI_DMA_FROMDEVICE ); - page =virt_to_page (scp->request_buffer); - offset = (ulong )scp->request_buffer & ~PAGE_MASK ; - phys_addr =pci_map_page (ha->pdev,page,offset, - scp->request_bufflen, cmndinfo->dma_dir); - scp->SCp.dma_handle = phys_addr; -if (mode64) { -if (ha->cache_feat &SCATTER_GATHER ) { - cmdp->u.cache64.DestAddr = (ulong64)-1 ; - cmdp->u.cache64.sg_canz =1 ; - cmdp->u.cache64.sg_lst[0 ].sg_ptr = phys_addr; - cmdp->u.cache64.sg_lst[0 ].sg_len = scp->request_bufflen; - cmdp->u.cache64.sg_lst[1 ].sg_len =0 ; - }else { - cmdp->u.cache64.DestAddr = phys_addr; - cmdp->u.cache64.sg_canz=0 ; - } - }else { -if (ha->cache_feat &SCATTER_GATHER ) { - cmdp->u.cache.DestAddr =0xffffffff ; - cmdp->u.cache.sg_canz =1 ; - cmdp->u.cache.sg_lst[0 ].sg_ptr = phys_addr; - cmdp->u.cache.sg_lst[0 ].sg_len = scp->request_bufflen; - cmdp->u.cache.sg_lst[1 ].sg_len =0 ; - }else { - cmdp->u.cache.DestAddr = phys_addr; - cmdp->u.cache.sg_canz=0 ; - } - } } }/* evaluate command size, check space */
@@ -2659,9 +2679,8 @@ static int gdth_fill_cache_cmd(gdth_ha_str *ha, Scsi_Cmnd *scp, ushort hdrive)static int gdth_fill_raw_cmd (gdth_ha_str *ha,Scsi_Cmnd *scp,unchar b) { registergdth_cmd_str *cmdp; -struct scatterlist *sl;ushort i; -dma_addr_t phys_addr, sense_paddr; +dma_addr_t sense_paddr;int cmd_index, sgcnt, mode64;unchar t,l;struct page *page;
@@ -2727,7 +2746,7 @@ static int gdth_fill_raw_cmd(gdth_ha_str *ha, Scsi_Cmnd *scp, unchar b) cmdp->u.raw64.lun = l; cmdp->u.raw64.bus = b; cmdp->u.raw64.priority =0 ; - cmdp->u.raw64.sdlen = scp->request_bufflen; + cmdp->u.raw64.sdlen =gdth_bufflen (scp); cmdp->u.raw64.sense_len =16 ; cmdp->u.raw64.sense_data = sense_paddr; cmdp->u.raw64.direction =
@@ -2744,7 +2763,7 @@ static int gdth_fill_raw_cmd(gdth_ha_str *ha, Scsi_Cmnd *scp, unchar b) cmdp->u.raw.bus = b; cmdp->u.raw.priority =0 ; cmdp->u.raw.link_p =0 ; - cmdp->u.raw.sdlen = scp->request_bufflen; + cmdp->u.raw.sdlen =gdth_bufflen (scp); cmdp->u.raw.sense_len =16 ; cmdp->u.raw.sense_data = sense_paddr; cmdp->u.raw.direction =
@@ -2753,16 +2772,16 @@ static int gdth_fill_raw_cmd(gdth_ha_str *ha, Scsi_Cmnd *scp, unchar b) cmdp->u.raw.sg_ranz =0 ; } -if (scp->use_sg) { - sl = (struct scatterlist *)scp->request_buffer; - sgcnt = scp->use_sg; - scp->SCp.Status =GDTH_MAP_SG ; +if (gdth_bufflen (scp)) { cmndinfo->dma_dir =PCI_DMA_BIDIRECTIONAL ; - sgcnt =pci_map_sg (ha->pdev,sl, scp->use_sg, cmndinfo->dma_dir); + sgcnt =pci_map_sg (ha->pdev,gdth_sglist (scp),gdth_sg_count (scp), + cmndinfo->dma_dir);if (mode64) { +struct scatterlist *sl; + cmdp->u.raw64.sdata = (ulong64)-1 ; cmdp->u.raw64.sg_ranz = sgcnt; -for (i=0 ; i<sgcnt; ++i,++sl) { +scsi_for_each_sg (scp, sl, sgcnt, i) { cmdp->u.raw64.sg_lst[i].sg_ptr =sg_dma_address (sl);#ifdef GDTH_DMA_STATISTICS if (cmdp->u.raw64.sg_lst[i].sg_ptr > (ulong64 )0xffffffff )
@@ -2773,9 +2792,11 @@ static int gdth_fill_raw_cmd(gdth_ha_str *ha, Scsi_Cmnd *scp, unchar b) cmdp->u.raw64.sg_lst[i].sg_len =sg_dma_len (sl); } }else { +struct scatterlist *sl; + cmdp->u.raw.sdata =0xffffffff ; cmdp->u.raw.sg_ranz = sgcnt; -for (i=0 ; i<sgcnt; ++i,++sl) { +scsi_for_each_sg (scp, sl, sgcnt, i) { cmdp->u.raw.sg_lst[i].sg_ptr =sg_dma_address (sl);#ifdef GDTH_DMA_STATISTICS ha->dma32_cnt++;
@@ -2791,38 +2812,6 @@ static int gdth_fill_raw_cmd(gdth_ha_str *ha, Scsi_Cmnd *scp, unchar b) }#endif - }else if (scp->request_bufflen) { - scp->SCp.Status =GDTH_MAP_SINGLE ; - cmndinfo->dma_dir =PCI_DMA_BIDIRECTIONAL ; - page =virt_to_page (scp->request_buffer); - offset = (ulong )scp->request_buffer & ~PAGE_MASK ; - phys_addr =pci_map_page (ha->pdev,page,offset, - scp->request_bufflen, cmndinfo->dma_dir); - scp->SCp.dma_handle = phys_addr; - -if (mode64) { -if (ha->raw_feat &SCATTER_GATHER ) { - cmdp->u.raw64.sdata = (ulong64)-1 ; - cmdp->u.raw64.sg_ranz=1 ; - cmdp->u.raw64.sg_lst[0 ].sg_ptr = phys_addr; - cmdp->u.raw64.sg_lst[0 ].sg_len = scp->request_bufflen; - cmdp->u.raw64.sg_lst[1 ].sg_len =0 ; - }else { - cmdp->u.raw64.sdata = phys_addr; - cmdp->u.raw64.sg_ranz=0 ; - } - }else { -if (ha->raw_feat &SCATTER_GATHER ) { - cmdp->u.raw.sdata =0xffffffff ; - cmdp->u.raw.sg_ranz=1 ; - cmdp->u.raw.sg_lst[0 ].sg_ptr = phys_addr; - cmdp->u.raw.sg_lst[0 ].sg_len = scp->request_bufflen; - cmdp->u.raw.sg_lst[1 ].sg_len =0 ; - }else { - cmdp->u.raw.sdata = phys_addr; - cmdp->u.raw.sg_ranz=0 ; - } - } }if (mode64) { TRACE(("raw cmd: addr. %x sganz %x sgptr0 %x sglen0 %x\n",
@@ -2871,7 +2860,7 @@ static int gdth_special_cmd(gdth_ha_str *ha, Scsi_Cmnd *scp)if (ha->type==GDT_EISA && ha->cmd_cnt>0 )return 0 ; -memcpy ( cmdp, scp->request_buffer,sizeof (gdth_cmd_str)); +gdth_copy_internal_data (ha, scp, (char *)cmdp,sizeof (gdth_cmd_str),1 ); cmdp->RequestBuffer = scp;/* search free command index */
@@ -3404,12 +3393,10 @@ static int gdth_sync_event(gdth_ha_str *ha, int service, unchar index,/* retry */ return 2 ; } -if (scp->SCp.Status ==GDTH_MAP_SG ) -pci_unmap_sg (ha->pdev,scp->request_buffer, - scp->use_sg, cmndinfo->dma_dir); -else if (scp->SCp.Status ==GDTH_MAP_SINGLE ) -pci_unmap_page (ha->pdev,scp->SCp.dma_handle, - scp->request_bufflen, cmndinfo->dma_dir); +if (gdth_bufflen (scp)) +pci_unmap_sg (ha->pdev,gdth_sglist (scp),gdth_sg_count (scp), + cmndinfo->dma_dir); +if (cmndinfo->sense_paddr)pci_unmap_page (ha->pdev, cmndinfo->sense_paddr,16 ,PCI_DMA_FROMDEVICE );
@@ -4046,6 +4033,11 @@ static int gdth_queuecommand(struct scsi_cmnd *scp, scp->scsi_done = done;gdth_update_timeout (scp, scp->timeout_per_command *6 ); cmndinfo->priority =DEFAULT_PRI ; + +gdth_set_bufflen (scp,scsi_bufflen (scp)); +gdth_set_sg_count (scp,scsi_sg_count (scp)); +gdth_set_sglist (scp,scsi_sglist (scp)); +return __gdth_queuecommand (ha, scp, cmndinfo); }
@@ -4056,7 +4048,6 @@ static int __gdth_queuecommand(gdth_ha_str *ha, struct scsi_cmnd *scp, cmndinfo->wait_for_completion =1 ; cmndinfo->phase =-1 ; cmndinfo->OpCode =-1 ; - scp->SCp.Status =GDTH_MAP_NONE ;#ifdef GDTH_STATISTICS ++act_ios;
@@ -4626,7 +4617,6 @@ static int gdth_ioctl(struct inode *inode, struct file *filep,return -ENOMEM ; scp->device = ha->sdev; scp->cmd_len =12 ; - scp->use_sg =0 ; scp->device->channel = res.number; rval =gdth_eh_bus_reset (scp); res.status = (rval ==SUCCESS ?S_OK :S_GENERR );
drivers/scsi/gdth.h +0 -7
@@ -303,15 +303,8 @@#define MAILBOXREG 0x0c90/* mailbox reg. (16 bytes) */ #define EISAREG 0x0cc0/* EISA configuration */ -/* DMA memory mappings */ -#define GDTH_MAP_NONE 0 -#define GDTH_MAP_SINGLE 1 -#define GDTH_MAP_SG 2 -#define GDTH_MAP_IOCTL 3 -/* other defines */ #define LINUX_OS 8/* used for cache optim. */ -#define SCATTER_GATHER 1/* s/g feature */ #define SECS32 0x1f/* round capacity */ #define BIOS_ID_OFFS 0x10/* offset contr-ID in ISABIOS */ #define LOCALBOARD 0/* board node always 0 */
Signature · 1 line
1.5.3.1
Quoted 10 lines · Boaz Harrosh
Hi!
following is an attempted at unified patchset for the gdth driver.
They try to incorporate floating patches to gdth from:
Christoph Hellwig
Jeff Garzik
Matthew Wilcox
and Me Boaz Harrosh
I have mistakenly put "To: Mike Christie <[email protected]>" instead of "To: Christoph Hellwig <[email protected]>"
Please Cc all replys To: Christoph Hellwig <[email protected]> Also.
Please for give me
Boaz