lkml.org 
[lkml]   [2002]   [Feb]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
Subject[PATCH] scsi_register cleanup
Hi,

this is part of the Kernel Janitor Project. As seen on the TODO list, I
checked every call to the scsi_register() function and added a check for
the return code where there wasn't any. Using cscope I checked every
file that had a function calling scsi_register(), so I'm pretty much
sure, that this is cleaned now. Patch against 2.5.3-dj4. Please review
and apply if correct and appropriate.

Regards,
Todor


diff -uNr linux-2.5.3-dj4.orig/drivers/acorn/scsi/acornscsi.c linux/drivers/acorn/scsi/acornscsi.c
--- linux-2.5.3-dj4.orig/drivers/acorn/scsi/acornscsi.c Wed Dec 26 01:04:40 2001
+++ linux/drivers/acorn/scsi/acornscsi.c Sun Feb 10 23:34:41 2002
@@ -2898,6 +2898,9 @@
ecard_claim(ecs[count]); /* Must claim here - card produces irq on reset */

instance = scsi_register(tpnt, sizeof(AS_Host));
+ if( !instance )
+ return count;
+
host = (AS_Host *)instance->hostdata;

instance->io_port = ecard_address(ecs[count], ECARD_MEMC, 0);
@@ -2915,13 +2918,26 @@
ecs[count]->irqaddr = (char *)ioaddr(host->card.io_intr);
ecs[count]->irqmask = 0x0a;

- request_region(instance->io_port + 0x800, 2, "acornscsi(sbic)");
- request_region(host->card.io_intr, 1, "acornscsi(intr)");
- request_region(host->card.io_page, 1, "acornscsi(page)");
+ if( !(request_region(instance->io_port + 0x800, 2, "acornscsi(sbic)")) )
+ goto unregister_scsi;
+
+ if( !(request_region(host->card.io_intr, 1, "acornscsi(intr)")) )
+ goto release_first;
+
+ if( !(request_region(host->card.io_page, 1, "acornscsi(page)")) )
+ goto release_second;
+
#ifdef USE_DMAC
- request_region(host->dma.io_port, 256, "acornscsi(dmac)");
+ if( !(request_region(host->dma.io_port, 256, "acornscsi(dmac)")) )
+ goto release_third;
+#endif
+
+ if( !(request_region(instance->io_port, 2048, "acornscsi(ram)")) )
+#ifdef USE_DMAC
+ goto release_fourth;
+#else
+ goto release_third;
#endif
- request_region(instance->io_port, 2048, "acornscsi(ram)");

if (request_irq(host->scsi.irq, acornscsi_intr, SA_INTERRUPT, "acornscsi", host)) {
printk(KERN_CRIT "scsi%d: IRQ%d not free, interrupts disabled\n",
@@ -2933,7 +2949,20 @@

++count;
}
- return count;
+
+out: return count;
+
+release_fourth:
+ release_region( host->dma.io_port, 256 );
+release_third:
+ release_region( host->card.io_page, 1 );
+release_second:
+ release_region( host->card.io_intr, 1 );
+release_first:
+ release_region( instance->io_port + 0x800, 2 );
+unregister_scsi:
+ scsi_unregister( instance );
+ goto out;
}

