]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/scsi/sym53c8xx_2/sym_glue.c
Merge branch 'master' of /pub/scm/linux/kernel/git/torvalds/linux-2.6
[linux-2.6-omap-h63xx.git] / drivers / scsi / sym53c8xx_2 / sym_glue.c
index 9c83b4d39a2687aa3a65bcebed3cc42fdb295f96..15a51459c81fbafb0d77d97f62542185cecb28e8 100644 (file)
 #define NAME53C                "sym53c"
 #define NAME53C8XX     "sym53c8xx"
 
-/* SPARC just has to be different ... */
-#ifdef __sparc__
-#define IRQ_FMT "%s"
-#define IRQ_PRM(x) __irq_itoa(x)
-#else
 #define IRQ_FMT "%d"
 #define IRQ_PRM(x) (x)
-#endif
 
 struct sym_driver_setup sym_driver_setup = SYM_LINUX_DRIVER_SETUP;
 unsigned int sym_debug_flags = 0;
@@ -152,41 +146,17 @@ struct sym_ucmd {         /* Override the SCSI pointer structure */
 
 static void __unmap_scsi_data(struct pci_dev *pdev, struct scsi_cmnd *cmd)
 {
-       int dma_dir = cmd->sc_data_direction;
+       if (SYM_UCMD_PTR(cmd)->data_mapped)
+               scsi_dma_unmap(cmd);
 
-       switch(SYM_UCMD_PTR(cmd)->data_mapped) {
-       case 2:
-               pci_unmap_sg(pdev, cmd->buffer, cmd->use_sg, dma_dir);
-               break;
-       case 1:
-               pci_unmap_single(pdev, SYM_UCMD_PTR(cmd)->data_mapping,
-                                cmd->request_bufflen, dma_dir);
-               break;
-       }
        SYM_UCMD_PTR(cmd)->data_mapped = 0;
 }
 
-static dma_addr_t __map_scsi_single_data(struct pci_dev *pdev, struct scsi_cmnd *cmd)
-{
-       dma_addr_t mapping;
-       int dma_dir = cmd->sc_data_direction;
-
-       mapping = pci_map_single(pdev, cmd->request_buffer,
-                                cmd->request_bufflen, dma_dir);
-       if (mapping) {
-               SYM_UCMD_PTR(cmd)->data_mapped  = 1;
-               SYM_UCMD_PTR(cmd)->data_mapping = mapping;
-       }
-
-       return mapping;
-}
-
 static int __map_scsi_sg_data(struct pci_dev *pdev, struct scsi_cmnd *cmd)
 {
        int use_sg;
-       int dma_dir = cmd->sc_data_direction;
 
-       use_sg = pci_map_sg(pdev, cmd->buffer, cmd->use_sg, dma_dir);
+       use_sg = scsi_dma_map(cmd);
        if (use_sg > 0) {
                SYM_UCMD_PTR(cmd)->data_mapped  = 2;
                SYM_UCMD_PTR(cmd)->data_mapping = use_sg;
@@ -197,8 +167,6 @@ static int __map_scsi_sg_data(struct pci_dev *pdev, struct scsi_cmnd *cmd)
 
 #define unmap_scsi_data(np, cmd)       \
                __unmap_scsi_data(np->s.device, cmd)
-#define map_scsi_single_data(np, cmd)  \
-               __map_scsi_single_data(np->s.device, cmd)
 #define map_scsi_sg_data(np, cmd)      \
                __map_scsi_sg_data(np->s.device, cmd)
 /*
@@ -328,55 +296,20 @@ void sym_set_cam_result_error(struct sym_hcb *np, struct sym_ccb *cp, int resid)
                 */
                cam_status = sym_xerr_cam_status(DID_ERROR, cp->xerr_status);
        }
-       cmd->resid = resid;
+       scsi_set_resid(cmd, resid);
        cmd->result = (drv_status << 24) + (cam_status << 16) + scsi_status;
 }
 
-
-/*
- *  Build the scatter/gather array for an I/O.
- */
-
-static int sym_scatter_no_sglist(struct sym_hcb *np, struct sym_ccb *cp, struct scsi_cmnd *cmd)
-{
-       struct sym_tblmove *data = &cp->phys.data[SYM_CONF_MAX_SG-1];
-       int segment;
-       unsigned int len = cmd->request_bufflen;
-
-       if (len) {
-               dma_addr_t baddr = map_scsi_single_data(np, cmd);
-               if (baddr) {
-                       if (len & 1) {
-                               struct sym_tcb *tp = &np->target[cp->target];
-                               if (tp->head.wval & EWS) {
-                                       len++;
-                                       cp->odd_byte_adjustment++;
-                               }
-                       }
-                       cp->data_len = len;
-                       sym_build_sge(np, data, baddr, len);
-                       segment = 1;
-               } else {
-                       segment = -2;
-               }
-       } else {
-               segment = 0;
-       }
-
-       return segment;
-}
-
 static int sym_scatter(struct sym_hcb *np, struct sym_ccb *cp, struct scsi_cmnd *cmd)
 {
        int segment;
-       int use_sg = (int) cmd->use_sg;
+       int use_sg;
 
        cp->data_len = 0;
 
-       if (!use_sg)
-               segment = sym_scatter_no_sglist(np, cp, cmd);
-       else if ((use_sg = map_scsi_sg_data(np, cmd)) > 0) {
-               struct scatterlist *scatter = (struct scatterlist *)cmd->buffer;
+       use_sg = map_scsi_sg_data(np, cmd);
+       if (use_sg > 0) {
+               struct scatterlist *sg;
                struct sym_tcb *tp = &np->target[cp->target];
                struct sym_tblmove *data;
 
@@ -387,9 +320,9 @@ static int sym_scatter(struct sym_hcb *np, struct sym_ccb *cp, struct scsi_cmnd
 
                data = &cp->phys.data[SYM_CONF_MAX_SG - use_sg];
 
-               for (segment = 0; segment < use_sg; segment++) {
-                       dma_addr_t baddr = sg_dma_address(&scatter[segment]);
-                       unsigned int len = sg_dma_len(&scatter[segment]);
+               scsi_for_each_sg(cmd, sg, use_sg, segment) {
+                       dma_addr_t baddr = sg_dma_address(sg);
+                       unsigned int len = sg_dma_len(sg);
 
                        if ((len & 1) && (tp->head.wval & EWS)) {
                                len++;
@@ -658,7 +591,7 @@ static int sym53c8xx_queue_command(struct scsi_cmnd *cmd,
 /*
  *  Linux entry point of the interrupt handler.
  */
-static irqreturn_t sym53c8xx_intr(int irq, void *dev_id, struct pt_regs * regs)
+static irqreturn_t sym53c8xx_intr(int irq, void *dev_id)
 {
        unsigned long flags;
        struct sym_hcb *np = (struct sym_hcb *)dev_id;
@@ -1553,7 +1486,7 @@ static struct Scsi_Host * __devinit sym_attach(struct scsi_host_template *tpnt,
         *  If we synchonize the C code with SCRIPTS on interrupt, 
         *  we do not want to share the INTR line at all.
         */
-       if (request_irq(pdev->irq, sym53c8xx_intr, SA_SHIRQ, NAME53C8XX, np)) {
+       if (request_irq(pdev->irq, sym53c8xx_intr, IRQF_SHARED, NAME53C8XX, np)) {
                printf_err("%s: request irq %d failure\n",
                        sym_name(np), pdev->irq);
                goto attach_failed;
@@ -2090,7 +2023,7 @@ static struct pci_device_id sym2_id_table[] __devinitdata = {
        { PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_NCR_53C860,
          PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
        { PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_53C1510,
-         PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
+         PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_STORAGE_SCSI<<8,  0xffff00, 0UL },
        { PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_NCR_53C896,
          PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
        { PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_NCR_53C895,