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

Commit 7dd00083 authored by Bartlomiej Zolnierkiewicz's avatar Bartlomiej Zolnierkiewicz
Browse files

ide: add ide_pio_cycle_time() helper (take 2)



* Add ide_pio_cycle_time() helper.

* Use it in ali14xx/ht6560b/qd65xx/cmd64{0,x}/sl82c105 and pmac host drivers
  (previously cycle time given by the device was only used for "pio" == 255).

* Remove no longer needed ide_pio_data_t.cycle_time field.

v2:
* Fix "ata_" prefix (Noticed by Jeff).

Acked-by: default avatarSergei Shtylyov <sshtylyov@ru.mvista.com>
Cc: Jeff Garzik <jeff@garzik.org>
Signed-off-by: default avatarBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
parent 31c4df44
Loading
Loading
Loading
Loading
+28 −12
Original line number Diff line number Diff line
@@ -249,6 +249,29 @@ static int ide_scan_pio_blacklist (char *model)
	return -1;
}

unsigned int ide_pio_cycle_time(ide_drive_t *drive, u8 pio)
{
	struct hd_driveid *id = drive->id;
	int cycle_time = 0;

	if (id->field_valid & 2) {
		if (id->capability & 8)
			cycle_time = id->eide_pio_iordy;
		else
			cycle_time = id->eide_pio;
	}

	/* conservative "downgrade" for all pre-ATA2 drives */
	if (pio < 3) {
		if (cycle_time && cycle_time < ide_pio_timings[pio].cycle_time)
			cycle_time = 0; /* use standard timing */
	}

	return cycle_time ? cycle_time : ide_pio_timings[pio].cycle_time;
}

EXPORT_SYMBOL_GPL(ide_pio_cycle_time);

/**
 *	ide_get_best_pio_mode	-	get PIO mode from drive
 *	@drive: drive to consider
@@ -266,7 +289,6 @@ static int ide_scan_pio_blacklist (char *model)
u8 ide_get_best_pio_mode (ide_drive_t *drive, u8 mode_wanted, u8 max_mode, ide_pio_data_t *d)
{
	int pio_mode;
	int cycle_time = 0;
	struct hd_driveid* id = drive->id;
	int overridden  = 0;

@@ -284,7 +306,6 @@ u8 ide_get_best_pio_mode (ide_drive_t *drive, u8 mode_wanted, u8 max_mode, ide_p
		}
		if (id->field_valid & 2) {	  /* drive implements ATA2? */
			if (id->capability & 8) { /* IORDY supported? */
				cycle_time = id->eide_pio_iordy;
				if (id->eide_pio_modes & 7) {
					overridden = 0;
					if (id->eide_pio_modes & 4)
@@ -294,8 +315,6 @@ u8 ide_get_best_pio_mode (ide_drive_t *drive, u8 mode_wanted, u8 max_mode, ide_p
					else
						pio_mode = 3;
				}
			} else {
				cycle_time = id->eide_pio;
			}
		}

@@ -310,18 +329,15 @@ u8 ide_get_best_pio_mode (ide_drive_t *drive, u8 mode_wanted, u8 max_mode, ide_p
			pio_mode--;
			printk(KERN_INFO "%s: applying conservative "
					 "PIO \"downgrade\"\n", drive->name);
			if (cycle_time && cycle_time < ide_pio_timings[pio_mode].cycle_time)
				cycle_time = 0; /* use standard timing */
		}
	}
	if (pio_mode > max_mode) {

	if (pio_mode > max_mode)
		pio_mode = max_mode;
		cycle_time = 0;
	}
	if (d) {

	if (d)
		d->pio_mode = pio_mode;
		d->cycle_time = cycle_time ? cycle_time : ide_pio_timings[pio_mode].cycle_time;
	}

	return pio_mode;
}

+2 −3
Original line number Diff line number Diff line
@@ -115,13 +115,12 @@ static void ali14xx_tune_drive (ide_drive_t *drive, u8 pio)
	int time1, time2;
	u8 param1, param2, param3, param4;
	unsigned long flags;
	ide_pio_data_t d;
	int bus_speed = system_bus_clock();

	pio = ide_get_best_pio_mode(drive, pio, ALI_MAX_PIO, &d);
	pio = ide_get_best_pio_mode(drive, pio, ALI_MAX_PIO, NULL);

	/* calculate timing, according to PIO mode */
	time1 = d.cycle_time;
	time1 = ide_pio_cycle_time(drive, pio);
	time2 = ide_pio_timings[pio].active_time;
	param3 = param1 = (time2 * bus_speed + 999) / 1000;
	param4 = param2 = (time1 * bus_speed + 999) / 1000 - param1;
