浏览代码

Merge git://git.kernel.org/pub/scm/linux/kernel/git/bart/ide-2.6

* git://git.kernel.org/pub/scm/linux/kernel/git/bart/ide-2.6:
  ide-disk: workaround for buggy HPA support on ST340823A (take 3)
  hpt34x: fix CONFIG_HPT34X_AUTODMA=n handling
  triflex: add missing ->dma_base check
  pdc202xx_old: add missing ->dma_base check
  pdc202xx_new: add missing ->dma_base check
  cs5530: add missing ->dma_base check
  ide: ide_config_drive_speed() bugfixes
  ide: add cable detection for early UDMA66 devices (take 3)
  ide-pmac: fix drive->init_speed reporting
  ide: config_drive_for_dma() fixes
  ide-cris: fix ->set_pio_mode method to set transfer mode on the device
  ide: fix hidden dependencies on CONFIG_IDE_GENERIC
  ide: make CONFIG_IDE_GENERIC default to N
Linus Torvalds 17 年之前
父节点
当前提交
38f061c571

+ 1 - 0
arch/cris/arch-v10/drivers/Kconfig

@@ -548,6 +548,7 @@ config ETRAX_IDE
 	select BLK_DEV_IDEDISK
 	select BLK_DEV_IDEDISK
 	select BLK_DEV_IDECD
 	select BLK_DEV_IDECD
 	select BLK_DEV_IDEDMA
 	select BLK_DEV_IDEDMA
+	select IDE_GENERIC
 	help
 	help
 	  Enable this to get support for ATA/IDE.
 	  Enable this to get support for ATA/IDE.
 	  You can't use parallel ports or SCSI ports
 	  You can't use parallel ports or SCSI ports

+ 1 - 0
arch/cris/arch-v32/drivers/Kconfig

@@ -592,6 +592,7 @@ config ETRAX_IDE
 	select BLK_DEV_IDEDISK
 	select BLK_DEV_IDEDISK
 	select BLK_DEV_IDECD
 	select BLK_DEV_IDECD
 	select BLK_DEV_IDEDMA
 	select BLK_DEV_IDEDMA
+	select IDE_GENERIC
 	help
 	help
 	  Enables the ETRAX IDE driver.
 	  Enables the ETRAX IDE driver.
 
 

+ 10 - 2
drivers/ide/Kconfig

@@ -304,9 +304,9 @@ comment "IDE chipset support/bugfixes"
 
 
 config IDE_GENERIC
 config IDE_GENERIC
 	tristate "generic/default IDE chipset support"
 	tristate "generic/default IDE chipset support"
-	default y
+	default H8300
 	help
 	help
-	  If unsure, say Y.
+	  If unsure, say N.
 
 
 config BLK_DEV_CMD640
 config BLK_DEV_CMD640
 	bool "CMD640 chipset bugfix/support"
 	bool "CMD640 chipset bugfix/support"
@@ -345,6 +345,7 @@ config BLK_DEV_CMD640_ENHANCED
 config BLK_DEV_IDEPNP
 config BLK_DEV_IDEPNP
 	bool "PNP EIDE support"
 	bool "PNP EIDE support"
 	depends on PNP
 	depends on PNP
+	select IDE_GENERIC
 	help
 	help
 	  If you have a PnP (Plug and Play) compatible EIDE card and
 	  If you have a PnP (Plug and Play) compatible EIDE card and
 	  would like the kernel to automatically detect and activate
 	  would like the kernel to automatically detect and activate
@@ -834,6 +835,7 @@ config BLK_DEV_IDE_AU1XXX_SEQTS_PER_RQ
 
 
 config IDE_ARM
 config IDE_ARM
 	def_bool ARM && (ARCH_CLPS7500 || ARCH_RPC || ARCH_SHARK)
 	def_bool ARM && (ARCH_CLPS7500 || ARCH_RPC || ARCH_SHARK)
+	select IDE_GENERIC
 
 
 config BLK_DEV_IDE_ICSIDE
 config BLK_DEV_IDE_ICSIDE
 	tristate "ICS IDE interface support"
 	tristate "ICS IDE interface support"
