Example #1
0
static int pdcnew_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) {
		/* Consult the list of known "bad" drives */
		if (__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 = config_chipset_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 (!config_chipset_for_dma(drive))
					goto no_dma_set;
			}
		} else if (__ide_dma_good_drive(drive) &&
			    (id->eide_dma_time < 150)) {
				goto no_dma_set;
			/* Consult the list of known "good" drives */
			if (!config_chipset_for_dma(drive))
				goto no_dma_set;
		} else {
			goto fast_ata_pio;
		}
		return hwif->ide_dma_on(drive);
	} 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);
	}
	/* IORDY not supported */
	return 0;
}
Example #2
0
static int piix_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 (__ide_dma_bad_drive(drive))
			goto fast_ata_pio;

		/**
		 * Try to turn DMA on if:
		 *  - UDMA or EIDE modes are supported or
		 *  - drive is a known "good" drive
		 *
		 * Checks for best mode supported are down later by
		 * piix_config_drive_for_dma() -> ide_dma_speed()
		 */
		if ((id->field_valid & (4 | 2)) ||
		    (__ide_dma_good_drive(drive) && id->eide_dma_time < 150)) {
			if (piix_config_drive_for_dma(drive))
				return hwif->ide_dma_on(drive);
		}

		/* For some reason DMA wasn't turned on, so try PIO. */
		goto fast_ata_pio;

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

    if (id && (id->capability & 1) && drive->autodma) {
        if (__ide_dma_bad_drive(drive))
            goto tune_pio;
        if (id->field_valid & 2) {
            if ((id->dma_mword & hwif->mwdma_mask) ||
                    (id->dma_1word & hwif->swdma_mask)) {
                if (!triflex_config_drive_for_dma(drive))
                    goto tune_pio;
            }
        } else
            goto tune_pio;
    } else {
tune_pio:
        hwif->tuneproc(drive, 255);
        return hwif->ide_dma_off_quietly(drive);
    }

    return hwif->ide_dma_on(drive);
}