]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/commitdiff
Merge branch 'upstream-fixes'
authorJeff Garzik <jgarzik@pobox.com>
Tue, 13 Dec 2005 07:30:04 +0000 (02:30 -0500)
committerJeff Garzik <jgarzik@pobox.com>
Tue, 13 Dec 2005 07:30:04 +0000 (02:30 -0500)
1  2 
drivers/scsi/libata-scsi.c
drivers/scsi/sata_mv.c
drivers/scsi/sata_promise.c
drivers/scsi/sata_sx4.c
include/linux/libata.h

index 2aef41112c4331b7472a5d93290977bb1af026f2,72ddba98f8fb562241bd263777a97867bc2fd1a2..f286a6f1c0db80fd7fce069fc669c868258d318f
@@@ -418,7 -418,7 +418,7 @@@ void ata_to_sense_error(unsigned id, u
        int i;
  
        /* Based on the 3ware driver translation table */
 -      static unsigned char sense_table[][4] = {
 +      static const unsigned char sense_table[][4] = {
                /* BBD|ECC|ID|MAR */
                {0xd1,          ABORTED_COMMAND, 0x00, 0x00},   // Device busy                  Aborted command
                /* BBD|ECC|ID */
                {0x80,          MEDIUM_ERROR, 0x11, 0x04},      // Block marked bad               Medium error, unrecovered read error
                {0xFF, 0xFF, 0xFF, 0xFF}, // END mark
        };
 -      static unsigned char stat_table[][4] = {
 +      static const unsigned char stat_table[][4] = {
                /* Must be first because BUSY means no other bits valid */
                {0x80,          ABORTED_COMMAND, 0x47, 0x00},   // Busy, fake parity for now
                {0x20,          HARDWARE_ERROR,  0x00, 0x00},   // Device fault
@@@ -1203,11 -1203,12 +1203,11 @@@ nothing_to_do
        return 1;
  }
  
 -static int ata_scsi_qc_complete(struct ata_queued_cmd *qc,
 -                              unsigned int err_mask)
 +static int ata_scsi_qc_complete(struct ata_queued_cmd *qc)
  {
        struct scsi_cmnd *cmd = qc->scsicmd;
        u8 *cdb = cmd->cmnd;
 -      int need_sense = (err_mask != 0);
 +      int need_sense = (qc->err_mask != 0);
  
        /* For ATA pass thru (SAT) commands, generate a sense block if
         * user mandated it or if there's an error.  Note that if we
@@@ -1531,7 -1532,7 +1531,7 @@@ unsigned int ata_scsiop_inq_80(struct a
        return 0;
  }
  
 -static const char *inq_83_str = "Linux ATA-SCSI simulator";
 +static const char * const inq_83_str = "Linux ATA-SCSI simulator";
  
  /**
   *    ata_scsiop_inq_83 - Simulate INQUIRY EVPD page 83, device identity
@@@ -1954,9 -1955,9 +1954,9 @@@ void ata_scsi_badcmd(struct scsi_cmnd *
        done(cmd);
  }
  
 -static int atapi_sense_complete(struct ata_queued_cmd *qc,unsigned int err_mask)
 +static int atapi_sense_complete(struct ata_queued_cmd *qc)
  {
 -      if (err_mask && ((err_mask & AC_ERR_DEV) == 0))
 +      if (qc->err_mask && ((qc->err_mask & AC_ERR_DEV) == 0))
                /* FIXME: not quite right; we don't want the
                 * translation of taskfile registers into
                 * a sense descriptors, since that's only
@@@ -2014,18 -2015,15 +2014,18 @@@ static void atapi_request_sense(struct 
  
        qc->complete_fn = atapi_sense_complete;
  
 -      if (ata_qc_issue(qc))
 -              ata_qc_complete(qc, AC_ERR_OTHER);
 +      if (ata_qc_issue(qc)) {
 +              qc->err_mask |= AC_ERR_OTHER;
 +              ata_qc_complete(qc);
 +      }
  
        DPRINTK("EXIT\n");
  }
  
 -static int atapi_qc_complete(struct ata_queued_cmd *qc, unsigned int err_mask)
 +static int atapi_qc_complete(struct ata_queued_cmd *qc)
  {
        struct scsi_cmnd *cmd = qc->scsicmd;
 +      unsigned int err_mask = qc->err_mask;
  
        VPRINTK("ENTER, err_mask 0x%X\n", err_mask);
  
@@@ -2175,9 -2173,12 +2175,12 @@@ ata_scsi_find_dev(struct ata_port *ap, 
        if (unlikely(!ata_dev_present(dev)))
                return NULL;
  
-       if (!atapi_enabled) {
-               if (unlikely(dev->class == ATA_DEV_ATAPI))
+       if (!atapi_enabled || (ap->flags & ATA_FLAG_NO_ATAPI)) {
+               if (unlikely(dev->class == ATA_DEV_ATAPI)) {
+                       printk(KERN_WARNING "ata%u(%u): WARNING: ATAPI is %s, device ignored.\n",
+                              ap->id, dev->devno, atapi_enabled ? "not supported with this driver" : "disabled");
                        return NULL;
+               }
        }
  
        return dev;
diff --combined drivers/scsi/sata_mv.c
index 3e7866b51ac69ef5b4bff28775813abb22f1a88d,9321cdf45680cb35c0c92d570c6e7fd3fe77ee3c..b2bf16a9bf4bffd094164a852a39295eb0fbfc10
@@@ -86,7 -86,8 +86,8 @@@ enum 
        MV_FLAG_DUAL_HC         = (1 << 30),  /* two SATA Host Controllers */
        MV_FLAG_IRQ_COALESCE    = (1 << 29),  /* IRQ coalescing capability */
        MV_COMMON_FLAGS         = (ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
-                                  ATA_FLAG_SATA_RESET | ATA_FLAG_MMIO),
+                                  ATA_FLAG_SATA_RESET | ATA_FLAG_MMIO |
+                                  ATA_FLAG_NO_ATAPI),
        MV_6XXX_FLAGS           = MV_FLAG_IRQ_COALESCE,
  
        CRQB_FLAG_READ          = (1 << 0),
@@@ -430,7 -431,7 +431,7 @@@ static const struct ata_port_operation
        .host_stop              = mv_host_stop,
  };
  
 -static struct ata_port_info mv_port_info[] = {
 +static const struct ata_port_info mv_port_info[] = {
        {  /* chip_504x */
                .sht            = &mv_sht,
                .host_flags     = MV_COMMON_FLAGS,
@@@ -1242,10 -1243,8 +1243,10 @@@ static void mv_host_intr(struct ata_hos
                                VPRINTK("port %u IRQ found for qc, "
                                        "ata_status 0x%x\n", port,ata_status);
                                /* mark qc status appropriately */
 -                              if (!(qc->tf.ctl & ATA_NIEN))
 -                                      ata_qc_complete(qc, err_mask);
 +                              if (!(qc->tf.ctl & ATA_NIEN)) {
 +                                      qc->err_mask |= err_mask;
 +                                      ata_qc_complete(qc);
 +                              }
                        }
                }
        }
@@@ -1866,8 -1865,7 +1867,8 @@@ static void mv_eng_timeout(struct ata_p
                 */
                spin_lock_irqsave(&ap->host_set->lock, flags);
                qc->scsidone = scsi_finish_command;
 -              ata_qc_complete(qc, AC_ERR_OTHER);
 +              qc->err_mask |= AC_ERR_OTHER;
 +              ata_qc_complete(qc);
                spin_unlock_irqrestore(&ap->host_set->lock, flags);
        }
  }
index e2e146a14f971f686b045ad7399680db39378555,2691625f9bce0bf2bf85e9670c39070a7b607786..da7fa04b8a7346713ce60895baa79d30fdf777ff
@@@ -70,6 -70,9 +70,9 @@@ enum 
        PDC_HAS_PATA            = (1 << 1), /* PDC20375 has PATA */
  
        PDC_RESET               = (1 << 11), /* HDMA reset */
+       PDC_COMMON_FLAGS        = ATA_FLAG_NO_LEGACY | ATA_FLAG_SRST |
+                                 ATA_FLAG_MMIO | ATA_FLAG_NO_ATAPI,
  };
  
  
@@@ -158,12 -161,11 +161,11 @@@ static const struct ata_port_operation
        .host_stop              = ata_pci_host_stop,
  };
  
 -static struct ata_port_info pdc_port_info[] = {
 +static const struct ata_port_info pdc_port_info[] = {
        /* board_2037x */
        {
                .sht            = &pdc_ata_sht,
-               .host_flags     = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
-                                 ATA_FLAG_SRST | ATA_FLAG_MMIO,
+               .host_flags     = PDC_COMMON_FLAGS | ATA_FLAG_SATA,
                .pio_mask       = 0x1f, /* pio0-4 */
                .mwdma_mask     = 0x07, /* mwdma0-2 */
                .udma_mask      = 0x7f, /* udma0-6 ; FIXME */
        /* board_20319 */
        {
                .sht            = &pdc_ata_sht,
-               .host_flags     = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
-                                 ATA_FLAG_SRST | ATA_FLAG_MMIO,
+               .host_flags     = PDC_COMMON_FLAGS | ATA_FLAG_SATA,
                .pio_mask       = 0x1f, /* pio0-4 */
                .mwdma_mask     = 0x07, /* mwdma0-2 */
                .udma_mask      = 0x7f, /* udma0-6 ; FIXME */
        /* board_20619 */
        {
                .sht            = &pdc_ata_sht,
-               .host_flags     = ATA_FLAG_NO_LEGACY | ATA_FLAG_SRST |
-                                 ATA_FLAG_MMIO | ATA_FLAG_SLAVE_POSS,
+               .host_flags     = PDC_COMMON_FLAGS | ATA_FLAG_SLAVE_POSS,
                .pio_mask       = 0x1f, /* pio0-4 */
                .mwdma_mask     = 0x07, /* mwdma0-2 */
                .udma_mask      = 0x7f, /* udma0-6 ; FIXME */
@@@ -401,8 -401,7 +401,8 @@@ static void pdc_eng_timeout(struct ata_
        case ATA_PROT_NODATA:
                printk(KERN_ERR "ata%u: command timeout\n", ap->id);
                drv_stat = ata_wait_idle(ap);
 -              ata_qc_complete(qc, __ac_err_mask(drv_stat));
 +              qc->err_mask |= __ac_err_mask(drv_stat);
 +              ata_qc_complete(qc);
                break;
  
        default:
                printk(KERN_ERR "ata%u: unknown timeout, cmd 0x%x stat 0x%x\n",
                       ap->id, qc->tf.command, drv_stat);
  
 -              ata_qc_complete(qc, ac_err_mask(drv_stat));
 +              qc->err_mask |= ac_err_mask(drv_stat);
 +              ata_qc_complete(qc);
                break;
        }
  
@@@ -424,21 -422,21 +424,21 @@@ out
  static inline unsigned int pdc_host_intr( struct ata_port *ap,
                                            struct ata_queued_cmd *qc)
  {
 -      unsigned int handled = 0, err_mask = 0;
 +      unsigned int handled = 0;
        u32 tmp;
        void __iomem *mmio = (void __iomem *) ap->ioaddr.cmd_addr + PDC_GLOBAL_CTL;
  
        tmp = readl(mmio);
        if (tmp & PDC_ERR_MASK) {
 -              err_mask = AC_ERR_DEV;
 +              qc->err_mask |= AC_ERR_DEV;
                pdc_reset_port(ap);
        }
  
        switch (qc->tf.protocol) {
        case ATA_PROT_DMA:
        case ATA_PROT_NODATA:
 -              err_mask |= ac_err_mask(ata_wait_idle(ap));
 -              ata_qc_complete(qc, err_mask);
 +              qc->err_mask |= ac_err_mask(ata_wait_idle(ap));
 +              ata_qc_complete(qc);
                handled = 1;
                break;
  
@@@ -705,7 -703,7 +705,7 @@@ static int pdc_ata_init_one (struct pci
                probe_ent->port[3].scr_addr = base + 0x700;
                break;
        case board_2037x:
 -                      probe_ent->n_ports = 2;
 +              probe_ent->n_ports = 2;
                break;
        case board_20619:
                probe_ent->n_ports = 4;
  
                probe_ent->port[2].scr_addr = base + 0x600;
                probe_ent->port[3].scr_addr = base + 0x700;
 -                break;
 +              break;
        default:
                BUG();
                break;
diff --combined drivers/scsi/sata_sx4.c
index 58da854a7c6845f1af48b198b1b957c03edc69bf,ac7b0d819ebc910a2325b756a24d3525da7b3a4b..94b253b80da851860ccd3235551dcb7fe88fc1d9
@@@ -215,12 -215,13 +215,13 @@@ static const struct ata_port_operation
        .host_stop              = pdc20621_host_stop,
  };
  
 -static struct ata_port_info pdc_port_info[] = {
 +static const struct ata_port_info pdc_port_info[] = {
        /* board_20621 */
        {
                .sht            = &pdc_sata_sht,
                .host_flags     = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
-                                 ATA_FLAG_SRST | ATA_FLAG_MMIO,
+                                 ATA_FLAG_SRST | ATA_FLAG_MMIO |
+                                 ATA_FLAG_NO_ATAPI,
                .pio_mask       = 0x1f, /* pio0-4 */
                .mwdma_mask     = 0x07, /* mwdma0-2 */
                .udma_mask      = 0x7f, /* udma0-6 ; FIXME */
@@@ -718,8 -719,7 +719,8 @@@ static inline unsigned int pdc20621_hos
                        VPRINTK("ata%u: read hdma, 0x%x 0x%x\n", ap->id,
                                readl(mmio + 0x104), readl(mmio + PDC_HDMA_CTLSTAT));
                        /* get drive status; clear intr; complete txn */
 -                      ata_qc_complete(qc, ac_err_mask(ata_wait_idle(ap)));
 +                      qc->err_mask |= ac_err_mask(ata_wait_idle(ap));
 +                      ata_qc_complete(qc);
                        pdc20621_pop_hdma(qc);
                }
  
                        VPRINTK("ata%u: write ata, 0x%x 0x%x\n", ap->id,
                                readl(mmio + 0x104), readl(mmio + PDC_HDMA_CTLSTAT));
                        /* get drive status; clear intr; complete txn */
 -                      ata_qc_complete(qc, ac_err_mask(ata_wait_idle(ap)));
 +                      qc->err_mask |= ac_err_mask(ata_wait_idle(ap));
 +                      ata_qc_complete(qc);
                        pdc20621_pop_hdma(qc);
                }
                handled = 1;
  
                status = ata_busy_wait(ap, ATA_BUSY | ATA_DRQ, 1000);
                DPRINTK("BUS_NODATA (drv_stat 0x%X)\n", status);
 -              ata_qc_complete(qc, ac_err_mask(status));
 +              qc->err_mask |= ac_err_mask(status);
 +              ata_qc_complete(qc);
                handled = 1;
  
        } else {
@@@ -884,8 -882,7 +885,8 @@@ static void pdc_eng_timeout(struct ata_
        case ATA_PROT_DMA:
        case ATA_PROT_NODATA:
                printk(KERN_ERR "ata%u: command timeout\n", ap->id);
 -              ata_qc_complete(qc, __ac_err_mask(ata_wait_idle(ap)));
 +              qc->err_mask |= __ac_err_mask(ata_wait_idle(ap));
 +              ata_qc_complete(qc);
                break;
  
        default:
                printk(KERN_ERR "ata%u: unknown timeout, cmd 0x%x stat 0x%x\n",
                       ap->id, qc->tf.command, drv_stat);
  
 -              ata_qc_complete(qc, ac_err_mask(drv_stat));
 +              qc->err_mask |= ac_err_mask(drv_stat);
 +              ata_qc_complete(qc);
                break;
        }
  
diff --combined include/linux/libata.h
index 46337e71613ef18d14be1bc0716c7c584a366993,41ea7dbc175573ac56cbff151f78ab4f27ae0b32..e828e172ccbf1f2d80b6838c43000d0379117abb
@@@ -122,6 -122,7 +122,7 @@@ enum 
        ATA_FLAG_NOINTR         = (1 << 9), /* FIXME: Remove this once
                                             * proper HSM is in place. */
        ATA_FLAG_DEBUGMSG       = (1 << 10),
+       ATA_FLAG_NO_ATAPI       = (1 << 11), /* No ATAPI support */
  
        ATA_QCFLAG_ACTIVE       = (1 << 1), /* cmd not yet ack'd to scsi lyer */
        ATA_QCFLAG_SG           = (1 << 3), /* have s/g table? */
        ATA_TMOUT_BOOT_QUICK    = 7 * HZ,       /* hueristic */
        ATA_TMOUT_CDB           = 30 * HZ,
        ATA_TMOUT_CDB_QUICK     = 5 * HZ,
 +      ATA_TMOUT_INTERNAL      = 30 * HZ,
 +      ATA_TMOUT_INTERNAL_QUICK = 5 * HZ,
  
        /* ATA bus states */
        BUS_UNKNOWN             = 0,
@@@ -196,7 -195,7 +197,7 @@@ struct ata_port
  struct ata_queued_cmd;
  
  /* typedefs */
 -typedef int (*ata_qc_cb_t) (struct ata_queued_cmd *qc, unsigned int err_mask);
 +typedef int (*ata_qc_cb_t) (struct ata_queued_cmd *qc);
  
  struct ata_ioports {
        unsigned long           cmd_addr;
@@@ -281,9 -280,9 +282,9 @@@ struct ata_queued_cmd 
        /* DO NOT iterate over __sg manually, use ata_for_each_sg() */
        struct scatterlist      *__sg;
  
 -      ata_qc_cb_t             complete_fn;
 +      unsigned int            err_mask;
  
 -      struct completion       *waiting;
 +      ata_qc_cb_t             complete_fn;
  
        void                    *private_data;
  };
@@@ -332,6 -331,8 +333,6 @@@ struct ata_port 
  
        u8                      ctl;    /* cache of ATA control register */
        u8                      last_ctl;       /* Cache last written value */
 -      unsigned int            bus_state;
 -      unsigned int            port_state;
        unsigned int            pio_mask;
        unsigned int            mwdma_mask;
        unsigned int            udma_mask;
@@@ -477,7 -478,7 +478,7 @@@ extern void ata_bmdma_start (struct ata
  extern void ata_bmdma_stop(struct ata_queued_cmd *qc);
  extern u8   ata_bmdma_status(struct ata_port *ap);
  extern void ata_bmdma_irq_clear(struct ata_port *ap);
 -extern void ata_qc_complete(struct ata_queued_cmd *qc, unsigned int err_mask);
 +extern void ata_qc_complete(struct ata_queued_cmd *qc);
  extern void ata_eng_timeout(struct ata_port *ap);
  extern void ata_scsi_simulate(u16 *id, struct scsi_cmnd *cmd,
                              void (*done)(struct scsi_cmnd *));
@@@ -669,7 -670,6 +670,7 @@@ static inline void ata_qc_reinit(struc
        qc->cursect = qc->cursg = qc->cursg_ofs = 0;
        qc->nsect = 0;
        qc->nbytes = qc->curbytes = 0;
 +      qc->err_mask = 0;
  
        ata_tf_init(qc->ap, &qc->tf, qc->dev->devno);
  }