@@ -867,6 +869,7 @@ config BLK_DEV_IDE_BAST
 config BLK_DEV_GAYLE
 config BLK_DEV_GAYLE
 	bool "Amiga Gayle IDE interface support"
 	bool "Amiga Gayle IDE interface support"
 	depends on AMIGA
 	depends on AMIGA
+	select IDE_GENERIC
 	help
 	help
 	  This is the IDE driver for the Amiga Gayle IDE interface. It supports
 	  This is the IDE driver for the Amiga Gayle IDE interface. It supports
 	  both the `A1200 style' and `A4000 style' of the Gayle IDE interface,
 	  both the `A1200 style' and `A4000 style' of the Gayle IDE interface,
@@ -898,6 +901,7 @@ config BLK_DEV_IDEDOUBLER
 config BLK_DEV_BUDDHA
 config BLK_DEV_BUDDHA
 	bool "Buddha/Catweasel/X-Surf IDE interface support (EXPERIMENTAL)"
 	bool "Buddha/Catweasel/X-Surf IDE interface support (EXPERIMENTAL)"
 	depends on ZORRO && EXPERIMENTAL
 	depends on ZORRO && EXPERIMENTAL
+	select IDE_GENERIC
 	help
 	help
 	  This is the IDE driver for the IDE interfaces on the Buddha, 
 	  This is the IDE driver for the IDE interfaces on the Buddha, 
 	  Catweasel and X-Surf expansion boards.  It supports up to two interfaces 
 	  Catweasel and X-Surf expansion boards.  It supports up to two interfaces 
@@ -910,6 +914,7 @@ config BLK_DEV_BUDDHA
 config BLK_DEV_FALCON_IDE
 config BLK_DEV_FALCON_IDE
 	bool "Falcon IDE interface support"
 	bool "Falcon IDE interface support"
 	depends on ATARI
 	depends on ATARI
+	select IDE_GENERIC
 	help
 	help
 	  This is the IDE driver for the builtin IDE interface on the Atari
 	  This is the IDE driver for the builtin IDE interface on the Atari
 	  Falcon. Say Y if you have a Falcon and want to use IDE devices (hard
 	  Falcon. Say Y if you have a Falcon and want to use IDE devices (hard
@@ -919,6 +924,7 @@ config BLK_DEV_FALCON_IDE
 config BLK_DEV_MAC_IDE
 config BLK_DEV_MAC_IDE
 	bool "Macintosh Quadra/Powerbook IDE interface support"
 	bool "Macintosh Quadra/Powerbook IDE interface support"
 	depends on MAC
 	depends on MAC
+	select IDE_GENERIC
 	help
 	help
 	  This is the IDE driver for the builtin IDE interface on some m68k
 	  This is the IDE driver for the builtin IDE interface on some m68k
 	  Macintosh models. It supports both the `Quadra style' (used in
 	  Macintosh models. It supports both the `Quadra style' (used in
@@ -932,6 +938,7 @@ config BLK_DEV_MAC_IDE
 config BLK_DEV_Q40IDE
 config BLK_DEV_Q40IDE
 	bool "Q40/Q60 IDE interface support"
 	bool "Q40/Q60 IDE interface support"
 	depends on Q40
 	depends on Q40
+	select IDE_GENERIC
 	help
 	help
 	  Enable the on-board IDE controller in the Q40/Q60.  This should
 	  Enable the on-board IDE controller in the Q40/Q60.  This should
 	  normally be on; disable it only if you are running a custom hard
 	  normally be on; disable it only if you are running a custom hard
@@ -940,6 +947,7 @@ config BLK_DEV_Q40IDE
 config BLK_DEV_MPC8xx_IDE
 config BLK_DEV_MPC8xx_IDE
 	bool "MPC8xx IDE support"
 	bool "MPC8xx IDE support"
 	depends on 8xx && IDE=y && BLK_DEV_IDE=y
 	depends on 8xx && IDE=y && BLK_DEV_IDE=y
+	select IDE_GENERIC
 	help
 	help
 	  This option provides support for IDE on Motorola MPC8xx Systems.
 	  This option provides support for IDE on Motorola MPC8xx Systems.
 	  Please see 'Type of MPC8xx IDE interface' for details.
 	  Please see 'Type of MPC8xx IDE interface' for details.

+ 2 - 0
drivers/ide/cris/ide-cris.c

@@ -718,6 +718,8 @@ static void tune_cris_ide(ide_drive_t *drive, u8 pio)
 	}
 	}
 
 
 	cris_ide_set_speed(TYPE_PIO, setup, strobe, hold);
 	cris_ide_set_speed(TYPE_PIO, setup, strobe, hold);
