• Mikael Pettersson's avatar
    sata_promise: update reset code · ff7cddf5
    Mikael Pettersson authored
    sata_promise's reset code has deviated quite a bit from
    the Promise reference driver's, and it has been observed
    to fail to recover from errors in some cases.
    
    This patch thus updates the reset code to more closely
    match the reference driver:
    
    - soft reset (pdc_reset_port):
      * wait for ATA engine to not be in packet command mode
        (2nd gen only)
      * write reset bit in PDC_CTLSTAT before the first read
        in the loop
      * for 2nd gen SATA follow up with FPDMA reset and clearing
        error status registers
    - hard reset (pdc_sata_hardreset):
      * wait for ATA engine to not be in packet command mode
        (2nd gen only)
      * reset ATA engine via the PCI control register
      * Tejun's change to use non-waiting hardreset + follow-up SRST
    
    I'm not changing the hotplug mask bits since they are taken care
    of by sata_promise's ->freeze() and ->thaw() operations. And I'm
    not writing the PMP port # because that's always zero (for now).
    
    Tested here on various controllers. In particular, one disk
    which used to timeout and fail to recover from certain hdparm
    and smartmonctl commands now works nicely.
    Signed-off-by: default avatarMikael Pettersson <mikpe@it.uu.se>
    Signed-off-by: default avatarJeff Garzik <jgarzik@redhat.com>
    ff7cddf5
sata_promise.c 34.1 KB