fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / drivers / scsi / g_NCR5380.c
index f289be2..cdd893b 100644 (file)
@@ -91,7 +91,6 @@
 #define AUTOPROBE_IRQ
 #define AUTOSENSE
 
-#include <linux/config.h>
 
 #ifdef CONFIG_SCSI_GENERIC_NCR53C400
 #define NCR53C400_PSEUDO_DMA 1
 #include <linux/sched.h>
 #include <linux/blkdev.h>
 #include "scsi.h"
-#include "hosts.h"
+#include <scsi/scsi_host.h>
 #include "g_NCR5380.h"
 #include "NCR5380.h"
 #include <linux/stat.h>
@@ -127,7 +126,7 @@ static int ncr_53c400a = NCR_NOT_SET;
 static int dtc_3181e = NCR_NOT_SET;
 
 static struct override {
-       NCR5380_implementation_fields;
+       NCR5380_map_type NCR5380_map_name;
        int irq;
        int dma;
        int board;              /* Use NCR53c400, Ricoh, etc. extensions ? */
@@ -138,10 +137,9 @@ static struct override {
 [1] __initdata = { { 0,},};
 #endif
 
+#define NO_OVERRIDES ARRAY_SIZE(overrides)
 
-#define NO_OVERRIDES (sizeof(overrides) / sizeof(struct override))
-
-#ifndef MODULE 
+#ifndef MODULE
 
 /**
  *     internal_setup          -       handle lilo command string override
@@ -210,7 +208,7 @@ static int __init do_NCR5380_setup(char *str)
 {
        int ints[10];
 
-       get_options(str, sizeof(ints) / sizeof(int), ints);
+       get_options(str, ARRAY_SIZE(ints), ints);
        internal_setup(BOARD_NCR5380, str, ints);
        return 1;
 }
@@ -218,7 +216,7 @@ static int __init do_NCR5380_setup(char *str)
 /**
  *     do_NCR53C400_setup              -       set up entry point
  *     @str: unused
- *     @ints: integer parameters from kernel setup code 
+ *     @ints: integer parameters from kernel setup code
  *
  *     Setup function invoked at boot to parse the ncr53c400= command
  *     line.
@@ -228,7 +226,7 @@ static int __init do_NCR53C400_setup(char *str)
 {
        int ints[10];
 
-       get_options(str, sizeof(ints) / sizeof(int), ints);
+       get_options(str, ARRAY_SIZE(ints), ints);
        internal_setup(BOARD_NCR53C400, str, ints);
        return 1;
 }
@@ -236,7 +234,7 @@ static int __init do_NCR53C400_setup(char *str)
 /**
  *     do_NCR53C400A_setup     -       set up entry point
  *     @str: unused
- *     @ints: integer parameters from kernel setup code 
+ *     @ints: integer parameters from kernel setup code
  *
  *     Setup function invoked at boot to parse the ncr53c400a= command
  *     line.
@@ -246,7 +244,7 @@ static int __init do_NCR53C400A_setup(char *str)
 {
        int ints[10];
 
-       get_options(str, sizeof(ints) / sizeof(int), ints);
+       get_options(str, ARRAY_SIZE(ints), ints);
        internal_setup(BOARD_NCR53C400A, str, ints);
        return 1;
 }
@@ -254,7 +252,7 @@ static int __init do_NCR53C400A_setup(char *str)
 /**
  *     do_DTC3181E_setup       -       set up entry point
  *     @str: unused
- *     @ints: integer parameters from kernel setup code 
+ *     @ints: integer parameters from kernel setup code
  *
  *     Setup function invoked at boot to parse the dtc3181e= command
  *     line.
@@ -264,7 +262,7 @@ static int __init do_DTC3181E_setup(char *str)
 {
        int ints[10];
 
-       get_options(str, sizeof(ints) / sizeof(int), ints);
+       get_options(str, ARRAY_SIZE(ints), ints);
        internal_setup(BOARD_DTC3181E, str, ints);
        return 1;
 }
@@ -285,7 +283,7 @@ static int __init do_DTC3181E_setup(char *str)
  *     Locks: none
  */
 
-int __init generic_NCR5380_detect(Scsi_Host_Template * tpnt)
+int __init generic_NCR5380_detect(struct scsi_host_template * tpnt)
 {
        static int current_override = 0;
        int count, i;
@@ -299,6 +297,10 @@ int __init generic_NCR5380_detect(Scsi_Host_Template * tpnt)
        };
        int flags = 0;
        struct Scsi_Host *instance;
+#ifdef CONFIG_SCSI_G_NCR5380_MEM
+       unsigned long base;
+       void __iomem *iomem;
+#endif
 
        if (ncr_irq != NCR_NOT_SET)
                overrides[0].irq = ncr_irq;
@@ -355,7 +357,7 @@ int __init generic_NCR5380_detect(Scsi_Host_Template * tpnt)
                if (!(overrides[current_override].NCR5380_map_name))
                        continue;
 
-               ports = 0;
+               ports = NULL;
                switch (overrides[current_override].board) {
                case BOARD_NCR5380:
                        flags = FLAG_NO_PSEUDO_DMA;
@@ -424,15 +426,22 @@ int __init generic_NCR5380_detect(Scsi_Host_Template * tpnt)
                        region_size = NCR5380_region_size;
                }
 #else
-               if(!request_mem_region(overrides[current_override].NCR5380_map_name, NCR5380_region_size, "ncr5380"))
+               base = overrides[current_override].NCR5380_map_name;
+               if (!request_mem_region(base, NCR5380_region_size, "ncr5380"))
+                       continue;
+               iomem = ioremap(base, NCR5380_region_size);
+               if (!iomem) {
+                       release_mem_region(base, NCR5380_region_size);
                        continue;
+               }
 #endif
                instance = scsi_register(tpnt, sizeof(struct NCR5380_hostdata));
                if (instance == NULL) {
 #ifndef CONFIG_SCSI_G_NCR5380_MEM
                        release_region(overrides[current_override].NCR5380_map_name, region_size);
 #else
-                       release_mem_region(overrides[current_override].NCR5380_map_name, NCR5380_region_size);
+                       iounmap(iomem);
+                       release_mem_region(base, NCR5380_region_size);
 #endif
                        continue;
                }
@@ -440,6 +449,8 @@ int __init generic_NCR5380_detect(Scsi_Host_Template * tpnt)
                instance->NCR5380_instance_name = overrides[current_override].NCR5380_map_name;
 #ifndef CONFIG_SCSI_G_NCR5380_MEM
                instance->n_io_port = region_size;
+#else
+               ((struct NCR5380_hostdata *)instance->hostdata).iomem = iomem;
 #endif
 
                NCR5380_init(instance, flags);
@@ -450,7 +461,7 @@ int __init generic_NCR5380_detect(Scsi_Host_Template * tpnt)
                        instance->irq = NCR5380_probe_irq(instance, 0xffff);
 
                if (instance->irq != SCSI_IRQ_NONE)
-                       if (request_irq(instance->irq, generic_NCR5380_intr, SA_INTERRUPT, "NCR5380", instance)) {
+                       if (request_irq(instance->irq, generic_NCR5380_intr, IRQF_DISABLED, "NCR5380", instance)) {
                                printk(KERN_WARNING "scsi%d : IRQ%d not free, interrupts disabled\n", instance->host_no, instance->irq);
                                instance->irq = SCSI_IRQ_NONE;
                        }
@@ -501,15 +512,18 @@ int generic_NCR5380_release_resources(struct Scsi_Host *instance)
 {
        NCR5380_local_declare();
        NCR5380_setup(instance);
+       
+       if (instance->irq != SCSI_IRQ_NONE)
+               free_irq(instance->irq, NULL);
+       NCR5380_exit(instance);
 
 #ifndef CONFIG_SCSI_G_NCR5380_MEM
        release_region(instance->NCR5380_instance_name, instance->n_io_port);
 #else
+       iounmap(((struct NCR5380_hostdata *)instance->hostdata).iomem);
        release_mem_region(instance->NCR5380_instance_name, NCR5380_region_size);
 #endif
 
-       if (instance->irq != SCSI_IRQ_NONE)
-               free_irq(instance->irq, NULL);
 
        return 0;
 }
@@ -584,7 +598,7 @@ static inline int NCR5380_pread(struct Scsi_Host *instance, unsigned char *dst,
                }
 #else
                /* implies CONFIG_SCSI_G_NCR5380_MEM */
-               isa_memcpy_fromio(dst + start, NCR53C400_host_buffer + NCR5380_map_name, 128);
+               memcpy_fromio(dst + start, iomem + NCR53C400_host_buffer, 128);
 #endif
                start += 128;
                blocks--;
@@ -604,7 +618,7 @@ static inline int NCR5380_pread(struct Scsi_Host *instance, unsigned char *dst,
                }
 #else
                /* implies CONFIG_SCSI_G_NCR5380_MEM */
-               isa_memcpy_fromio(dst + start, NCR53C400_host_buffer + NCR5380_map_name, 128);
+               memcpy_fromio(dst + start, iomem + NCR53C400_host_buffer, 128);
 #endif
                start += 128;
                blocks--;
@@ -669,7 +683,7 @@ static inline int NCR5380_pwrite(struct Scsi_Host *instance, unsigned char *src,
                }
 #else
                /* implies CONFIG_SCSI_G_NCR5380_MEM */
-               isa_memcpy_toio(NCR53C400_host_buffer + NCR5380_map_name, src + start, 128);
+               memcpy_toio(iomem + NCR53C400_host_buffer, src + start, 128);
 #endif
                start += 128;
                blocks--;
@@ -685,7 +699,7 @@ static inline int NCR5380_pwrite(struct Scsi_Host *instance, unsigned char *src,
                }
 #else
                /* implies CONFIG_SCSI_G_NCR5380_MEM */
-               isa_memcpy_toio(NCR53C400_host_buffer + NCR5380_map_name, src + start, 128);
+               memcpy_toio(iomem + NCR53C400_host_buffer, src + start, 128);
 #endif
                start += 128;
                blocks--;
@@ -796,8 +810,7 @@ static int generic_NCR5380_proc_info(struct Scsi_Host *scsi_ptr, char *buffer, c
        Scsi_Cmnd *ptr;
        struct NCR5380_hostdata *hostdata;
 #ifdef NCR5380_STATS
-       Scsi_Device *dev;
-       extern const char *const scsi_device_types[MAX_SCSI_DEVICE_CODE];
+       struct scsi_device *dev;
 #endif
 
        NCR5380_setup(scsi_ptr);
@@ -837,7 +850,7 @@ static int generic_NCR5380_proc_info(struct Scsi_Host *scsi_ptr, char *buffer, c
                long tr = hostdata->time_read[dev->id] / HZ;
                long tw = hostdata->time_write[dev->id] / HZ;
 
-               PRINTP("  T:%d %s " ANDP dev->id ANDP(dev->type < MAX_SCSI_DEVICE_CODE) ? scsi_device_types[(int) dev->type] : "Unknown");
+               PRINTP("  T:%d %s " ANDP dev->id ANDP scsi_device_type(dev->type));
                for (i = 0; i < 8; i++)
                        if (dev->vendor[i] >= 0x20)
                                *(buffer + (len++)) = dev->vendor[i];
@@ -897,7 +910,7 @@ static int generic_NCR5380_proc_info(struct Scsi_Host *scsi_ptr, char *buffer, c
 #undef PRINTP
 #undef ANDP
 
-static Scsi_Host_Template driver_template = {
+static struct scsi_host_template driver_template = {
        .proc_info              = generic_NCR5380_proc_info,
        .name                   = "Generic NCR5380/NCR53C400 Scsi Driver",
        .detect                 = generic_NCR5380_detect,
@@ -906,8 +919,6 @@ static Scsi_Host_Template driver_template = {
        .queuecommand           = generic_NCR5380_queue_command,
        .eh_abort_handler       = generic_NCR5380_abort,
        .eh_bus_reset_handler   = generic_NCR5380_bus_reset,
-       .eh_device_reset_handler = generic_NCR5380_device_reset,
-       .eh_host_reset_handler  = generic_NCR5380_host_reset,
        .bios_param             = NCR5380_BIOSPARAM,
        .can_queue              = CAN_QUEUE,
         .this_id               = 7,
@@ -918,13 +929,13 @@ static Scsi_Host_Template driver_template = {
 #include <linux/module.h>
 #include "scsi_module.c"
 
-MODULE_PARM(ncr_irq, "i");
-MODULE_PARM(ncr_dma, "i");
-MODULE_PARM(ncr_addr, "i");
-MODULE_PARM(ncr_5380, "i");
-MODULE_PARM(ncr_53c400, "i");
-MODULE_PARM(ncr_53c400a, "i");
-MODULE_PARM(dtc_3181e, "i");
+module_param(ncr_irq, int, 0);
+module_param(ncr_dma, int, 0);
+module_param(ncr_addr, int, 0);
+module_param(ncr_5380, int, 0);
+module_param(ncr_53c400, int, 0);
+module_param(ncr_53c400a, int, 0);
+module_param(dtc_3181e, int, 0);
 MODULE_LICENSE("GPL");