+
+	(void)ide_config_drive_speed(drive, XFER_PIO_0 + pio);
 }
 }
 
 
 static int speed_cris_ide(ide_drive_t *drive, u8 speed)
 static int speed_cris_ide(ide_drive_t *drive, u8 speed)

+ 18 - 0
drivers/ide/ide-disk.c

@@ -481,6 +481,15 @@ static inline int idedisk_supports_lba48(const struct hd_driveid *id)
 	       && id->lba_capacity_2;
 	       && id->lba_capacity_2;
 }
 }
 
 
+/*
+ * Some disks report total number of sectors instead of
+ * maximum sector address.  We list them here.
+ */
+static const struct drive_list_entry hpa_list[] = {
+	{ "ST340823A",	NULL },
+	{ NULL,		NULL }
+};
+
 static void idedisk_check_hpa(ide_drive_t *drive)
 static void idedisk_check_hpa(ide_drive_t *drive)
 {
 {
 	unsigned long long capacity, set_max;
 	unsigned long long capacity, set_max;
@@ -492,6 +501,15 @@ static void idedisk_check_hpa(ide_drive_t *drive)
 	else
 	else
 		set_max = idedisk_read_native_max_address(drive);
 		set_max = idedisk_read_native_max_address(drive);
 
 
+	if (ide_in_drive_list(drive->id, hpa_list)) {
+		/*
+		 * Since we are inclusive wrt to firmware revisions do this
+		 * extra check and apply the workaround only when needed.
+		 */
+		if (set_max == capacity + 1)
+			set_max--;
+	}
+
 	if (set_max <= capacity)
 	if (set_max <= capacity)
 		return;
 		return;
 
 

+ 10 - 35
drivers/ide/ide-dma.c

@@ -134,25 +134,6 @@ static const struct drive_list_entry drive_blacklist [] = {
 
 
 };
 };
 
 
-/**
- *	ide_in_drive_list	-	look for drive in black/white list
- *	@id: drive identifier
- *	@drive_table: list to inspect
- *
- *	Look for a drive in the blacklist and the whitelist tables
- *	Returns 1 if the drive is found in the table.
- */
-
-int ide_in_drive_list(struct hd_driveid *id, const struct drive_list_entry *drive_table)
-{
-	for ( ; drive_table->id_model ; drive_table++)
-		if ((!strcmp(drive_table->id_model, id->model)) &&
-		    (!drive_table->id_firmware ||
-		     strstr(id->fw_rev, drive_table->id_firmware)))
-			return 1;
-	return 0;
-}
-
 /**
 /**
  *	ide_dma_intr	-	IDE DMA interrupt handler
  *	ide_dma_intr	-	IDE DMA interrupt handler
  *	@drive: the drive the interrupt is for
  *	@drive: the drive the interrupt is for
@@ -349,9 +330,17 @@ EXPORT_SYMBOL_GPL(ide_destroy_dmatable);
  
  
 static int config_drive_for_dma (ide_drive_t *drive)
 static int config_drive_for_dma (ide_drive_t *drive)
 {
 {
+	ide_hwif_t *hwif = drive->hwif;
 	struct hd_driveid *id = drive->id;
 	struct hd_driveid *id = drive->id;
 
 
-	if ((id->capability & 1) && drive->hwif->autodma) {
+	/* consult the list of known "bad" drives */
+	if (__ide_dma_bad_drive(drive))
+		return -1;
+
+	if (drive->media != ide_disk && hwif->atapi_dma == 0)
+		return -1;
+
+	if ((id->capability & 1) && drive->autodma) {
 		/*
 		/*
 		 * Enable DMA on any drive that has
 		 * Enable DMA on any drive that has
 		 * UltraDMA (mode 0/1/2/3/4/5/6) enabled
 		 * UltraDMA (mode 0/1/2/3/4/5/6) enabled
@@ -513,20 +502,6 @@ int __ide_dma_on (ide_drive_t *drive)
 
 
 EXPORT_SYMBOL(__ide_dma_on);
 EXPORT_SYMBOL(__ide_dma_on);
 
 
-/**
- *	__ide_dma_check		-	check DMA setup
- *	@drive: drive to check
- *
- *	Don't use - due for extermination
- */
- 
-int __ide_dma_check (ide_drive_t *drive)
-{
-	return config_drive_for_dma(drive);
-}
-
-EXPORT_SYMBOL(__ide_dma_check);
-
 /**
 /**
  *	ide_dma_setup	-	begin a DMA phase
  *	ide_dma_setup	-	begin a DMA phase
  *	@drive: target device
  *	@drive: target device
@@ -1021,7 +996,7 @@ void ide_setup_dma (ide_hwif_t *hwif, unsigned long dma_base, unsigned int num_p
 	if (!hwif->dma_host_on)
 	if (!hwif->dma_host_on)
 		hwif->dma_host_on = &ide_dma_host_on;
 		hwif->dma_host_on = &ide_dma_host_on;
 	if (!hwif->ide_dma_check)
 	if (!hwif->ide_dma_check)
-		hwif->ide_dma_check = &__ide_dma_check;
+		hwif->ide_dma_check = &config_drive_for_dma;
 	if (!hwif->dma_setup)
 	if (!hwif->dma_setup)
 		hwif->dma_setup = &ide_dma_setup;
 		hwif->dma_setup = &ide_dma_setup;
 	if (!hwif->dma_exec_cmd)
 	if (!hwif->dma_exec_cmd)

+ 40 - 5
drivers/ide/ide-iops.c

@@ -565,6 +565,36 @@ int ide_wait_stat (ide_startstop_t *startstop, ide_drive_t *drive, u8 good, u8 b
 
 
 EXPORT_SYMBOL(ide_wait_stat);
 EXPORT_SYMBOL(ide_wait_stat);
 
 
+/**
+ *	ide_in_drive_list	-	look for drive in black/white list
+ *	@id: drive identifier
+ *	@drive_table: list to inspect
+ *
+ *	Look for a drive in the blacklist and the whitelist tables
+ *	Returns 1 if the drive is found in the table.
+ */
+
+int ide_in_drive_list(struct hd_driveid *id, const struct drive_list_entry *drive_table)
+{
+	for ( ; drive_table->id_model; drive_table++)
+		if ((!strcmp(drive_table->id_model, id->model)) &&
+		    (!drive_table->id_firmware ||
+		     strstr(id->fw_rev, drive_table->id_firmware)))
+			return 1;
+	return 0;
+}
+
+EXPORT_SYMBOL_GPL(ide_in_drive_list);
+
+/*
+ * Early UDMA66 devices don't set bit14 to 1, only bit13 is valid.
+ * We list them here and depend on the device side cable detection for them.
+ */
+static const struct drive_list_entry ivb_list[] = {
+	{ "QUANTUM FIREBALLlct10 05"	, "A03.0900"	},
+	{ NULL				, NULL		}
+};
+
 /*
 /*
  *  All hosts that use the 80c ribbon must use!
  *  All hosts that use the 80c ribbon must use!
  *  The name is derived from upper byte of word 93 and the 80c ribbon.
  *  The name is derived from upper byte of word 93 and the 80c ribbon.
@@ -573,11 +603,16 @@ u8 eighty_ninty_three (ide_drive_t *drive)
 {
 {
 	ide_hwif_t *hwif = drive->hwif;
 	ide_hwif_t *hwif = drive->hwif;
 	struct hd_driveid *id = drive->id;
 	struct hd_driveid *id = drive->id;
+	int ivb = ide_in_drive_list(id, ivb_list);
 
 
 	if (hwif->cbl == ATA_CBL_PATA40_SHORT)
 	if (hwif->cbl == ATA_CBL_PATA40_SHORT)
 		return 1;
 		return 1;
 
 
-	if (hwif->cbl != ATA_CBL_PATA80)
+	if (ivb)
+		printk(KERN_DEBUG "%s: skipping word 93 validity check\n",
+				  drive->name);
+
+	if (hwif->cbl != ATA_CBL_PATA80 && !ivb)
 		goto no_80w;
 		goto no_80w;
 
 
 	/* Check for SATA but only if we are ATA5 or higher */
 	/* Check for SATA but only if we are ATA5 or higher */
@@ -587,11 +622,11 @@ u8 eighty_ninty_three (ide_drive_t *drive)
 	/*
 	/*
 	 * FIXME:
 	 * FIXME:
 	 * - change master/slave IDENTIFY order
 	 * - change master/slave IDENTIFY order
-	 * - force bit13 (80c cable present) check
+	 * - force bit13 (80c cable present) check also for !ivb devices
 	 *   (unless the slave device is pre-ATA3)
 	 *   (unless the slave device is pre-ATA3)
 	 */
 	 */
 #ifndef CONFIG_IDEDMA_IVB
 #ifndef CONFIG_IDEDMA_IVB
-	if (id->hw_config & 0x4000)
+	if ((id->hw_config & 0x4000) || (ivb && (id->hw_config & 0x2000)))
 #else
 #else
 	if (id->hw_config & 0x6000)
 	if (id->hw_config & 0x6000)
 #endif
 #endif
@@ -795,7 +830,7 @@ int ide_config_drive_speed (ide_drive_t *drive, u8 speed)
 		hwif->OUTB(drive->ctl | 2, IDE_CONTROL_REG);
 		hwif->OUTB(drive->ctl | 2, IDE_CONTROL_REG);
 	hwif->OUTB(speed, IDE_NSECTOR_REG);
 	hwif->OUTB(speed, IDE_NSECTOR_REG);
 	hwif->OUTB(SETFEATURES_XFER, IDE_FEATURE_REG);
 	hwif->OUTB(SETFEATURES_XFER, IDE_FEATURE_REG);
-	hwif->OUTB(WIN_SETFEATURES, IDE_COMMAND_REG);
+	hwif->OUTBSYNC(drive, WIN_SETFEATURES, IDE_COMMAND_REG);
 	if ((IDE_CONTROL_REG) && (drive->quirk_list == 2))
 	if ((IDE_CONTROL_REG) && (drive->quirk_list == 2))
 		hwif->OUTB(drive->ctl, IDE_CONTROL_REG);
 		hwif->OUTB(drive->ctl, IDE_CONTROL_REG);
 	udelay(1);
 	udelay(1);
@@ -822,7 +857,7 @@ int ide_config_drive_speed (ide_drive_t *drive, u8 speed)
 	 */
 	 */
 	for (i = 0; i < 10; i++) {
 	for (i = 0; i < 10; i++) {
 		udelay(1);
 		udelay(1);
-		if (OK_STAT((stat = hwif->INB(IDE_STATUS_REG)), DRIVE_READY, BUSY_STAT|DRQ_STAT|ERR_STAT)) {
+		if (OK_STAT((stat = hwif->INB(IDE_STATUS_REG)), drive->ready_stat, BUSY_STAT|DRQ_STAT|ERR_STAT)) {
 			error = 0;
 			error = 0;
 			break;
 			break;
 		}
 		}

+ 7 - 1
drivers/ide/pci/cs5530.c

@@ -1,5 +1,5 @@
 /*
 /*
- * linux/drivers/ide/pci/cs5530.c		Version 0.73	Mar 10 2007
+ * linux/drivers/ide/pci/cs5530.c		Version 0.74	Jul 28 2007
  *
  *
  * Copyright (C) 2000			Andre Hedrick <andre@linux-ide.org>
  * Copyright (C) 2000			Andre Hedrick <andre@linux-ide.org>
  * Copyright (C) 2000			Mark Lord <mlord@pobox.com>
  * Copyright (C) 2000			Mark Lord <mlord@pobox.com>
@@ -207,6 +207,9 @@ static unsigned int __devinit init_chipset_cs5530 (struct pci_dev *dev, const ch
 	struct pci_dev *master_0 = NULL, *cs5530_0 = NULL;
 	struct pci_dev *master_0 = NULL, *cs5530_0 = NULL;
 	unsigned long flags;
 	unsigned long flags;
 
 
+	if (pci_resource_start(dev, 4) == 0)
+		return -EFAULT;
+
 	dev = NULL;
 	dev = NULL;
 	while ((dev = pci_get_device(PCI_VENDOR_ID_CYRIX, PCI_ANY_ID, dev)) != NULL) {
 	while ((dev = pci_get_device(PCI_VENDOR_ID_CYRIX, PCI_ANY_ID, dev)) != NULL) {
 		switch (dev->device) {
 		switch (dev->device) {
@@ -325,6 +328,9 @@ static void __devinit init_hwif_cs5530 (ide_hwif_t *hwif)
 			/* needs autotuning later */
 			/* needs autotuning later */
 	}
 	}
 
 
+	if (hwif->dma_base == 0)
+		return;
+
 	hwif->atapi_dma = 1;
 	hwif->atapi_dma = 1;
 	hwif->ultra_mask = 0x07;
 	hwif->ultra_mask = 0x07;
 	hwif->mwdma_mask = 0x07;
 	hwif->mwdma_mask = 0x07;

+ 2 - 4
drivers/ide/pci/hpt34x.c

@@ -89,11 +89,7 @@ static int hpt34x_config_drive_xfer_rate (ide_drive_t *drive)
 	drive->init_speed = 0;
 	drive->init_speed = 0;
 
 
 	if (ide_tune_dma(drive))
 	if (ide_tune_dma(drive))
-#ifndef CONFIG_HPT34X_AUTODMA
 		return -1;
 		return -1;
-#else
-		return 0;
-#endif
 
 
 	if (ide_use_fast_pio(drive))
 	if (ide_use_fast_pio(drive))
 		hpt34x_tune_drive(drive, 255);
 		hpt34x_tune_drive(drive, 255);
@@ -160,9 +156,11 @@ static void __devinit init_hwif_hpt34x(ide_hwif_t *hwif)
 	if (!hwif->dma_base)
 	if (!hwif->dma_base)
 		return;
 		return;
 
 
+#ifdef CONFIG_HPT34X_AUTODMA
 	hwif->ultra_mask = 0x07;
 	hwif->ultra_mask = 0x07;
 	hwif->mwdma_mask = 0x07;
 	hwif->mwdma_mask = 0x07;
 	hwif->swdma_mask = 0x07;
 	hwif->swdma_mask = 0x07;
+#endif
 
 
 	hwif->ide_dma_check = &hpt34x_config_drive_xfer_rate;
 	hwif->ide_dma_check = &hpt34x_config_drive_xfer_rate;
 	if (!noautodma)
 	if (!noautodma)

+ 0 - 9
drivers/ide/pci/ns87415.c

@@ -187,14 +187,6 @@ static int ns87415_ide_dma_setup(ide_drive_t *drive)
 	return 1;
 	return 1;
 }
 }
 
 
