Merge git://git.kernel.org/pub/scm/linux/kernel/git/sfrench/cifs-2.6
[pandora-kernel.git] / drivers / scsi / pcmcia / nsp_cs.c
index c6f8c6e..5082ca3 100644 (file)
@@ -25,8 +25,6 @@
 
 ***********************************************************************/
 
-/* $Id: nsp_cs.c,v 1.23 2003/08/18 11:09:19 elca Exp $ */
-
 #include <linux/version.h>
 #include <linux/module.h>
 #include <linux/kernel.h>
@@ -59,7 +57,7 @@
 #include "nsp_cs.h"
 
 MODULE_AUTHOR("YOKOTA Hiroshi <yokota@netlab.is.tsukuba.ac.jp>");
-MODULE_DESCRIPTION("WorkBit NinjaSCSI-3 / NinjaSCSI-32Bi(16bit) PCMCIA SCSI host adapter module $Revision: 1.23 $");
+MODULE_DESCRIPTION("WorkBit NinjaSCSI-3 / NinjaSCSI-32Bi(16bit) PCMCIA SCSI host adapter module");
 MODULE_SUPPORTED_DEVICE("sd,sr,sg,st");
 #ifdef MODULE_LICENSE
 MODULE_LICENSE("GPL");
@@ -83,10 +81,6 @@ static struct scsi_host_template nsp_driver_template = {
        .proc_name               = "nsp_cs",
        .proc_info               = nsp_proc_info,
        .name                    = "WorkBit NinjaSCSI-3/32Bi(16bit)",
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
-       .detect                  = nsp_detect_old,
-       .release                 = nsp_release_old,
-#endif
        .info                    = nsp_info,
        .queuecommand            = nsp_queuecommand,
 /*     .eh_abort_handler        = nsp_eh_abort,*/
@@ -97,9 +91,6 @@ static struct scsi_host_template nsp_driver_template = {
        .sg_tablesize            = SG_ALL,
        .cmd_per_lun             = 1,
        .use_clustering          = DISABLE_CLUSTERING,
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,2))
-       .use_new_eh_code         = 1,
-#endif
 };
 
 static nsp_hw_data nsp_data_base; /* attach <-> detect glue */
@@ -144,6 +135,11 @@ static nsp_hw_data nsp_data_base; /* attach <-> detect glue */
 
 #define NSP_DEBUG_BUF_LEN              150
 
