* [PATCH] scsi_register cleanup
@ 2002-02-11 0:07 Todor Todorov
0 siblings, 0 replies; only message in thread
From: Todor Todorov @ 2002-02-11 0:07 UTC (permalink / raw)
To: lkml, kjml
[-- Attachment #1: Type: text/plain, Size: 428 bytes --]
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
[-- Attachment #2: cleanup-scsi_register.diff --]
[-- Type: text/plain, Size: 30287 bytes --]
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;
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2002-02-10 23:37 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2002-02-11 0:07 [PATCH] scsi_register cleanup Todor Todorov
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.