-static int ns87415_ide_dma_check (ide_drive_t *drive)
-{
-	if (drive->media != ide_disk)
-		return -1;
-
-	return __ide_dma_check(drive);
-}
-
 static void __devinit init_hwif_ns87415 (ide_hwif_t *hwif)
 static void __devinit init_hwif_ns87415 (ide_hwif_t *hwif)
 {
 {
 	struct pci_dev *dev = hwif->pci_dev;
 	struct pci_dev *dev = hwif->pci_dev;
@@ -266,7 +258,6 @@ static void __devinit init_hwif_ns87415 (ide_hwif_t *hwif)
 
 
 	outb(0x60, hwif->dma_status);
 	outb(0x60, hwif->dma_status);
 	hwif->dma_setup = &ns87415_ide_dma_setup;
 	hwif->dma_setup = &ns87415_ide_dma_setup;
-	hwif->ide_dma_check = &ns87415_ide_dma_check;
 	hwif->ide_dma_end = &ns87415_ide_dma_end;
 	hwif->ide_dma_end = &ns87415_ide_dma_end;
 
 
 	if (!noautodma)
 	if (!noautodma)

+ 8 - 2
drivers/ide/pci/pdc202xx_new.c

@@ -378,6 +378,9 @@ static unsigned int __devinit init_chipset_pdcnew(struct pci_dev *dev, const cha
 	int f, r;
 	int f, r;
 	u8 pll_ctl0, pll_ctl1;
 	u8 pll_ctl0, pll_ctl1;
 
 
+	if (dma_base == 0)
+		return -EFAULT;
+
 #ifdef CONFIG_PPC_PMAC
 #ifdef CONFIG_PPC_PMAC
 	apple_kiwi_init(dev);
 	apple_kiwi_init(dev);
 #endif
 #endif
@@ -494,15 +497,18 @@ static void __devinit init_hwif_pdc202new(ide_hwif_t *hwif)
 	hwif->speedproc = &pdcnew_tune_chipset;
 	hwif->speedproc = &pdcnew_tune_chipset;
 	hwif->resetproc = &pdcnew_reset;
 	hwif->resetproc = &pdcnew_reset;
 
 
+	hwif->err_stops_fifo = 1;
+
 	hwif->drives[0].autotune = hwif->drives[1].autotune = 1;
 	hwif->drives[0].autotune = hwif->drives[1].autotune = 1;
 
 
+	if (hwif->dma_base == 0)
+		return;
+
 	hwif->atapi_dma  = 1;
 	hwif->atapi_dma  = 1;
 
 
 	hwif->ultra_mask = hwif->cds->udma_mask;
 	hwif->ultra_mask = hwif->cds->udma_mask;
 	hwif->mwdma_mask = 0x07;
 	hwif->mwdma_mask = 0x07;
 
 
-	hwif->err_stops_fifo = 1;
-
 	hwif->ide_dma_check = &pdcnew_config_drive_xfer_rate;
 	hwif->ide_dma_check = &pdcnew_config_drive_xfer_rate;
 
 
 	if (hwif->cbl != ATA_CBL_PATA40_SHORT)
 	if (hwif->cbl != ATA_CBL_PATA40_SHORT)

+ 6 - 3
drivers/ide/pci/pdc202xx_old.c

@@ -1,5 +1,5 @@
 /*
 /*
- *  linux/drivers/ide/pci/pdc202xx_old.c	Version 0.50	Mar 3, 2007
+ *  linux/drivers/ide/pci/pdc202xx_old.c	Version 0.51	Jul 27, 2007
  *
  *
  *  Copyright (C) 1998-2002		Andre Hedrick <andre@linux-ide.org>
  *  Copyright (C) 1998-2002		Andre Hedrick <andre@linux-ide.org>
  *  Copyright (C) 2006-2007		MontaVista Software, Inc.
  *  Copyright (C) 2006-2007		MontaVista Software, Inc.
@@ -337,15 +337,18 @@ static void __devinit init_hwif_pdc202xx(ide_hwif_t *hwif)
 
 
 	hwif->speedproc = &pdc202xx_tune_chipset;
 	hwif->speedproc = &pdc202xx_tune_chipset;
 
 
+	hwif->err_stops_fifo = 1;
+
 	hwif->drives[0].autotune = hwif->drives[1].autotune = 1;
 	hwif->drives[0].autotune = hwif->drives[1].autotune = 1;
 
 
+	if (hwif->dma_base == 0)
+		return;
+
 	hwif->ultra_mask = hwif->cds->udma_mask;
 	hwif->ultra_mask = hwif->cds->udma_mask;
 	hwif->mwdma_mask = 0x07;
 	hwif->mwdma_mask = 0x07;
 	hwif->swdma_mask = 0x07;
 	hwif->swdma_mask = 0x07;
 	hwif->atapi_dma = 1;
 	hwif->atapi_dma = 1;
 
 
-	hwif->err_stops_fifo = 1;
-
 	hwif->ide_dma_check = &pdc202xx_config_drive_xfer_rate;
 	hwif->ide_dma_check = &pdc202xx_config_drive_xfer_rate;
 	hwif->dma_lost_irq = &pdc202xx_dma_lost_irq;
 	hwif->dma_lost_irq = &pdc202xx_dma_lost_irq;
 	hwif->dma_timeout = &pdc202xx_dma_timeout;
 	hwif->dma_timeout = &pdc202xx_dma_timeout;

+ 3 - 0
drivers/ide/pci/triflex.c

@@ -115,6 +115,9 @@ static void __devinit init_hwif_triflex(ide_hwif_t *hwif)
 	hwif->tuneproc = &triflex_tune_drive;
 	hwif->tuneproc = &triflex_tune_drive;
 	hwif->speedproc = &triflex_tune_chipset;
 	hwif->speedproc = &triflex_tune_chipset;
 
 
+	if (hwif->dma_base == 0)
+		return;
+
 	hwif->atapi_dma  = 1;
 	hwif->atapi_dma  = 1;
 	hwif->mwdma_mask = 0x07;
 	hwif->mwdma_mask = 0x07;
 	hwif->swdma_mask = 0x07;
 	hwif->swdma_mask = 0x07;

+ 3 - 11
drivers/ide/ppc/pmac.c

@@ -604,6 +604,9 @@ out:
 				drive->id->dma_1word |= 0x0101; break;
 				drive->id->dma_1word |= 0x0101; break;
 			default: break;
 			default: break;
 		}
 		}
+		if (!drive->init_speed)
+			drive->init_speed = command;
+		drive->current_speed = command;
 	}
 	}
 	enable_irq(hwif->irq);
 	enable_irq(hwif->irq);
 	return result;
 	return result;
@@ -986,7 +989,6 @@ pmac_ide_tune_chipset (ide_drive_t *drive, byte speed)
 		return ret;
 		return ret;
 		
 		
 	pmac_ide_do_update_timings(drive);	
 	pmac_ide_do_update_timings(drive);	
-	drive->current_speed = speed;
 
 
 	return 0;
 	return 0;
 }
 }
@@ -1737,11 +1739,6 @@ pmac_ide_mdma_enable(ide_drive_t *drive, u16 mode)
 	/* Apply timings to controller */
 	/* Apply timings to controller */
 	*timings = timing_local[0];
 	*timings = timing_local[0];
 	*timings2 = timing_local[1];
 	*timings2 = timing_local[1];
-	
-	/* Set speed info in drive */
-	drive->current_speed = mode;	
-	if (!drive->init_speed)
-		drive->init_speed = mode;
 
 
 	return 1;
 	return 1;
 }
 }
@@ -1793,11 +1790,6 @@ pmac_ide_udma_enable(ide_drive_t *drive, u16 mode)
 	*timings = timing_local[0];
 	*timings = timing_local[0];
 	*timings2 = timing_local[1];
 	*timings2 = timing_local[1];
 
 
-	/* Set speed info in drive */
-	drive->current_speed = mode;	
-	if (!drive->init_speed)
-		drive->init_speed = mode;
-
 	return 1;
 	return 1;
 }
 }
 
 

