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

* master.kernel.org:/pub/scm/linux/kernel/git/bart/ide-2.6:
  ide: Add the MCP73/77 support to PATA driver
  Add the PATA controller device ID to pci_ids.h for MCP73/MCP77.
  hpt366: disallow Ultra133 for HPT374
  ide: generic IDE PCI driver, add another device exception
  ide: HPA detect from resume
  it821x: RAID mode fixes
  serverworks: fix CSB6 tuning logic
  serverworks: remove crappy code
This commit is contained in:
Linus Torvalds 2007-06-11 11:31:43 -07:00
commit bb3d2dd723
10 changed files with 115 additions and 63 deletions

View File

@ -1037,6 +1037,17 @@ static void ide_disk_release(struct kref *kref)
static int ide_disk_probe(ide_drive_t *drive); static int ide_disk_probe(ide_drive_t *drive);
/*
* On HPA drives the capacity needs to be
* reinitilized on resume otherwise the disk
* can not be used and a hard reset is required
*/
static void ide_disk_resume(ide_drive_t *drive)
{
if (idedisk_supports_hpa(drive->id))
init_idedisk_capacity(drive);
}
static void ide_device_shutdown(ide_drive_t *drive) static void ide_device_shutdown(ide_drive_t *drive)
{ {
#ifdef CONFIG_ALPHA #ifdef CONFIG_ALPHA
@ -1071,6 +1082,7 @@ static ide_driver_t idedisk_driver = {
}, },
.probe = ide_disk_probe, .probe = ide_disk_probe,
.remove = ide_disk_remove, .remove = ide_disk_remove,
.resume = ide_disk_resume,
.shutdown = ide_device_shutdown, .shutdown = ide_device_shutdown,
.version = IDEDISK_VERSION, .version = IDEDISK_VERSION,
.media = ide_disk, .media = ide_disk,

View File

@ -717,7 +717,7 @@ EXPORT_SYMBOL_GPL(ide_undecoded_slave);
* This routine only knows how to look for drive units 0 and 1 * This routine only knows how to look for drive units 0 and 1
* on an interface, so any setting of MAX_DRIVES > 2 won't work here. * on an interface, so any setting of MAX_DRIVES > 2 won't work here.
*/ */
static void probe_hwif(ide_hwif_t *hwif) static void probe_hwif(ide_hwif_t *hwif, void (*fixup)(ide_hwif_t *hwif))
{ {
unsigned int unit; unsigned int unit;
unsigned long flags; unsigned long flags;
@ -820,6 +820,9 @@ static void probe_hwif(ide_hwif_t *hwif)
return; return;
} }
if (fixup)
fixup(hwif);
for (unit = 0; unit < MAX_DRIVES; ++unit) { for (unit = 0; unit < MAX_DRIVES; ++unit) {
ide_drive_t *drive = &hwif->drives[unit]; ide_drive_t *drive = &hwif->drives[unit];
@ -874,10 +877,7 @@ static int hwif_init(ide_hwif_t *hwif);
int probe_hwif_init_with_fixup(ide_hwif_t *hwif, void (*fixup)(ide_hwif_t *hwif)) int probe_hwif_init_with_fixup(ide_hwif_t *hwif, void (*fixup)(ide_hwif_t *hwif))
{ {
probe_hwif(hwif); probe_hwif(hwif, fixup);
if (fixup)
fixup(hwif);
if (!hwif_init(hwif)) { if (!hwif_init(hwif)) {
printk(KERN_INFO "%s: failed to initialize IDE interface\n", printk(KERN_INFO "%s: failed to initialize IDE interface\n",
@ -1404,7 +1404,7 @@ int ideprobe_init (void)
for (index = 0; index < MAX_HWIFS; ++index) for (index = 0; index < MAX_HWIFS; ++index)
if (probe[index]) if (probe[index])
probe_hwif(&ide_hwifs[index]); probe_hwif(&ide_hwifs[index], NULL);
for (index = 0; index < MAX_HWIFS; ++index) for (index = 0; index < MAX_HWIFS; ++index)
if (probe[index]) if (probe[index])
hwif_init(&ide_hwifs[index]); hwif_init(&ide_hwifs[index]);

View File

@ -1010,9 +1010,11 @@ static int generic_ide_resume(struct device *dev)
{ {
ide_drive_t *drive = dev->driver_data; ide_drive_t *drive = dev->driver_data;
ide_hwif_t *hwif = HWIF(drive); ide_hwif_t *hwif = HWIF(drive);
ide_driver_t *drv = to_ide_driver(dev->driver);
struct request rq; struct request rq;
struct request_pm_state rqpm; struct request_pm_state rqpm;
ide_task_t args; ide_task_t args;
int err;
/* Call ACPI _STM only once */ /* Call ACPI _STM only once */
if (!(drive->dn % 2)) if (!(drive->dn % 2))
@ -1029,7 +1031,12 @@ static int generic_ide_resume(struct device *dev)
rqpm.pm_step = ide_pm_state_start_resume; rqpm.pm_step = ide_pm_state_start_resume;
rqpm.pm_state = PM_EVENT_ON; rqpm.pm_state = PM_EVENT_ON;
return ide_do_drive_cmd(drive, &rq, ide_head_wait); err = ide_do_drive_cmd(drive, &rq, ide_head_wait);
if (err == 0 && drv && drv->resume)
drv->resume(drive);
return err;
} }
int generic_ide_ioctl(ide_drive_t *drive, struct file *file, struct block_device *bdev, int generic_ide_ioctl(ide_drive_t *drive, struct file *file, struct block_device *bdev,

View File

@ -1,5 +1,5 @@
/* /*
* Version 2.13 * Version 2.15
* *
* AMD 755/756/766/8111 and nVidia nForce/2/2s/3/3s/CK804/MCP04 * AMD 755/756/766/8111 and nVidia nForce/2/2s/3/3s/CK804/MCP04
* IDE driver for Linux. * IDE driver for Linux.
@ -76,6 +76,8 @@ static struct amd_ide_chip {
{ PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_IDE, 0x50, AMD_UDMA_133 }, { PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_IDE, 0x50, AMD_UDMA_133 },
{ PCI_DEVICE_ID_NVIDIA_NFORCE_MCP65_IDE, 0x50, AMD_UDMA_133 }, { PCI_DEVICE_ID_NVIDIA_NFORCE_MCP65_IDE, 0x50, AMD_UDMA_133 },
{ PCI_DEVICE_ID_NVIDIA_NFORCE_MCP67_IDE, 0x50, AMD_UDMA_133 }, { PCI_DEVICE_ID_NVIDIA_NFORCE_MCP67_IDE, 0x50, AMD_UDMA_133 },
{ PCI_DEVICE_ID_NVIDIA_NFORCE_MCP73_IDE, 0x50, AMD_UDMA_133 },
{ PCI_DEVICE_ID_NVIDIA_NFORCE_MCP77_IDE, 0x50, AMD_UDMA_133 },
{ PCI_DEVICE_ID_AMD_CS5536_IDE, 0x40, AMD_UDMA_100 }, { PCI_DEVICE_ID_AMD_CS5536_IDE, 0x40, AMD_UDMA_100 },
{ 0 } { 0 }
}; };
@ -494,7 +496,9 @@ static ide_pci_device_t amd74xx_chipsets[] __devinitdata = {
/* 17 */ DECLARE_NV_DEV("NFORCE-MCP61"), /* 17 */ DECLARE_NV_DEV("NFORCE-MCP61"),
/* 18 */ DECLARE_NV_DEV("NFORCE-MCP65"), /* 18 */ DECLARE_NV_DEV("NFORCE-MCP65"),
/* 19 */ DECLARE_NV_DEV("NFORCE-MCP67"), /* 19 */ DECLARE_NV_DEV("NFORCE-MCP67"),
/* 20 */ DECLARE_AMD_DEV("AMD5536"), /* 20 */ DECLARE_NV_DEV("NFORCE-MCP73"),
/* 21 */ DECLARE_NV_DEV("NFORCE-MCP77"),
/* 22 */ DECLARE_AMD_DEV("AMD5536"),
}; };
static int __devinit amd74xx_probe(struct pci_dev *dev, const struct pci_device_id *id) static int __devinit amd74xx_probe(struct pci_dev *dev, const struct pci_device_id *id)
@ -534,7 +538,9 @@ static struct pci_device_id amd74xx_pci_tbl[] = {
{ PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 17 }, { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 17 },
{ PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP65_IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 18 }, { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP65_IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 18 },
{ PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP67_IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 19 }, { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP67_IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 19 },
{ PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_CS5536_IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 20 }, { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP73_IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 20 },
{ PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP77_IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 21 },
{ PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_CS5536_IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 22 },
{ 0, }, { 0, },
}; };
MODULE_DEVICE_TABLE(pci, amd74xx_pci_tbl); MODULE_DEVICE_TABLE(pci, amd74xx_pci_tbl);

View File

@ -198,32 +198,41 @@ static ide_pci_device_t generic_chipsets[] __devinitdata = {
static int __devinit generic_init_one(struct pci_dev *dev, const struct pci_device_id *id) static int __devinit generic_init_one(struct pci_dev *dev, const struct pci_device_id *id)
{ {
ide_pci_device_t *d = &generic_chipsets[id->driver_data]; ide_pci_device_t *d = &generic_chipsets[id->driver_data];
u16 command;
int ret = -ENODEV; int ret = -ENODEV;
/* Don't use the generic entry unless instructed to do so */ /* Don't use the generic entry unless instructed to do so */
if (id->driver_data == 0 && ide_generic_all == 0) if (id->driver_data == 0 && ide_generic_all == 0)
goto out; goto out;
if (dev->vendor == PCI_VENDOR_ID_UMC && switch (dev->vendor) {
dev->device == PCI_DEVICE_ID_UMC_UM8886A && case PCI_VENDOR_ID_UMC:
(!(PCI_FUNC(dev->devfn) & 1))) if (dev->device == PCI_DEVICE_ID_UMC_UM8886A &&
goto out; /* UM8886A/BF pair */ !(PCI_FUNC(dev->devfn) & 1))
goto out; /* UM8886A/BF pair */
if (dev->vendor == PCI_VENDOR_ID_OPTI && break;
dev->device == PCI_DEVICE_ID_OPTI_82C558 && case PCI_VENDOR_ID_OPTI:
(!(PCI_FUNC(dev->devfn) & 1))) if (dev->device == PCI_DEVICE_ID_OPTI_82C558 &&
goto out; !(PCI_FUNC(dev->devfn) & 1))
if (dev->vendor == PCI_VENDOR_ID_JMICRON) {
if (dev->device != PCI_DEVICE_ID_JMICRON_JMB368 && PCI_FUNC(dev->devfn) != 1)
goto out; goto out;
break;
case PCI_VENDOR_ID_JMICRON:
if (dev->device != PCI_DEVICE_ID_JMICRON_JMB368 &&
PCI_FUNC(dev->devfn) != 1)
goto out;
break;
case PCI_VENDOR_ID_NS:
if (dev->device == PCI_DEVICE_ID_NS_87410 &&
(dev->class >> 8) != PCI_CLASS_STORAGE_IDE)
goto out;
break;
} }
if (dev->vendor != PCI_VENDOR_ID_JMICRON) { if (dev->vendor != PCI_VENDOR_ID_JMICRON) {
u16 command;
pci_read_config_word(dev, PCI_COMMAND, &command); pci_read_config_word(dev, PCI_COMMAND, &command);
if (!(command & PCI_COMMAND_IO)) { if (!(command & PCI_COMMAND_IO)) {
printk(KERN_INFO "Skipping disabled %s IDE controller.\n", d->name); printk(KERN_INFO "Skipping disabled %s IDE "
"controller.\n", d->name);
goto out; goto out;
} }
} }

View File

@ -1,5 +1,5 @@
/* /*
* linux/drivers/ide/pci/hpt366.c Version 1.03 May 4, 2007 * linux/drivers/ide/pci/hpt366.c Version 1.04 Jun 4, 2007
* *
* Copyright (C) 1999-2003 Andre Hedrick <andre@linux-ide.org> * Copyright (C) 1999-2003 Andre Hedrick <andre@linux-ide.org>
* Portions Copyright (C) 2001 Sun Microsystems, Inc. * Portions Copyright (C) 2001 Sun Microsystems, Inc.
@ -106,7 +106,8 @@
* switch to calculating PCI clock frequency based on the chip's base DPLL * switch to calculating PCI clock frequency based on the chip's base DPLL
* frequency * frequency
* - switch to using the DPLL clock and enable UltraATA/133 mode by default on * - switch to using the DPLL clock and enable UltraATA/133 mode by default on
* anything newer than HPT370/A * anything newer than HPT370/A (except HPT374 that is not capable of this
* mode according to the manual)
* - fold PCI clock detection and DPLL setup code into init_chipset_hpt366(), * - fold PCI clock detection and DPLL setup code into init_chipset_hpt366(),
* also fixing the interchanged 25/40 MHz PCI clock cases for HPT36x chips; * also fixing the interchanged 25/40 MHz PCI clock cases for HPT36x chips;
* unify HPT36x/37x timing setup code and the speedproc handlers by joining * unify HPT36x/37x timing setup code and the speedproc handlers by joining
@ -365,7 +366,6 @@ static u32 sixty_six_base_hpt37x[] = {
}; };
#define HPT366_DEBUG_DRIVE_INFO 0 #define HPT366_DEBUG_DRIVE_INFO 0
#define HPT374_ALLOW_ATA133_6 1
#define HPT371_ALLOW_ATA133_6 1 #define HPT371_ALLOW_ATA133_6 1
#define HPT302_ALLOW_ATA133_6 1 #define HPT302_ALLOW_ATA133_6 1
#define HPT372_ALLOW_ATA133_6 1 #define HPT372_ALLOW_ATA133_6 1
@ -450,7 +450,7 @@ static struct hpt_info hpt370a __devinitdata = {
static struct hpt_info hpt374 __devinitdata = { static struct hpt_info hpt374 __devinitdata = {
.chip_type = HPT374, .chip_type = HPT374,
.max_mode = HPT374_ALLOW_ATA133_6 ? 4 : 3, .max_mode = 3,
.dpll_clk = 48, .dpll_clk = 48,
.settings = hpt37x_settings .settings = hpt37x_settings
}; };

View File

@ -1,6 +1,6 @@
/* /*
* linux/drivers/ide/pci/it821x.c Version 0.10 Mar 10 2007 * linux/drivers/ide/pci/it821x.c Version 0.15 Jun 2 2007
* *
* Copyright (C) 2004 Red Hat <alan@redhat.com> * Copyright (C) 2004 Red Hat <alan@redhat.com>
* Copyright (C) 2007 Bartlomiej Zolnierkiewicz * Copyright (C) 2007 Bartlomiej Zolnierkiewicz
@ -262,7 +262,7 @@ static int it821x_tunepio(ide_drive_t *drive, u8 set_pio)
} }
if (itdev->smart) if (itdev->smart)
goto set_drive_speed; return 0;
/* We prefer 66Mhz clock for PIO 0-3, don't care for PIO4 */ /* We prefer 66Mhz clock for PIO 0-3, don't care for PIO4 */
itdev->want[unit][1] = pio_want[set_pio]; itdev->want[unit][1] = pio_want[set_pio];
@ -271,7 +271,6 @@ static int it821x_tunepio(ide_drive_t *drive, u8 set_pio)
it821x_clock_strategy(drive); it821x_clock_strategy(drive);
it821x_program(drive, itdev->pio[unit]); it821x_program(drive, itdev->pio[unit]);
set_drive_speed:
return ide_config_drive_speed(drive, XFER_PIO_0 + set_pio); return ide_config_drive_speed(drive, XFER_PIO_0 + set_pio);
} }
@ -455,12 +454,12 @@ static int it821x_tune_chipset (ide_drive_t *drive, byte xferspeed)
default: default:
return 1; return 1;
} }
return ide_config_drive_speed(drive, speed);
} }
/*
* In smart mode the clocking is done by the host controller /* don't touch anything in the smart mode */
* snooping the mode we picked. The rest of it is not our problem return 0;
*/
return ide_config_drive_speed(drive, speed);
} }
/** /**
@ -559,17 +558,10 @@ static void __devinit it821x_fixups(ide_hwif_t *hwif)
if(idbits[129] != 1) if(idbits[129] != 1)
printk("(%dK stripe)", idbits[146]); printk("(%dK stripe)", idbits[146]);
printk(".\n"); printk(".\n");
/* Now the core code will have wrongly decided no DMA
so we need to fix this */
hwif->dma_off_quietly(drive);
#ifdef CONFIG_IDEDMA_ONLYDISK
if (drive->media == ide_disk)
#endif
ide_set_dma(drive);
} else { } else {
/* Non RAID volume. Fixups to stop the core code /* Non RAID volume. Fixups to stop the core code
doing unsupported things */ doing unsupported things */
id->field_valid &= 1; id->field_valid &= 3;
id->queue_depth = 0; id->queue_depth = 0;
id->command_set_1 = 0; id->command_set_1 = 0;
id->command_set_2 &= 0xC400; id->command_set_2 &= 0xC400;
@ -584,6 +576,16 @@ static void __devinit it821x_fixups(ide_hwif_t *hwif)
printk(KERN_INFO "%s: Performing identify fixups.\n", printk(KERN_INFO "%s: Performing identify fixups.\n",
drive->name); drive->name);
} }
/*
* Set MWDMA0 mode as enabled/support - just to tell
* IDE core that DMA is supported (it821x hardware
* takes care of DMA mode programming).
*/
if (id->capability & 1) {
id->dma_mword |= 0x0101;
drive->current_speed = XFER_MW_DMA_0;
}
} }
} }