+6 −4
Original line number Diff line number Diff line
@@ -203,11 +203,13 @@ static u8 ht_pio2timings(ide_drive_t *drive, u8 pio)
{
	int active_time, recovery_time;
	int active_cycles, recovery_cycles;
	ide_pio_data_t d;
	int bus_speed = system_bus_clock();
	
        if (pio) {
		pio = ide_get_best_pio_mode(drive, pio, 5, &d);
		unsigned int cycle_time;

		pio = ide_get_best_pio_mode(drive, pio, 5, NULL);
		cycle_time = ide_pio_cycle_time(drive, pio);

		/*
		 *  Just like opti621.c we try to calculate the
@@ -215,7 +217,7 @@ static u8 ht_pio2timings(ide_drive_t *drive, u8 pio)
		 *  according system bus speed.
		 */
		active_time = ide_pio_timings[pio].active_time;
		recovery_time = d.cycle_time 
		recovery_time = cycle_time
			- active_time
			- ide_pio_timings[pio].setup_time;
		/*
+10 −10
Original line number Diff line number Diff line
@@ -252,38 +252,38 @@ static void qd6500_tune_drive (ide_drive_t *drive, u8 pio)

static void qd6580_tune_drive (ide_drive_t *drive, u8 pio)
{
	ide_pio_data_t d;
	int base = HWIF(drive)->select_data;
	unsigned int cycle_time;
	int active_time   = 175;
	int recovery_time = 415; /* worst case values from the dos driver */

	if (drive->id && !qd_find_disk_type(drive, &active_time, &recovery_time)) {
		pio = ide_get_best_pio_mode(drive, pio, 4, &d);
		pio = ide_get_best_pio_mode(drive, pio, 4, NULL);
		cycle_time = ide_pio_cycle_time(drive, pio);

		switch (pio) {
			case 0: break;
			case 3:
				if (d.cycle_time >= 110) {
				if (cycle_time >= 110) {
					active_time = 86;
					recovery_time = d.cycle_time - 102;
					recovery_time = cycle_time - 102;
				} else
					printk(KERN_WARNING "%s: Strange recovery time !\n",drive->name);
				break;
			case 4:
				if (d.cycle_time >= 69) {
				if (cycle_time >= 69) {
					active_time = 70;
					recovery_time = d.cycle_time - 61;
					recovery_time = cycle_time - 61;
				} else
					printk(KERN_WARNING "%s: Strange recovery time !\n",drive->name);
				break;
			default:
				if (d.cycle_time >= 180) {
				if (cycle_time >= 180) {
					active_time = 110;
					recovery_time = d.cycle_time - 120;
					recovery_time = cycle_time - 120;
				} else {
					active_time = ide_pio_timings[pio].active_time;
					recovery_time = d.cycle_time
							-active_time;
					recovery_time = cycle_time - active_time;
				}
		}
		printk(KERN_INFO "%s: PIO mode%d\n", drive->name,pio);
+5 −7
Original line number Diff line number Diff line
@@ -633,9 +633,8 @@ static void cmd640_set_mode (unsigned int index, u8 pio_mode, unsigned int cycle
 */
static void cmd640_tune_drive (ide_drive_t *drive, u8 mode_wanted)
{
	unsigned int index = 0, cycle_time;
	u8 b;
	ide_pio_data_t  d;
	unsigned int index = 0;

	while (drive != cmd_drives[index]) {
		if (++index > 3) {
@@ -662,13 +661,12 @@ static void cmd640_tune_drive (ide_drive_t *drive, u8 mode_wanted)
			return;
	}

	(void) ide_get_best_pio_mode (drive, mode_wanted, 5, &d);
	cmd640_set_mode (index, d.pio_mode, d.cycle_time);
	mode_wanted = ide_get_best_pio_mode(drive, mode_wanted, 5, NULL);
	cycle_time = ide_pio_cycle_time(drive, mode_wanted);
	cmd640_set_mode(index, mode_wanted, cycle_time);

	printk("%s: selected cmd640 PIO mode%d (%dns)",
		drive->name,
		d.pio_mode,
		d.cycle_time);
		drive->name, mode_wanted, cycle_time);

	display_clocks(index);
}
Loading