• Tejun Heo's avatar
    [PATCH] ahci: do not powerdown during initialization · 8e16f941
    Tejun Heo authored
    ahci_init_controller() calls ahci_deinit_port() to make sure the
    controller is stopped before initializing the controller.  In turn,
    ahci_deinit_port() invokes ahci_power_down() to power down the port.
    If the controller supports slumber mode, the link is put into it.
    
    Unfortunately, some devices don't implement link powersaving mode
    properly and show erratic behavior after link is put into slumber
    mode.  For example, HL-DT-ST DVD-RAM GSA-H30N completely locks up on
    slumber transition and can only be recovered with the *REAL* hard
    reset - power removal and reapply.
    
    Note that this makes the first probing reset different from all
    others.  If the above dvd-ram is hotplugged after ahci is initialized,
    no problem occurs because ahci is already fully initialized with phy
    powered up.  So, this might also be the reason for other weird AHCI
    initial probing abnormalities.
    
    This patch moves power up/down out of port init/deinit and call them
    only when needed.
    
    Power down is now called only when suspending.  As system suspend
    usually involves powering down 12v for storage devices, this shouldn't
    cause problem even if the attached device doesn't support slumber
    mode.  However, in partial power management and suspend failure cases,
    devices might lock up after suspend attempt.  I thought about removing
    transition to slumber mode altogether but ahci spec mandates it before
    HBA D3 state transition.  Blacklisting such devices might be the
    solution.
    Signed-off-by: default avatarTejun Heo <htejun@gmail.com>
    8e16f941
ahci.c 47 KB