diff options
Diffstat (limited to 'drivers/scsi/gvp11.c')
-rw-r--r-- | drivers/scsi/gvp11.c | 65 |
1 files changed, 35 insertions, 30 deletions
diff --git a/drivers/scsi/gvp11.c b/drivers/scsi/gvp11.c index d905012ba..0c6150964 100644 --- a/drivers/scsi/gvp11.c +++ b/drivers/scsi/gvp11.c @@ -75,7 +75,8 @@ static int dma_setup (Scsi_Cmnd *cmd, int dir_in) if ( scsi_alloc_out_of_range || !HDATA(cmd->host)->dma_bounce_buffer) { HDATA(cmd->host)->dma_bounce_buffer = - amiga_chip_alloc(HDATA(cmd->host)->dma_bounce_len); + amiga_chip_alloc(HDATA(cmd->host)->dma_bounce_len, + "GVP II SCSI Bounce Buffer"); if(!HDATA(cmd->host)->dma_bounce_buffer) { @@ -100,7 +101,8 @@ static int dma_setup (Scsi_Cmnd *cmd, int dir_in) } HDATA(cmd->host)->dma_bounce_buffer = - amiga_chip_alloc(HDATA(cmd->host)->dma_bounce_len); + amiga_chip_alloc(HDATA(cmd->host)->dma_bounce_len, + "GVP II SCSI Bounce Buffer"); if(!HDATA(cmd->host)->dma_bounce_buffer) { @@ -180,10 +182,9 @@ int __init gvp11_detect(Scsi_Host_Template *tpnt) { static unsigned char called = 0; struct Scsi_Host *instance; - caddr_t address; + unsigned long address; unsigned int epc; - unsigned int key = 0, skey; - const struct ConfigDev *cd; + struct zorro_dev *z = NULL; unsigned int default_dma_xfer_mask; #ifdef CHECK_WD33C93 volatile unsigned char *sasr_3393, *scmd_3393; @@ -198,38 +199,39 @@ int __init gvp11_detect(Scsi_Host_Template *tpnt) tpnt->proc_name = "GVP11"; tpnt->proc_info = &wd33c93_proc_info; - while (1) { + while ((z = zorro_find_device(ZORRO_WILDCARD, z))) { /* * This should (hopefully) be the correct way to identify * all the different GVP SCSI controllers (except for the * SERIES I though). */ - skey = key; - if ((key = zorro_find(ZORRO_PROD_GVP_COMBO_030_R3_SCSI, 0, skey)) || - (key = zorro_find(ZORRO_PROD_GVP_SERIES_II, 0, skey))) + if (z->id == ZORRO_PROD_GVP_COMBO_030_R3_SCSI || + z->id == ZORRO_PROD_GVP_SERIES_II) default_dma_xfer_mask = ~0x00ffffff; - else if ((key = zorro_find(ZORRO_PROD_GVP_GFORCE_030_SCSI, 0, skey)) || - (key = zorro_find(ZORRO_PROD_GVP_A530_SCSI, 0, skey)) || - (key = zorro_find(ZORRO_PROD_GVP_COMBO_030_R4_SCSI, 0, skey))) + else if (z->id == ZORRO_PROD_GVP_GFORCE_030_SCSI || + z->id == ZORRO_PROD_GVP_A530_SCSI || + z->id == ZORRO_PROD_GVP_COMBO_030_R4_SCSI) default_dma_xfer_mask = ~0x01ffffff; - else if ((key = zorro_find(ZORRO_PROD_GVP_A1291, 0, skey)) || - (key = zorro_find(ZORRO_PROD_GVP_GFORCE_040_SCSI_1, 0, skey))) + else if (z->id == ZORRO_PROD_GVP_A1291 || + z->id == ZORRO_PROD_GVP_GFORCE_040_SCSI_1) default_dma_xfer_mask = ~0x07ffffff; else - break; - - cd = zorro_get_board(key); - address = cd->cd_BoardAddr; + continue; /* * Rumors state that some GVP ram boards use the same product * code as the SCSI controllers. Therefore if the board-size * is not 64KB we asume it is a ram board and bail out. */ - if (cd->cd_BoardSize != 0x10000) + if (z->resource.end-z->resource.start != 0xffff) continue; + address = z->resource.start; + if (!request_mem_region(address, 256, "wd33c93")) + continue; + strcpy(z->name, "GVP Series II SCSI"); + #ifdef CHECK_WD33C93 /* @@ -251,18 +253,18 @@ int __init gvp11_detect(Scsi_Host_Template *tpnt) q = *sasr_3393; /* read it */ if (q & 0x08) /* bit 3 should always be clear */ - continue; + goto release; *sasr_3393 = WD_AUXILIARY_STATUS; /* setup indirect address */ if (*sasr_3393 == WD_AUXILIARY_STATUS) { /* shouldn't retain the write */ *sasr_3393 = save_sasr; /* Oops - restore this byte */ - continue; + goto release; } if (*sasr_3393 != q) { /* should still read the same */ *sasr_3393 = save_sasr; /* Oops - restore this byte */ - continue; + goto release; } if (*scmd_3393 != q) /* and so should the image at 0x1f */ - continue; + goto release; /* Ok, we probably have a wd33c93, but let's check a few other places @@ -279,7 +281,7 @@ int __init gvp11_detect(Scsi_Host_Template *tpnt) *sasr_3393 = WD_SCSI_STATUS; *scmd_3393 = q; if (qq != q) /* should be read only */ - continue; + goto release; *sasr_3393 = 0x1e; /* this register is unimplemented */ q = *scmd_3393; *sasr_3393 = 0x1e; @@ -289,7 +291,7 @@ int __init gvp11_detect(Scsi_Host_Template *tpnt) *sasr_3393 = 0x1e; *scmd_3393 = q; if (qq != q || qq != 0xff) /* should be read only, all 1's */ - continue; + goto release; *sasr_3393 = WD_TIMEOUT_PERIOD; q = *scmd_3393; *sasr_3393 = WD_TIMEOUT_PERIOD; @@ -299,13 +301,13 @@ int __init gvp11_detect(Scsi_Host_Template *tpnt) *sasr_3393 = WD_TIMEOUT_PERIOD; *scmd_3393 = q; if (qq != (~q & 0xff)) /* should be read/write */ - continue; + goto release; #endif instance = scsi_register (tpnt, sizeof (struct WD33C93_hostdata)); - instance->base = (unsigned char *)ZTWO_VADDR(address); + instance->base = ZTWO_VADDR(address); instance->irq = IRQ_AMIGA_PORTS; - instance->unique_id = key; + instance->unique_id = z->slotaddr; if (gvp11_xfer_mask) HDATA(instance)->dma_xfer_mask = gvp11_xfer_mask; @@ -340,7 +342,10 @@ int __init gvp11_detect(Scsi_Host_Template *tpnt) "GVP11 SCSI", gvp11_intr); } DMA(instance)->CNTR = GVP11_DMAC_INT_ENABLE; - zorro_config_board(key, 0); + continue; + +release: + release_mem_region(ZTWO_PADDR(instance->base), 256); } return num_gvp11; @@ -363,7 +368,7 @@ int gvp11_release(struct Scsi_Host *instance) { #ifdef MODULE DMA(instance)->CNTR = 0; - zorro_unconfig_board(instance->unique_id, 0); + release_mem_region(ZTWO_PADDR(instance->base), 256); if (--num_gvp11 == 0) free_irq(IRQ_AMIGA_PORTS, gvp11_intr); wd33c93_release(); |