#include "sata_promise.h"
#define DRV_NAME "sata_promise"
-#define DRV_VERSION "1.04"
+#define DRV_VERSION "1.03"
enum {
PDC_GLOBAL_CTL = 0x48, /* Global control/status (per port) */
PDC_CTLSTAT = 0x60, /* IDE control and status (per port) */
PDC_SATA_PLUG_CSR = 0x6C, /* SATA Plug control/status reg */
- PDC2_SATA_PLUG_CSR = 0x60, /* SATAII Plug control/status reg */
PDC_SLEW_CTL = 0x470, /* slew rate control reg */
PDC_ERR_MASK = (1<<19) | (1<<20) | (1<<21) | (1<<22) |
board_20319 = 1, /* FastTrak S150 TX4 */
board_20619 = 2, /* FastTrak TX4000 */
board_20771 = 3, /* FastTrak TX2300 */
- board_2057x = 4, /* SATAII150 Tx2plus */
- board_40518 = 5, /* SATAII150 Tx4 */
- PDC_HAS_PATA = (1 << 1), /* PDC20375/20575 has PATA */
+ PDC_HAS_PATA = (1 << 1), /* PDC20375 has PATA */
PDC_RESET = (1 << 11), /* HDMA reset */
dma_addr_t pkt_dma;
};
-struct pdc_host_priv {
- int hotplug_offset;
-};
-
static u32 pdc_sata_scr_read (struct ata_port *ap, unsigned int sc_reg);
static void pdc_sata_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val);
static int pdc_ata_init_one (struct pci_dev *pdev, const struct pci_device_id *ent);
static void pdc_tf_load_mmio(struct ata_port *ap, const struct ata_taskfile *tf);
static void pdc_exec_command_mmio(struct ata_port *ap, const struct ata_taskfile *tf);
static void pdc_irq_clear(struct ata_port *ap);
-static unsigned int pdc_qc_issue_prot(struct ata_queued_cmd *qc);
-static void pdc_host_stop(struct ata_host_set *host_set);
+static int pdc_qc_issue_prot(struct ata_queued_cmd *qc);
static struct scsi_host_template pdc_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 = ATA_SHT_USE_CLUSTERING,
.scr_write = pdc_sata_scr_write,
.port_start = pdc_port_start,
.port_stop = pdc_port_stop,
- .host_stop = pdc_host_stop,
+ .host_stop = ata_pci_host_stop,
};
static const struct ata_port_operations pdc_pata_ops = {
.port_start = pdc_port_start,
.port_stop = pdc_port_stop,
- .host_stop = pdc_host_stop,
+ .host_stop = ata_pci_host_stop,
};
static const struct ata_port_info pdc_port_info[] = {
/* board_2037x */
{
.sht = &pdc_ata_sht,
- .host_flags = PDC_COMMON_FLAGS /* | ATA_FLAG_SATA */, /* pata fix */
+ .host_flags = PDC_COMMON_FLAGS | ATA_FLAG_SATA,
.pio_mask = 0x1f, /* pio0-4 */
.mwdma_mask = 0x07, /* mwdma0-2 */
.udma_mask = 0x7f, /* udma0-6 ; FIXME */
.udma_mask = 0x7f, /* udma0-6 ; FIXME */
.port_ops = &pdc_sata_ops,
},
-
- /* board_2057x */
- {
- .sht = &pdc_ata_sht,
- .host_flags = PDC_COMMON_FLAGS | ATA_FLAG_SATA,
- .pio_mask = 0x1f, /* pio0-4 */
- .mwdma_mask = 0x07, /* mwdma0-2 */
- .udma_mask = 0x7f, /* udma0-6 ; FIXME */
- .port_ops = &pdc_sata_ops,
- },
-
- /* board_40518 */
- {
- .sht = &pdc_ata_sht,
- .host_flags = PDC_COMMON_FLAGS | ATA_FLAG_SATA,
- .pio_mask = 0x1f, /* pio0-4 */
- .mwdma_mask = 0x07, /* mwdma0-2 */
- .udma_mask = 0x7f, /* udma0-6 ; FIXME */
- .port_ops = &pdc_sata_ops,
- },
};
static const struct pci_device_id pdc_ata_pci_tbl[] = {
{ PCI_VENDOR_ID_PROMISE, 0x3376, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
board_2037x },
{ PCI_VENDOR_ID_PROMISE, 0x3574, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
- board_2057x },
+ board_2037x },
{ PCI_VENDOR_ID_PROMISE, 0x3d75, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
- board_2057x },
+ board_2037x },
{ PCI_VENDOR_ID_PROMISE, 0x3d73, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
board_2037x },
{ PCI_VENDOR_ID_PROMISE, 0x3d17, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
board_20319 },
{ PCI_VENDOR_ID_PROMISE, 0x3d18, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
- board_40518 },
+ board_20319 },
{ PCI_VENDOR_ID_PROMISE, 0x6629, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
board_20619 },
if (rc)
return rc;
- pp = kzalloc(sizeof(*pp), GFP_KERNEL);
+ pp = kmalloc(sizeof(*pp), GFP_KERNEL);
if (!pp) {
rc = -ENOMEM;
goto err_out;
}
+ memset(pp, 0, sizeof(*pp));
pp->pkt = dma_alloc_coherent(dev, 128, &pp->pkt_dma, GFP_KERNEL);
if (!pp->pkt) {
}
-static void pdc_host_stop(struct ata_host_set *host_set)
-{
- struct pdc_host_priv *hp = host_set->private_data;
-
- ata_pci_host_stop(host_set);
-
- kfree(hp);
-}
-
-
static void pdc_reset_port(struct ata_port *ap)
{
void __iomem *mmio = (void __iomem *) ap->ioaddr.cmd_addr + PDC_CTLSTAT;
static void pdc_sata_phy_reset(struct ata_port *ap)
{
-/* pdc_reset_port(ap); */ /* pata fix */
-/* sata_phy_reset(ap); */ /* pata fix */
- /* if no sata flag, test for pata drive */ /* pata fix */
- if (ap->flags & ATA_FLAG_SATA) /* pata fix */
- { /* pata fix */
- pdc_reset_port(ap); /* pata fix */
- sata_phy_reset(ap); /* pata fix */
- } /* pata fix */
- else /* pata fix */
- pdc_pata_phy_reset(ap); /* pata fix */
+ pdc_reset_port(ap);
+ sata_phy_reset(ap);
}
static void pdc_pata_phy_reset(struct ata_port *ap)
{
/* FIXME: add cable detect. Don't assume 40-pin cable */
-/* ap->cbl = ATA_CBL_PATA40; */ /* pata fix */
-/* ap->udma_mask &= ATA_UDMA_MASK_40C; */ /* pata fix */
- /* add cable detection code for pata drives */ /* pata fix */
- u8 tmp; /* pata fix */
- void *mmio = (void *) ap->ioaddr.cmd_addr + PDC_CTLSTAT + 0x03; /* pata fix */
- tmp = readb(mmio); /* pata fix */
- if (tmp & 0x01) /* pata fix */
- { /* pata fix */
- ap->cbl = ATA_CBL_PATA40; /* pata fix */
- ap->udma_mask &= ATA_UDMA_MASK_40C; /* pata fix */
- } /* pata fix */
- else /* pata fix */
- ap->cbl = ATA_CBL_PATA80; /* pata fix */
+ ap->cbl = ATA_CBL_PATA40;
+ ap->udma_mask &= ATA_UDMA_MASK_40C;
pdc_reset_port(ap);
ata_port_probe(ap);
spin_lock_irqsave(&host_set->lock, flags);
qc = ata_qc_from_tag(ap, ap->active_tag);
+ if (!qc) {
+ printk(KERN_ERR "ata%u: BUG: timeout without command\n",
+ ap->id);
+ goto out;
+ }
+
+ /* hack alert! We cannot use the supplied completion
+ * function from inside the ->eh_strategy_handler() thread.
+ * libata is the only user of ->eh_strategy_handler() in
+ * any kernel, so the default scsi_done() assumes it is
+ * not being called from the SCSI EH.
+ */
+ qc->scsidone = scsi_finish_command;
switch (qc->tf.protocol) {
case ATA_PROT_DMA:
printk(KERN_ERR "ata%u: command timeout\n", ap->id);
drv_stat = ata_wait_idle(ap);
qc->err_mask |= __ac_err_mask(drv_stat);
+ ata_qc_complete(qc);
break;
default:
ap->id, qc->tf.command, drv_stat);
qc->err_mask |= ac_err_mask(drv_stat);
+ ata_qc_complete(qc);
break;
}
+out:
spin_unlock_irqrestore(&host_set->lock, flags);
- ata_eh_qc_complete(qc);
DPRINTK("EXIT\n");
}
VPRINTK("QUICK EXIT 2\n");
return IRQ_NONE;
}
-
- spin_lock(&host_set->lock);
-
mask &= 0xffff; /* only 16 tags possible */
if (!mask) {
VPRINTK("QUICK EXIT 3\n");
- goto done_irq;
+ return IRQ_NONE;
}
+ spin_lock(&host_set->lock);
+
writel(mask, mmio_base + PDC_INT_SEQMASK);
for (i = 0; i < host_set->n_ports; i++) {
}
}
+ spin_unlock(&host_set->lock);
+
VPRINTK("EXIT\n");
-done_irq:
- spin_unlock(&host_set->lock);
return IRQ_RETVAL(handled);
}
readl((void __iomem *) ap->ioaddr.cmd_addr + PDC_PKT_SUBMIT); /* flush */
}
-static unsigned int pdc_qc_issue_prot(struct ata_queued_cmd *qc)
+static int pdc_qc_issue_prot(struct ata_queued_cmd *qc)
{
switch (qc->tf.protocol) {
case ATA_PROT_DMA:
static void pdc_host_init(unsigned int chip_id, struct ata_probe_ent *pe)
{
void __iomem *mmio = pe->mmio_base;
- struct pdc_host_priv *hp = pe->private_data;
- int hotplug_offset = hp->hotplug_offset;
u32 tmp;
/*
writel(tmp, mmio + PDC_FLASH_CTL);
/* clear plug/unplug flags for all ports */
- tmp = readl(mmio + hotplug_offset);
- writel(tmp | 0xff, mmio + hotplug_offset);
+ tmp = readl(mmio + PDC_SATA_PLUG_CSR);
+ writel(tmp | 0xff, mmio + PDC_SATA_PLUG_CSR);
/* mask plug/unplug ints */
- tmp = readl(mmio + hotplug_offset);
- writel(tmp | 0xff0000, mmio + hotplug_offset);
+ tmp = readl(mmio + PDC_SATA_PLUG_CSR);
+ writel(tmp | 0xff0000, mmio + PDC_SATA_PLUG_CSR);
/* reduce TBG clock to 133 Mhz. */
tmp = readl(mmio + PDC_TBG_MODE);
{
static int printed_version;
struct ata_probe_ent *probe_ent = NULL;
- struct pdc_host_priv *hp;
unsigned long base;
void __iomem *mmio_base;
unsigned int board_idx = (unsigned int) ent->driver_data;
int pci_dev_busy = 0;
int rc;
- u8 tmp; /* pata fix */
if (!printed_version++)
dev_printk(KERN_DEBUG, &pdev->dev, "version " DRV_VERSION "\n");
if (rc)
goto err_out_regions;
- probe_ent = kzalloc(sizeof(*probe_ent), GFP_KERNEL);
+ probe_ent = kmalloc(sizeof(*probe_ent), GFP_KERNEL);
if (probe_ent == NULL) {
rc = -ENOMEM;
goto err_out_regions;
}
+ memset(probe_ent, 0, sizeof(*probe_ent));
probe_ent->dev = pci_dev_to_dev(pdev);
INIT_LIST_HEAD(&probe_ent->node);
}
base = (unsigned long) mmio_base;
- hp = kzalloc(sizeof(*hp), GFP_KERNEL);
- if (hp == NULL) {
- rc = -ENOMEM;
- goto err_out_free_ent;
- }
-
- /* Set default hotplug offset */
- hp->hotplug_offset = PDC_SATA_PLUG_CSR;
- probe_ent->private_data = hp;
-
probe_ent->sht = pdc_port_info[board_idx].sht;
probe_ent->host_flags = pdc_port_info[board_idx].host_flags;
probe_ent->pio_mask = pdc_port_info[board_idx].pio_mask;
probe_ent->port[0].scr_addr = base + 0x400;
probe_ent->port[1].scr_addr = base + 0x500;
- probe_ent->port_flags[0] = ATA_FLAG_SATA; /* pata fix */
- probe_ent->port_flags[1] = ATA_FLAG_SATA; /* pata fix */
-
/* notice 4-port boards */
switch (board_idx) {
- case board_40518:
- /* Override hotplug offset for SATAII150 */
- hp->hotplug_offset = PDC2_SATA_PLUG_CSR;
- /* Fall through */
case board_20319:
probe_ent->n_ports = 4;
probe_ent->port[2].scr_addr = base + 0x600;
probe_ent->port[3].scr_addr = base + 0x700;
-
- probe_ent->port_flags[2] = ATA_FLAG_SATA; /* pata fix */
- probe_ent->port_flags[3] = ATA_FLAG_SATA; /* pata fix */
break;
- case board_2057x:
- /* Override hotplug offset for SATAII150 */
- hp->hotplug_offset = PDC2_SATA_PLUG_CSR;
- /* Fall through */
case board_2037x:
-/* probe_ent->n_ports = 2; */ /* pata fix */
- /* Some boards have also PATA port */ /* pata fix */
- tmp = readb(mmio_base + PDC_FLASH_CTL+1); /* pata fix */
- if (!(tmp & 0x80)) /* pata fix */
- { /* pata fix */
- probe_ent->n_ports = 3; /* pata fix */
- pdc_ata_setup_port(&probe_ent->port[2], base + 0x300); /* pata fix */
- probe_ent->port_flags[2] = ATA_FLAG_SLAVE_POSS; /* pata fix */
- printk(KERN_INFO DRV_NAME " PATA port found\n"); /* pata fix */
- } /* pata fix */
- else /* pata fix */
- probe_ent->n_ports = 2; /* pata fix */
+ probe_ent->n_ports = 2;
break;
case board_20771:
probe_ent->n_ports = 2;
probe_ent->port[2].scr_addr = base + 0x600;
probe_ent->port[3].scr_addr = base + 0x700;
-
- probe_ent->port_flags[2] = ATA_FLAG_SATA; /* pata fix */
- probe_ent->port_flags[3] = ATA_FLAG_SATA; /* pata fix */
break;
default:
BUG();
/* initialize adapter */
pdc_host_init(board_idx, probe_ent);
- /* FIXME: Need any other frees than hp? */
- if (!ata_device_add(probe_ent))
- kfree(hp);
-
+ /* FIXME: check ata_device_add return value */
+ ata_device_add(probe_ent);
kfree(probe_ent);
return 0;