diff -ur linux-ata-hosts-9/drivers/ide/alim15x3.c linux/drivers/ide/alim15x3.c --- linux-ata-hosts-9/drivers/ide/alim15x3.c Mon Jun 24 22:40:40 2002 +++ linux/drivers/ide/alim15x3.c Mon Jun 24 22:43:20 2002 @@ -99,24 +99,6 @@ __restore_flags(flags); } -/* FIXME: unfold --bkz */ -static byte ali15x3_can_ultra(struct ata_device *drive) -{ - if (m5229_revision <= 0x20) { - return 0; - } else if ((m5229_revision < 0xC2) && -#ifndef CONFIG_WDC_ALI15X3 - ((chip_is_1543c_e && strstr(drive->id->model, "WDC ")) || - (drive->type != ATA_DISK))) { -#else - (drive->type != ATA_DISK)) { -#endif - return 0; - } else { - return 1; - } -} - static int ali15x3_tune_chipset(struct ata_device *drive, byte speed) { struct pci_dev *dev = drive->channel->pci_dev; @@ -158,85 +140,14 @@ } #ifdef CONFIG_BLK_DEV_IDEDMA -static int config_chipset_for_dma(struct ata_device *drive, u8 udma) -{ - int map = drive->channel->modes_map; - u8 mode; - - if (!eighty_ninty_three(drive)) - map &= ~XFER_UDMA_80W; - - if (!udma) - map &= ~XFER_UDMA_ALL; - - mode = ata_timing_mode(drive, map); - - if (mode < XFER_SW_DMA_0) - return 0; - - return !ali15x3_tune_chipset(drive, mode); -} - static int ali15x3_udma_setup(struct ata_device *drive, int map) { - struct hd_driveid *id = drive->id; - struct ata_channel *hwif = drive->channel; - int on = 1; - int verbose = 1; - byte can_ultra_dma = ali15x3_can_ultra(drive); - - if ((m5229_revision<=0x20) && (drive->type != ATA_DISK)) { - udma_enable(drive, 0, 0); - return 0; - } - - if ((id != NULL) && ((id->capability & 1) != 0) && hwif->autodma) { - /* Consult the list of known "bad" drives */ - if (udma_black_list(drive)) { - on = 0; - goto fast_ata_pio; - } - on = 0; - verbose = 0; - if ((id->field_valid & 4) && (m5229_revision >= 0xC2)) { - if (id->dma_ultra & 0x003F) { - /* Force if Capable UltraDMA */ - on = config_chipset_for_dma(drive, can_ultra_dma); - if ((id->field_valid & 2) && - (!on)) - goto try_dma_modes; - } - } else if (id->field_valid & 2) { -try_dma_modes: - if ((id->dma_mword & 0x0007) || - (id->dma_1word & 0x0007)) { - /* Force if Capable regular DMA modes */ - on = config_chipset_for_dma(drive, can_ultra_dma); - if (!on) - goto no_dma_set; - } - } else if (udma_white_list(drive)) { - if (id->eide_dma_time > 150) { - goto no_dma_set; - } - /* Consult the list of known "good" drives */ - on = config_chipset_for_dma(drive, can_ultra_dma); - if (!on) - goto no_dma_set; - } else { - goto fast_ata_pio; - } - } else if ((id->capability & 8) || (id->field_valid & 2)) { -fast_ata_pio: - on = 0; - verbose = 0; -no_dma_set: - ali15x3_tune_drive(drive, 255); - } - - udma_enable(drive, on, verbose); - - return 0; +#ifndef CONFIG_WDC_ALI15X3 + if ((m5229_revision < 0xC2) && chip_is_1543c_e && + strstr(drive->id->model, "WDC ")) + map &= ~XFER_UDMA_ALL; +#endif + return udma_generic_setup(drive, map); } static int ali15x3_udma_init(struct ata_device *drive, struct request *rq) @@ -251,7 +162,7 @@ { int map = XFER_EPIO | XFER_SWDMA | XFER_MWDMA; - if (!ali15x3_can_ultra(ch->drive)) + if (m5229_revision <= 0x20) return map; map |= XFER_UDMA; @@ -439,8 +350,10 @@ * M1543C or newer for DMAing */ hwif->modes_map = ali15x3_modes_map(hwif); - hwif->udma_init = ali15x3_udma_init; + if (m5229_revision < 0xC2) + hwif->no_atapi_autodma = 1; hwif->udma_setup = ali15x3_udma_setup; + hwif->udma_init = ali15x3_udma_init; hwif->autodma = 1; } diff -ur linux-ata-hosts-9/drivers/ide/ata-timing.c linux/drivers/ide/ata-timing.c --- linux-ata-hosts-9/drivers/ide/ata-timing.c Mon Jun 24 22:15:05 2002 +++ linux/drivers/ide/ata-timing.c Mon Jun 24 22:43:20 2002 @@ -86,9 +86,11 @@ if ((map & XFER_UDMA_100) == XFER_UDMA_100) if ((best = (id->dma_ultra & 0x0020) ? XFER_UDMA_5 : 0)) return best; - if ((map & XFER_UDMA_66) == XFER_UDMA_66) - if ((best = (id->dma_ultra & 0x0010) ? XFER_UDMA_4 : - (id->dma_ultra & 0x0008) ? XFER_UDMA_3 : 0)) return best; + if ((map & XFER_UDMA_66_4) == XFER_UDMA_66_4) + if ((best = (id->dma_ultra & 0x0010) ? XFER_UDMA_4 : 0)) return best; + + if ((map & XFER_UDMA_66_3) == XFER_UDMA_66_3) + if ((best = (id->dma_ultra & 0x0008) ? XFER_UDMA_3 : 0)) return best; if ((best = (id->dma_ultra & 0x0004) ? XFER_UDMA_2 : (id->dma_ultra & 0x0002) ? XFER_UDMA_1 : diff -ur linux-ata-hosts-9/drivers/ide/ata-timing.h linux/drivers/ide/ata-timing.h --- linux-ata-hosts-9/drivers/ide/ata-timing.h Mon Jun 24 22:24:30 2002 +++ linux/drivers/ide/ata-timing.h Mon Jun 24 22:43:20 2002 @@ -59,18 +59,22 @@ #define ENOUGH(v,unit) (((v)-1)/(unit)+1) #define EZ(v,unit) ((v)?ENOUGH(v,unit):0) -#define XFER_MODE 0xf0 -#define XFER_UDMA_133 0x48 -#define XFER_UDMA_100 0x44 -#define XFER_UDMA_66 0x42 -#define XFER_UDMA 0x40 -#define XFER_MWDMA 0x20 -#define XFER_SWDMA 0x10 -#define XFER_EPIO 0x01 -#define XFER_PIO 0x00 +/* see hpt366.c for details */ +#define XFER_UDMA_66_3 0x100 +#define XFER_UDMA_66_4 0x200 -#define XFER_UDMA_ALL 0x4e -#define XFER_UDMA_80W 0x0e +#define XFER_MODE 0xff0 +#define XFER_UDMA_133 0x800 +#define XFER_UDMA_100 0x400 +#define XFER_UDMA_66 0x300 +#define XFER_UDMA 0x040 +#define XFER_MWDMA 0x020 +#define XFER_SWDMA 0x010 +#define XFER_EPIO 0x001 +#define XFER_PIO 0x000 + +#define XFER_UDMA_ALL 0xf40 +#define XFER_UDMA_80W 0xf00 /* External interface to host chips channel timing setup. * diff -ur linux-ata-hosts-9/drivers/ide/hpt34x.c linux/drivers/ide/hpt34x.c --- linux-ata-hosts-9/drivers/ide/hpt34x.c Mon Jun 24 22:40:40 2002 +++ linux/drivers/ide/hpt34x.c Mon Jun 24 22:43:20 2002 @@ -75,10 +75,10 @@ static int hpt34x_udma_setup(struct ata_device *drive, int map) { #ifdef CONFIG_HPT34X_AUTODMA - udma_generic_setup(drive, map); -#endif - + return udma_generic_setup(drive, map); +#else return 0; +#endif } static int hpt34x_udma_stop(struct ata_device *drive) diff -ur linux-ata-hosts-9/drivers/ide/hpt366.c linux/drivers/ide/hpt366.c --- linux-ata-hosts-9/drivers/ide/hpt366.c Mon Jun 24 22:40:40 2002 +++ linux/drivers/ide/hpt366.c Mon Jun 24 22:43:20 2002 @@ -648,65 +648,42 @@ return ide_config_drive_speed(drive, speed); } +/* FIXME: pio == 255 -> ata_best_pio_mode(drive) --bkz */ static void hpt3xx_tune_drive(struct ata_device *drive, u8 pio) { (void) hpt3xx_tune_chipset(drive, XFER_PIO_0 + min_t(u8, pio, 4)); } #ifdef CONFIG_BLK_DEV_IDEDMA -static int config_chipset_for_dma(struct ata_device *drive) +static int hpt3xx_udma_setup(struct ata_device *drive, int map) { - int map; u32 rev; - u8 mode; if (drive->type != ATA_DISK) return 0; rev = hpt_revision(drive->channel->pci_dev); - map = drive->channel->modes_map; + /* FIXME: badlists need futher investigation --bkz */ - if (!eighty_ninty_three(drive)) - map &= ~XFER_UDMA_80W; + /* bad_ata100_5 is for HPT370/370A, + bad_ata66_4, bad_ata66_3 and bad_ata33 are for HPT366/368 */ - mode = ata_timing_mode(drive, map); + if (rev < 5 && check_in_drive_lists(drive, bad_ata100_5)) + map &= ~XFER_UDMA_100; - /* FIXME: badlists need futher investigation --bkz - bad_ata100_5 is for HPT370/370A, - bad_ata66_4, bad_ata66_3 and bad_ata33 are for HPT366/368 - */ - if (mode == XFER_UDMA_5 && rev < 5) { - if (check_in_drive_lists(drive, bad_ata100_5)) { - /* FIXME: make XFER_UDMA_66/100/133 - independent of XFER_UDMA --bkz */ - map &= ~XFER_UDMA_100; - map |= XFER_UDMA; - mode = ata_timing_mode(drive, map); - } - } - if (mode == XFER_UDMA_4 && rev < 3) { - if (check_in_drive_lists(drive, bad_ata66_4)) { - if (drive->id->dma_ultra & 0x0008) { - mode = XFER_UDMA_3; - } else { - map &= ~XFER_UDMA_66; - map |= XFER_UDMA; - mode = ata_timing_mode(drive, map); - } - } - } - if (mode == XFER_UDMA_3 && rev < 3) { - if (check_in_drive_lists(drive, bad_ata66_3)) { - map &= ~XFER_UDMA_66; - map |= XFER_UDMA; - mode = ata_timing_mode(drive, map); - } + if (rev < 3) { + if (check_in_drive_lists(drive, bad_ata66_4)) + map &= ~XFER_UDMA_66_4; + + if (check_in_drive_lists(drive, bad_ata66_3)) + map &= ~XFER_UDMA_66_3; + + if (check_in_drive_lists(drive, bad_ata33)) + map &= ~XFER_UDMA_ALL; } - if (check_in_drive_lists(drive, bad_ata33) && rev < 3) - mode = ata_timing_mode(drive, XFER_MWDMA); - return !hpt3xx_tune_chipset(drive, mode); + return udma_generic_setup(drive, map); } static int hpt3xx_quirkproc(struct ata_device *drive) @@ -743,59 +720,6 @@ } } -static int hpt3xx_udma_setup(struct ata_device *drive, int map) -{ - struct hd_driveid *id = drive->id; - int on = 1; - int verbose = 1; - - if (id && (id->capability & 1) && drive->channel->autodma) { - /* Consult the list of known "bad" drives */ - if (udma_black_list(drive)) { - on = 0; - goto fast_ata_pio; - } - on = 0; - verbose = 0; - if (id->field_valid & 4) { - if (id->dma_ultra & 0x007F) { - /* Force if Capable UltraDMA */ - on = config_chipset_for_dma(drive); - if ((id->field_valid & 2) && - (!on)) - goto try_dma_modes; - } - } else if (id->field_valid & 2) { -try_dma_modes: - if (id->dma_mword & 0x0007) { - /* Force if Capable regular DMA modes */ - on = config_chipset_for_dma(drive); - if (!on) - goto no_dma_set; - } - } else if (udma_white_list(drive)) { - if (id->eide_dma_time > 150) { - goto no_dma_set; - } - /* Consult the list of known "good" drives */ - on = config_chipset_for_dma(drive); - if (!on) - goto no_dma_set; - } else { - goto fast_ata_pio; - } - } else if ((id->capability & 8) || (id->field_valid & 2)) { -fast_ata_pio: - on = 0; - verbose = 0; -no_dma_set: - hpt3xx_tune_chipset(drive, ata_best_pio_mode(drive)); - } - udma_enable(drive, on, verbose); - - return 0; -} - static void hpt366_udma_irq_lost(struct ata_device *drive) { struct pci_dev *dev = drive->channel->pci_dev;