patch-2.4.25 linux-2.4.25/drivers/scsi/amiga7xx.c
Next file: linux-2.4.25/drivers/scsi/bvme6000.c
Previous file: linux-2.4.25/drivers/scsi/aha1542.c
Back to the patch index
Back to the overall index
- Lines: 194
- Date:
2004-02-18 05:36:31.000000000 -0800
- Orig file:
linux-2.4.24/drivers/scsi/amiga7xx.c
- Orig date:
2003-06-13 07:51:36.000000000 -0700
diff -urN linux-2.4.24/drivers/scsi/amiga7xx.c linux-2.4.25/drivers/scsi/amiga7xx.c
@@ -1,6 +1,6 @@
/*
* Detection routine for the NCR53c710 based Amiga SCSI Controllers for Linux.
- * Amiga MacroSystemUS WarpEngine SCSI controller.
+ * Amiga MacroSystemUS WarpEngine SCSI controller.
* Amiga Technologies A4000T SCSI controller.
* Amiga Technologies/DKB A4091 SCSI controller.
*
@@ -14,13 +14,13 @@
#include <linux/version.h>
#include <linux/config.h>
#include <linux/zorro.h>
+#include <linux/stat.h>
#include <asm/setup.h>
#include <asm/page.h>
#include <asm/pgtable.h>
#include <asm/amigaints.h>
#include <asm/amigahw.h>
-
#include <asm/irq.h>
#include "scsi.h"
@@ -28,107 +28,83 @@
#include "53c7xx.h"
#include "amiga7xx.h"
-#include<linux/stat.h>
-
-extern int ncr53c7xx_init (Scsi_Host_Template *tpnt, int board, int chip,
- u32 base, int io_port, int irq, int dma,
- long long options, int clock);
-int __init amiga7xx_detect(Scsi_Host_Template *tpnt)
+static int amiga7xx_register_one(Scsi_Host_Template *tpnt,
+ unsigned long address)
{
- static unsigned char called = 0;
- int num = 0, clock;
long long options;
- struct zorro_dev *z = NULL;
- unsigned long address;
+ int clock;
- if (called || !MACH_IS_AMIGA)
+ if (!request_mem_region(address, 0x1000, "ncr53c710"))
return 0;
- tpnt->proc_name = "Amiga7xx";
+ address = (unsigned long)z_ioremap(address, 0x1000);
+ options = OPTION_MEMORY_MAPPED | OPTION_DEBUG_TEST1 | OPTION_INTFLY |
+ OPTION_SYNCHRONOUS | OPTION_ALWAYS_SYNCHRONOUS |
+ OPTION_DISCONNECT;
+ clock = 50000000; /* 50 MHz SCSI Clock */
+ ncr53c7xx_init(tpnt, 0, 710, address, 0, IRQ_AMIGA_PORTS, DMA_NONE,
+ options, clock);
+ return 1;
+}
-#ifdef CONFIG_A4000T_SCSI
- if (AMIGAHW_PRESENT(A4000_SCSI)) {
- address = 0xdd0040;
- if (request_mem_region(address, 0x1000, "ncr53c710")) {
- address = ZTWO_VADDR(address);
- options = OPTION_MEMORY_MAPPED | OPTION_DEBUG_TEST1 |
- OPTION_INTFLY | OPTION_SYNCHRONOUS |
- OPTION_ALWAYS_SYNCHRONOUS | OPTION_DISCONNECT;
- clock = 50000000; /* 50MHz SCSI Clock */
- ncr53c7xx_init(tpnt, 0, 710, address, 0, IRQ_AMIGA_PORTS, DMA_NONE,
- options, clock);
- num++;
- }
- }
-#endif
+
+#ifdef CONFIG_ZORRO
+
+static struct {
+ zorro_id id;
+ unsigned long offset;
+ int absolute; /* offset is absolute address */
+} amiga7xx_table[] = {
+ { .id = ZORRO_PROD_PHASE5_BLIZZARD_603E_PLUS, .offset = 0xf40000,
+ .absolute = 1 },
+ { .id = ZORRO_PROD_MACROSYSTEMS_WARP_ENGINE_40xx, .offset = 0x40000 },
+ { .id = ZORRO_PROD_CBM_A4091_1, .offset = 0x800000 },
+ { .id = ZORRO_PROD_CBM_A4091_2, .offset = 0x800000 },
+ { .id = ZORRO_PROD_GVP_GFORCE_040_060, .offset = 0x40000 },
+ { 0 }
+};
+
+static int __init amiga7xx_zorro_detect(Scsi_Host_Template *tpnt)
+{
+ int num = 0, i;
+ struct zorro_dev *z = NULL;
+ unsigned long address;
while ((z = zorro_find_device(ZORRO_WILDCARD, z))) {
- unsigned long address = z->resource.start;
- unsigned long size = z->resource.end-z->resource.start+1;
- switch (z->id) {
-#ifdef CONFIG_BLZ603EPLUS_SCSI
- case ZORRO_PROD_PHASE5_BLIZZARD_603E_PLUS:
- address = 0xf40000;
- if (request_mem_region(address, 0x1000, "ncr53c710")) {
- address = ZTWO_VADDR(address);
- options = OPTION_MEMORY_MAPPED | OPTION_DEBUG_TEST1 |
- OPTION_INTFLY | OPTION_SYNCHRONOUS |
- OPTION_ALWAYS_SYNCHRONOUS | OPTION_DISCONNECT;
- clock = 50000000; /* 50MHz SCSI Clock */
- ncr53c7xx_init(tpnt, 0, 710, address, 0, IRQ_AMIGA_PORTS,
- DMA_NONE, options, clock);
- num++;
- }
+ for (i = 0; amiga7xx_table[i].id; i++)
+ if (z->id == amiga7xx_table[i].id)
break;
-#endif
+ if (!amiga7xx_table[i].id)
+ continue;
+ if (amiga7xx_table[i].absolute)
+ address = amiga7xx_table[i].offset;
+ else
+ address = z->resource.start + amiga7xx_table[i].offset;
+ num += amiga7xx_register_one(tpnt, address);
+ }
+ return num;
+}
-#ifdef CONFIG_WARPENGINE_SCSI
- case ZORRO_PROD_MACROSYSTEMS_WARP_ENGINE_40xx:
- if (request_mem_region(address+0x40000, 0x1000, "ncr53c710")) {
- address = (unsigned long)z_ioremap(address, size);
- options = OPTION_MEMORY_MAPPED | OPTION_DEBUG_TEST1 |
- OPTION_INTFLY | OPTION_SYNCHRONOUS |
- OPTION_ALWAYS_SYNCHRONOUS | OPTION_DISCONNECT;
- clock = 50000000; /* 50MHz SCSI Clock */
- ncr53c7xx_init(tpnt, 0, 710, address+0x40000, 0,
- IRQ_AMIGA_PORTS, DMA_NONE, options, clock);
- num++;
- }
- break;
-#endif
+#endif /* CONFIG_ZORRO */
-#ifdef CONFIG_A4091_SCSI
- case ZORRO_PROD_CBM_A4091_1:
- case ZORRO_PROD_CBM_A4091_2:
- if (request_mem_region(address+0x800000, 0x1000, "ncr53c710")) {
- address = (unsigned long)z_ioremap(address, size);
- options = OPTION_MEMORY_MAPPED | OPTION_DEBUG_TEST1 |
- OPTION_INTFLY | OPTION_SYNCHRONOUS |
- OPTION_ALWAYS_SYNCHRONOUS | OPTION_DISCONNECT;
- clock = 50000000; /* 50MHz SCSI Clock */
- ncr53c7xx_init(tpnt, 0, 710, address+0x800000, 0,
- IRQ_AMIGA_PORTS, DMA_NONE, options, clock);
- num++;
- }
- break;
-#endif
-#ifdef CONFIG_GVP_TURBO_SCSI
- case ZORRO_PROD_GVP_GFORCE_040_060:
- if (request_mem_region(address+0x40000, 0x1000, "ncr53c710")) {
- address = ZTWO_VADDR(address);
- options = OPTION_MEMORY_MAPPED | OPTION_DEBUG_TEST1 |
- OPTION_INTFLY | OPTION_SYNCHRONOUS |
- OPTION_ALWAYS_SYNCHRONOUS | OPTION_DISCONNECT;
- clock = 50000000; /* 50MHz SCSI Clock */
- ncr53c7xx_init(tpnt, 0, 710, address+0x40000, 0,
- IRQ_AMIGA_PORTS, DMA_NONE, options, clock);
- num++;
- }
+int __init amiga7xx_detect(Scsi_Host_Template *tpnt)
+{
+ static unsigned char called = 0;
+ int num = 0;
+
+ if (called || !MACH_IS_AMIGA)
+ return 0;
+
+ tpnt->proc_name = "Amiga7xx";
+
+ if (AMIGAHW_PRESENT(A4000_SCSI))
+ num += amiga7xx_register_one(tpnt, 0xdd0040);
+
+#ifdef CONFIG_ZORRO
+ num += amiga7xx_zorro_detect(tpnt);
#endif
- }
- }
called = 1;
return num;
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)