+static inline void nsp_inc_resid(struct scsi_cmnd *SCpnt, int residInc)
+{
+       scsi_set_resid(SCpnt, scsi_get_resid(SCpnt) + residInc);
+}
+
 static void nsp_cs_message(const char *func, int line, char *type, char *fmt, ...)
 {
        va_list args;
@@ -201,8 +197,10 @@ static int nsp_queuecommand(struct scsi_cmnd *SCpnt,
 #endif
        nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
 
-       nsp_dbg(NSP_DEBUG_QUEUECOMMAND, "SCpnt=0x%p target=%d lun=%d buff=0x%p bufflen=%d use_sg=%d",
-                  SCpnt, target, SCpnt->device->lun, SCpnt->request_buffer, SCpnt->request_bufflen, SCpnt->use_sg);
+       nsp_dbg(NSP_DEBUG_QUEUECOMMAND,
+               "SCpnt=0x%p target=%d lun=%d sglist=0x%p bufflen=%d sg_count=%d",
+               SCpnt, target, SCpnt->device->lun, scsi_sglist(SCpnt),
+               scsi_bufflen(SCpnt), scsi_sg_count(SCpnt));
        //nsp_dbg(NSP_DEBUG_QUEUECOMMAND, "before CurrentSC=0x%p", data->CurrentSC);
 
        SCpnt->scsi_done        = done;
@@ -234,7 +232,7 @@ static int nsp_queuecommand(struct scsi_cmnd *SCpnt,
        SCpnt->SCp.have_data_in = IO_UNKNOWN;
        SCpnt->SCp.sent_command = 0;
        SCpnt->SCp.phase        = PH_UNDETERMINED;
-       SCpnt->resid            = SCpnt->request_bufflen;
+       scsi_set_resid(SCpnt, scsi_bufflen(SCpnt));
 
        /* setup scratch area
           SCp.ptr              : buffer pointer
@@ -242,14 +240,14 @@ static int nsp_queuecommand(struct scsi_cmnd *SCpnt,
           SCp.buffer           : next buffer
           SCp.buffers_residual : left buffers in list
           SCp.phase            : current state of the command */
-       if (SCpnt->use_sg) {
-               SCpnt->SCp.buffer           = (struct scatterlist *) SCpnt->request_buffer;
+       if (scsi_bufflen(SCpnt)) {
+               SCpnt->SCp.buffer           = scsi_sglist(SCpnt);
                SCpnt->SCp.ptr              = BUFFER_ADDR;
                SCpnt->SCp.this_residual    = SCpnt->SCp.buffer->length;
-               SCpnt->SCp.buffers_residual = SCpnt->use_sg - 1;
+               SCpnt->SCp.buffers_residual = scsi_sg_count(SCpnt) - 1;
        } else {
-               SCpnt->SCp.ptr              = (char *) SCpnt->request_buffer;
-               SCpnt->SCp.this_residual    = SCpnt->request_bufflen;
+               SCpnt->SCp.ptr              = NULL;
+               SCpnt->SCp.this_residual    = 0;
                SCpnt->SCp.buffer           = NULL;
                SCpnt->SCp.buffers_residual = 0;
        }
@@ -730,7 +728,9 @@ static void nsp_pio_read(struct scsi_cmnd *SCpnt)
        ocount = data->FifoCount;
 
        nsp_dbg(NSP_DEBUG_DATA_IO, "in SCpnt=0x%p resid=%d ocount=%d ptr=0x%p this_residual=%d buffers=0x%p nbuf=%d",
-               SCpnt, SCpnt->resid, ocount, SCpnt->SCp.ptr, SCpnt->SCp.this_residual, SCpnt->SCp.buffer, SCpnt->SCp.buffers_residual);
+               SCpnt, scsi_get_resid(SCpnt), ocount, SCpnt->SCp.ptr,
+               SCpnt->SCp.this_residual, SCpnt->SCp.buffer,
+               SCpnt->SCp.buffers_residual);
 
        time_out = 1000;
 
@@ -780,7 +780,7 @@ static void nsp_pio_read(struct scsi_cmnd *SCpnt)
                        return;
                }
 
-               SCpnt->resid             -= res;
+               nsp_inc_resid(SCpnt, -res);
                SCpnt->SCp.ptr           += res;
                SCpnt->SCp.this_residual -= res;
                ocount                   += res;
@@ -804,10 +804,12 @@ static void nsp_pio_read(struct scsi_cmnd *SCpnt)
 
        if (time_out == 0) {
                nsp_msg(KERN_DEBUG, "pio read timeout resid=%d this_residual=%d buffers_residual=%d",
-                       SCpnt->resid, SCpnt->SCp.this_residual, SCpnt->SCp.buffers_residual);
+                       scsi_get_resid(SCpnt), SCpnt->SCp.this_residual,
+                       SCpnt->SCp.buffers_residual);
        }
        nsp_dbg(NSP_DEBUG_DATA_IO, "read ocount=0x%x", ocount);
-       nsp_dbg(NSP_DEBUG_DATA_IO, "r cmd=%d resid=0x%x\n", data->CmdId, SCpnt->resid);
+       nsp_dbg(NSP_DEBUG_DATA_IO, "r cmd=%d resid=0x%x\n", data->CmdId,
+                                                       scsi_get_resid(SCpnt));
 }
 
 /*
@@ -825,7 +827,9 @@ static void nsp_pio_write(struct scsi_cmnd *SCpnt)
        ocount   = data->FifoCount;
 
        nsp_dbg(NSP_DEBUG_DATA_IO, "in fifocount=%d ptr=0x%p this_residual=%d buffers=0x%p nbuf=%d resid=0x%x",
-               data->FifoCount, SCpnt->SCp.ptr, SCpnt->SCp.this_residual, SCpnt->SCp.buffer, SCpnt->SCp.buffers_residual, SCpnt->resid);
+               data->FifoCount, SCpnt->SCp.ptr, SCpnt->SCp.this_residual,
+               SCpnt->SCp.buffer, SCpnt->SCp.buffers_residual,
+               scsi_get_resid(SCpnt));
 
        time_out = 1000;
 
@@ -839,7 +843,7 @@ static void nsp_pio_write(struct scsi_cmnd *SCpnt)
 
                        nsp_dbg(NSP_DEBUG_DATA_IO, "phase changed stat=0x%x, res=%d\n", stat, res);
                        /* Put back pointer */
