提交 07b73470 编写于 作者: T Tejun Heo 提交者: Jeff Garzik

[PATCH] sata_sil24: convert to new reset mechanism

Convert sata_sil24 ->phy_reset to new reset mechanism.
Signed-off-by: NTejun Heo <htejun@gmail.com>
Signed-off-by: NJeff Garzik <jgarzik@pobox.com>
上级 531db7aa
...@@ -249,7 +249,7 @@ static u8 sil24_check_status(struct ata_port *ap); ...@@ -249,7 +249,7 @@ static u8 sil24_check_status(struct ata_port *ap);
static u32 sil24_scr_read(struct ata_port *ap, unsigned sc_reg); static u32 sil24_scr_read(struct ata_port *ap, unsigned sc_reg);
static void sil24_scr_write(struct ata_port *ap, unsigned sc_reg, u32 val); static void sil24_scr_write(struct ata_port *ap, unsigned sc_reg, u32 val);
static void sil24_tf_read(struct ata_port *ap, struct ata_taskfile *tf); static void sil24_tf_read(struct ata_port *ap, struct ata_taskfile *tf);
static void sil24_phy_reset(struct ata_port *ap); static int sil24_probe_reset(struct ata_port *ap, unsigned int *classes);
static void sil24_qc_prep(struct ata_queued_cmd *qc); static void sil24_qc_prep(struct ata_queued_cmd *qc);
static unsigned int sil24_qc_issue(struct ata_queued_cmd *qc); static unsigned int sil24_qc_issue(struct ata_queued_cmd *qc);
static void sil24_irq_clear(struct ata_port *ap); static void sil24_irq_clear(struct ata_port *ap);
...@@ -306,7 +306,7 @@ static const struct ata_port_operations sil24_ops = { ...@@ -306,7 +306,7 @@ static const struct ata_port_operations sil24_ops = {
.tf_read = sil24_tf_read, .tf_read = sil24_tf_read,
.phy_reset = sil24_phy_reset, .probe_reset = sil24_probe_reset,
.qc_prep = sil24_qc_prep, .qc_prep = sil24_qc_prep,
.qc_issue = sil24_qc_issue, .qc_issue = sil24_qc_issue,
...@@ -336,8 +336,8 @@ static struct ata_port_info sil24_port_info[] = { ...@@ -336,8 +336,8 @@ static struct ata_port_info sil24_port_info[] = {
{ {
.sht = &sil24_sht, .sht = &sil24_sht,
.host_flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | .host_flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
ATA_FLAG_SRST | ATA_FLAG_MMIO | ATA_FLAG_MMIO | ATA_FLAG_PIO_DMA |
ATA_FLAG_PIO_DMA | SIL24_NPORTS2FLAG(4), SIL24_NPORTS2FLAG(4),
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = 0x1f, /* pio0-4 */
.mwdma_mask = 0x07, /* mwdma0-2 */ .mwdma_mask = 0x07, /* mwdma0-2 */
.udma_mask = 0x3f, /* udma0-5 */ .udma_mask = 0x3f, /* udma0-5 */
...@@ -347,8 +347,8 @@ static struct ata_port_info sil24_port_info[] = { ...@@ -347,8 +347,8 @@ static struct ata_port_info sil24_port_info[] = {
{ {
.sht = &sil24_sht, .sht = &sil24_sht,
.host_flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | .host_flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
ATA_FLAG_SRST | ATA_FLAG_MMIO | ATA_FLAG_MMIO | ATA_FLAG_PIO_DMA |
ATA_FLAG_PIO_DMA | SIL24_NPORTS2FLAG(2), SIL24_NPORTS2FLAG(2),
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = 0x1f, /* pio0-4 */
.mwdma_mask = 0x07, /* mwdma0-2 */ .mwdma_mask = 0x07, /* mwdma0-2 */
.udma_mask = 0x3f, /* udma0-5 */ .udma_mask = 0x3f, /* udma0-5 */
...@@ -358,8 +358,8 @@ static struct ata_port_info sil24_port_info[] = { ...@@ -358,8 +358,8 @@ static struct ata_port_info sil24_port_info[] = {
{ {
.sht = &sil24_sht, .sht = &sil24_sht,
.host_flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | .host_flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
ATA_FLAG_SRST | ATA_FLAG_MMIO | ATA_FLAG_MMIO | ATA_FLAG_PIO_DMA |
ATA_FLAG_PIO_DMA | SIL24_NPORTS2FLAG(1), SIL24_NPORTS2FLAG(1),
.pio_mask = 0x1f, /* pio0-4 */ .pio_mask = 0x1f, /* pio0-4 */
.mwdma_mask = 0x07, /* mwdma0-2 */ .mwdma_mask = 0x07, /* mwdma0-2 */
.udma_mask = 0x3f, /* udma0-5 */ .udma_mask = 0x3f, /* udma0-5 */
...@@ -428,7 +428,8 @@ static void sil24_tf_read(struct ata_port *ap, struct ata_taskfile *tf) ...@@ -428,7 +428,8 @@ static void sil24_tf_read(struct ata_port *ap, struct ata_taskfile *tf)
*tf = pp->tf; *tf = pp->tf;
} }
static int sil24_issue_SRST(struct ata_port *ap) static int sil24_softreset(struct ata_port *ap, int verbose,
unsigned int *class)
{ {
void __iomem *port = (void __iomem *)ap->ioaddr.cmd_addr; void __iomem *port = (void __iomem *)ap->ioaddr.cmd_addr;
struct sil24_port_priv *pp = ap->private_data; struct sil24_port_priv *pp = ap->private_data;
...@@ -437,6 +438,8 @@ static int sil24_issue_SRST(struct ata_port *ap) ...@@ -437,6 +438,8 @@ static int sil24_issue_SRST(struct ata_port *ap)
u32 irq_enable, irq_stat; u32 irq_enable, irq_stat;
int cnt; int cnt;
DPRINTK("ENTER\n");
/* temporarily turn off IRQs during SRST */ /* temporarily turn off IRQs during SRST */
irq_enable = readl(port + PORT_IRQ_ENABLE_SET); irq_enable = readl(port + PORT_IRQ_ENABLE_SET);
writel(irq_enable, port + PORT_IRQ_ENABLE_CLR); writel(irq_enable, port + PORT_IRQ_ENABLE_CLR);
...@@ -466,30 +469,27 @@ static int sil24_issue_SRST(struct ata_port *ap) ...@@ -466,30 +469,27 @@ static int sil24_issue_SRST(struct ata_port *ap)
/* restore IRQs */ /* restore IRQs */
writel(irq_enable, port + PORT_IRQ_ENABLE_SET); writel(irq_enable, port + PORT_IRQ_ENABLE_SET);
if (!(irq_stat & PORT_IRQ_COMPLETE)) if (sata_dev_present(ap)) {
return -1; if (!(irq_stat & PORT_IRQ_COMPLETE)) {
DPRINTK("EXIT, srst failed\n");
return -EIO;
}
/* update TF */ sil24_update_tf(ap);
sil24_update_tf(ap); *class = ata_dev_classify(&pp->tf);
}
if (*class == ATA_DEV_UNKNOWN)
*class = ATA_DEV_NONE;
DPRINTK("EXIT, class=%u\n", *class);
return 0; return 0;
} }
static void sil24_phy_reset(struct ata_port *ap) static int sil24_probe_reset(struct ata_port *ap, unsigned int *classes)
{ {
struct sil24_port_priv *pp = ap->private_data; return ata_drive_probe_reset(ap, ata_std_probeinit,
sil24_softreset, NULL,
__sata_phy_reset(ap); ata_std_postreset, classes);
if (ap->flags & ATA_FLAG_PORT_DISABLED)
return;
if (sil24_issue_SRST(ap) < 0) {
printk(KERN_ERR DRV_NAME
" ata%u: SRST failed, disabling port\n", ap->id);
ap->ops->port_disable(ap);
return;
}
ap->device->class = ata_dev_classify(&pp->tf);
} }
static inline void sil24_fill_sg(struct ata_queued_cmd *qc, static inline void sil24_fill_sg(struct ata_queued_cmd *qc,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册