lkml.org 
[lkml]   [2011]   [Dec]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    SubjectRe: [PATCH v5 5/6] ata: add ata port system PM callbacks
    From
    Date
    On Tue, 2011-12-13 at 21:56 +0800, Lin Ming wrote:
    > +
    > +static int ata_port_resume(struct device *dev)
    > +{
    > + struct ata_port *ap = to_ata_port(dev);
    > + int rc;
    > +
    > + rc = ata_port_request_pm(ap, PMSG_ON, ATA_EH_RESET,
    > + ATA_EHI_NO_AUTOPSY | ATA_EHI_QUIET, 1);
    > + return rc;
    > +}

    I just realized that the ata port runtime PM status need to be updated
    after system resume.

    I tried below patch.
    Unfortunately, it causes a problem that sd can't resume correctly.

    During system resume, ata port is resumed first and then sd resumed.

    When ata port resumed, device_resume(...) calls pm_runtime_put_sync(..),
    which causes ata port to be runtime suspended immediately.

    So sd resume fails because it requires ata port to be active to handle
    start device command.

    This seems a PM core's bug.

    device_resume(...) should not runtime suspend the parent device, because
    its children have not resumed yet.

    Alan,

    What do you think?

    ---
    drivers/ata/libata-core.c | 18 ++++++++++++++++--
    1 files changed, 16 insertions(+), 2 deletions(-)

    diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
    index 15a3d4d..8996758 100644
    --- a/drivers/ata/libata-core.c
    +++ b/drivers/ata/libata-core.c
    @@ -5298,7 +5298,7 @@ static int ata_port_suspend(struct device *dev)
    return ata_port_suspend_common(dev);
    }

    -static int ata_port_resume(struct device *dev)
    +static int ata_port_resume_common(struct device *dev)
    {
    struct ata_port *ap = to_ata_port(dev);
    int rc;
    @@ -5308,6 +5308,20 @@ static int ata_port_resume(struct device *dev)
    return rc;
    }

    +static int ata_port_resume(struct device *dev)
    +{
    + int rc;
    +
    + rc = ata_port_resume_common(dev);
    + if (!rc) {
    + pm_runtime_disable(dev);
    + pm_runtime_set_active(dev);
    + pm_runtime_enable(dev);
    + }
    +
    + return rc;
    +}
    +
    static int ata_port_runtime_idle(struct device *dev)
    {
    return pm_runtime_suspend(dev);
    @@ -5318,7 +5332,7 @@ static const struct dev_pm_ops ata_port_pm_ops = {
    .resume = ata_port_resume,

    .runtime_suspend = ata_port_suspend_common,
    - .runtime_resume = ata_port_resume,
    + .runtime_resume = ata_port_resume_common,
    .runtime_idle = ata_port_runtime_idle,
    };








    \
     
     \ /
      Last update: 2011-12-13 15:25    [W:0.028 / U:30.628 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site