e1000: add missing length check to e1000 receive routine
[safe/jmp/linux-2.6] / drivers / scsi / eata.c
index 059eeee..be5099d 100644 (file)
  *  the driver sets host->wish_block = 1 for all ISA boards.
  */
 
-#include <linux/config.h>
 #include <linux/string.h>
 #include <linux/kernel.h>
 #include <linux/ioport.h>
@@ -524,7 +523,7 @@ static struct scsi_host_template driver_template = {
        .slave_configure = eata2x_slave_configure,
        .this_id = 7,
        .unchecked_isa_dma = 1,
-       .use_clustering = ENABLE_CLUSTERING
+       .use_clustering = ENABLE_CLUSTERING,
 };
 
 #if !defined(__BIG_ENDIAN_BITFIELD) && !defined(__LITTLE_ENDIAN_BITFIELD)
@@ -876,7 +875,7 @@ static unsigned long io_port[] = {
 /* But transfer orientation from the 16 bit data register is Little Endian */
 #define REG2H(x)   le16_to_cpu(x)
 
-static irqreturn_t do_interrupt_handler(int, void *, struct pt_regs *);
+static irqreturn_t do_interrupt_handler(int, void *);
 static void flush_dev(struct scsi_device *, unsigned long, struct hostdata *,
                      unsigned int);
 static int do_trace = 0;
@@ -1222,7 +1221,7 @@ static int port_detect(unsigned long port_base, unsigned int j,
 
        /* Board detected, allocate its IRQ */
        if (request_irq(irq, do_interrupt_handler,
-                       SA_INTERRUPT | ((subversion == ESA) ? SA_SHIRQ : 0),
+                       IRQF_DISABLED | ((subversion == ESA) ? IRQF_SHARED : 0),
                        driver_name, (void *)&sha[j])) {
                printk("%s: unable to allocate IRQ %u, detaching.\n", name,
                       irq);
@@ -1427,7 +1426,7 @@ static int port_detect(unsigned long port_base, unsigned int j,
 
        if (ha->pdev) {
                pci_set_master(ha->pdev);
-               if (pci_set_dma_mask(ha->pdev, DMA_32BIT_MASK))
+               if (pci_set_dma_mask(ha->pdev, DMA_BIT_MASK(32)))
                        printk("%s: warning, pci_set_dma_mask failed.\n",
                               ha->board_name);
        }
@@ -1610,8 +1609,9 @@ static int eata2x_detect(struct scsi_host_template *tpnt)
 
 static void map_dma(unsigned int i, struct hostdata *ha)
 {
-       unsigned int k, count, pci_dir;
-       struct scatterlist *sgpnt;
+       unsigned int k, pci_dir;
+       int count;
+       struct scatterlist *sg;
        struct mscp *cpp;
        struct scsi_cmnd *SCpnt;
 
@@ -1622,42 +1622,30 @@ static void map_dma(unsigned int i, struct hostdata *ha)
        if (SCpnt->sense_buffer)
                cpp->sense_addr =
                    H2DEV(pci_map_single(ha->pdev, SCpnt->sense_buffer,
-                          sizeof SCpnt->sense_buffer, PCI_DMA_FROMDEVICE));
+                          SCSI_SENSE_BUFFERSIZE, PCI_DMA_FROMDEVICE));
 
-       cpp->sense_len = sizeof SCpnt->sense_buffer;
+       cpp->sense_len = SCSI_SENSE_BUFFERSIZE;
 
-       if (!SCpnt->use_sg) {
-
-               /* If we get here with PCI_DMA_NONE, pci_map_single triggers a BUG() */
-               if (!SCpnt->request_bufflen)
-                       pci_dir = PCI_DMA_BIDIRECTIONAL;
-
-               if (SCpnt->request_buffer)
-                       cpp->data_address = H2DEV(pci_map_single(ha->pdev,
-                                                                SCpnt->
-                                                                request_buffer,
-                                                                SCpnt->
-                                                                request_bufflen,
-                                                                pci_dir));
-
-               cpp->data_len = H2DEV(SCpnt->request_bufflen);
+       if (!scsi_sg_count(SCpnt)) {
+               cpp->data_len = 0;
                return;
        }
 
-       sgpnt = (struct scatterlist *)SCpnt->request_buffer;
-       count = pci_map_sg(ha->pdev, sgpnt, SCpnt->use_sg, pci_dir);
+       count = pci_map_sg(ha->pdev, scsi_sglist(SCpnt), scsi_sg_count(SCpnt),
+                          pci_dir);
+       BUG_ON(!count);
 
-       for (k = 0; k < count; k++) {
-               cpp->sglist[k].address = H2DEV(sg_dma_address(&sgpnt[k]));
-               cpp->sglist[k].num_bytes = H2DEV(sg_dma_len(&sgpnt[k]));
+       scsi_for_each_sg(SCpnt, sg, count, k) {
+               cpp->sglist[k].address = H2DEV(sg_dma_address(sg));
+               cpp->sglist[k].num_bytes = H2DEV(sg_dma_len(sg));
        }
 
        cpp->sg = 1;
        cpp->data_address = H2DEV(pci_map_single(ha->pdev, cpp->sglist,
-                                                SCpnt->use_sg *
+                                                scsi_sg_count(SCpnt) *
                                                 sizeof(struct sg_list),
                                                 pci_dir));
-       cpp->data_len = H2DEV((SCpnt->use_sg * sizeof(struct sg_list)));
+       cpp->data_len = H2DEV((scsi_sg_count(SCpnt) * sizeof(struct sg_list)));
 }
 
 static void unmap_dma(unsigned int i, struct hostdata *ha)
@@ -1674,8 +1662,8 @@ static void unmap_dma(unsigned int i, struct hostdata *ha)
                pci_unmap_single(ha->pdev, DEV2H(cpp->sense_addr),
                                 DEV2H(cpp->sense_len), PCI_DMA_FROMDEVICE);
 
-       if (SCpnt->use_sg)
-               pci_unmap_sg(ha->pdev, SCpnt->request_buffer, SCpnt->use_sg,
+       if (scsi_sg_count(SCpnt))
+               pci_unmap_sg(ha->pdev, scsi_sglist(SCpnt), scsi_sg_count(SCpnt),
                             pci_dir);
 
        if (!DEV2H(cpp->data_len))
@@ -1701,9 +1689,9 @@ static void sync_dma(unsigned int i, struct hostdata *ha)
                                            DEV2H(cpp->sense_len),
                                            PCI_DMA_FROMDEVICE);
 
-       if (SCpnt->use_sg)
-               pci_dma_sync_sg_for_cpu(ha->pdev, SCpnt->request_buffer,
-                                       SCpnt->use_sg, pci_dir);
+       if (scsi_sg_count(SCpnt))
+               pci_dma_sync_sg_for_cpu(ha->pdev, scsi_sglist(SCpnt),
+                                       scsi_sg_count(SCpnt), pci_dir);
 
        if (!DEV2H(cpp->data_len))
                pci_dir = PCI_DMA_BIDIRECTIONAL;
@@ -1779,7 +1767,7 @@ static int eata2x_queuecommand(struct scsi_cmnd *SCpnt,
 
        if (SCpnt->host_scribble)
                panic("%s: qcomm, pid %ld, SCpnt %p already active.\n",
-                     ha->board_name, SCpnt->pid, SCpnt);
+                     ha->board_name, SCpnt->serial_number, SCpnt);
 
        /* i is the mailbox number, look for the first free mailbox
           starting from last_cp_used */
@@ -1813,7 +1801,7 @@ static int eata2x_queuecommand(struct scsi_cmnd *SCpnt,
 
        if (do_trace)
                scmd_printk(KERN_INFO, SCpnt,
-                       "qcomm, mbox %d, pid %ld.\n", i, SCpnt->pid);
+                       "qcomm, mbox %d, pid %ld.\n", i, SCpnt->serial_number);
 
        cpp->reqsen = 1;
        cpp->dispri = 1;
@@ -1846,7 +1834,7 @@ static int eata2x_queuecommand(struct scsi_cmnd *SCpnt,
                unmap_dma(i, ha);
                SCpnt->host_scribble = NULL;
                scmd_printk(KERN_INFO, SCpnt,
-                       "qcomm, pid %ld, adapter busy.\n", SCpnt->pid);
+                       "qcomm, pid %ld, adapter busy.\n", SCpnt->serial_number);
                return 1;
        }
 
@@ -1862,13 +1850,13 @@ static int eata2x_eh_abort(struct scsi_cmnd *SCarg)
 
        if (SCarg->host_scribble == NULL) {
                scmd_printk(KERN_INFO, SCarg,
-                       "abort, pid %ld inactive.\n", SCarg->pid);
+                       "abort, pid %ld inactive.\n", SCarg->serial_number);
                return SUCCESS;
        }
 
        i = *(unsigned int *)SCarg->host_scribble;
        scmd_printk(KERN_WARNING, SCarg,
-               "abort, mbox %d, pid %ld.\n", i, SCarg->pid);
+               "abort, mbox %d, pid %ld.\n", i, SCarg->serial_number);
 
        if (i >= shost->can_queue)
                panic("%s: abort, invalid SCarg->host_scribble.\n", ha->board_name);
@@ -1913,7 +1901,7 @@ static int eata2x_eh_abort(struct scsi_cmnd *SCarg)
                SCarg->host_scribble = NULL;
                ha->cp_stat[i] = FREE;
                printk("%s, abort, mbox %d ready, DID_ABORT, pid %ld done.\n",
-                      ha->board_name, i, SCarg->pid);
+                      ha->board_name, i, SCarg->serial_number);
                SCarg->scsi_done(SCarg);
                return SUCCESS;
        }
