fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / drivers / scsi / fd_mcs.c
index 32e0cd5..668569e 100644 (file)
@@ -96,7 +96,6 @@
 
 #include "scsi.h"
 #include <scsi/scsi_host.h>
-#include "fd_mcs.h"
 
 #define DRIVER_VERSION "v0.2 by ZP Gu<zpg@castle.net>"
 
 
 #define DEBUG            0     /* Enable debugging output */
 #define ENABLE_PARITY    1     /* Enable SCSI Parity */
-#define DO_DETECT        0     /* Do device detection here (see scsi.c) */
 
 /* END OF USER DEFINABLE OPTIONS */
 
 #if DEBUG
 #define EVERY_ACCESS     0     /* Write a line on every scsi access */
 #define ERRORS_ONLY      1     /* Only write a line if there is an error */
-#define DEBUG_DETECT     1     /* Debug fd_mcs_detect() */
 #define DEBUG_MESSAGES   1     /* Debug MESSAGE IN phase */
 #define DEBUG_ABORT      1     /* Debug abort() routine */
 #define DEBUG_RESET      1     /* Debug reset() routine */
 #else
 #define EVERY_ACCESS     0     /* LEAVE THESE ALONE--CHANGE THE ONES ABOVE */
 #define ERRORS_ONLY      0
-#define DEBUG_DETECT     0
 #define DEBUG_MESSAGES   0
 #define DEBUG_ABORT      0
 #define DEBUG_RESET      0
@@ -283,9 +279,9 @@ static struct fd_mcs_adapters_struct fd_mcs_adapters[] = {
         2},
 };
 
-#define FD_BRDS sizeof(fd_mcs_adapters)/sizeof(struct fd_mcs_adapters_struct)
+#define FD_BRDS ARRAY_SIZE(fd_mcs_adapters)
 
-static irqreturn_t fd_mcs_intr(int irq, void *dev_id, struct pt_regs *regs);
+static irqreturn_t fd_mcs_intr(int irq, void *dev_id);
 
 static unsigned long addresses[] = { 0xc8000, 0xca000, 0xce000, 0xde000 };
 static unsigned short ports[] = { 0x140, 0x150, 0x160, 0x170 };
@@ -298,6 +294,7 @@ static struct Scsi_Host *hosts[FD_MAX_HOSTS + 1] = { NULL };
 static int user_fifo_count = 0;
 static int user_fifo_size = 0;
 
+#ifndef MODULE
 static int __init fd_mcs_setup(char *str)
 {
        static int done_setup = 0;
@@ -315,6 +312,7 @@ static int __init fd_mcs_setup(char *str)
 }
 
 __setup("fd_mcs=", fd_mcs_setup);
+#endif /* !MODULE */
 
 static void print_banner(struct Scsi_Host *shpnt)
 {
@@ -347,7 +345,7 @@ static void fd_mcs_make_bus_idle(struct Scsi_Host *shpnt)
                outb(0x01 | PARITY_MASK, TMC_Cntl_port);
 }
 