-                       SCpnt->resid             += res;
+                       nsp_inc_resid(SCpnt, res);
                        SCpnt->SCp.ptr           -= res;
                        SCpnt->SCp.this_residual += res;
                        ocount                   -= res;
@@ -875,7 +879,7 @@ static void nsp_pio_write(struct scsi_cmnd *SCpnt)
                        break;
                }
 
-               SCpnt->resid             -= res;
+               nsp_inc_resid(SCpnt, -res);
                SCpnt->SCp.ptr           += res;
                SCpnt->SCp.this_residual -= res;
                ocount                   += res;
@@ -895,10 +899,12 @@ static void nsp_pio_write(struct scsi_cmnd *SCpnt)
        data->FifoCount = ocount;
 
        if (time_out == 0) {
-               nsp_msg(KERN_DEBUG, "pio write timeout resid=0x%x", SCpnt->resid);
+               nsp_msg(KERN_DEBUG, "pio write timeout resid=0x%x",
+                                                       scsi_get_resid(SCpnt));
        }
        nsp_dbg(NSP_DEBUG_DATA_IO, "write ocount=0x%x", ocount);
-       nsp_dbg(NSP_DEBUG_DATA_IO, "w cmd=%d resid=0x%x\n", data->CmdId, SCpnt->resid);
+       nsp_dbg(NSP_DEBUG_DATA_IO, "w cmd=%d resid=0x%x\n", data->CmdId,
+                                                       scsi_get_resid(SCpnt));
 }
 #undef RFIFO_CRIT
 #undef WFIFO_CRIT
@@ -920,9 +926,8 @@ static int nsp_nexus(struct scsi_cmnd *SCpnt)
        nsp_index_write(base, SYNCREG,  sync->SyncRegister);
        nsp_index_write(base, ACKWIDTH, sync->AckWidth);
 
-       if (SCpnt->use_sg    == 0        ||
-           SCpnt->resid % 4 != 0        ||
-           SCpnt->resid     <= PAGE_SIZE ) {
+       if (scsi_get_resid(SCpnt) % 4 != 0 ||
+           scsi_get_resid(SCpnt) <= PAGE_SIZE ) {
                data->TransferMode = MODE_IO8;
        } else if (nsp_burst_mode == BURST_MEM32) {
                data->TransferMode = MODE_MEM32;
@@ -1313,11 +1318,7 @@ static struct Scsi_Host *nsp_detect(struct scsi_host_template *sht)
        nsp_hw_data *data_b = &nsp_data_base, *data;
 
        nsp_dbg(NSP_DEBUG_INIT, "this_id=%d", sht->this_id);
-#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,73))
        host = scsi_host_alloc(&nsp_driver_template, sizeof(nsp_hw_data));
-#else
-       host = scsi_register(sht, sizeof(nsp_hw_data));
-#endif
        if (host == NULL) {
                nsp_dbg(NSP_DEBUG_INIT, "host failed");
                return NULL;
@@ -1354,37 +1355,6 @@ static struct Scsi_Host *nsp_detect(struct scsi_host_template *sht)
        return host; /* detect done. */
 }
 
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
-static int nsp_detect_old(struct scsi_host_template *sht)
-{
-       if (nsp_detect(sht) == NULL) {
-               return 0;
-       } else {
-               //MOD_INC_USE_COUNT;
-               return 1;
-       }
-}
-
-
-static int nsp_release_old(struct Scsi_Host *shpnt)
-{
-       //nsp_hw_data *data = (nsp_hw_data *)shpnt->hostdata;
-
-       /* PCMCIA Card Service dose same things below. */
-       /* So we do nothing.                           */
-       //if (shpnt->irq) {
-       //      free_irq(shpnt->irq, data->ScsiInfo);
-       //}
-       //if (shpnt->io_port) {
-       //      release_region(shpnt->io_port, shpnt->n_io_port);
-       //}
-
-       //MOD_DEC_USE_COUNT;
-
-       return 0;
-}
-#endif
-
 /*----------------------------------------------------------------*/
 /* return info string                                            */
 /*----------------------------------------------------------------*/
@@ -1403,19 +1373,9 @@ static const char *nsp_info(struct Scsi_Host *shpnt)
                        nsp_dbg(NSP_DEBUG_PROC, "buffer=0x%p pos=0x%p length=%d %d\n", buffer, pos, length,  length - (pos - buffer));\
                } \
        } while(0)