@@ -1930,12 +1918,12 @@ static int eata2x_eh_host_reset(struct scsi_cmnd *SCarg)
        struct hostdata *ha = (struct hostdata *)shost->hostdata;
 
        scmd_printk(KERN_INFO, SCarg,
-               "reset, enter, pid %ld.\n", SCarg->pid);
+               "reset, enter, pid %ld.\n", SCarg->serial_number);
 
        spin_lock_irq(shost->host_lock);
 
        if (SCarg->host_scribble == NULL)
-               printk("%s: reset, pid %ld inactive.\n", ha->board_name, SCarg->pid);
+               printk("%s: reset, pid %ld inactive.\n", ha->board_name, SCarg->serial_number);
 
        if (ha->in_reset) {
                printk("%s: reset, exit, already in reset.\n", ha->board_name);
@@ -1975,13 +1963,13 @@ static int eata2x_eh_host_reset(struct scsi_cmnd *SCarg)
                if (ha->cp_stat[i] == READY || ha->cp_stat[i] == ABORTING) {
                        ha->cp_stat[i] = ABORTING;
                        printk("%s: reset, mbox %d aborting, pid %ld.\n",
-                              ha->board_name, i, SCpnt->pid);
+                              ha->board_name, i, SCpnt->serial_number);
                }
 
                else {
                        ha->cp_stat[i] = IN_RESET;
                        printk("%s: reset, mbox %d in reset, pid %ld.\n",
-                              ha->board_name, i, SCpnt->pid);
+                              ha->board_name, i, SCpnt->serial_number);
                }
 
                if (SCpnt->host_scribble == NULL)