+ 2 - 2
include/linux/ide.h

@@ -1285,13 +1285,14 @@ void ide_init_sg_cmd(ide_drive_t *, struct request *);
 #define BAD_DMA_DRIVE		0
 #define BAD_DMA_DRIVE		0
 #define GOOD_DMA_DRIVE		1
 #define GOOD_DMA_DRIVE		1
 
 
-#ifdef CONFIG_BLK_DEV_IDEDMA
 struct drive_list_entry {
 struct drive_list_entry {
 	const char *id_model;
 	const char *id_model;
 	const char *id_firmware;
 	const char *id_firmware;
 };
 };
 
 
 int ide_in_drive_list(struct hd_driveid *, const struct drive_list_entry *);
 int ide_in_drive_list(struct hd_driveid *, const struct drive_list_entry *);
+
+#ifdef CONFIG_BLK_DEV_IDEDMA
 int __ide_dma_bad_drive(ide_drive_t *);
 int __ide_dma_bad_drive(ide_drive_t *);
 int __ide_dma_good_drive(ide_drive_t *);
 int __ide_dma_good_drive(ide_drive_t *);
 u8 ide_max_dma_mode(ide_drive_t *);
 u8 ide_max_dma_mode(ide_drive_t *);
@@ -1312,7 +1313,6 @@ void ide_dma_host_off(ide_drive_t *);
 void ide_dma_off_quietly(ide_drive_t *);
 void ide_dma_off_quietly(ide_drive_t *);
 void ide_dma_host_on(ide_drive_t *);
 void ide_dma_host_on(ide_drive_t *);
 extern int __ide_dma_on(ide_drive_t *);
 extern int __ide_dma_on(ide_drive_t *);
-extern int __ide_dma_check(ide_drive_t *);
 extern int ide_dma_setup(ide_drive_t *);
 extern int ide_dma_setup(ide_drive_t *);
 extern void ide_dma_start(ide_drive_t *);
 extern void ide_dma_start(ide_drive_t *);
 extern int __ide_dma_end(ide_drive_t *);
 extern int __ide_dma_end(ide_drive_t *);