-static int
-nsp_proc_info(
-#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,73))
-       struct Scsi_Host *host,
-#endif
-       char  *buffer,
-       char **start,
-       off_t  offset,
-       int    length,
-#if !(LINUX_VERSION_CODE > KERNEL_VERSION(2,5,73))
-       int    hostno,
-#endif
-       int    inout)
+
+static int nsp_proc_info(struct Scsi_Host *host, char *buffer, char **start,
+                        off_t offset, int length, int inout)
 {
        int id;
        char *pos = buffer;
@@ -1423,24 +1383,13 @@ nsp_proc_info(
        int speed;
        unsigned long flags;
        nsp_hw_data *data;
-#if !(LINUX_VERSION_CODE > KERNEL_VERSION(2,5,73))
-       struct Scsi_Host *host;
-#else
        int hostno;
-#endif
+
        if (inout) {
                return -EINVAL;
        }
 
-#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,73))
        hostno = host->host_no;
-#else
-       /* search this HBA host */
-       host = scsi_host_hn_get(hostno);
-       if (host == NULL) {
-               return -ESRCH;
-       }
-#endif
        data = (nsp_hw_data *)host->hostdata;
 
 
@@ -1602,9 +1551,8 @@ static int nsp_cs_probe(struct pcmcia_device *link)
        nsp_dbg(NSP_DEBUG_INIT, "in");
 
        /* Create new SCSI device */
-       info = kmalloc(sizeof(*info), GFP_KERNEL);
+       info = kzalloc(sizeof(*info), GFP_KERNEL);
        if (info == NULL) { return -ENOMEM; }
-       memset(info, 0, sizeof(*info));
        info->p_dev = link;
        link->priv = info;
        data->ScsiInfo = info;
@@ -1676,10 +1624,6 @@ static int nsp_cs_config(struct pcmcia_device *link)
        cistpl_cftable_entry_t dflt = { 0 };
        struct Scsi_Host *host;
        nsp_hw_data      *data = &nsp_data_base;
-#if !(LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,74))
-       struct scsi_device       *dev;
-       dev_node_t      **tail, *node;
-#endif
 
        nsp_dbg(NSP_DEBUG_INIT, "in");
 
@@ -1812,17 +1756,7 @@ static int nsp_cs_config(struct pcmcia_device *link)
                goto cs_failed;
        }
 
-#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,2))
        host = nsp_detect(&nsp_driver_template);
-#else
-       scsi_register_host(&nsp_driver_template);
-       for (host = scsi_host_get_next(NULL); host != NULL;
-            host = scsi_host_get_next(host)) {
-               if (host->hostt == &nsp_driver_template) {
-                       break;
-               }
-       }
-#endif
 
        if (host == NULL) {
                nsp_dbg(NSP_DEBUG_INIT, "detect failed");
@@ -1830,7 +1764,6 @@ static int nsp_cs_config(struct pcmcia_device *link)
        }
 
 
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,74))
        ret = scsi_add_host (host, NULL);
        if (ret)
                goto cs_failed;
@@ -1841,52 +1774,6 @@ static int nsp_cs_config(struct pcmcia_device *link)
        link->dev_node  = &info->node;
        info->host = host;
 