@@ -2036,7 +2024,7 @@ static int eata2x_eh_host_reset(struct scsi_cmnd *SCarg)
 
                        printk
                            ("%s, reset, mbox %d locked, DID_RESET, pid %ld done.\n",
-                            ha->board_name, i, SCpnt->pid);
+                            ha->board_name, i, SCpnt->serial_number);
                }
 
                else if (ha->cp_stat[i] == ABORTING) {
@@ -2050,7 +2038,7 @@ static int eata2x_eh_host_reset(struct scsi_cmnd *SCarg)
 
                        printk
                            ("%s, reset, mbox %d aborting, DID_RESET, pid %ld done.\n",
-                            ha->board_name, i, SCpnt->pid);
+                            ha->board_name, i, SCpnt->serial_number);
                }
 
                else
@@ -2064,7 +2052,7 @@ static int eata2x_eh_host_reset(struct scsi_cmnd *SCarg)
        do_trace = 0;
 
        if (arg_done)
-               printk("%s: reset, exit, pid %ld done.\n", ha->board_name, SCarg->pid);
+               printk("%s: reset, exit, pid %ld done.\n", ha->board_name, SCarg->serial_number);
        else
                printk("%s: reset, exit.\n", ha->board_name);
 
@@ -2203,7 +2191,7 @@ static int reorder(struct hostdata *ha, unsigned long cursec,
                        cpp = &ha->cp[k];
                        SCpnt = cpp->SCpnt;
                        ll[n] = SCpnt->request->nr_sectors;
-                       pl[n] = SCpnt->pid;
+                       pl[n] = SCpnt->serial_number;
 
                        if (!n)
                                continue;
@@ -2251,7 +2239,7 @@ static int reorder(struct hostdata *ha, unsigned long cursec,
                            "%s pid %ld mb %d fc %d nr %d sec %ld ns %ld"
                             " cur %ld s:%c r:%c rev:%c in:%c ov:%c xd %d.\n",
                             (ihdlr ? "ihdlr" : "qcomm"),
-                            SCpnt->pid, k, flushcount,
+                            SCpnt->serial_number, k, flushcount,
                             n_ready, SCpnt->request->sector,
                             SCpnt->request->nr_sectors, cursec, YESNO(s),
                             YESNO(r), YESNO(rev), YESNO(input_only),
@@ -2298,7 +2286,7 @@ static void flush_dev(struct scsi_device *dev, unsigned long cursec,
                            "%s, pid %ld, mbox %d, adapter"
                             " busy, will abort.\n",
                             (ihdlr ? "ihdlr" : "qcomm"),
-                            SCpnt->pid, k);
+                            SCpnt->serial_number, k);
                        ha->cp_stat[k] = ABORTING;
                        continue;
                }