View File

@ -1,5 +1,5 @@
/* /*
* linux/drivers/ide/pci/serverworks.c Version 0.9 Mar 4 2007 * linux/drivers/ide/pci/serverworks.c Version 0.11 Jun 2 2007
* *
* Copyright (C) 1998-2000 Michel Aubry * Copyright (C) 1998-2000 Michel Aubry
* Copyright (C) 1998-2000 Andrzej Krzysztofowicz * Copyright (C) 1998-2000 Andrzej Krzysztofowicz
@ -170,42 +170,55 @@ static int svwks_tune_chipset (ide_drive_t *drive, u8 xferspeed)
if (!drive->init_speed) { if (!drive->init_speed) {
u8 dma_stat = inb(hwif->dma_status); u8 dma_stat = inb(hwif->dma_status);
dma_pio:
if (((ultra_enable << (7-drive->dn) & 0x80) == 0x80) && if (((ultra_enable << (7-drive->dn) & 0x80) == 0x80) &&
((dma_stat & (1<<(5+unit))) == (1<<(5+unit)))) { ((dma_stat & (1<<(5+unit))) == (1<<(5+unit)))) {
drive->current_speed = drive->init_speed = XFER_UDMA_0 + udma_modes[(ultra_timing >> (4*unit)) & ~(0xF0)]; drive->current_speed = drive->init_speed = XFER_UDMA_0 + udma_modes[(ultra_timing >> (4*unit)) & ~(0xF0)];
return 0; return 0;
} else if ((dma_timing) && } else if ((dma_timing) &&
((dma_stat&(1<<(5+unit)))==(1<<(5+unit)))) { ((dma_stat&(1<<(5+unit)))==(1<<(5+unit)))) {
u8 dmaspeed = dma_timing; u8 dmaspeed;
dma_timing &= ~0xFFU; switch (dma_timing & 0x77) {
if ((dmaspeed & 0x20) == 0x20) case 0x20:
dmaspeed = XFER_MW_DMA_2; dmaspeed = XFER_MW_DMA_2;
else if ((dmaspeed & 0x21) == 0x21) break;
case 0x21:
dmaspeed = XFER_MW_DMA_1; dmaspeed = XFER_MW_DMA_1;
else if ((dmaspeed & 0x77) == 0x77) break;
case 0x77:
dmaspeed = XFER_MW_DMA_0; dmaspeed = XFER_MW_DMA_0;
else break;
default:
goto dma_pio; goto dma_pio;
}
drive->current_speed = drive->init_speed = dmaspeed; drive->current_speed = drive->init_speed = dmaspeed;
return 0; return 0;
} else if (pio_timing) { }
u8 piospeed = pio_timing; dma_pio:
if (pio_timing) {
u8 piospeed;
pio_timing &= ~0xFFU; switch (pio_timing & 0x7f) {
if ((piospeed & 0x20) == 0x20) case 0x20:
piospeed = XFER_PIO_4; piospeed = XFER_PIO_4;
else if ((piospeed & 0x22) == 0x22) break;
case 0x22:
piospeed = XFER_PIO_3; piospeed = XFER_PIO_3;
else if ((piospeed & 0x34) == 0x34) break;
case 0x34:
piospeed = XFER_PIO_2; piospeed = XFER_PIO_2;
else if ((piospeed & 0x47) == 0x47) break;
case 0x47:
piospeed = XFER_PIO_1; piospeed = XFER_PIO_1;
else if ((piospeed & 0x5d) == 0x5d) break;
case 0x5d:
piospeed = XFER_PIO_0; piospeed = XFER_PIO_0;
else break;
default:
goto oem_setup_failed; goto oem_setup_failed;
}
drive->current_speed = drive->init_speed = piospeed; drive->current_speed = drive->init_speed = piospeed;
return 0; return 0;
} }
@ -214,8 +227,8 @@ dma_pio:
oem_setup_failed: oem_setup_failed:
pio_timing &= ~0xFFU; pio_timing = 0;
dma_timing &= ~0xFFU; dma_timing = 0;
ultra_timing &= ~(0x0F << (4*unit)); ultra_timing &= ~(0x0F << (4*unit));
ultra_enable &= ~(0x01 << drive->dn); ultra_enable &= ~(0x01 << drive->dn);
csb5_pio &= ~(0x0F << (4*drive->dn)); csb5_pio &= ~(0x0F << (4*drive->dn));

View File

@ -1001,6 +1001,7 @@ struct ide_driver_s {
struct device_driver gen_driver; struct device_driver gen_driver;
int (*probe)(ide_drive_t *); int (*probe)(ide_drive_t *);
void (*remove)(ide_drive_t *); void (*remove)(ide_drive_t *);
void (*resume)(ide_drive_t *);
void (*shutdown)(ide_drive_t *); void (*shutdown)(ide_drive_t *);
#ifdef CONFIG_IDE_PROC_FS #ifdef CONFIG_IDE_PROC_FS
ide_proc_entry_t *proc; ide_proc_entry_t *proc;

View File

@ -1233,6 +1233,8 @@
#define PCI_DEVICE_ID_NVIDIA_NVENET_26 0x054E #define PCI_DEVICE_ID_NVIDIA_NVENET_26 0x054E
#define PCI_DEVICE_ID_NVIDIA_NVENET_27 0x054F #define PCI_DEVICE_ID_NVIDIA_NVENET_27 0x054F
#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP67_IDE 0x0560 #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP67_IDE 0x0560
#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP73_IDE 0x056C
#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP77_IDE 0x0759
#define PCI_VENDOR_ID_IMS 0x10e0 #define PCI_VENDOR_ID_IMS 0x10e0
#define PCI_DEVICE_ID_IMS_TT128 0x9128 #define PCI_DEVICE_ID_IMS_TT128 0x9128