-#else
-       nsp_dbg(NSP_DEBUG_INIT, "GET_SCSI_INFO");
-       tail = &link->dev_node;
-       info->ndev = 0;
-
-       nsp_dbg(NSP_DEBUG_INIT, "host=0x%p", host);
-
-       for (dev = host->host_queue; dev != NULL; dev = dev->next) {
-               unsigned long id;
-               id = (dev->id & 0x0f) + ((dev->lun & 0x0f) << 4) +
-                       ((dev->channel & 0x0f) << 8) +
-                       ((dev->host->host_no & 0x0f) << 12);
-               node = &info->node[info->ndev];
-               node->minor = 0;
-               switch (dev->type) {
-               case TYPE_TAPE:
-                       node->major = SCSI_TAPE_MAJOR;
-                       snprintf(node->dev_name, sizeof(node->dev_name), "st#%04lx", id);
-                       break;
-               case TYPE_DISK:
-               case TYPE_MOD:
-                       node->major = SCSI_DISK0_MAJOR;
-                       snprintf(node->dev_name, sizeof(node->dev_name), "sd#%04lx", id);
-                       break;
-               case TYPE_ROM:
-               case TYPE_WORM:
-                       node->major = SCSI_CDROM_MAJOR;
-                       snprintf(node->dev_name, sizeof(node->dev_name), "sr#%04lx", id);
-                       break;
-               default:
-                       node->major = SCSI_GENERIC_MAJOR;
-                       snprintf(node->dev_name, sizeof(node->dev_name), "sg#%04lx", id);
-                       break;
-               }
-               *tail = node; tail = &node->next;
-               info->ndev++;
-               info->host = dev->host;
-       }
-
-       *tail = NULL;
-       if (info->ndev == 0) {
-               nsp_msg(KERN_INFO, "no SCSI devices found");
-       }
-       nsp_dbg(NSP_DEBUG_INIT, "host=0x%p", host);
-#endif
-
        /* Finally, report what we've done */
        printk(KERN_INFO "nsp_cs: index 0x%02x: ",
               link->conf.ConfigIndex);
@@ -1939,13 +1826,9 @@ static void nsp_cs_release(struct pcmcia_device *link)
        nsp_dbg(NSP_DEBUG_INIT, "link=0x%p", link);
 
        /* Unlink the device chain */
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,2))
        if (info->host != NULL) {
                scsi_remove_host(info->host);
        }
-#else
-       scsi_unregister_host(&nsp_driver_template);
-#endif
        link->dev_node = NULL;
 
        if (link->win) {
@@ -1955,11 +1838,9 @@ static void nsp_cs_release(struct pcmcia_device *link)
        }
        pcmcia_disable_device(link);
 
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,2))
        if (info->host != NULL) {
                scsi_host_put(info->host);
        }
-#endif
 } /* nsp_cs_release */
 
 static int nsp_cs_suspend(struct pcmcia_device *link)
@@ -2006,7 +1887,6 @@ static int nsp_cs_resume(struct pcmcia_device *link)
 /*======================================================================*
  *     module entry point
  *====================================================================*/
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,68))
 static struct pcmcia_device_id nsp_cs_ids[] = {
        PCMCIA_DEVICE_PROD_ID123("IO DATA", "CBSC16       ", "1", 0x547e66dc, 0x0d63a3fd, 0x51de003a),
        PCMCIA_DEVICE_PROD_ID123("KME    ", "SCSI-CARD-001", "1", 0x534c02bc, 0x52008408, 0x51de003a),
@@ -2030,28 +1910,12 @@ static struct pcmcia_driver nsp_driver = {
        .suspend        = nsp_cs_suspend,
        .resume         = nsp_cs_resume,
 };
-#endif
 
 static int __init nsp_cs_init(void)
 {
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,68))
        nsp_msg(KERN_INFO, "loading...");
 
        return pcmcia_register_driver(&nsp_driver);
-#else
-       servinfo_t serv;
-
-       nsp_msg(KERN_INFO, "loading...");
-       pcmcia_get_card_services_info(&serv);
-       if (serv.Revision != CS_RELEASE_CODE) {
-               nsp_msg(KERN_DEBUG, "Card Services release does not match!");
-               return -EINVAL;
-       }
-       register_pcmcia_driver(&dev_info, &nsp_cs_attach, &nsp_cs_detach);
-
-       nsp_dbg(NSP_DEBUG_INIT, "out");
-       return 0;
-#endif
 }
 
 static void __exit nsp_cs_exit(void)