-static int fd_mcs_detect(Scsi_Host_Template * tpnt)
+static int fd_mcs_detect(struct scsi_host_template * tpnt)
 {
        int loop;
        struct Scsi_Host *shpnt;
@@ -404,7 +402,7 @@ static int fd_mcs_detect(Scsi_Host_Template * tpnt)
                                mca_set_adapter_name(slot - 1, fd_mcs_adapters[loop].name);
 
                                /* check irq/region */
-                               if (request_irq(irq, fd_mcs_intr, SA_SHIRQ, "fd_mcs", hosts)) {
+                               if (request_irq(irq, fd_mcs_intr, IRQF_SHARED, "fd_mcs", hosts)) {
                                        printk(KERN_ERR "fd_mcs: interrupt is not available, skipping...\n");
                                        continue;
                                }
@@ -432,6 +430,7 @@ static int fd_mcs_detect(Scsi_Host_Template * tpnt)
                                FIFO_COUNT = user_fifo_count ? user_fifo_count : fd_mcs_adapters[loop].fifo_count;
                                FIFO_Size = user_fifo_size ? user_fifo_size : fd_mcs_adapters[loop].fifo_size;
 
+/* FIXME: Do we need to keep this bit of code inside NOT_USED around at all? */
 #ifdef NOT_USED
                                /* *************************************************** */
                                /* Try to toggle 32-bit mode.  This only
@@ -510,59 +509,6 @@ static int fd_mcs_detect(Scsi_Host_Template * tpnt)
                                outb(0, SCSI_Mode_Cntl_port);
                                outb(PARITY_MASK, TMC_Cntl_port);
                                /* done reset */
-
-#if DO_DETECT
-                               /* scan devices attached */
-                               {
-                                       const int buflen = 255;
-                                       int i, j, retcode;
-                                       Scsi_Cmnd SCinit;
-                                       unsigned char do_inquiry[] = { INQUIRY, 0, 0, 0, buflen, 0 };
-                                       unsigned char do_request_sense[] = { REQUEST_SENSE,
-                                               0, 0, 0, buflen, 0
-                                       };
-                                       unsigned char do_read_capacity[] = { READ_CAPACITY,
-                                               0, 0, 0, 0, 0, 0, 0, 0, 0
-                                       };
-                                       unsigned char buf[buflen];
-
-                                       SCinit.request_buffer = SCinit.buffer = buf;
-                                       SCinit.request_bufflen = SCinit.bufflen = sizeof(buf) - 1;
-                                       SCinit.use_sg = 0;
-                                       SCinit.lun = 0;
-                                       SCinit.host = shpnt;
-
-                                       printk("fd_mcs: detection routine scanning for devices:\n");
-                                       for (i = 0; i < 8; i++) {
-                                               if (i == shpnt->this_id)        /* Skip host adapter */
-                                                       continue;
-                                               SCinit.target = i;
-                                               memcpy(SCinit.cmnd, do_request_sense, sizeof(do_request_sense));
-                                               retcode = fd_mcs_command(&SCinit);
-                                               if (!retcode) {
-                                                       memcpy(SCinit.cmnd, do_inquiry, sizeof(do_inquiry));
-                                                       retcode = fd_mcs_command(&SCinit);
-                                                       if (!retcode) {
-                                                               printk("     SCSI ID %d: ", i);
-                                                               for (j = 8; j < (buf[4] < 32 ? buf[4] : 32); j++)
-                                                                       printk("%c", buf[j] >= 20 ? buf[j] : ' ');
-                                                               memcpy(SCinit.cmnd, do_read_capacity, sizeof(do_read_capacity));
-                                                               retcode = fd_mcs_command(&SCinit);
-                                                               if (!retcode) {
-                                                                       unsigned long blocks, size, capacity;
-
-                                                                       blocks = (buf[0] << 24) | (buf[1] << 16)
-                                                                           | (buf[2] << 8) | buf[3];
-                                                                       size = (buf[4] << 24) | (buf[5] << 16) | (buf[6] << 8) | buf[7];
-                                                                       capacity = +(+(blocks / 1024L) * +(size * 10L)) / 1024L;
-
-                                                                       printk("%lu MB (%lu byte blocks)\n", ((capacity + 5L) / 10L), size);
-                                                               }
-                                                       }
-                                               }
-                                       }
-                               }
-#endif
                        }
                }
 
@@ -673,7 +619,7 @@ static void my_done(struct Scsi_Host *shpnt, int error)
 }
 
 /* only my_done needs to be protected  */
