• Tejun Heo's avatar
    libata: make sure port is thawed when skipping resets · d6515e6f
    Tejun Heo authored
    When SCR access is available and the link is offline, softreset is
    skipped as it only wastes time and some controllers don't respond very
    well.  However, the skip path forgot to thaw the port, which not only
    blocks further event notification from the port but also causes
    repeated EH invocations on the same event on drivers which rely on
    ->thaw() to clear events if the IRQ is shared with another device or
    port.
    
    This problem has always been there but is uncovered by recent sata_nv
    nf2/3 change which dropped hardreset support while maintaining SCR
    access.  nf2/3 doesn't clear hotplug event mask from the interrupt
    handler but relies on ->thaw() to clear them.  When the hardreset was
    there, the reset action was never skipped and the port was always
    thawed but, with the hardreset gone, ->prereset() determines that
    there's no need for softreset and both ->softreset() and ->thaw() are
    skipped.  This leads to stuck hotplug event in the IRQ status register
    triggering hotplug event whenever IRQ is delieverd on the same IRQ.
    As the controller shares the same IRQ for both ports, this happens on
    every IO if one port is occpupied and the other isn't.
    
    This patch fixes the problem by making sure that the port is thawed on
    reset-skip path.
    
    bko#11615 reports this problem.
    Signed-off-by: default avatarTejun Heo <tj@kernel.org>
    Cc: Robert Hancock <hancockrwd@gmail.com>
    Reported-by: default avatarDan Andresan <danyer@gmail.com>
    Reported-by: default avatarArne Woerner <arne_woerner@yahoo.com>
    Reported-by: default avatarStefan Lippers-Hollmann <s.L-H@gmx.de>
    Signed-off-by: default avatarJeff Garzik <jgarzik@redhat.com>
    d6515e6f
libata-eh.c 89.1 KB