/*
diff -uNr linux-2.5.3-dj4.orig/drivers/acorn/scsi/cumana_1.c linux/drivers/acorn/scsi/cumana_1.c
--- linux-2.5.3-dj4.orig/drivers/acorn/scsi/cumana_1.c Wed Dec 26 01:04:40 2001
+++ linux/drivers/acorn/scsi/cumana_1.c Sun Feb 10 23:34:16 2002
@@ -141,6 +141,9 @@
break;

instance = scsi_register (tpnt, sizeof(struct NCR5380_hostdata));
+ if( !instance )
+ goto out;
+
instance->io_port = CUMANA_ADDRESS(ecs[count]);
instance->irq = CUMANA_IRQ(ecs[count]);

@@ -148,7 +151,8 @@
ecard_claim(ecs[count]);

instance->n_io_port = 255;
- request_region (instance->io_port, instance->n_io_port, "CumanaSCSI-1");
+ if( !(request_region (instance->io_port, instance->n_io_port, "CumanaSCSI-1")) )
+ goto unregister_scsi;

((struct NCR5380_hostdata *)instance->hostdata)->ctrl = 0;
outb(0x00, instance->io_port - 577);
@@ -178,7 +182,11 @@

++count;
}
- return count;
+
+out: return count;
+unregister_scsi:
+ scsi_unregister( instance );
+ goto out;
}

int cumanascsi_release (struct Scsi_Host *shpnt)
diff -uNr linux-2.5.3-dj4.orig/drivers/acorn/scsi/ecoscsi.c linux/drivers/acorn/scsi/ecoscsi.c
--- linux-2.5.3-dj4.orig/drivers/acorn/scsi/ecoscsi.c Wed Dec 26 01:04:40 2001
+++ linux/drivers/acorn/scsi/ecoscsi.c Sun Feb 10 23:33:34 2002
@@ -104,28 +104,25 @@
tpnt->proc_name = "ecoscsi";

instance = scsi_register (tpnt, sizeof(struct NCR5380_hostdata));
+ if( !instance )
+ return 0;
+
instance->io_port = 0x80ce8000;
instance->n_io_port = 144;
instance->irq = IRQ_NONE;

- if (check_region (instance->io_port, instance->n_io_port)) {
- scsi_unregister (instance);
- return 0;
- }
+ if( !(request_region (instance->io_port, instance->n_io_port, "ecoscsi")) )
+ goto unregister_scsi;

ecoscsi_write (instance, MODE_REG, 0x20); /* Is it really SCSI? */
- if (ecoscsi_read (instance, MODE_REG) != 0x20) { /* Write to a reg. */
- scsi_unregister(instance);
- return 0; /* and try to read */
- }
+ if (ecoscsi_read (instance, MODE_REG) != 0x20) /* Write to a reg. */
+ goto release_reg; /* and try to read */
+
ecoscsi_write( instance, MODE_REG, 0x00 ); /* it back. */
- if (ecoscsi_read (instance, MODE_REG) != 0x00) {
- scsi_unregister(instance);
- return 0;
- }
+ if (ecoscsi_read (instance, MODE_REG) != 0x00)
+ goto release_reg;

NCR5380_init(instance, 0);
- request_region (instance->io_port, instance->n_io_port, "ecoscsi");

if (instance->irq != IRQ_NONE)
if (request_irq(instance->irq, do_ecoscsi_intr, SA_INTERRUPT, "ecoscsi", NULL)) {
@@ -149,7 +146,13 @@
printk("\nscsi%d:", instance->host_no);
NCR5380_print_options(instance);
printk("\n");
- return 1;
+
+ return 1;
+release_reg:
+ release_region( instance->io_port, instance->n_io_port );
+unregister_scsi:
+ scsi_unregister( instance );
+ return 0;
}

int ecoscsi_release (struct Scsi_Host *shpnt)
diff -uNr linux-2.5.3-dj4.orig/drivers/acorn/scsi/oak.c linux/drivers/acorn/scsi/oak.c
--- linux-2.5.3-dj4.orig/drivers/acorn/scsi/oak.c Wed Dec 26 01:04:40 2001
+++ linux/drivers/acorn/scsi/oak.c Sun Feb 10 23:38:58 2002
@@ -127,6 +127,9 @@
break;

instance = scsi_register (tpnt, sizeof(struct NCR5380_hostdata));
+ if( !instance )
+ goto out;
+
instance->io_port = OAK_ADDRESS(ecs[count]);
instance->irq = OAK_IRQ(ecs[count]);

@@ -134,7 +137,8 @@
ecard_claim(ecs[count]);

instance->n_io_port = 255;
- request_region (instance->io_port, instance->n_io_port, "Oak SCSI");
+ if( !(request_region (instance->io_port, instance->n_io_port, "Oak SCSI")) )
+ goto unregister_scsi:

if (instance->irq != IRQ_NONE)
if (request_irq(instance->irq, do_oakscsi_intr, SA_INTERRUPT, "Oak SCSI", NULL)) {
@@ -165,7 +169,11 @@
if(count == 0)
printk("No oak scsi devices found\n");
#endif
+
+out:
return count;
+unregister_scsi:
+ scsi_unregister( instance );
}

