libata-core: Fix the iordy methods
This alone isn't sufficient to save the universe from prehistoric disks and controllers but it is a first important step. Split off a separate function to provide a mode filter when controller iordy is not available. Signed-off-by: Alan Cox <alan@redhat.com> Signed-off-by: Jeff Garzik <jeff@garzik.org>
This commit is contained in:
parent
04351821b4
commit
432729f0b0
|
@ -1382,27 +1382,41 @@ unsigned int ata_do_simple_cmd(struct ata_device *dev, u8 cmd)
|
||||||
|
|
||||||
unsigned int ata_pio_need_iordy(const struct ata_device *adev)
|
unsigned int ata_pio_need_iordy(const struct ata_device *adev)
|
||||||
{
|
{
|
||||||
int pio;
|
/* Controller doesn't support IORDY. Probably a pointless check
|
||||||
int speed = adev->pio_mode - XFER_PIO_0;
|
as the caller should know this */
|
||||||
|
if (adev->ap->flags & ATA_FLAG_NO_IORDY)
|
||||||
if (speed < 2)
|
|
||||||
return 0;
|
return 0;
|
||||||
if (speed > 2)
|
/* PIO3 and higher it is mandatory */
|
||||||
|
if (adev->pio_mode > XFER_PIO_2)
|
||||||
return 1;
|
return 1;
|
||||||
|
/* We turn it on when possible */
|
||||||
|
if (ata_id_has_iordy(adev->id))
|
||||||
|
return 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ata_pio_mask_no_iordy - Return the non IORDY mask
|
||||||
|
* @adev: ATA device
|
||||||
|
*
|
||||||
|
* Compute the highest mode possible if we are not using iordy. Return
|
||||||
|
* -1 if no iordy mode is available.
|
||||||
|
*/
|
||||||
|
|
||||||
|
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 */
|
||||||
|
|
||||||
if (adev->id[ATA_ID_FIELD_VALID] & 2) { /* EIDE */
|
if (adev->id[ATA_ID_FIELD_VALID] & 2) { /* EIDE */
|
||||||
pio = adev->id[ATA_ID_EIDE_PIO];
|
u16 pio = adev->id[ATA_ID_EIDE_PIO];
|
||||||
/* Is the speed faster than the drive allows non IORDY ? */
|
/* Is the speed faster than the drive allows non IORDY ? */
|
||||||
if (pio) {
|
if (pio) {
|
||||||
/* This is cycle times not frequency - watch the logic! */
|
/* This is cycle times not frequency - watch the logic! */
|
||||||
if (pio > 240) /* PIO2 is 240nS per cycle */
|
if (pio > 240) /* PIO2 is 240nS per cycle */
|
||||||
return 1;
|
return 3 << ATA_SHIFT_PIO;
|
||||||
return 0;
|
return 7 << ATA_SHIFT_PIO;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 3 << ATA_SHIFT_PIO;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue