Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 432729f0 authored by Alan Cox's avatar Alan Cox Committed by Jeff Garzik
Browse files

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: default avatarAlan Cox <alan@redhat.com>
Signed-off-by: default avatarJeff Garzik <jeff@garzik.org>
parent 04351821
Loading
Loading
Loading
Loading
+25 −11
Original line number Original line Diff line number Diff line
@@ -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;
	/* We turn it on when possible */
	if (ata_id_has_iordy(adev->id))
		return 1;
		return 1;
	return 0;
}


	/* If we have no drive specific rule, then PIO 2 is non IORDY */
/**
 *	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 (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;
}
}


/**
/**