[PATCH] ahci: use ata_wait_register()
authorTejun Heo <htejun@gmail.com>
Tue, 11 Apr 2006 13:22:29 +0000 (22:22 +0900)
committerJeff Garzik <jeff@garzik.org>
Tue, 11 Apr 2006 17:19:11 +0000 (13:19 -0400)
Replace ahci_poll_register() with ata_wait_register().

Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
drivers/scsi/ahci.c

index 0e7fb9b..1b8429c 100644 (file)
@@ -516,24 +516,6 @@ static void ahci_fill_cmd_slot(struct ahci_port_priv *pp, u32 opts)
        pp->cmd_slot[0].tbl_addr_hi = cpu_to_le32((pp->cmd_tbl_dma >> 16) >> 16);
 }
 
-static int ahci_poll_register(void __iomem *reg, u32 mask, u32 val,
-                             unsigned long interval_msec,
-                             unsigned long timeout_msec)
-{
-       unsigned long timeout;
-       u32 tmp;
-
-       timeout = jiffies + (timeout_msec * HZ) / 1000;
-       do {
-               tmp = readl(reg);
-               if ((tmp & mask) == val)
-                       return 0;
-               msleep(interval_msec);
-       } while (time_before(jiffies, timeout));
-
-       return -1;
-}
-
 static int ahci_softreset(struct ata_port *ap, unsigned int *class)
 {
        struct ahci_host_priv *hpriv = ap->host_set->private_data;
@@ -543,6 +525,7 @@ static int ahci_softreset(struct ata_port *ap, unsigned int *class)
        const u32 cmd_fis_len = 5; /* five dwords */
        const char *reason = NULL;
        struct ata_taskfile tf;
+       u32 tmp;
        u8 *fis;
        int rc;
 
@@ -564,8 +547,6 @@ static int ahci_softreset(struct ata_port *ap, unsigned int *class)
        /* check BUSY/DRQ, perform Command List Override if necessary */
        ahci_tf_read(ap, &tf);
        if (tf.command & (ATA_BUSY | ATA_DRQ)) {
-               u32 tmp;
-
                if (!(hpriv->cap & HOST_CAP_CLO)) {
                        rc = -EIO;
                        reason = "port busy but no CLO";
@@ -575,10 +556,10 @@ static int ahci_softreset(struct ata_port *ap, unsigned int *class)
                tmp = readl(port_mmio + PORT_CMD);
                tmp |= PORT_CMD_CLO;
                writel(tmp, port_mmio + PORT_CMD);
-               readl(port_mmio + PORT_CMD); /* flush */
 
-               if (ahci_poll_register(port_mmio + PORT_CMD, PORT_CMD_CLO, 0x0,
-                                      1, 500)) {
+               tmp = ata_wait_register(port_mmio + PORT_CMD,
+                                       PORT_CMD_CLO, PORT_CMD_CLO, 1, 500);
+               if (tmp & PORT_CMD_CLO) {
                        rc = -EIO;
                        reason = "CLO failed";
                        goto fail_restart;
@@ -599,9 +580,9 @@ static int ahci_softreset(struct ata_port *ap, unsigned int *class)
        fis[1] &= ~(1 << 7);    /* turn off Command FIS bit */
 
        writel(1, port_mmio + PORT_CMD_ISSUE);
-       readl(port_mmio + PORT_CMD_ISSUE);      /* flush */
 
-       if (ahci_poll_register(port_mmio + PORT_CMD_ISSUE, 0x1, 0x0, 1, 500)) {
+       tmp = ata_wait_register(port_mmio + PORT_CMD_ISSUE, 0x1, 0x1, 1, 500);
+       if (tmp & 0x1) {
                rc = -EIO;
                reason = "1st FIS failed";
                goto fail;