int oakscsi_release (struct Scsi_Host *shpnt)
diff -uNr linux-2.5.3-dj4.orig/drivers/scsi/aacraid/linit.c linux/drivers/scsi/aacraid/linit.c
--- linux-2.5.3-dj4.orig/drivers/scsi/aacraid/linit.c Sun Feb 10 19:09:03 2002
+++ linux/drivers/scsi/aacraid/linit.c Sun Feb 10 20:56:35 2002
@@ -189,6 +189,8 @@
* specific information.
*/
host_ptr = scsi_register( template, sizeof(struct aac_dev) );
+ if( !host_ptr )
+ continue;
/*
* These three parameters can be used to allow for wide SCSI
* and for host adapters that support multiple buses.
diff -uNr linux-2.5.3-dj4.orig/drivers/scsi/gdth.c linux/drivers/scsi/gdth.c
--- linux-2.5.3-dj4.orig/drivers/scsi/gdth.c Sun Feb 10 19:09:04 2002
+++ linux/drivers/scsi/gdth.c Sun Feb 10 21:53:23 2002
@@ -3991,112 +3991,114 @@
if (gdth_ctr_count >= MAXHA)
break;
if (gdth_search_isa(isa_bios)) { /* controller found */
- shp = scsi_register(shtp,sizeof(gdth_ext_str));
- ha = HADATA(shp);
- if (!gdth_init_isa(isa_bios,ha)) {
- scsi_unregister(shp);
- continue;
- }
+ if( (shp = scsi_register(shtp,sizeof(gdth_ext_str))) != NULL ) {
+ ha = HADATA(shp);
+ if (!gdth_init_isa(isa_bios,ha)) {
+ scsi_unregister(shp);
+ continue;
+ }
#ifdef __ia64__
- break;
+ 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);
+ /* 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 LINUX_VERSION_CODE >= 0x010346
- if (request_irq(ha->irq,gdth_interrupt,SA_INTERRUPT,"gdth",ha))
+ if (request_irq(ha->irq,gdth_interrupt,SA_INTERRUPT,"gdth",ha))
#else
- if (request_irq(ha->irq,gdth_interrupt,SA_INTERRUPT,"gdth"))
+ if (request_irq(ha->irq,gdth_interrupt,SA_INTERRUPT,"gdth"))
#endif
- {
- 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");
+ {
+ 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");
#if LINUX_VERSION_CODE >= 0x010346
- free_irq(ha->irq,ha);
+ free_irq(ha->irq,ha);
#else
- free_irq(ha->irq);
+ free_irq(ha->irq);
#endif
- 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;
+ 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;
+ NUMDATA(shp)->hanum = (ushort)hanum;
+ NUMDATA(shp)->busnum= 0;

- ha->pccb = CMDDATA(shp);
+ ha->pccb = CMDDATA(shp);
#if LINUX_VERSION_CODE >= 0x020322
- ha->pscratch = (void *) __get_free_pages(GFP_ATOMIC | GFP_DMA,
+ ha->pscratch = (void *) __get_free_pages(GFP_ATOMIC | GFP_DMA,
GDTH_SCRATCH_ORD);
#else
- ha->pscratch = scsi_init_malloc(GDTH_SCRATCH, GFP_ATOMIC | GFP_DMA);
+ ha->pscratch = scsi_init_malloc(GDTH_SCRATCH, GFP_ATOMIC | GFP_DMA);
#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 || !gdth_search_drives(hanum)) {
- printk("GDT-ISA: Error during device scan\n");
- --gdth_ctr_count;
- --gdth_ctr_vcount;
- if (ha->pscratch != NULL)
+ 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 || !gdth_search_drives(hanum)) {
+ printk("GDT-ISA: Error during device scan\n");
+ --gdth_ctr_count;
+ --gdth_ctr_vcount;
+ if (ha->pscratch != NULL)
#if LINUX_VERSION_CODE >= 0x020322
- free_pages((unsigned long)ha->pscratch, GDTH_SCRATCH_ORD);
+ free_pages((unsigned long)ha->pscratch, GDTH_SCRATCH_ORD);
#else
- scsi_init_free((void *)ha->pscratch, GDTH_SCRATCH);
+ scsi_init_free((void *)ha->pscratch, GDTH_SCRATCH);
#endif
#if LINUX_VERSION_CODE >= 0x010346
- free_irq(ha->irq,ha);
+ free_irq(ha->irq,ha);
#else
- free_irq(ha->irq);
+ free_irq(ha->irq);
#endif
- scsi_unregister(shp);
- continue;
- }
- if (hdr_channel < 0 || hdr_channel > ha->bus_cnt)
- hdr_channel = ha->bus_cnt;
- ha->virt_bus = hdr_channel;
+ 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 >= 0x020000
- shp->max_id = ha->tid_cnt;
- shp->max_lun = MAXLUN;
- shp->max_channel = virt_ctr ? 0 : ha->bus_cnt;
- if (virt_ctr)
-#endif
- {
- 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_id = ha->tid_cnt;
+ shp->max_lun = MAXLUN;
+ shp->max_channel = virt_ctr ? 0 : ha->bus_cnt;
+ if (virt_ctr)
+#endif
+ {
+ virt_ctr = 1;
+ /* register addit. SCSI channels as virtual controllers */
+ for (b = 1; b < ha->bus_cnt + 1; ++b) {
+ if( (shp = scsi_register(shtp,sizeof(gdth_num_str))) != NULL ) {
+ 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;
+ }
+ }
+ }

