libata: correct handling of SRST reset sequences
authorAlan Cox <alan@lxorguk.ukuu.org.uk>
Wed, 3 Oct 2007 12:23:18 +0000 (13:23 +0100)
committerJeff Garzik <jeff@garzik.org>
Fri, 12 Oct 2007 18:55:45 +0000 (14:55 -0400)
commit681c80b5d96076f447e8101ac4325c82d8dce508
tree82cbcc887b5bbdd7c4ed48f38a3e97762cac98db
parent237d8440cb2b104a3b97fc971a9bce67960bb616
libata: correct handling of SRST reset sequences

Correct handling of SRST reset sequences.  After an SRST it is undefined
whether the drive has gone back to PIO0.  In order to talk safely we should
talk slowly and carefully until we know.

Thus when we do the reset if the controller has a pio setup method we call it
to flip back to PIO 0 and a known state.  After the reset completes the
identify will then be done at the safe speed and the drive/controller will
pick suitable faster modes and reconfigure the controller to these timings.

As a side effect it means we force the controller to PIO 0 as we bring it up
which fixes funnies on a few systems where the BIOS firmware leaves us in an
interesting choice of modes, or embedded boxes with no firmware which come up
in random states.

For smart controllers there is nothing to do - they know about this
internally.

Signed-off-by: Alan Cox <alan@redhat.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
drivers/ata/libata-core.c