lkml.org 
[lkml]   [2011]   [Jun]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH v2] ahci: fix pmp softreset with HDD
    Hello,

    On Wed, Jun 15, 2011 at 06:04:12PM +0800, Yuan-Hsin Chen wrote:
    > From: Yuan-Hsin Chen <yhchen@faraday-tech.com>
    >
    > When enabling both port multiplier and platform ahci sata,
    > ahci times out while connecting to HDD directly. This is
    > because soft reset fails with IPMS set. Do soft reset
    > again to port 0.
    >
    > The soft reset sequence is copied from ahci.c.
    >
    > Signed-off-by: Yuan-Hsin Chen <yhchen@faraday-tech.com>

    Getting closer.

    > +config SATA_PMP_RST
    > + bool "SATA PMP softreset"
    > + depends on SATA_PMP
    > + default n
    > + help
    > + When enabling both port multiplier and platform ahci sata,
    > + ahci times out while connecting to HDD directly in some
    > + ahci controller. This is because soft reset fails with
    > + IPMS set. Do soft reset again to port 0.
    > +

    Hmmm... Is there any way to detect the specific controller from
    ahci_platform.c? This is workaround for a controller bug. It should
    be enabled automatically. Making it a config option doesn't make
    whole lot of sense.

    > @@ -1329,6 +1338,56 @@ static int ahci_softreset(struct ata_link *link, unsigned int *class,
    > }
    > EXPORT_SYMBOL_GPL(ahci_do_softreset);
    >
    > +static int ahci_pmp_check_ready(struct ata_link *link)
    > +{
    > + void __iomem *port_mmio = ahci_port_base(link->ap);
    > + u8 status = readl(port_mmio + PORT_TFDATA) & 0xFF;
    > + u32 irq_status = readl(port_mmio + PORT_IRQ_STAT);
    > +
    > + /*
    > + * There is no need to check TFDATA if BAD PMP is found due to HW bug,
    > + * which can save timeout delay.
    > + */
    > + if (irq_status & PORT_IRQ_BAD_PMP)
    > + return -EIO;
    > +
    > + printk("%s:TFT 0x%x\n", __func__, status);
    > + return ata_check_ready(status);
    > +}
    > +
    > +static int ahci_pmp_softreset(struct ata_link *link, unsigned int *class,
    > + unsigned long deadline)
    > +{
    > + struct ata_port *ap = link->ap;
    > + void __iomem *port_mmio = ahci_port_base(ap);
    > + int pmp = sata_srst_pmp(link);
    > + int rc;
    > + u32 irq_sts;
    > +
    > + DPRINTK("ENTER\n");
    > +
    > + rc = ahci_do_softreset(link, class, pmp, deadline,
    > + ahci_pmp_check_ready);
    > +
    > + /*
    > + * Soft reset fails with IPMS set when PMP is enabled but
    > + * SATA HDD/ODD is connected to SATA port, do soft reset
    > + * again to port 0.
    > + */
    > + if (rc == -EIO) {
    > + irq_sts = readl(port_mmio + PORT_IRQ_STAT);
    > + if (irq_sts & PORT_IRQ_BAD_PMP) {
    > + ata_link_printk(link, KERN_WARNING,
    > + "applying PMP SRST workaround "
    > + "and retrying\n");
    > + rc = ahci_do_softreset(link, class, 0, deadline,
    > + ahci_check_ready);
    > + }
    > + }
    > +
    > + return rc;
    > +}

    Please make two separate patches. One to rename & move sb600 ops to
    libahci.c and another to use it for platform. There's no reason to
    have two identical sets of functions doing the same thing.

    Thanks.

    --
    tejun


    \
     
     \ /
      Last update: 2011-06-15 12:17    [W:0.026 / U:32.020 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site