- GDTH_INIT_LOCK_HA(ha);
- gdth_enable_int(hanum);
+ GDTH_INIT_LOCK_HA(ha);
+ gdth_enable_int(hanum);
#endif /* !__ia64__ */
+ }
}
}

@@ -4105,99 +4107,101 @@
if (gdth_ctr_count >= MAXHA)
break;
if (gdth_search_eisa(eisa_slot)) { /* controller found */
- shp = scsi_register(shtp,sizeof(gdth_ext_str));
- 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( (shp = scsi_register(shtp,sizeof(gdth_ext_str))) != NULL ) {
+ 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 LINUX_VERSION_CODE >= 0x010346
- if (request_irq(ha->irq,gdth_interrupt,SA_INTERRUPT,"gdth",ha))
+ if (request_irq(ha->irq,gdth_interrupt,SA_INTERRUPT,"gdth",ha))
#else
- if (request_irq(ha->irq,gdth_interrupt,SA_INTERRUPT,"gdth"))
+ if (request_irq(ha->irq,gdth_interrupt,SA_INTERRUPT,"gdth"))
#endif
- {
- 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));
+ {
+ 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->pccb = CMDDATA(shp);
#if LINUX_VERSION_CODE >= 0x020322
- ha->pscratch = (void *) __get_free_pages(GFP_ATOMIC | GFP_DMA,
+ ha->pscratch = (void *) __get_free_pages(GFP_ATOMIC | GFP_DMA,
GDTH_SCRATCH_ORD);
#else
- ha->pscratch = scsi_init_malloc(GDTH_SCRATCH, GFP_ATOMIC | GFP_DMA);
+ ha->pscratch = scsi_init_malloc(GDTH_SCRATCH, GFP_ATOMIC | GFP_DMA);
#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 || !gdth_search_drives(hanum)) {
- printk("GDT-EISA: Error during device scan\n");
- --gdth_ctr_count;
- --gdth_ctr_vcount;
- if (ha->pscratch != NULL)
+ 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 || !gdth_search_drives(hanum)) {
+ printk("GDT-EISA: Error during device scan\n");
+ --gdth_ctr_count;
+ --gdth_ctr_vcount;
+ if (ha->pscratch != NULL)
#if LINUX_VERSION_CODE >= 0x020322
- free_pages((unsigned long)ha->pscratch, GDTH_SCRATCH_ORD);
+ free_pages((unsigned long)ha->pscratch, GDTH_SCRATCH_ORD);
#else
- scsi_init_free((void *)ha->pscratch, GDTH_SCRATCH);
+ scsi_init_free((void *)ha->pscratch, GDTH_SCRATCH);
#endif
#if LINUX_VERSION_CODE >= 0x010346
- free_irq(ha->irq,ha);
+ free_irq(ha->irq,ha);
#else
- free_irq(ha->irq);
+ free_irq(ha->irq);
#endif
- scsi_unregister(shp);
- continue;
- }
- if (hdr_channel < 0 || hdr_channel > ha->bus_cnt)
- hdr_channel = ha->bus_cnt;
- ha->virt_bus = hdr_channel;
+ 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 >= 0x020000
- shp->max_id = ha->tid_cnt;
- shp->max_lun = MAXLUN;
- shp->max_channel = virt_ctr ? 0 : ha->bus_cnt;
- if (virt_ctr)
-#endif
- {
- 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;
- }
- }
-
- GDTH_INIT_LOCK_HA(ha);
- gdth_enable_int(hanum);
- }
+ shp->max_id = ha->tid_cnt;
+ shp->max_lun = MAXLUN;
+ shp->max_channel = virt_ctr ? 0 : ha->bus_cnt;
+ if (virt_ctr)
+#endif
+ {
+ virt_ctr = 1;
+ /* register addit. SCSI channels as virtual controllers */
+ for (b = 1; b < ha->bus_cnt + 1; ++b) {
+ if( (shp = scsi_register(shtp,sizeof(gdth_num_str))) != NULL ) {
+ 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;
+ }
+ }
+ }
+
+ GDTH_INIT_LOCK_HA(ha);
+ gdth_enable_int(hanum);
+ }
+ }
}

