vserver 1.9.3
[linux-2.6.git] / drivers / ide / pci / piix.c
index 26719f2..c4161a5 100644 (file)
@@ -561,36 +561,31 @@ static int piix_config_drive_xfer_rate (ide_drive_t *drive)
        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;
-               if (id->field_valid & 4) {
-                       if (id->dma_ultra & hwif->ultra_mask) {
-                               /* Force if Capable UltraDMA */
-                               if ((id->field_valid & 2) &&
-                                   (!piix_config_drive_for_dma(drive)))
-                                       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 (!piix_config_drive_for_dma(drive))
-                                       goto no_dma_set;
-                       }
-               } else if (__ide_dma_good_drive(drive) &&
-                          (id->eide_dma_time < 150)) {
-                       /* Consult the list of known "good" drives */
-                       if (!piix_config_drive_for_dma(drive))
-                               goto no_dma_set;
-               } else {
-                       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);
                }
-               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:
-no_dma_set:
+               /* Find best PIO mode. */
                hwif->tuneproc(drive, 255);
                return hwif->ide_dma_off_quietly(drive);
        }
@@ -803,7 +798,7 @@ static struct pci_device_id piix_pci_tbl[] = {
 MODULE_DEVICE_TABLE(pci, piix_pci_tbl);
 
 static struct pci_driver driver = {
-       .name           = "PIIX IDE",
+       .name           = "PIIX_IDE",
        .id_table       = piix_pci_tbl,
        .probe          = piix_init_one,
 };