Skip to content
  • Tejun Heo's avatar
    ahci: implement ata_save/restore_initial_config() · d447df14
    Tejun Heo authored
    
    
    There are several registers which describe how the controller is
    configured.  These registers are sometimes implemented as r/w
    registers which are configured by firmware and get cleared on
    controller reset or after suspend/resume cycle.  ahci saved and
    restored those values inside ahci_reset_controller() which is a bit
    messy and doesn't work over suspend/resume cycle.
    
    This patch implements ahci_save/restore_initial_config().  The save
    function is called during driver initialization and saves cap and
    port_map to hpriv.  The restore function is called after the
    controller is reset to restore the initial values.
    
    Sometimes the initial firmware values are inconsistent and need to be
    fixed up.  This is handled by ahci_save_initial_config().  For this,
    there are two versions of saved registers.  One to write back to the
    hardware register, the other to use during driver operation.  This is
    necessary to keep ahci's behavior unchanged (write back fixed up
    port_map while keeping cap as-is).
    
    This patch makes ahci save the register values once before the first
    controller reset, not after it's been reset.  Also, the same stored
    values are used written back after each reset, so the register values
    are properly recovered after suspend/resume cycle.
    
    Signed-off-by: default avatarTejun Heo <htejun@gmail.com>
    Signed-off-by: default avatarJeff Garzik <jeff@garzik.org>
    d447df14