/* scanning for PCI controllers */
@@ -4214,100 +4218,102 @@
for (ctr = 0; ctr < cnt; ++ctr) {
if (gdth_ctr_count >= MAXHA)
break;
- shp = scsi_register(shtp,sizeof(gdth_ext_str));
- 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].bus,PCI_SLOT(pcistr[ctr].device_fn),ha->irq);
+ if( (shp = scsi_register(shtp,sizeof(gdth_ext_str))) != NULL ) {
+ 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].bus,PCI_SLOT(pcistr[ctr].device_fn),ha->irq);

#if LINUX_VERSION_CODE >= 0x010346
- if (request_irq(ha->irq, gdth_interrupt,
+ if (request_irq(ha->irq, gdth_interrupt,
SA_INTERRUPT|SA_SHIRQ, "gdth", ha))
#else
- if (request_irq(ha->irq, gdth_interrupt,
+ if (request_irq(ha->irq, gdth_interrupt,
SA_INTERRUPT|SA_SHIRQ, "gdth"))
#endif
- {
- 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;
+ {
+ 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;
+ NUMDATA(shp)->hanum = (ushort)hanum;
+ NUMDATA(shp)->busnum= 0;

- ha->pccb = CMDDATA(shp);
+ ha->pccb = CMDDATA(shp);
#if LINUX_VERSION_CODE >= 0x020322
- ha->pscratch = (void *) __get_free_pages(GFP_ATOMIC | GFP_DMA,
+ ha->pscratch = (void *) __get_free_pages(GFP_ATOMIC | GFP_DMA,
GDTH_SCRATCH_ORD);
#else
- ha->pscratch = scsi_init_malloc(GDTH_SCRATCH, GFP_ATOMIC | GFP_DMA);
+ ha->pscratch = scsi_init_malloc(GDTH_SCRATCH, GFP_ATOMIC | GFP_DMA);
#endif
- ha->scratch_busy = FALSE;
- ha->req_first = NULL;
- ha->tid_cnt = pcistr[ctr].device_id >= 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;
-
- if (ha->pscratch == NULL || !gdth_search_drives(hanum)) {
- printk("GDT-PCI: Error during device scan\n");
- --gdth_ctr_count;
- --gdth_ctr_vcount;
- if (ha->pscratch != NULL)
+ ha->scratch_busy = FALSE;
+ ha->req_first = NULL;
+ ha->tid_cnt = pcistr[ctr].device_id >= 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;
+
+ if (ha->pscratch == NULL || !gdth_search_drives(hanum)) {
+ printk("GDT-PCI: Error during device scan\n");
+ --gdth_ctr_count;
+ --gdth_ctr_vcount;
+ if (ha->pscratch != NULL)
#if LINUX_VERSION_CODE >= 0x020322
- free_pages((unsigned long)ha->pscratch, GDTH_SCRATCH_ORD);
+ free_pages((unsigned long)ha->pscratch, GDTH_SCRATCH_ORD);
#else
- scsi_init_free((void *)ha->pscratch, GDTH_SCRATCH);
+ scsi_init_free((void *)ha->pscratch, GDTH_SCRATCH);
#endif
#if LINUX_VERSION_CODE >= 0x010346
- free_irq(ha->irq,ha);
+ free_irq(ha->irq,ha);
#else
- free_irq(ha->irq);
+ free_irq(ha->irq);
#endif
- scsi_unregister(shp);
- continue;
- }
- if (hdr_channel < 0 || hdr_channel > ha->bus_cnt)
- hdr_channel = ha->bus_cnt;
- ha->virt_bus = hdr_channel;
+ 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 >= 0x020000
- shp->max_id = ha->tid_cnt;
- shp->max_lun = MAXLUN;
- shp->max_channel = virt_ctr ? 0 : ha->bus_cnt;
- if (virt_ctr)
-#endif
- {
- 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;
- }
- }
-
- GDTH_INIT_LOCK_HA(ha);
- gdth_enable_int(hanum);
- }
- }
+ shp->max_id = ha->tid_cnt;
+ shp->max_lun = MAXLUN;
+ shp->max_channel = virt_ctr ? 0 : ha->bus_cnt;
+ if (virt_ctr)
+#endif
+ {
+ virt_ctr = 1;
+ /* register addit. SCSI channels as virtual controllers */
+ for (b = 1; b < ha->bus_cnt + 1; ++b) {
+ if( (shp = scsi_register(shtp,sizeof(gdth_num_str))) != NULL ) {
+ 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;
+ }
+ }
+ }
+
+ GDTH_INIT_LOCK_HA(ha);
+ gdth_enable_int(hanum);
+ }
+ }
+ }

TRACE2(("gdth_detect() %d controller detected\n",gdth_ctr_count));
if (gdth_ctr_count > 0) {
diff -uNr linux-2.5.3-dj4.orig/drivers/scsi/pci2220i.c linux/drivers/scsi/pci2220i.c
--- linux-2.5.3-dj4.orig/drivers/scsi/pci2220i.c Sun Feb 10 19:09:04 2002
+++ linux/drivers/scsi/pci2220i.c Sun Feb 10 22:00:10 2002
@@ -2643,6 +2643,9 @@
while ( (pcidev = pci_find_device (VENDOR_PSI, DEVICE_BIGD_1, pcidev)) != NULL )
{
pshost = scsi_register (tpnt, sizeof(ADAPTER2220I));
+ if( pshost == NULL )
+ continue;
+
padapter = HOSTDATA(pshost);

if ( GetRegs (pshost, TRUE, pcidev) )
diff -uNr linux-2.5.3-dj4.orig/drivers/scsi/pcmcia/nsp_cs.c linux/drivers/scsi/pcmcia/nsp_cs.c
--- linux-2.5.3-dj4.orig/drivers/scsi/pcmcia/nsp_cs.c Wed Dec 26 01:04:40 2001
+++ linux/drivers/scsi/pcmcia/nsp_cs.c Sun Feb 10 22:07:18 2002
@@ -1185,8 +1185,16 @@

DEBUG(0, __FUNCTION__ " this_id=%d\n", sht->this_id);

- request_region(data->BaseAddress, data->NumAddress, "nsp_cs");
+ if( !( request_region(data->BaseAddress, data->NumAddress, "nsp_cs") ) )
+ return 0;
+
host = scsi_register(sht, 0);
+
+ if( !host ) {
+ release_region( data->BaseAddress, data->NumAddress );
+ return 0;
+ }
+
host->io_port = data->BaseAddress;
host->unique_id = data->BaseAddress;
host->n_io_port = data->NumAddress;
\
 
 \ /
  Last update: 2005-03-22 13:24    [W:0.098 / U:0.116 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site