@@ -2307,17 +2295,14 @@ static void flush_dev(struct scsi_device *dev, unsigned long cursec,
        }
 }
 
-static irqreturn_t ihdlr(int irq, struct Scsi_Host *shost)
+static irqreturn_t ihdlr(struct Scsi_Host *shost)
 {
        struct scsi_cmnd *SCpnt;
        unsigned int i, k, c, status, tstatus, reg;
        struct mssp *spp;
        struct mscp *cpp;
        struct hostdata *ha = (struct hostdata *)shost->hostdata;
-
-       if (shost->irq != irq)
-               panic("%s: ihdlr, irq %d, shost->irq %d.\n", ha->board_name, irq,
-                     shost->irq);
+       int irq = shost->irq;
 
        /* Check if this board need to be serviced */
        if (!(inb(shost->io_port + REG_AUX_STATUS) & IRQ_ASSERTED))
@@ -2412,11 +2397,11 @@ static irqreturn_t ihdlr(int irq, struct Scsi_Host *shost)
 
        if (SCpnt->host_scribble == NULL)
                panic("%s: ihdlr, mbox %d, pid %ld, SCpnt %p garbled.\n", ha->board_name,
-                     i, SCpnt->pid, SCpnt);
+                     i, SCpnt->serial_number, SCpnt);
 
        if (*(unsigned int *)SCpnt->host_scribble != i)
                panic("%s: ihdlr, mbox %d, pid %ld, index mismatch %d.\n",
-                     ha->board_name, i, SCpnt->pid,
+                     ha->board_name, i, SCpnt->serial_number,
                      *(unsigned int *)SCpnt->host_scribble);
 
        sync_dma(i, ha);
@@ -2466,12 +2451,12 @@ static irqreturn_t ihdlr(int irq, struct Scsi_Host *shost)
                               "target_status 0x%x, sense key 0x%x.\n",
                               ha->board_name,
                               SCpnt->device->channel, SCpnt->device->id,
-                              SCpnt->device->lun, SCpnt->pid,
+                              SCpnt->device->lun, SCpnt->serial_number,
                               spp->target_status, SCpnt->sense_buffer[2]);
 
                ha->target_to[SCpnt->device->id][SCpnt->device->channel] = 0;
 
-               if (ha->last_retried_pid == SCpnt->pid)
+               if (ha->last_retried_pid == SCpnt->serial_number)
                        ha->retries = 0;
 
                break;
@@ -2506,7 +2491,7 @@ static irqreturn_t ihdlr(int irq, struct Scsi_Host *shost)
 #endif
 
                        ha->retries++;
-                       ha->last_retried_pid = SCpnt->pid;
+                       ha->last_retried_pid = SCpnt->serial_number;
                } else
                        status = DID_ERROR << 16;
 
@@ -2537,7 +2522,7 @@ static irqreturn_t ihdlr(int irq, struct Scsi_Host *shost)
                scmd_printk(KERN_INFO, SCpnt, "ihdlr, mbox %2d, err 0x%x:%x,"
                       " pid %ld, reg 0x%x, count %d.\n",
                       i, spp->adapter_status, spp->target_status,
-                      SCpnt->pid, reg, ha->iocount);
+                      SCpnt->serial_number, reg, ha->iocount);
 
        unmap_dma(i, ha);
 
@@ -2556,8 +2541,7 @@ static irqreturn_t ihdlr(int irq, struct Scsi_Host *shost)
        return IRQ_NONE;
 }
 
-static irqreturn_t do_interrupt_handler(int irq, void *shap,
-                                       struct pt_regs *regs)
+static irqreturn_t do_interrupt_handler(int dummy, void *shap)
 {
        struct Scsi_Host *shost;
        unsigned int j;
@@ -2570,7 +2554,7 @@ static irqreturn_t do_interrupt_handler(int irq, void *shap,
        shost = sh[j];
 
        spin_lock_irqsave(shost->host_lock, spin_flags);
-       ret = ihdlr(irq, shost);
+       ret = ihdlr(shost);
        spin_unlock_irqrestore(shost->host_lock, spin_flags);
        return ret;
 }