-static irqreturn_t fd_mcs_intr(int irq, void *dev_id, struct pt_regs *regs)
+static irqreturn_t fd_mcs_intr(int irq, void *dev_id)
 {
        unsigned long flags;
        int status;
@@ -727,7 +673,7 @@ static irqreturn_t fd_mcs_intr(int irq, void *dev_id, struct pt_regs *regs)
                outb(0x40 | FIFO_COUNT, Interrupt_Cntl_port);
 
                outb(0x82, SCSI_Cntl_port);     /* Bus Enable + Select */
-               outb(adapter_mask | (1 << current_SC->device->id), SCSI_Data_NoACK_port);
+               outb(adapter_mask | (1 << scmd_id(current_SC)), SCSI_Data_NoACK_port);
 
                /* Stop arbitration and enable parity */
                outb(0x10 | PARITY_MASK, TMC_Cntl_port);
@@ -739,7 +685,7 @@ static irqreturn_t fd_mcs_intr(int irq, void *dev_id, struct pt_regs *regs)
                status = inb(SCSI_Status_port);
                if (!(status & 0x01)) {
                        /* Try again, for slow devices */
-                       if (fd_mcs_select(shpnt, current_SC->device->id)) {
+                       if (fd_mcs_select(shpnt, scmd_id(current_SC))) {
 #if EVERY_ACCESS
                                printk(" SFAIL ");
 #endif
@@ -1297,18 +1243,9 @@ static int fd_mcs_abort(Scsi_Cmnd * SCpnt)
        return SUCCESS;
 }
 
-static int fd_mcs_host_reset(Scsi_Cmnd * SCpnt)
-{
-       return FAILED;
-}
-
-static int fd_mcs_device_reset(Scsi_Cmnd * SCpnt) 
-{
-       return FAILED;
-}
-
 static int fd_mcs_bus_reset(Scsi_Cmnd * SCpnt) {
        struct Scsi_Host *shpnt = SCpnt->device->host;
+       unsigned long flags;
 
 #if DEBUG_RESET
        static int called_once = 0;
@@ -1325,6 +1262,8 @@ static int fd_mcs_bus_reset(Scsi_Cmnd * SCpnt) {
        called_once = 1;
 #endif
 
+       spin_lock_irqsave(shpnt->host_lock, flags);
+
        outb(1, SCSI_Cntl_port);
        do_pause(2);
        outb(0, SCSI_Cntl_port);
@@ -1332,6 +1271,8 @@ static int fd_mcs_bus_reset(Scsi_Cmnd * SCpnt) {
        outb(0, SCSI_Mode_Cntl_port);
        outb(PARITY_MASK, TMC_Cntl_port);
 
+       spin_unlock_irqrestore(shpnt->host_lock, flags);
+
        /* Unless this is the very first call (i.e., SCPnt == NULL), everything
           is probably hosed at this point.  We will, however, try to keep
           things going by informing the high-level code that we need help. */
@@ -1404,7 +1345,7 @@ static int fd_mcs_biosparam(struct scsi_device * disk, struct block_device *bdev
        return 0;
 }
 
-static Scsi_Host_Template driver_template = {
+static struct scsi_host_template driver_template = {
        .proc_name                      = "fd_mcs",
        .proc_info                      = fd_mcs_proc_info,
        .detect                         = fd_mcs_detect,
@@ -1413,8 +1354,6 @@ static Scsi_Host_Template driver_template = {
        .queuecommand                   = fd_mcs_queue, 
        .eh_abort_handler               = fd_mcs_abort,
        .eh_bus_reset_handler           = fd_mcs_bus_reset,
-       .eh_host_reset_handler          = fd_mcs_host_reset,
-       .eh_device_reset_handler        = fd_mcs_device_reset,
        .bios_param                     = fd_mcs_biosparam,
        .can_queue                      = 1,
        .this_id                        = 7,
@@ -1423,3 +1362,5 @@ static Scsi_Host_Template driver_template = {
        .use_clustering                 = DISABLE_CLUSTERING,
 };
 #include "scsi_module.c"
+
+MODULE_LICENSE("GPL");