libata: don't set IORDY for reset

Before issuing reset, libata configures xfermode to PIO0 which makes
some drivers turn on IORDY which may cause the controller to lock up
if the port is not occupied.  IORDY isn't necessary at this point
anyway.  Make ata_pio_need_iordy() return zero if it's being called
for reset.

This fixes bko#11703.  Reported and tracked down by Daniel Gnoutcheff
and Constantine Gavrilov.

Signed-off-by: Tejun Heo <tj@kernel.org>
Reported-by: Daniel Gnoutcheff <gnoutchd@union.edu>
Cc: Constantine Gavrilov <constantine.gavrilov@gmail.com>
Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
This commit is contained in:
Tejun Heo 2009-06-11 11:04:45 +09:00 committed by Jeff Garzik
parent dc77ad4c87
commit 0d9e6659a1

View file

@ -1993,11 +1993,17 @@ unsigned int ata_do_simple_cmd(struct ata_device *dev, u8 cmd)
* Check if the current speed of the device requires IORDY. Used * Check if the current speed of the device requires IORDY. Used
* by various controllers for chip configuration. * by various controllers for chip configuration.
*/ */
unsigned int ata_pio_need_iordy(const struct ata_device *adev) unsigned int ata_pio_need_iordy(const struct ata_device *adev)
{ {
/* Controller doesn't support IORDY. Probably a pointless check /* Don't set IORDY if we're preparing for reset. IORDY may
as the caller should know this */ * lead to controller lock up on certain controllers if the
* port is not occupied. See bko#11703 for details.
*/
if (adev->link->ap->pflags & ATA_PFLAG_RESETTING)
return 0;
/* Controller doesn't support IORDY. Probably a pointless
* check as the caller should know this.
*/
if (adev->link->ap->flags & ATA_FLAG_NO_IORDY) if (adev->link->ap->flags & ATA_FLAG_NO_IORDY)
return 0; return 0;
/* CF spec. r4.1 Table 22 says no iordy on PIO5 and PIO6. */ /* CF spec. r4.1 Table 22 says no iordy on PIO5 and PIO6. */
@ -2020,7 +2026,6 @@ unsigned int ata_pio_need_iordy(const struct ata_device *adev)
* Compute the highest mode possible if we are not using iordy. Return * Compute the highest mode possible if we are not using iordy. Return
* -1 if no iordy mode is available. * -1 if no iordy mode is available.
*/ */
static u32 ata_pio_mask_no_iordy(const struct ata_device *adev) static u32 ata_pio_mask_no_iordy(const struct ata_device *adev)
{ {
/* If we have no drive specific rule, then PIO 2 is non IORDY */ /* If we have no drive specific rule, then PIO 2 is non IORDY */