linux 2.6.16.38 w/ vs2.0.3-rc1
[linux-2.6.git] / drivers / scsi / pdc_adma.c
index efc8fff..e8df0c9 100644 (file)
@@ -46,7 +46,7 @@
 #include <linux/libata.h>
 
 #define DRV_NAME       "pdc_adma"
-#define DRV_VERSION    "0.04"
+#define DRV_VERSION    "0.03"
 
 /* macro to calculate base address for ATA regs */
 #define ADMA_ATA_REGS(base,port_no)    ((base) + ((port_no) * 0x40))
@@ -131,7 +131,7 @@ static void adma_host_stop(struct ata_host_set *host_set);
 static void adma_port_stop(struct ata_port *ap);
 static void adma_phy_reset(struct ata_port *ap);
 static void adma_qc_prep(struct ata_queued_cmd *qc);
-static unsigned int adma_qc_issue(struct ata_queued_cmd *qc);
+static int adma_qc_issue(struct ata_queued_cmd *qc);
 static int adma_check_atapi_dma(struct ata_queued_cmd *qc);
 static void adma_bmdma_stop(struct ata_queued_cmd *qc);
 static u8 adma_bmdma_status(struct ata_port *ap);
@@ -143,16 +143,17 @@ static struct scsi_host_template adma_ata_sht = {
        .name                   = DRV_NAME,
        .ioctl                  = ata_scsi_ioctl,
        .queuecommand           = ata_scsi_queuecmd,
+       .eh_strategy_handler    = ata_scsi_error,
        .can_queue              = ATA_DEF_QUEUE,
        .this_id                = ATA_SHT_THIS_ID,
        .sg_tablesize           = LIBATA_MAX_PRD,
+       .max_sectors            = ATA_MAX_SECTORS,
        .cmd_per_lun            = ATA_SHT_CMD_PER_LUN,
        .emulated               = ATA_SHT_EMULATED,
        .use_clustering         = ENABLE_CLUSTERING,
        .proc_name              = DRV_NAME,
        .dma_boundary           = ADMA_DMA_BOUNDARY,
        .slave_configure        = ata_scsi_slave_config,
-       .slave_destroy          = ata_scsi_slave_destroy,
        .bios_param             = ata_std_bios_param,
 };
 
@@ -168,7 +169,6 @@ static const struct ata_port_operations adma_ata_ops = {
        .qc_prep                = adma_qc_prep,
        .qc_issue               = adma_qc_issue,
        .eng_timeout            = adma_eng_timeout,
-       .data_xfer              = ata_mmio_data_xfer,
        .irq_handler            = adma_intr,
        .irq_clear              = adma_irq_clear,
        .port_start             = adma_port_start,
@@ -183,8 +183,7 @@ static struct ata_port_info adma_port_info[] = {
        {
                .sht            = &adma_ata_sht,
                .host_flags     = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST |
-                                 ATA_FLAG_NO_LEGACY | ATA_FLAG_MMIO |
-                                 ATA_FLAG_PIO_POLLING,
+                                 ATA_FLAG_NO_LEGACY | ATA_FLAG_MMIO,
                .pio_mask       = 0x10, /* pio4 */
                .udma_mask      = 0x1f, /* udma0-4 */
                .port_ops       = &adma_ata_ops,
@@ -323,7 +322,7 @@ static int adma_fill_sg(struct ata_queued_cmd *qc)
                        = (pFLAGS & pEND) ? 0 : cpu_to_le32(pp->pkt_dma + i + 4);
                i += 4;
 
-               VPRINTK("PRD[%u] = (0x%lX, 0x%X)\n", i/4,
+               VPRINTK("PRD[%u] = (0x%lX, 0x%X)\n", nelem,
                                        (unsigned long)addr, len);
        }
        return i;
@@ -420,7 +419,7 @@ static inline void adma_packet_start(struct ata_queued_cmd *qc)
        writew(aPIOMD4 | aGO, chan + ADMA_CONTROL);
 }
 
-static unsigned int adma_qc_issue(struct ata_queued_cmd *qc)
+static int adma_qc_issue(struct ata_queued_cmd *qc)
 {
        struct adma_port_priv *pp = qc->ap->private_data;
 
@@ -458,13 +457,13 @@ static inline unsigned int adma_intr_pkt(struct ata_host_set *host_set)
                        continue;
                handled = 1;
                adma_enter_reg_mode(ap);
-               if (ap->flags & ATA_FLAG_DISABLED)
+               if (ap->flags & (ATA_FLAG_PORT_DISABLED | ATA_FLAG_NOINTR))
                        continue;
                pp = ap->private_data;
                if (!pp || pp->state != adma_state_pkt)
                        continue;
                qc = ata_qc_from_tag(ap, ap->active_tag);
-               if (qc && (!(qc->tf.flags & ATA_TFLAG_POLLING))) {
+               if (qc && (!(qc->tf.ctl & ATA_NIEN))) {
                        if ((status & (aPERR | aPSD | aUIRQ)))
                                qc->err_mask |= AC_ERR_OTHER;
                        else if (pp->pkt[0] != cDONE)
@@ -483,13 +482,13 @@ static inline unsigned int adma_intr_mmio(struct ata_host_set *host_set)
        for (port_no = 0; port_no < host_set->n_ports; ++port_no) {
                struct ata_port *ap;
                ap = host_set->ports[port_no];
-               if (ap && (!(ap->flags & ATA_FLAG_DISABLED))) {
+               if (ap && (!(ap->flags & (ATA_FLAG_PORT_DISABLED | ATA_FLAG_NOINTR)))) {
                        struct ata_queued_cmd *qc;
                        struct adma_port_priv *pp = ap->private_data;
                        if (!pp || pp->state != adma_state_mmio)
                                continue;
                        qc = ata_qc_from_tag(ap, ap->active_tag);
-                       if (qc && (!(qc->tf.flags & ATA_TFLAG_POLLING))) {
+                       if (qc && (!(qc->tf.ctl & ATA_NIEN))) {
 
                                /* check main status, clearing INTRQ */
                                u8 status = ata_check_status(ap);
@@ -691,7 +690,7 @@ static int adma_ata_init_one(struct pci_dev *pdev,
        probe_ent->port_ops     = adma_port_info[board_idx].port_ops;
 
        probe_ent->irq          = pdev->irq;
-       probe_ent->irq_flags    = IRQF_SHARED;
+       probe_ent->irq_flags    = SA_SHIRQ;
        probe_ent->mmio_base    = mmio_base;
        probe_ent->n_ports      = ADMA_PORTS;