Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 43321
b: refs/heads/master
c: 25b93d8
h: refs/heads/master
i:
  43319: 688a85b
v: v3
  • Loading branch information
Mikael Pettersson authored and Jeff Garzik committed Dec 7, 2006
1 parent e8d2c76 commit ccce3ef
Show file tree
Hide file tree
Showing 2 changed files with 69 additions and 13 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: e3472cbe5c10a91c737405cd706142787736392c
refs/heads/master: 25b93d81b9abe3b786bdf3396d728bb13b0a911c
80 changes: 68 additions & 12 deletions trunk/drivers/ata/sata_promise.c
Original file line number Diff line number Diff line change
Expand Up @@ -71,9 +71,12 @@ enum {

PDC_HAS_PATA = (1 << 1), /* PDC20375/20575 has PATA */

/* PDC_CTLSTAT bit definitions */
PDC_DMA_ENABLE = (1 << 7),
PDC_IRQ_DISABLE = (1 << 10),
PDC_RESET = (1 << 11), /* HDMA reset */

PDC_COMMON_FLAGS = ATA_FLAG_NO_LEGACY | ATA_FLAG_SRST |
PDC_COMMON_FLAGS = ATA_FLAG_NO_LEGACY |
ATA_FLAG_MMIO | ATA_FLAG_NO_ATAPI |
ATA_FLAG_PIO_POLLING,

Expand All @@ -99,13 +102,16 @@ static void pdc_eng_timeout(struct ata_port *ap);
static int pdc_port_start(struct ata_port *ap);
static void pdc_port_stop(struct ata_port *ap);
static void pdc_pata_phy_reset(struct ata_port *ap);
static void pdc_sata_phy_reset(struct ata_port *ap);
static void pdc_qc_prep(struct ata_queued_cmd *qc);
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 *host);
static void pdc_freeze(struct ata_port *ap);
static void pdc_thaw(struct ata_port *ap);
static void pdc_error_handler(struct ata_port *ap);
static void pdc_post_internal_cmd(struct ata_queued_cmd *qc);


static struct scsi_host_template pdc_ata_sht = {
Expand Down Expand Up @@ -134,11 +140,12 @@ static const struct ata_port_operations pdc_sata_ops = {
.exec_command = pdc_exec_command_mmio,
.dev_select = ata_std_dev_select,

.phy_reset = pdc_sata_phy_reset,

.qc_prep = pdc_qc_prep,
.qc_issue = pdc_qc_issue_prot,
.eng_timeout = pdc_eng_timeout,
.freeze = pdc_freeze,
.thaw = pdc_thaw,
.error_handler = pdc_error_handler,
.post_internal_cmd = pdc_post_internal_cmd,
.data_xfer = ata_mmio_data_xfer,
.irq_handler = pdc_interrupt,
.irq_clear = pdc_irq_clear,
Expand Down Expand Up @@ -196,7 +203,7 @@ static const struct ata_port_info pdc_port_info[] = {
/* board_20619 */
{
.sht = &pdc_ata_sht,
.flags = PDC_COMMON_FLAGS | ATA_FLAG_SLAVE_POSS,
.flags = PDC_COMMON_FLAGS | ATA_FLAG_SRST | ATA_FLAG_SLAVE_POSS,
.pio_mask = 0x1f, /* pio0-4 */
.mwdma_mask = 0x07, /* mwdma0-2 */
.udma_mask = 0x7f, /* udma0-6 ; FIXME */
Expand Down Expand Up @@ -346,12 +353,6 @@ static void pdc_reset_port(struct ata_port *ap)
readl(mmio); /* flush */
}

static void pdc_sata_phy_reset(struct ata_port *ap)
{
pdc_reset_port(ap);
sata_phy_reset(ap);
}

static void pdc_pata_cbl_detect(struct ata_port *ap)
{
u8 tmp;
Expand Down Expand Up @@ -419,6 +420,61 @@ static void pdc_qc_prep(struct ata_queued_cmd *qc)
}
}

static void pdc_freeze(struct ata_port *ap)
{
void __iomem *mmio = (void __iomem *) ap->ioaddr.cmd_addr;
u32 tmp;

tmp = readl(mmio + PDC_CTLSTAT);
tmp |= PDC_IRQ_DISABLE;
tmp &= ~PDC_DMA_ENABLE;
writel(tmp, mmio + PDC_CTLSTAT);
readl(mmio + PDC_CTLSTAT); /* flush */
}

static void pdc_thaw(struct ata_port *ap)
{
void __iomem *mmio = (void __iomem *) ap->ioaddr.cmd_addr;
u32 tmp;

/* clear IRQ */
readl(mmio + PDC_INT_SEQMASK);

/* turn IRQ back on */
tmp = readl(mmio + PDC_CTLSTAT);
tmp &= ~PDC_IRQ_DISABLE;
writel(tmp, mmio + PDC_CTLSTAT);
readl(mmio + PDC_CTLSTAT); /* flush */
}

static void pdc_error_handler(struct ata_port *ap)
{
ata_reset_fn_t hardreset;

if (!(ap->pflags & ATA_PFLAG_FROZEN))
pdc_reset_port(ap);

hardreset = NULL;
if (sata_scr_valid(ap))
hardreset = sata_std_hardreset;

/* perform recovery */
ata_do_eh(ap, ata_std_prereset, ata_std_softreset, hardreset,
ata_std_postreset);
}

static void pdc_post_internal_cmd(struct ata_queued_cmd *qc)
{
struct ata_port *ap = qc->ap;

if (qc->flags & ATA_QCFLAG_FAILED)
qc->err_mask |= AC_ERR_OTHER;

/* make DMA engine forget about the failed command */
if (qc->err_mask)
pdc_reset_port(ap);
}

static void pdc_eng_timeout(struct ata_port *ap)
{
struct ata_host *host = ap->host;
Expand Down

0 comments on commit ccce3ef

Please sign in to comment.