Example #1
0
static int slc90e66_config_drive_xfer_rate (ide_drive_t *drive)
{
    ide_hwif_t *hwif	= HWIF(drive);
    struct hd_driveid *id	= drive->id;

    drive->init_speed = 0;

    if ((id->capability & 1) && drive->autodma) {
        /* Consult the list of known "bad" drives */
        if (hwif->ide_dma_bad_drive(drive))
            goto fast_ata_pio;

        if (id->field_valid & 4) {
            if (id->dma_ultra & hwif->ultra_mask) {
                /* Force if Capable UltraDMA */
                int dma = slc90e66_config_drive_for_dma(drive);
                if ((id->field_valid & 2) && !dma)
                    goto try_dma_modes;
            }
        } else if (id->field_valid & 2) {
try_dma_modes:
            if ((id->dma_mword & hwif->mwdma_mask) ||
                    (id->dma_1word & hwif->swdma_mask)) {
                /* Force if Capable regular DMA modes */
                if (!slc90e66_config_drive_for_dma(drive))
                    goto no_dma_set;
            }
        } else if (hwif->ide_dma_good_drive(drive) &&
                   (id->eide_dma_time < 150)) {
            /* Consult the list of known "good" drives */
            if (!slc90e66_config_drive_for_dma(drive))
                goto no_dma_set;
        } else {
            goto fast_ata_pio;
        }
    } else if ((id->capability & 8) || (id->field_valid & 2)) {
fast_ata_pio:
no_dma_set:
        hwif->tuneproc(drive, 5);
        return hwif->ide_dma_off_quietly(drive);
    }
    return hwif->ide_dma_on(drive);
}
Example #2
0
static int slc90e66_config_drive_xfer_rate (ide_drive_t *drive)
{
	ide_hwif_t *hwif	= HWIF(drive);
	struct hd_driveid *id	= drive->id;

	drive->init_speed = 0;

	if ((id->capability & 1) && drive->autodma) {

		if (ide_use_dma(drive) && slc90e66_config_drive_for_dma(drive))
			return hwif->ide_dma_on(drive);

		goto fast_ata_pio;

	} else if ((id->capability & 8) || (id->field_valid & 2)) {
fast_ata_pio:
		slc90e66_tune_drive(drive, 255);
		return hwif->ide_dma_off_quietly(drive);
	}
	/* IORDY not supported */
	return 0;
}
Example #3
0
static int slc90e66_config_drive_xfer_rate (ide_drive_t *drive)
{
	ide_hwif_t *hwif	= HWIF(drive);
	struct hd_driveid *id	= drive->id;

	drive->init_speed = 0;

	if (id && (id->capability & 1) && drive->autodma) {

		if (ide_use_dma(drive) && slc90e66_config_drive_for_dma(drive))
			return hwif->ide_dma_on(drive);

		goto fast_ata_pio;

	} else if ((id->capability & 8) || (id->field_valid & 2)) {
fast_ata_pio:
		(void) hwif->speedproc(drive, XFER_PIO_0 +
				       ide_get_best_pio_mode(drive, 255, 4, NULL));
		return hwif->ide_dma_off_quietly(drive);
	}
	/* IORDY not supported */
	return 0;
}