提交 38f061c5 编写于 作者: L Linus Torvalds

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
...@@ -548,6 +548,7 @@ config ETRAX_IDE ...@@ -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
......
...@@ -592,6 +592,7 @@ config ETRAX_IDE ...@@ -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.
......
...@@ -304,9 +304,9 @@ comment "IDE chipset support/bugfixes" ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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.
......
...@@ -718,6 +718,8 @@ static void tune_cris_ide(ide_drive_t *drive, u8 pio) ...@@ -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)
......
...@@ -481,6 +481,15 @@ static inline int idedisk_supports_lba48(const struct hd_driveid *id) ...@@ -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) ...@@ -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;
......
...@@ -134,25 +134,6 @@ static const struct drive_list_entry drive_blacklist [] = { ...@@ -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); ...@@ -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) ...@@ -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 ...@@ -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)
......
...@@ -565,6 +565,36 @@ int ide_wait_stat (ide_startstop_t *startstop, ide_drive_t *drive, u8 good, u8 b ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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;
} }
......
/* /*
* 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 ...@@ -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) ...@@ -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;
......
...@@ -89,11 +89,7 @@ static int hpt34x_config_drive_xfer_rate (ide_drive_t *drive) ...@@ -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) ...@@ -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)
......
...@@ -187,14 +187,6 @@ static int ns87415_ide_dma_setup(ide_drive_t *drive) ...@@ -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) ...@@ -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)
......
...@@ -378,6 +378,9 @@ static unsigned int __devinit init_chipset_pdcnew(struct pci_dev *dev, const cha ...@@ -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) ...@@ -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)
......
/* /*
* 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) ...@@ -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;
......
...@@ -115,6 +115,9 @@ static void __devinit init_hwif_triflex(ide_hwif_t *hwif) ...@@ -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;
......
...@@ -604,6 +604,9 @@ pmac_ide_do_setfeature(ide_drive_t *drive, u8 command) ...@@ -604,6 +604,9 @@ pmac_ide_do_setfeature(ide_drive_t *drive, u8 command)
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) ...@@ -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) ...@@ -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) ...@@ -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;
} }
......
...@@ -1285,13 +1285,14 @@ void ide_init_sg_cmd(ide_drive_t *, struct request *); ...@@ -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 *); ...@@ -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 *);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册