• Mikael Pettersson's avatar
    sata_promise: fix hardreset hotplug events, take 2 · c07a9c49
    Mikael Pettersson authored
    A Promise SATA controller will signal hotplug events when a hard
    reset (COMRESET) is done on a port. These events aren't masked by
    the driver, and the unexpected interrupts will cause a sequence
    of failed reset attempts util libata's EH finally gives up.
    
    This has not been a common problem so far, but the pending libata
    hardreset-by-default changes makes it a critical issue.
    
    The solution is to disable hotplug events before a reset, and to
    reenable them afterwards. (Promise's driver does this too.)
    
    This patch adds SATA-specific versions of ->freeze() and ->thaw()
    that also disable and enable hotplug events. PATA ports continue
    to use the old versions of ->freeze() and ->thaw().
    
    Accesses to the hotplug register must be serialised via host->lock.
    We rely on ap->lock == &ap->host->lock and that libata takes this
    lock before ->freeze() and ->thaw(). Document this requirement.
    The interrupt handler is adjusted so its hotplug register accesses
    are inside the region protected by host->lock.
    
    Tested on various chips (SATA300TX4, SATA300TX2plus, SATAII150TX4,
    FastTrack TX4000) with various combinations of SATA and PATA disks,
    with and without the pending hardreset-by-default changes.
    Signed-off-by: default avatarMikael Pettersson <mikpe@it.uu.se>
    Acked-by: default avatarTejun Heo <htejun@gmail.com>
    Signed-off-by: default avatarJeff Garzik <jeff@garzik.org>
    c07a9c49
sata_promise.c 31.5 KB