/shark/trunk/drivers/pci/numa.c |
---|
0,0 → 1,129 |
/* |
* numa.c - Low-level PCI access for NUMA-Q machines |
*/ |
#include <linux/pci.h> |
#include <linux/init.h> |
#include "pci.h" |
#define BUS2QUAD(global) (mp_bus_id_to_node[global]) |
#define BUS2LOCAL(global) (mp_bus_id_to_local[global]) |
#define QUADLOCAL2BUS(quad,local) (quad_local_to_mp_bus_id[quad][local]) |
#define PCI_CONF1_MQ_ADDRESS(bus, devfn, reg) \ |
(0x80000000 | (BUS2LOCAL(bus) << 16) | (devfn << 8) | (reg & ~3)) |
static int pci_conf1_mq_read (int seg, int bus, int devfn, int reg, int len, u32 *value) |
{ |
unsigned long flags; |
if (!value || (bus > MAX_MP_BUSSES) || (devfn > 255) || (reg > 255)) |
return -EINVAL; |
spin_lock_irqsave(&pci_config_lock, flags); |
outl_quad(PCI_CONF1_MQ_ADDRESS(bus, devfn, reg), 0xCF8, BUS2QUAD(bus)); |
switch (len) { |
case 1: |
*value = inb_quad(0xCFC + (reg & 3), BUS2QUAD(bus)); |
break; |
case 2: |
*value = inw_quad(0xCFC + (reg & 2), BUS2QUAD(bus)); |
break; |
case 4: |
*value = inl_quad(0xCFC, BUS2QUAD(bus)); |
break; |
} |
spin_unlock_irqrestore(&pci_config_lock, flags); |
return 0; |
} |
static int pci_conf1_mq_write (int seg, int bus, int devfn, int reg, int len, u32 value) |
{ |
unsigned long flags; |
if ((bus > MAX_MP_BUSSES) || (devfn > 255) || (reg > 255)) |
return -EINVAL; |
spin_lock_irqsave(&pci_config_lock, flags); |
outl_quad(PCI_CONF1_MQ_ADDRESS(bus, devfn, reg), 0xCF8, BUS2QUAD(bus)); |
switch (len) { |
case 1: |
outb_quad((u8)value, 0xCFC + (reg & 3), BUS2QUAD(bus)); |
break; |
case 2: |
outw_quad((u16)value, 0xCFC + (reg & 2), BUS2QUAD(bus)); |
break; |
case 4: |
outl_quad((u32)value, 0xCFC, BUS2QUAD(bus)); |
break; |
} |
spin_unlock_irqrestore(&pci_config_lock, flags); |
return 0; |
} |
#undef PCI_CONF1_MQ_ADDRESS |
static struct pci_raw_ops pci_direct_conf1_mq = { |
.read = pci_conf1_mq_read, |
.write = pci_conf1_mq_write |
}; |
static void __devinit pci_fixup_i450nx(struct pci_dev *d) |
{ |
/* |
* i450NX -- Find and scan all secondary buses on all PXB's. |
*/ |
int pxb, reg; |
u8 busno, suba, subb; |
int quad = BUS2QUAD(d->bus->number); |
printk("PCI: Searching for i450NX host bridges on %s\n", pci_name(d)); |
reg = 0xd0; |
for(pxb=0; pxb<2; pxb++) { |
pci_read_config_byte(d, reg++, &busno); |
pci_read_config_byte(d, reg++, &suba); |
pci_read_config_byte(d, reg++, &subb); |
DBG("i450NX PXB %d: %02x/%02x/%02x\n", pxb, busno, suba, subb); |
if (busno) |
pci_scan_bus(QUADLOCAL2BUS(quad,busno), &pci_root_ops, NULL); /* Bus A */ |
if (suba < subb) |
pci_scan_bus(QUADLOCAL2BUS(quad,suba+1), &pci_root_ops, NULL); /* Bus B */ |
} |
pcibios_last_bus = -1; |
} |
struct pci_fixup pcibios_fixups[] = { |
{ PCI_FIXUP_HEADER, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82451NX, pci_fixup_i450nx }, |
}; |
static int __init pci_numa_init(void) |
{ |
int quad; |
raw_pci_ops = &pci_direct_conf1_mq; |
if (pcibios_scanned++) |
return 0; |
pci_root_bus = pcibios_scan_root(0); |
if (numnodes > 1) { |
for (quad = 1; quad < numnodes; ++quad) { |
printk("Scanning PCI bus %d for quad %d\n", |
QUADLOCAL2BUS(quad,0), quad); |
pci_scan_bus(QUADLOCAL2BUS(quad,0), |
&pci_root_ops, NULL); |
} |
} |
return 0; |
} |
subsys_initcall(pci_numa_init); |
/shark/trunk/drivers/pci/access.c |
---|
0,0 → 1,64 |
#include <linuxcomp.h> |
#include <linux/pci.h> |
#include <linux/module.h> |
#include <linux/ioport.h> |
/* |
* This interrupt-safe spinlock protects all accesses to PCI |
* configuration space. |
*/ |
static spinlock_t pci_lock = SPIN_LOCK_UNLOCKED; |
/* |
* Wrappers for all PCI configuration access functions. They just check |
* alignment, do locking and call the low-level functions pointed to |
* by pci_dev->ops. |
*/ |
#define PCI_byte_BAD 0 |
#define PCI_word_BAD (pos & 1) |
#define PCI_dword_BAD (pos & 3) |
#define PCI_OP_READ(size,type,len) \ |
int pci_bus_read_config_##size \ |
(struct pci_bus *bus, unsigned int devfn, int pos, type *value) \ |
{ \ |
int res; \ |
unsigned long flags; \ |
u32 data = 0; \ |
if (PCI_##size##_BAD) return PCIBIOS_BAD_REGISTER_NUMBER; \ |
spin_lock_irqsave(&pci_lock, flags); \ |
res = bus->ops->read(bus, devfn, pos, len, &data); \ |
*value = (type)data; \ |
spin_unlock_irqrestore(&pci_lock, flags); \ |
return res; \ |
} |
#define PCI_OP_WRITE(size,type,len) \ |
int pci_bus_write_config_##size \ |
(struct pci_bus *bus, unsigned int devfn, int pos, type value) \ |
{ \ |
int res; \ |
unsigned long flags; \ |
if (PCI_##size##_BAD) return PCIBIOS_BAD_REGISTER_NUMBER; \ |
spin_lock_irqsave(&pci_lock, flags); \ |
res = bus->ops->write(bus, devfn, pos, len, value); \ |
spin_unlock_irqrestore(&pci_lock, flags); \ |
return res; \ |
} |
PCI_OP_READ(byte, u8, 1) |
PCI_OP_READ(word, u16, 2) |
PCI_OP_READ(dword, u32, 4) |
PCI_OP_WRITE(byte, u8, 1) |
PCI_OP_WRITE(word, u16, 2) |
PCI_OP_WRITE(dword, u32, 4) |
EXPORT_SYMBOL(pci_bus_read_config_byte); |
EXPORT_SYMBOL(pci_bus_read_config_word); |
EXPORT_SYMBOL(pci_bus_read_config_dword); |
EXPORT_SYMBOL(pci_bus_write_config_byte); |
EXPORT_SYMBOL(pci_bus_write_config_word); |
EXPORT_SYMBOL(pci_bus_write_config_dword); |
/shark/trunk/drivers/pci/include/drivers/shark_pci26.h |
---|
0,0 → 1,28 |
/* |
* Project: S.Ha.R.K. |
* |
* Coordinators: |
* Giorgio Buttazzo <giorgio@sssup.it> |
* Paolo Gai <pj@gandalf.sssup.it> |
* |
* Authors : |
* Giacomo Guidi <giacomo@gandalf.sssup.it> |
* |
* |
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy) |
* |
* http://www.sssup.it |
* http://retis.sssup.it |
* http://shark.sssup.it |
*/ |
/* Glue Layer Header Linux PCI 2.6 Driver*/ |
#ifndef __SHARK_PCI26__ |
#define __SHARK_PCI26__ |
/* Init the PCI 2.6 Driver */ |
int PCI26_init(void); |
#endif |
/shark/trunk/drivers/pci/pci2.h |
---|
0,0 → 1,74 |
/* |
* Low-Level PCI Access for i386 machines. |
* |
* (c) 1999 Martin Mares <mj@ucw.cz> |
*/ |
//#define DEBUG |
#ifdef DEBUG |
#define DBG(x...) printk(x) |
#else |
#define DBG(x...) |
#endif |
#define PCI_PROBE_BIOS 0x0001 |
#define PCI_PROBE_CONF1 0x0002 |
#define PCI_PROBE_CONF2 0x0004 |
#define PCI_NO_SORT 0x0100 |
#define PCI_BIOS_SORT 0x0200 |
#define PCI_NO_CHECKS 0x0400 |
#define PCI_USE_PIRQ_MASK 0x0800 |
#define PCI_ASSIGN_ROMS 0x1000 |
#define PCI_BIOS_IRQ_SCAN 0x2000 |
#define PCI_ASSIGN_ALL_BUSSES 0x4000 |
#define PCI_NO_ACPI_ROUTING 0x8000 |
extern unsigned int pci_probe; |
/* pci-i386.c */ |
extern unsigned int pcibios_max_latency; |
void pcibios_resource_survey(void); |
int pcibios_enable_resources(struct pci_dev *, int); |
/* pci-pc.c */ |
extern int pcibios_last_bus; |
extern struct pci_bus *pci_root_bus; |
extern struct pci_ops pci_root_ops; |
/* pci-irq.c */ |
struct irq_info { |
u8 bus, devfn; /* Bus, device and function */ |
struct { |
u8 link; /* IRQ line ID, chipset dependent, 0=not routed */ |
u16 bitmap; /* Available IRQs */ |
} __attribute__((packed)) irq[4]; |
u8 slot; /* Slot number, 0=onboard */ |
u8 rfu; |
} __attribute__((packed)); |
struct irq_routing_table { |
u32 signature; /* PIRQ_SIGNATURE should be here */ |
u16 version; /* PIRQ_VERSION */ |
u16 size; /* Table size in bytes */ |
u8 rtr_bus, rtr_devfn; /* Where the interrupt router lies */ |
u16 exclusive_irqs; /* IRQs devoted exclusively to PCI usage */ |
u16 rtr_vendor, rtr_device; /* Vendor and device ID of interrupt router */ |
u32 miniport_data; /* Crap */ |
u8 rfu[11]; |
u8 checksum; /* Modulo 256 checksum must give zero */ |
struct irq_info slots[0]; |
} __attribute__((packed)); |
extern unsigned int pcibios_irq_mask; |
extern int pcibios_scanned; |
extern spinlock_t pci_config_lock; |
int pirq_enable_irq(struct pci_dev *dev); |
extern int (*pcibios_enable_irq)(struct pci_dev *dev); |
/shark/trunk/drivers/pci/names.c |
---|
0,0 → 1,140 |
/* |
* PCI Class and Device Name Tables |
* |
* Copyright 1993--1999 Drew Eckhardt, Frederic Potter, |
* David Mosberger-Tang, Martin Mares |
*/ |
#include <linuxcomp.h> |
#include <linux/config.h> |
#include <linux/types.h> |
#include <linux/kernel.h> |
#include <linux/pci.h> |
#include <linux/init.h> |
#ifdef CONFIG_PCI_NAMES |
struct pci_device_info { |
unsigned short device; |
unsigned short seen; |
const char *name; |
}; |
struct pci_vendor_info { |
unsigned short vendor; |
unsigned short nr; |
const char *name; |
struct pci_device_info *devices; |
}; |
/* |
* This is ridiculous, but we want the strings in |
* the .init section so that they don't take up |
* real memory.. Parse the same file multiple times |
* to get all the info. |
*/ |
#define VENDOR( vendor, name ) static char __vendorstr_##vendor[] __devinitdata = name; |
#define ENDVENDOR() |
#define DEVICE( vendor, device, name ) static char __devicestr_##vendor##device[] __devinitdata = name; |
#include "devlist.h" |
#define VENDOR( vendor, name ) static struct pci_device_info __devices_##vendor[] __devinitdata = { |
#define ENDVENDOR() }; |
#define DEVICE( vendor, device, name ) { 0x##device, 0, __devicestr_##vendor##device }, |
#include "devlist.h" |
static struct pci_vendor_info __devinitdata pci_vendor_list[] = { |
#define VENDOR( vendor, name ) { 0x##vendor, sizeof(__devices_##vendor) / sizeof(struct pci_device_info), __vendorstr_##vendor, __devices_##vendor }, |
#define ENDVENDOR() |
#define DEVICE( vendor, device, name ) |
#include "devlist.h" |
}; |
#define VENDORS (sizeof(pci_vendor_list)/sizeof(struct pci_vendor_info)) |
void __devinit pci_name_device(struct pci_dev *dev) |
{ |
const struct pci_vendor_info *vendor_p = pci_vendor_list; |
int i = VENDORS; |
char *name = dev->pretty_name; |
do { |
if (vendor_p->vendor == dev->vendor) |
goto match_vendor; |
vendor_p++; |
} while (--i); |
/* Couldn't find either the vendor nor the device */ |
sprintf(name, "PCI device %04x:%04x", dev->vendor, dev->device); |
return; |
match_vendor: { |
struct pci_device_info *device_p = vendor_p->devices; |
int i = vendor_p->nr; |
while (i > 0) { |
if (device_p->device == dev->device) |
goto match_device; |
device_p++; |
i--; |
} |
/* Ok, found the vendor, but unknown device */ |
sprintf(name, "PCI device %04x:%04x (%." PCI_NAME_HALF "s)", |
dev->vendor, dev->device, vendor_p->name); |
return; |
/* Full match */ |
match_device: { |
char *n = name + sprintf(name, "%." PCI_NAME_HALF |
"s %." PCI_NAME_HALF "s", |
vendor_p->name, device_p->name); |
int nr = device_p->seen + 1; |
device_p->seen = nr; |
if (nr > 1) |
sprintf(n, " (#%d)", nr); |
} |
} |
} |
/* |
* Class names. Not in .init section as they are needed in runtime. |
*/ |
static u16 pci_class_numbers[] = { |
#define CLASS(x,y) 0x##x, |
#include "classlist.h" |
}; |
static char *pci_class_names[] = { |
#define CLASS(x,y) y, |
#include "classlist.h" |
}; |
char * |
pci_class_name(u32 class) |
{ |
int i; |
for(i=0; i<sizeof(pci_class_numbers)/sizeof(pci_class_numbers[0]); i++) |
if (pci_class_numbers[i] == class) |
return pci_class_names[i]; |
return NULL; |
} |
#else |
void __devinit pci_name_device(struct pci_dev *dev) |
{ |
} |
char * |
pci_class_name(u32 class) |
{ |
return NULL; |
} |
#endif /* CONFIG_PCI_NAMES */ |
/shark/trunk/drivers/pci/pci-driver.c |
---|
0,0 → 1,538 |
/* |
* drivers/pci/pci-driver.c |
* |
*/ |
#include <linuxcomp.h> |
#include <linux/pci.h> |
#include <linux/module.h> |
#include <linux/init.h> |
#include <linux/device.h> |
#include <linux/pci-dynids.h> |
#include "pci.h" |
/* |
* Registration of PCI drivers and handling of hot-pluggable devices. |
*/ |
/** |
* pci_match_one_device - Tell if a PCI device structure has a matching |
* PCI device id structure |
* @id: single PCI device id structure to match |
* @dev: the PCI device structure to match against |
* |
* Returns the matching pci_device_id structure or %NULL if there is no match. |
*/ |
static inline const struct pci_device_id * |
pci_match_one_device(const struct pci_device_id *id, const struct pci_dev *dev) |
{ |
if ((id->vendor == PCI_ANY_ID || id->vendor == dev->vendor) && |
(id->device == PCI_ANY_ID || id->device == dev->device) && |
(id->subvendor == PCI_ANY_ID || id->subvendor == dev->subsystem_vendor) && |
(id->subdevice == PCI_ANY_ID || id->subdevice == dev->subsystem_device) && |
!((id->class ^ dev->class) & id->class_mask)) |
return id; |
return NULL; |
} |
/* |
* Dynamic device IDs are disabled for !CONFIG_HOTPLUG |
*/ |
#ifdef CONFIG_HOTPLUG |
/** |
* pci_device_probe_dynamic() |
* |
* Walk the dynamic ID list looking for a match. |
* returns 0 and sets pci_dev->driver when drv claims pci_dev, else error. |
*/ |
static int |
pci_device_probe_dynamic(struct pci_driver *drv, struct pci_dev *pci_dev) |
{ |
int error = -ENODEV; |
struct list_head *pos; |
struct dynid *dynid; |
spin_lock(&drv->dynids.lock); |
list_for_each(pos, &drv->dynids.list) { |
dynid = list_entry(pos, struct dynid, node); |
if (pci_match_one_device(&dynid->id, pci_dev)) { |
spin_unlock(&drv->dynids.lock); |
error = drv->probe(pci_dev, &dynid->id); |
if (error >= 0) { |
pci_dev->driver = drv; |
return 0; |
} |
return error; |
} |
} |
spin_unlock(&drv->dynids.lock); |
return error; |
} |
static inline void |
dynid_init(struct dynid *dynid) |
{ |
memset(dynid, 0, sizeof(*dynid)); |
INIT_LIST_HEAD(&dynid->node); |
} |
/** |
* store_new_id |
* |
* Adds a new dynamic pci device ID to this driver, |
* and causes the driver to probe for all devices again. |
*/ |
static inline ssize_t |
store_new_id(struct device_driver *driver, const char *buf, size_t count) |
{ |
struct dynid *dynid; |
struct bus_type * bus; |
struct pci_driver *pdrv = to_pci_driver(driver); |
__u32 vendor=PCI_ANY_ID, device=PCI_ANY_ID, subvendor=PCI_ANY_ID, |
subdevice=PCI_ANY_ID, class=0, class_mask=0; |
unsigned long driver_data=0; |
int fields=0; |
fields = sscanf(buf, "%x %x %x %x %x %x %lux", |
&vendor, &device, &subvendor, &subdevice, |
&class, &class_mask, &driver_data); |
if (fields < 0) |
return -EINVAL; |
dynid = kmalloc(sizeof(*dynid), GFP_KERNEL); |
if (!dynid) |
return -ENOMEM; |
dynid_init(dynid); |
dynid->id.vendor = vendor; |
dynid->id.device = device; |
dynid->id.subvendor = subvendor; |
dynid->id.subdevice = subdevice; |
dynid->id.class = class; |
dynid->id.class_mask = class_mask; |
dynid->id.driver_data = pdrv->dynids.use_driver_data ? |
driver_data : 0UL; |
spin_lock(&pdrv->dynids.lock); |
list_add_tail(&pdrv->dynids.list, &dynid->node); |
spin_unlock(&pdrv->dynids.lock); |
bus = get_bus(pdrv->driver.bus); |
if (bus) { |
if (get_driver(&pdrv->driver)) { |
down_write(&bus->subsys.rwsem); |
driver_attach(&pdrv->driver); |
up_write(&bus->subsys.rwsem); |
put_driver(&pdrv->driver); |
} |
put_bus(bus); |
} |
return count; |
} |
static DRIVER_ATTR(new_id, S_IWUSR, NULL, store_new_id); |
static inline void |
pci_init_dynids(struct pci_dynids *dynids) |
{ |
memset(dynids, 0, sizeof(*dynids)); |
spin_lock_init(&dynids->lock); |
INIT_LIST_HEAD(&dynids->list); |
} |
static void |
pci_free_dynids(struct pci_driver *drv) |
{ |
struct list_head *pos, *n; |
struct dynid *dynid; |
spin_lock(&drv->dynids.lock); |
list_for_each_safe(pos, n, &drv->dynids.list) { |
dynid = list_entry(pos, struct dynid, node); |
list_del(&dynid->node); |
kfree(dynid); |
} |
spin_unlock(&drv->dynids.lock); |
} |
static int |
pci_create_newid_file(struct pci_driver *drv) |
{ |
int error = 0; |
if (drv->probe != NULL) |
error = sysfs_create_file(&drv->driver.kobj, |
&driver_attr_new_id.attr); |
return error; |
} |
static int |
pci_bus_match_dynids(const struct pci_dev *pci_dev, struct pci_driver *pci_drv) |
{ |
struct list_head *pos; |
struct dynid *dynid; |
spin_lock(&pci_drv->dynids.lock); |
list_for_each(pos, &pci_drv->dynids.list) { |
dynid = list_entry(pos, struct dynid, node); |
if (pci_match_one_device(&dynid->id, pci_dev)) { |
spin_unlock(&pci_drv->dynids.lock); |
return 1; |
} |
} |
spin_unlock(&pci_drv->dynids.lock); |
return 0; |
} |
#else /* !CONFIG_HOTPLUG */ |
static inline int pci_device_probe_dynamic(struct pci_driver *drv, struct pci_dev *pci_dev) |
{ |
return -ENODEV; |
} |
static inline void dynid_init(struct dynid *dynid) {} |
static inline void pci_init_dynids(struct pci_dynids *dynids) {} |
static inline void pci_free_dynids(struct pci_driver *drv) {} |
static inline int pci_create_newid_file(struct pci_driver *drv) |
{ |
return 0; |
} |
static inline int pci_bus_match_dynids(const struct pci_dev *pci_dev, struct pci_driver *pci_drv) |
{ |
return 0; |
} |
#endif |
/** |
* pci_match_device - Tell if a PCI device structure has a matching |
* PCI device id structure |
* @ids: array of PCI device id structures to search in |
* @dev: the PCI device structure to match against |
* |
* Used by a driver to check whether a PCI device present in the |
* system is in its list of supported devices.Returns the matching |
* pci_device_id structure or %NULL if there is no match. |
*/ |
const struct pci_device_id * |
pci_match_device(const struct pci_device_id *ids, const struct pci_dev *dev) |
{ |
while (ids->vendor || ids->subvendor || ids->class_mask) { |
if (pci_match_one_device(ids, dev)) |
return ids; |
ids++; |
} |
return NULL; |
} |
/** |
* pci_device_probe_static() |
* |
* returns 0 and sets pci_dev->driver when drv claims pci_dev, else error. |
*/ |
static int |
pci_device_probe_static(struct pci_driver *drv, struct pci_dev *pci_dev) |
{ |
int error = -ENODEV; |
const struct pci_device_id *id; |
if (!drv->id_table) |
return error; |
id = pci_match_device(drv->id_table, pci_dev); |
if (id) |
error = drv->probe(pci_dev, id); |
if (error >= 0) { |
pci_dev->driver = drv; |
return 0; |
} |
return error; |
} |
/** |
* __pci_device_probe() |
* |
* returns 0 on success, else error. |
* side-effect: pci_dev->driver is set to drv when drv claims pci_dev. |
*/ |
static int |
__pci_device_probe(struct pci_driver *drv, struct pci_dev *pci_dev) |
{ |
int error = 0; |
if (!pci_dev->driver && drv->probe) { |
error = pci_device_probe_static(drv, pci_dev); |
if (error == -ENODEV) |
error = pci_device_probe_dynamic(drv, pci_dev); |
} |
return error; |
} |
static int pci_device_probe(struct device * dev) |
{ |
int error = 0; |
struct pci_driver *drv; |
struct pci_dev *pci_dev; |
drv = to_pci_driver(dev->driver); |
pci_dev = to_pci_dev(dev); |
pci_dev_get(pci_dev); |
error = __pci_device_probe(drv, pci_dev); |
if (error) |
pci_dev_put(pci_dev); |
return error; |
} |
static int pci_device_remove(struct device * dev) |
{ |
struct pci_dev * pci_dev = to_pci_dev(dev); |
struct pci_driver * drv = pci_dev->driver; |
if (drv) { |
if (drv->remove) |
drv->remove(pci_dev); |
pci_dev->driver = NULL; |
} |
pci_dev_put(pci_dev); |
return 0; |
} |
static int pci_device_suspend(struct device * dev, u32 state) |
{ |
struct pci_dev * pci_dev = to_pci_dev(dev); |
struct pci_driver * drv = pci_dev->driver; |
if (drv && drv->suspend) |
return drv->suspend(pci_dev,state); |
return 0; |
} |
static int pci_device_resume(struct device * dev) |
{ |
struct pci_dev * pci_dev = to_pci_dev(dev); |
struct pci_driver * drv = pci_dev->driver; |
if (drv && drv->resume) |
drv->resume(pci_dev); |
return 0; |
} |
#define kobj_to_pci_driver(obj) container_of(obj, struct device_driver, kobj) |
#define attr_to_driver_attribute(obj) container_of(obj, struct driver_attribute, attr) |
static ssize_t |
pci_driver_attr_show(struct kobject * kobj, struct attribute *attr, char *buf) |
{ |
struct device_driver *driver = kobj_to_pci_driver(kobj); |
struct driver_attribute *dattr = attr_to_driver_attribute(attr); |
ssize_t ret = 0; |
if (get_driver(driver)) { |
if (dattr->show) |
ret = dattr->show(driver, buf); |
put_driver(driver); |
} |
return ret; |
} |
static ssize_t |
pci_driver_attr_store(struct kobject * kobj, struct attribute *attr, |
const char *buf, size_t count) |
{ |
struct device_driver *driver = kobj_to_pci_driver(kobj); |
struct driver_attribute *dattr = attr_to_driver_attribute(attr); |
ssize_t ret = 0; |
if (get_driver(driver)) { |
if (dattr->store) |
ret = dattr->store(driver, buf, count); |
put_driver(driver); |
} |
return ret; |
} |
static struct sysfs_ops pci_driver_sysfs_ops = { |
.show = pci_driver_attr_show, |
.store = pci_driver_attr_store, |
}; |
static struct kobj_type pci_driver_kobj_type = { |
.sysfs_ops = &pci_driver_sysfs_ops, |
}; |
static int |
pci_populate_driver_dir(struct pci_driver *drv) |
{ |
return pci_create_newid_file(drv); |
} |
/** |
* pci_register_driver - register a new pci driver |
* @drv: the driver structure to register |
* |
* Adds the driver structure to the list of registered drivers |
* Returns the number of pci devices which were claimed by the driver |
* during registration. The driver remains registered even if the |
* return value is zero. |
*/ |
int |
pci_register_driver(struct pci_driver *drv) |
{ |
int count = 0; |
/* initialize common driver fields */ |
drv->driver.name = drv->name; |
drv->driver.bus = &pci_bus_type; |
drv->driver.probe = pci_device_probe; |
drv->driver.remove = pci_device_remove; |
drv->driver.kobj.ktype = &pci_driver_kobj_type; |
pci_init_dynids(&drv->dynids); |
/* register with core */ |
count = driver_register(&drv->driver); |
if (count >= 0) { |
pci_populate_driver_dir(drv); |
} |
return count ? count : 1; |
} |
/** |
* pci_unregister_driver - unregister a pci driver |
* @drv: the driver structure to unregister |
* |
* Deletes the driver structure from the list of registered PCI drivers, |
* gives it a chance to clean up by calling its remove() function for |
* each device it was responsible for, and marks those devices as |
* driverless. |
*/ |
void |
pci_unregister_driver(struct pci_driver *drv) |
{ |
driver_unregister(&drv->driver); |
pci_free_dynids(drv); |
} |
static struct pci_driver pci_compat_driver = { |
.name = "compat" |
}; |
/** |
* pci_dev_driver - get the pci_driver of a device |
* @dev: the device to query |
* |
* Returns the appropriate pci_driver structure or %NULL if there is no |
* registered driver for the device. |
*/ |
struct pci_driver * |
pci_dev_driver(const struct pci_dev *dev) |
{ |
if (dev->driver) |
return dev->driver; |
else { |
int i; |
for(i=0; i<=PCI_ROM_RESOURCE; i++) |
if (dev->resource[i].flags & IORESOURCE_BUSY) |
return &pci_compat_driver; |
} |
return NULL; |
} |
/** |
* pci_bus_match - Tell if a PCI device structure has a matching PCI device id structure |
* @ids: array of PCI device id structures to search in |
* @dev: the PCI device structure to match against |
* |
* Used by a driver to check whether a PCI device present in the |
* system is in its list of supported devices.Returns the matching |
* pci_device_id structure or %NULL if there is no match. |
*/ |
static int pci_bus_match(struct device * dev, struct device_driver * drv) |
{ |
const struct pci_dev * pci_dev = to_pci_dev(dev); |
struct pci_driver * pci_drv = to_pci_driver(drv); |
const struct pci_device_id * ids = pci_drv->id_table; |
const struct pci_device_id *found_id; |
if (!ids) |
return 0; |
found_id = pci_match_device(ids, pci_dev); |
if (found_id) |
return 1; |
return pci_bus_match_dynids(pci_dev, pci_drv); |
} |
/** |
* pci_dev_get - increments the reference count of the pci device structure |
* @dev: the device being referenced |
* |
* Each live reference to a device should be refcounted. |
* |
* Drivers for PCI devices should normally record such references in |
* their probe() methods, when they bind to a device, and release |
* them by calling pci_dev_put(), in their disconnect() methods. |
* |
* A pointer to the device with the incremented reference counter is returned. |
*/ |
struct pci_dev *pci_dev_get(struct pci_dev *dev) |
{ |
struct device *tmp; |
if (!dev) |
return NULL; |
tmp = get_device(&dev->dev); |
if (tmp) |
return to_pci_dev(tmp); |
else |
return NULL; |
} |
/** |
* pci_dev_put - release a use of the pci device structure |
* @dev: device that's been disconnected |
* |
* Must be called when a user of a device is finished with it. When the last |
* user of the device calls this function, the memory of the device is freed. |
*/ |
void pci_dev_put(struct pci_dev *dev) |
{ |
if (dev) |
put_device(&dev->dev); |
} |
#ifndef CONFIG_HOTPLUG |
int pci_hotplug (struct device *dev, char **envp, int num_envp, |
char *buffer, int buffer_size) |
{ |
return -ENODEV; |
} |
#endif |
struct bus_type pci_bus_type = { |
.name = "pci", |
.match = pci_bus_match, |
.hotplug = pci_hotplug, |
.suspend = pci_device_suspend, |
.resume = pci_device_resume, |
}; |
int __init pci_driver_init(void) |
{ |
return bus_register(&pci_bus_type); |
} |
postcore_initcall(pci_driver_init); |
EXPORT_SYMBOL(pci_match_device); |
EXPORT_SYMBOL(pci_register_driver); |
EXPORT_SYMBOL(pci_unregister_driver); |
EXPORT_SYMBOL(pci_dev_driver); |
EXPORT_SYMBOL(pci_bus_type); |
EXPORT_SYMBOL(pci_dev_get); |
EXPORT_SYMBOL(pci_dev_put); |
/shark/trunk/drivers/pci/legacy.c |
---|
0,0 → 1,56 |
/* |
* legacy.c - traditional, old school PCI bus probing |
*/ |
#include <linuxcomp.h> |
#include <linux/init.h> |
#include <linux/pci.h> |
#include "pci2.h" |
/* |
* Discover remaining PCI buses in case there are peer host bridges. |
* We use the number of last PCI bus provided by the PCI BIOS. |
*/ |
static void __devinit pcibios_fixup_peer_bridges(void) |
{ |
int n, devfn; |
if (pcibios_last_bus <= 0 || pcibios_last_bus >= 0xff) |
return; |
DBG("PCI: Peer bridge fixup\n"); |
for (n=0; n <= pcibios_last_bus; n++) { |
u32 l; |
if (pci_find_bus(0, n)) |
continue; |
for (devfn = 0; devfn < 256; devfn += 8) { |
if (!raw_pci_ops->read(0, n, devfn, PCI_VENDOR_ID, 2, &l) && |
l != 0x0000 && l != 0xffff) { |
DBG("Found device at %02x:%02x [%04x]\n", n, devfn, l); |
printk(KERN_INFO "PCI: Discovered peer bus %02x\n", n); |
pci_scan_bus(n, &pci_root_ops, NULL); |
break; |
} |
} |
} |
} |
int __init pci_legacy_init(void) |
{ |
if (!raw_pci_ops) { |
printk("PCI: System does not support PCI\n"); |
return 0; |
} |
if (pcibios_scanned++) |
return 0; |
printk("PCI: Probing PCI hardware\n"); |
pci_root_bus = pcibios_scan_root(0); |
pcibios_fixup_peer_bridges(); |
return 0; |
} |
subsys_initcall(pci_legacy_init); |
/shark/trunk/drivers/pci/search.c |
---|
0,0 → 1,323 |
/* |
* PCI searching functions. |
* |
* Copyright 1993 -- 1997 Drew Eckhardt, Frederic Potter, |
* David Mosberger-Tang |
* Copyright 1997 -- 2000 Martin Mares <mj@ucw.cz> |
* Copyright 2003 -- Greg Kroah-Hartman <greg@kroah.com> |
*/ |
#include <linuxcomp.h> |
#include <linux/init.h> |
#include <linux/pci.h> |
#include <linux/module.h> |
#include <linux/interrupt.h> |
spinlock_t pci_bus_lock = SPIN_LOCK_UNLOCKED; |
static struct pci_bus * __devinit |
pci_do_find_bus(struct pci_bus* bus, unsigned char busnr) |
{ |
struct pci_bus* child; |
struct list_head *tmp; |
if(bus->number == busnr) |
return bus; |
list_for_each(tmp, &bus->children) { |
child = pci_do_find_bus(pci_bus_b(tmp), busnr); |
if(child) |
return child; |
} |
return NULL; |
} |
/** |
* pci_find_bus - locate PCI bus from a given domain and bus number |
* @domain: number of PCI domain to search |
* @busnr: number of desired PCI bus |
* |
* Given a PCI bus number and domain number, the desired PCI bus is located |
* in the global list of PCI buses. If the bus is found, a pointer to its |
* data structure is returned. If no bus is found, %NULL is returned. |
*/ |
struct pci_bus * __devinit pci_find_bus(int domain, int busnr) |
{ |
struct pci_bus *bus = NULL; |
struct pci_bus *tmp_bus; |
while ((bus = pci_find_next_bus(bus)) != NULL) { |
if (pci_domain_nr(bus) != domain) |
continue; |
tmp_bus = pci_do_find_bus(bus, busnr); |
if (tmp_bus) |
return tmp_bus; |
} |
return NULL; |
} |
/** |
* pci_find_next_bus - begin or continue searching for a PCI bus |
* @from: Previous PCI bus found, or %NULL for new search. |
* |
* Iterates through the list of known PCI busses. A new search is |
* initiated by passing %NULL to the @from argument. Otherwise if |
* @from is not %NULL, searches continue from next device on the |
* global list. |
*/ |
struct pci_bus * |
pci_find_next_bus(const struct pci_bus *from) |
{ |
struct list_head *n; |
struct pci_bus *b = NULL; |
//WARN_ON(in_interrupt()); |
spin_lock(&pci_bus_lock); |
n = from ? from->node.next : pci_root_buses.next; |
if (n != &pci_root_buses) |
b = pci_bus_b(n); |
spin_unlock(&pci_bus_lock); |
return b; |
} |
/** |
* pci_find_slot - locate PCI device from a given PCI slot |
* @bus: number of PCI bus on which desired PCI device resides |
* @devfn: encodes number of PCI slot in which the desired PCI |
* device resides and the logical device number within that slot |
* in case of multi-function devices. |
* |
* Given a PCI bus and slot/function number, the desired PCI device |
* is located in system global list of PCI devices. If the device |
* is found, a pointer to its data structure is returned. If no |
* device is found, %NULL is returned. |
*/ |
struct pci_dev * |
pci_find_slot(unsigned int bus, unsigned int devfn) |
{ |
struct pci_dev *dev = NULL; |
while ((dev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) { |
if (dev->bus->number == bus && dev->devfn == devfn) |
return dev; |
} |
return NULL; |
} |
/** |
* pci_find_subsys - begin or continue searching for a PCI device by vendor/subvendor/device/subdevice id |
* @vendor: PCI vendor id to match, or %PCI_ANY_ID to match all vendor ids |
* @device: PCI device id to match, or %PCI_ANY_ID to match all device ids |
* @ss_vendor: PCI subsystem vendor id to match, or %PCI_ANY_ID to match all vendor ids |
* @ss_device: PCI subsystem device id to match, or %PCI_ANY_ID to match all device ids |
* @from: Previous PCI device found in search, or %NULL for new search. |
* |
* Iterates through the list of known PCI devices. If a PCI device is |
* found with a matching @vendor, @device, @ss_vendor and @ss_device, a pointer to its |
* device structure is returned. Otherwise, %NULL is returned. |
* A new search is initiated by passing %NULL to the @from argument. |
* Otherwise if @from is not %NULL, searches continue from next device on the global list. |
* |
* NOTE: Do not use this function anymore, use pci_get_subsys() instead, as |
* the pci device returned by this function can disappear at any moment in |
* time. |
*/ |
struct pci_dev * |
pci_find_subsys(unsigned int vendor, unsigned int device, |
unsigned int ss_vendor, unsigned int ss_device, |
const struct pci_dev *from) |
{ |
struct list_head *n; |
struct pci_dev *dev; |
//WARN_ON(in_interrupt()); |
spin_lock(&pci_bus_lock); |
n = from ? from->global_list.next : pci_devices.next; |
while (n && (n != &pci_devices)) { |
dev = pci_dev_g(n); |
if ((vendor == PCI_ANY_ID || dev->vendor == vendor) && |
(device == PCI_ANY_ID || dev->device == device) && |
(ss_vendor == PCI_ANY_ID || dev->subsystem_vendor == ss_vendor) && |
(ss_device == PCI_ANY_ID || dev->subsystem_device == ss_device)) |
goto exit; |
n = n->next; |
} |
dev = NULL; |
exit: |
spin_unlock(&pci_bus_lock); |
return dev; |
} |
/** |
* pci_find_device - begin or continue searching for a PCI device by vendor/device id |
* @vendor: PCI vendor id to match, or %PCI_ANY_ID to match all vendor ids |
* @device: PCI device id to match, or %PCI_ANY_ID to match all device ids |
* @from: Previous PCI device found in search, or %NULL for new search. |
* |
* Iterates through the list of known PCI devices. If a PCI device is |
* found with a matching @vendor and @device, a pointer to its device structure is |
* returned. Otherwise, %NULL is returned. |
* A new search is initiated by passing %NULL to the @from argument. |
* Otherwise if @from is not %NULL, searches continue from next device on the global list. |
* |
* NOTE: Do not use this function anymore, use pci_get_device() instead, as |
* the pci device returned by this function can disappear at any moment in |
* time. |
*/ |
struct pci_dev * |
pci_find_device(unsigned int vendor, unsigned int device, const struct pci_dev *from) |
{ |
return pci_find_subsys(vendor, device, PCI_ANY_ID, PCI_ANY_ID, from); |
} |
/** |
* pci_get_subsys - begin or continue searching for a PCI device by vendor/subvendor/device/subdevice id |
* @vendor: PCI vendor id to match, or %PCI_ANY_ID to match all vendor ids |
* @device: PCI device id to match, or %PCI_ANY_ID to match all device ids |
* @ss_vendor: PCI subsystem vendor id to match, or %PCI_ANY_ID to match all vendor ids |
* @ss_device: PCI subsystem device id to match, or %PCI_ANY_ID to match all device ids |
* @from: Previous PCI device found in search, or %NULL for new search. |
* |
* Iterates through the list of known PCI devices. If a PCI device is |
* found with a matching @vendor, @device, @ss_vendor and @ss_device, a pointer to its |
* device structure is returned, and the reference count to the device is |
* incremented. Otherwise, %NULL is returned. A new search is initiated by |
* passing %NULL to the @from argument. Otherwise if @from is not %NULL, |
* searches continue from next device on the global list. |
* The reference count for @from is always decremented if it is not %NULL. |
*/ |
struct pci_dev * |
pci_get_subsys(unsigned int vendor, unsigned int device, |
unsigned int ss_vendor, unsigned int ss_device, |
struct pci_dev *from) |
{ |
struct list_head *n; |
struct pci_dev *dev; |
//WARN_ON(in_interrupt()); |
spin_lock(&pci_bus_lock); |
n = from ? from->global_list.next : pci_devices.next; |
while (n && (n != &pci_devices)) { |
dev = pci_dev_g(n); |
if ((vendor == PCI_ANY_ID || dev->vendor == vendor) && |
(device == PCI_ANY_ID || dev->device == device) && |
(ss_vendor == PCI_ANY_ID || dev->subsystem_vendor == ss_vendor) && |
(ss_device == PCI_ANY_ID || dev->subsystem_device == ss_device)) |
goto exit; |
n = n->next; |
} |
dev = NULL; |
exit: |
pci_dev_put(from); |
dev = pci_dev_get(dev); |
spin_unlock(&pci_bus_lock); |
return dev; |
} |
/** |
* pci_get_device - begin or continue searching for a PCI device by vendor/device id |
* @vendor: PCI vendor id to match, or %PCI_ANY_ID to match all vendor ids |
* @device: PCI device id to match, or %PCI_ANY_ID to match all device ids |
* @from: Previous PCI device found in search, or %NULL for new search. |
* |
* Iterates through the list of known PCI devices. If a PCI device is |
* found with a matching @vendor and @device, a pointer to its device structure is |
* returned. Otherwise, %NULL is returned. |
* A new search is initiated by passing %NULL to the @from argument. |
* Otherwise if @from is not %NULL, searches continue from next device on the global list. |
* |
* Iterates through the list of known PCI devices. If a PCI device is |
* found with a matching @vendor and @device, the reference count to the |
* device is incremented and a pointer to its device structure is returned. |
* Otherwise, %NULL is returned. A new search is initiated by passing %NULL |
* to the @from argument. Otherwise if @from is not %NULL, searches continue |
* from next device on the global list. The reference count for @from is |
* always decremented if it is not %NULL. |
*/ |
struct pci_dev * |
pci_get_device(unsigned int vendor, unsigned int device, struct pci_dev *from) |
{ |
return pci_get_subsys(vendor, device, PCI_ANY_ID, PCI_ANY_ID, from); |
} |
/** |
* pci_find_device_reverse - begin or continue searching for a PCI device by vendor/device id |
* @vendor: PCI vendor id to match, or %PCI_ANY_ID to match all vendor ids |
* @device: PCI device id to match, or %PCI_ANY_ID to match all device ids |
* @from: Previous PCI device found in search, or %NULL for new search. |
* |
* Iterates through the list of known PCI devices in the reverse order of pci_find_device(). |
* If a PCI device is found with a matching @vendor and @device, a pointer to |
* its device structure is returned. Otherwise, %NULL is returned. |
* A new search is initiated by passing %NULL to the @from argument. |
* Otherwise if @from is not %NULL, searches continue from previous device on the global list. |
*/ |
struct pci_dev * |
pci_find_device_reverse(unsigned int vendor, unsigned int device, const struct pci_dev *from) |
{ |
struct list_head *n; |
struct pci_dev *dev; |
//WARN_ON(in_interrupt()); |
spin_lock(&pci_bus_lock); |
n = from ? from->global_list.prev : pci_devices.prev; |
while (n && (n != &pci_devices)) { |
dev = pci_dev_g(n); |
if ((vendor == PCI_ANY_ID || dev->vendor == vendor) && |
(device == PCI_ANY_ID || dev->device == device)) |
goto exit; |
n = n->prev; |
} |
dev = NULL; |
exit: |
spin_unlock(&pci_bus_lock); |
return dev; |
} |
/** |
* pci_find_class - begin or continue searching for a PCI device by class |
* @class: search for a PCI device with this class designation |
* @from: Previous PCI device found in search, or %NULL for new search. |
* |
* Iterates through the list of known PCI devices. If a PCI device is |
* found with a matching @class, a pointer to its device structure is |
* returned. Otherwise, %NULL is returned. |
* A new search is initiated by passing %NULL to the @from argument. |
* Otherwise if @from is not %NULL, searches continue from next device |
* on the global list. |
*/ |
struct pci_dev * |
pci_find_class(unsigned int class, const struct pci_dev *from) |
{ |
struct list_head *n; |
struct pci_dev *dev; |
spin_lock(&pci_bus_lock); |
n = from ? from->global_list.next : pci_devices.next; |
while (n && (n != &pci_devices)) { |
dev = pci_dev_g(n); |
if (dev->class == class) |
goto exit; |
n = n->next; |
} |
dev = NULL; |
exit: |
spin_unlock(&pci_bus_lock); |
return dev; |
} |
EXPORT_SYMBOL(pci_find_bus); |
EXPORT_SYMBOL(pci_find_class); |
EXPORT_SYMBOL(pci_find_device); |
EXPORT_SYMBOL(pci_find_device_reverse); |
EXPORT_SYMBOL(pci_find_slot); |
EXPORT_SYMBOL(pci_find_subsys); |
EXPORT_SYMBOL(pci_get_device); |
EXPORT_SYMBOL(pci_get_subsys); |
/shark/trunk/drivers/pci/probe.c |
---|
0,0 → 1,685 |
/* |
* probe.c - PCI detection and setup code |
*/ |
#include <linuxcomp.h> |
#include <linux/init.h> |
#include <linux/pci.h> |
#include <linux/slab.h> |
#include <linux/module.h> |
//#define DEBUG |
#ifdef DEBUG |
#define DBG(x...) printk(x) |
#else |
#define DBG(x...) |
#endif |
#define CARDBUS_LATENCY_TIMER 176 /* secondary latency timer */ |
#define CARDBUS_RESERVE_BUSNR 3 |
/* Ugh. Need to stop exporting this to modules. */ |
LIST_HEAD(pci_root_buses); |
EXPORT_SYMBOL(pci_root_buses); |
LIST_HEAD(pci_devices); |
/* |
* Translate the low bits of the PCI base |
* to the resource type |
*/ |
static inline unsigned int pci_calc_resource_flags(unsigned int flags) |
{ |
if (flags & PCI_BASE_ADDRESS_SPACE_IO) |
return IORESOURCE_IO; |
if (flags & PCI_BASE_ADDRESS_MEM_PREFETCH) |
return IORESOURCE_MEM | IORESOURCE_PREFETCH; |
return IORESOURCE_MEM; |
} |
/* |
* Find the extent of a PCI decode.. |
*/ |
static u32 pci_size(u32 base, u32 maxbase, unsigned long mask) |
{ |
u32 size = mask & maxbase; /* Find the significant bits */ |
if (!size) |
return 0; |
/* Get the lowest of them to find the decode size, and |
from that the extent. */ |
size = (size & ~(size-1)) - 1; |
/* base == maxbase can be valid only if the BAR has |
already been programmed with all 1s. */ |
if (base == maxbase && ((base | size) & mask) != mask) |
return 0; |
return size; |
} |
static void pci_read_bases(struct pci_dev *dev, unsigned int howmany, int rom) |
{ |
unsigned int pos, reg, next; |
u32 l, sz; |
struct resource *res; |
for(pos=0; pos<howmany; pos = next) { |
next = pos+1; |
res = &dev->resource[pos]; |
res->name = pci_name(dev); |
reg = PCI_BASE_ADDRESS_0 + (pos << 2); |
pci_read_config_dword(dev, reg, &l); |
pci_write_config_dword(dev, reg, ~0); |
pci_read_config_dword(dev, reg, &sz); |
pci_write_config_dword(dev, reg, l); |
if (!sz || sz == 0xffffffff) |
continue; |
if (l == 0xffffffff) |
l = 0; |
if ((l & PCI_BASE_ADDRESS_SPACE) == PCI_BASE_ADDRESS_SPACE_MEMORY) { |
sz = pci_size(l, sz, PCI_BASE_ADDRESS_MEM_MASK); |
if (!sz) |
continue; |
res->start = l & PCI_BASE_ADDRESS_MEM_MASK; |
res->flags |= l & ~PCI_BASE_ADDRESS_MEM_MASK; |
} else { |
sz = pci_size(l, sz, PCI_BASE_ADDRESS_IO_MASK & 0xffff); |
if (!sz) |
continue; |
res->start = l & PCI_BASE_ADDRESS_IO_MASK; |
res->flags |= l & ~PCI_BASE_ADDRESS_IO_MASK; |
} |
res->end = res->start + (unsigned long) sz; |
res->flags |= pci_calc_resource_flags(l); |
if ((l & (PCI_BASE_ADDRESS_SPACE | PCI_BASE_ADDRESS_MEM_TYPE_MASK)) |
== (PCI_BASE_ADDRESS_SPACE_MEMORY | PCI_BASE_ADDRESS_MEM_TYPE_64)) { |
pci_read_config_dword(dev, reg+4, &l); |
next++; |
#if BITS_PER_LONG == 64 |
res->start |= ((unsigned long) l) << 32; |
res->end = res->start + sz; |
pci_write_config_dword(dev, reg+4, ~0); |
pci_read_config_dword(dev, reg+4, &sz); |
pci_write_config_dword(dev, reg+4, l); |
if (~sz) |
res->end = res->start + 0xffffffff + |
(((unsigned long) ~sz) << 32); |
#else |
if (l) { |
printk(KERN_ERR "PCI: Unable to handle 64-bit address for device %s\n", pci_name(dev)); |
res->start = 0; |
res->flags = 0; |
continue; |
} |
#endif |
} |
} |
if (rom) { |
dev->rom_base_reg = rom; |
res = &dev->resource[PCI_ROM_RESOURCE]; |
res->name = pci_name(dev); |
pci_read_config_dword(dev, rom, &l); |
pci_write_config_dword(dev, rom, ~PCI_ROM_ADDRESS_ENABLE); |
pci_read_config_dword(dev, rom, &sz); |
pci_write_config_dword(dev, rom, l); |
if (l == 0xffffffff) |
l = 0; |
if (sz && sz != 0xffffffff) { |
sz = pci_size(l, sz, PCI_ROM_ADDRESS_MASK); |
if (sz) { |
res->flags = (l & PCI_ROM_ADDRESS_ENABLE) | |
IORESOURCE_MEM | IORESOURCE_PREFETCH | |
IORESOURCE_READONLY | IORESOURCE_CACHEABLE; |
res->start = l & PCI_ROM_ADDRESS_MASK; |
res->end = res->start + (unsigned long) sz; |
} |
} |
} |
} |
void __devinit pci_read_bridge_bases(struct pci_bus *child) |
{ |
struct pci_dev *dev = child->self; |
u8 io_base_lo, io_limit_lo; |
u16 mem_base_lo, mem_limit_lo; |
unsigned long base, limit; |
struct resource *res; |
int i; |
if (!dev) /* It's a host bus, nothing to read */ |
return; |
if (dev->transparent) { |
printk("Transparent bridge - %s\n", pci_name(dev)); |
for(i = 0; i < PCI_BUS_NUM_RESOURCES; i++) |
child->resource[i] = child->parent->resource[i]; |
return; |
} |
for(i=0; i<3; i++) |
child->resource[i] = &dev->resource[PCI_BRIDGE_RESOURCES+i]; |
res = child->resource[0]; |
pci_read_config_byte(dev, PCI_IO_BASE, &io_base_lo); |
pci_read_config_byte(dev, PCI_IO_LIMIT, &io_limit_lo); |
base = (io_base_lo & PCI_IO_RANGE_MASK) << 8; |
limit = (io_limit_lo & PCI_IO_RANGE_MASK) << 8; |
if ((io_base_lo & PCI_IO_RANGE_TYPE_MASK) == PCI_IO_RANGE_TYPE_32) { |
u16 io_base_hi, io_limit_hi; |
pci_read_config_word(dev, PCI_IO_BASE_UPPER16, &io_base_hi); |
pci_read_config_word(dev, PCI_IO_LIMIT_UPPER16, &io_limit_hi); |
base |= (io_base_hi << 16); |
limit |= (io_limit_hi << 16); |
} |
if (base && base <= limit) { |
res->flags = (io_base_lo & PCI_IO_RANGE_TYPE_MASK) | IORESOURCE_IO; |
res->start = base; |
res->end = limit + 0xfff; |
} |
res = child->resource[1]; |
pci_read_config_word(dev, PCI_MEMORY_BASE, &mem_base_lo); |
pci_read_config_word(dev, PCI_MEMORY_LIMIT, &mem_limit_lo); |
base = (mem_base_lo & PCI_MEMORY_RANGE_MASK) << 16; |
limit = (mem_limit_lo & PCI_MEMORY_RANGE_MASK) << 16; |
if (base && base <= limit) { |
res->flags = (mem_base_lo & PCI_MEMORY_RANGE_TYPE_MASK) | IORESOURCE_MEM; |
res->start = base; |
res->end = limit + 0xfffff; |
} |
res = child->resource[2]; |
pci_read_config_word(dev, PCI_PREF_MEMORY_BASE, &mem_base_lo); |
pci_read_config_word(dev, PCI_PREF_MEMORY_LIMIT, &mem_limit_lo); |
base = (mem_base_lo & PCI_PREF_RANGE_MASK) << 16; |
limit = (mem_limit_lo & PCI_PREF_RANGE_MASK) << 16; |
if ((mem_base_lo & PCI_PREF_RANGE_TYPE_MASK) == PCI_PREF_RANGE_TYPE_64) { |
u32 mem_base_hi, mem_limit_hi; |
pci_read_config_dword(dev, PCI_PREF_BASE_UPPER32, &mem_base_hi); |
pci_read_config_dword(dev, PCI_PREF_LIMIT_UPPER32, &mem_limit_hi); |
#if BITS_PER_LONG == 64 |
base |= ((long) mem_base_hi) << 32; |
limit |= ((long) mem_limit_hi) << 32; |
#else |
if (mem_base_hi || mem_limit_hi) { |
printk(KERN_ERR "PCI: Unable to handle 64-bit address space for %s\n", child->name); |
return; |
} |
#endif |
} |
if (base && base <= limit) { |
res->flags = (mem_base_lo & PCI_MEMORY_RANGE_TYPE_MASK) | IORESOURCE_MEM | IORESOURCE_PREFETCH; |
res->start = base; |
res->end = limit + 0xfffff; |
} |
} |
static struct pci_bus * __devinit pci_alloc_bus(void) |
{ |
struct pci_bus *b; |
b = kmalloc(sizeof(*b), GFP_KERNEL); |
if (b) { |
memset(b, 0, sizeof(*b)); |
INIT_LIST_HEAD(&b->node); |
INIT_LIST_HEAD(&b->children); |
INIT_LIST_HEAD(&b->devices); |
} |
return b; |
} |
static struct pci_bus * __devinit |
pci_alloc_child_bus(struct pci_bus *parent, struct pci_dev *bridge, int busnr) |
{ |
struct pci_bus *child; |
/* |
* Allocate a new bus, and inherit stuff from the parent.. |
*/ |
child = pci_alloc_bus(); |
if (child) { |
int i; |
child->self = bridge; |
child->parent = parent; |
child->ops = parent->ops; |
child->sysdata = parent->sysdata; |
child->dev = &bridge->dev; |
/* |
* Set up the primary, secondary and subordinate |
* bus numbers. |
*/ |
child->number = child->secondary = busnr; |
child->primary = parent->secondary; |
child->subordinate = 0xff; |
/* Set up default resource pointers and names.. */ |
for (i = 0; i < 4; i++) { |
child->resource[i] = &bridge->resource[PCI_BRIDGE_RESOURCES+i]; |
child->resource[i]->name = child->name; |
} |
bridge->subordinate = child; |
} |
return child; |
} |
struct pci_bus * __devinit pci_add_new_bus(struct pci_bus *parent, struct pci_dev *dev, int busnr) |
{ |
struct pci_bus *child; |
child = pci_alloc_child_bus(parent, dev, busnr); |
if (child) |
list_add_tail(&child->node, &parent->children); |
return child; |
} |
static unsigned int __devinit pci_scan_child_bus(struct pci_bus *bus); |
/* |
* If it's a bridge, configure it and scan the bus behind it. |
* For CardBus bridges, we don't scan behind as the devices will |
* be handled by the bridge driver itself. |
* |
* We need to process bridges in two passes -- first we scan those |
* already configured by the BIOS and after we are done with all of |
* them, we proceed to assigning numbers to the remaining buses in |
* order to avoid overlaps between old and new bus numbers. |
*/ |
int __devinit pci_scan_bridge(struct pci_bus *bus, struct pci_dev * dev, int max, int pass) |
{ |
struct pci_bus *child; |
int is_cardbus = (dev->hdr_type == PCI_HEADER_TYPE_CARDBUS); |
u32 buses; |
pci_read_config_dword(dev, PCI_PRIMARY_BUS, &buses); |
DBG("Scanning behind PCI bridge %s, config %06x, pass %d\n", |
pci_name(dev), buses & 0xffffff, pass); |
if ((buses & 0xffff00) && !pcibios_assign_all_busses() && !is_cardbus) { |
unsigned int cmax; |
/* |
* Bus already configured by firmware, process it in the first |
* pass and just note the configuration. |
*/ |
if (pass) |
return max; |
child = pci_alloc_child_bus(bus, dev, 0); |
child->primary = buses & 0xFF; |
child->secondary = (buses >> 8) & 0xFF; |
child->subordinate = (buses >> 16) & 0xFF; |
child->number = child->secondary; |
cmax = pci_scan_child_bus(child); |
if (cmax > max) max = cmax; |
} else { |
/* |
* We need to assign a number to this bus which we always |
* do in the second pass. |
*/ |
if (!pass) |
return max; |
/* Clear errors */ |
pci_write_config_word(dev, PCI_STATUS, 0xffff); |
child = pci_alloc_child_bus(bus, dev, ++max); |
buses = (buses & 0xff000000) |
| ((unsigned int)(child->primary) << 0) |
| ((unsigned int)(child->secondary) << 8) |
| ((unsigned int)(child->subordinate) << 16); |
/* |
* yenta.c forces a secondary latency timer of 176. |
* Copy that behaviour here. |
*/ |
if (is_cardbus) { |
buses &= ~0xff000000; |
buses |= CARDBUS_LATENCY_TIMER << 24; |
} |
/* |
* We need to blast all three values with a single write. |
*/ |
pci_write_config_dword(dev, PCI_PRIMARY_BUS, buses); |
if (!is_cardbus) { |
/* Now we can scan all subordinate buses... */ |
max = pci_scan_child_bus(child); |
} else { |
/* |
* For CardBus bridges, we leave 4 bus numbers |
* as cards with a PCI-to-PCI bridge can be |
* inserted later. |
*/ |
max += CARDBUS_RESERVE_BUSNR; |
} |
/* |
* Set the subordinate bus number to its real value. |
*/ |
child->subordinate = max; |
pci_write_config_byte(dev, PCI_SUBORDINATE_BUS, max); |
} |
sprintf26(child->name, (is_cardbus ? "PCI CardBus #%02x" : "PCI Bus #%02x"), child->number); |
return max; |
} |
/* |
* Read interrupt line and base address registers. |
* The architecture-dependent code can tweak these, of course. |
*/ |
static void pci_read_irq(struct pci_dev *dev) |
{ |
unsigned char irq; |
pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &irq); |
if (irq) |
pci_read_config_byte(dev, PCI_INTERRUPT_LINE, &irq); |
dev->irq = irq; |
} |
/** |
* pci_setup_device - fill in class and map information of a device |
* @dev: the device structure to fill |
* |
* Initialize the device structure with information about the device's |
* vendor,class,memory and IO-space addresses,IRQ lines etc. |
* Called at initialisation of the PCI subsystem and by CardBus services. |
* Returns 0 on success and -1 if unknown type of device (not normal, bridge |
* or CardBus). |
*/ |
static int pci_setup_device(struct pci_dev * dev) |
{ |
u32 class; |
dev->slot_name = dev->dev.bus_id; |
sprintf26(pci_name(dev), "%04x:%02x:%02x.%d", pci_domain_nr(dev->bus), |
dev->bus->number, PCI_SLOT(dev->devfn), PCI_FUNC(dev->devfn)); |
INIT_LIST_HEAD(&dev->pools); |
pci_read_config_dword(dev, PCI_CLASS_REVISION, &class); |
class >>= 8; /* upper 3 bytes */ |
dev->class = class; |
class >>= 8; |
DBG("Found %02x:%02x [%04x/%04x] %06x %02x\n", dev->bus->number, |
dev->devfn, dev->vendor, dev->device, class, dev->hdr_type); |
/* "Unknown power state" */ |
dev->current_state = 4; |
switch (dev->hdr_type) { /* header type */ |
case PCI_HEADER_TYPE_NORMAL: /* standard header */ |
if (class == PCI_CLASS_BRIDGE_PCI) |
goto bad; |
pci_read_irq(dev); |
pci_read_bases(dev, 6, PCI_ROM_ADDRESS); |
pci_read_config_word(dev, PCI_SUBSYSTEM_VENDOR_ID, &dev->subsystem_vendor); |
pci_read_config_word(dev, PCI_SUBSYSTEM_ID, &dev->subsystem_device); |
break; |
case PCI_HEADER_TYPE_BRIDGE: /* bridge header */ |
if (class != PCI_CLASS_BRIDGE_PCI) |
goto bad; |
/* The PCI-to-PCI bridge spec requires that subtractive |
decoding (i.e. transparent) bridge must have programming |
interface code of 0x01. */ |
dev->transparent = ((dev->class & 0xff) == 1); |
pci_read_bases(dev, 2, PCI_ROM_ADDRESS1); |
break; |
case PCI_HEADER_TYPE_CARDBUS: /* CardBus bridge header */ |
if (class != PCI_CLASS_BRIDGE_CARDBUS) |
goto bad; |
pci_read_irq(dev); |
pci_read_bases(dev, 1, 0); |
pci_read_config_word(dev, PCI_CB_SUBSYSTEM_VENDOR_ID, &dev->subsystem_vendor); |
pci_read_config_word(dev, PCI_CB_SUBSYSTEM_ID, &dev->subsystem_device); |
break; |
default: /* unknown header */ |
printk(KERN_ERR "PCI: device %s has unknown header type %02x, ignoring.\n", |
pci_name(dev), dev->hdr_type); |
return -1; |
bad: |
printk(KERN_ERR "PCI: %s: class %x doesn't match header type %02x. Ignoring class.\n", |
pci_name(dev), class, dev->hdr_type); |
dev->class = PCI_CLASS_NOT_DEFINED; |
} |
/* We found a fine healthy device, go go go... */ |
return 0; |
} |
/** |
* pci_release_dev - free a pci device structure when all users of it are finished. |
* @dev: device that's been disconnected |
* |
* Will be called only by the device core when all users of this pci device are |
* done. |
*/ |
static void pci_release_dev(struct device *dev) |
{ |
struct pci_dev *pci_dev; |
pci_dev = to_pci_dev(dev); |
kfree(pci_dev); |
} |
/* |
* Read the config data for a PCI device, sanity-check it |
* and fill in the dev structure... |
*/ |
static struct pci_dev * __devinit |
pci_scan_device(struct pci_bus *bus, int devfn) |
{ |
struct pci_dev *dev; |
u32 l; |
u8 hdr_type; |
if (pci_bus_read_config_byte(bus, devfn, PCI_HEADER_TYPE, &hdr_type)) |
return NULL; |
if (pci_bus_read_config_dword(bus, devfn, PCI_VENDOR_ID, &l)) |
return NULL; |
/* some broken boards return 0 or ~0 if a slot is empty: */ |
if (l == 0xffffffff || l == 0x00000000 || |
l == 0x0000ffff || l == 0xffff0000) |
return NULL; |
dev = kmalloc(sizeof(struct pci_dev), GFP_KERNEL); |
if (!dev) |
return NULL; |
memset(dev, 0, sizeof(struct pci_dev)); |
dev->bus = bus; |
dev->sysdata = bus->sysdata; |
dev->dev.parent = bus->dev; |
dev->dev.bus = &pci_bus_type; |
dev->devfn = devfn; |
dev->hdr_type = hdr_type & 0x7f; |
dev->multifunction = !!(hdr_type & 0x80); |
dev->vendor = l & 0xffff; |
dev->device = (l >> 16) & 0xffff; |
/* Assume 32-bit PCI; let 64-bit PCI cards (which are far rarer) |
set this higher, assuming the system even supports it. */ |
dev->dma_mask = 0xffffffff; |
dev->consistent_dma_mask = 0xffffffff; |
if (pci_setup_device(dev) < 0) { |
kfree(dev); |
return NULL; |
} |
device_initialize(&dev->dev); |
dev->dev.release = pci_release_dev; |
pci_dev_get(dev); |
pci_name_device(dev); |
dev->dev.dma_mask = &dev->dma_mask; |
return dev; |
} |
/** |
* pci_scan_slot - scan a PCI slot on a bus for devices. |
* @bus: PCI bus to scan |
* @devfn: slot number to scan (must have zero function.) |
* |
* Scan a PCI slot on the specified PCI bus for devices, adding |
* discovered devices to the @bus->devices list. New devices |
* will have an empty dev->global_list head. |
*/ |
int __devinit pci_scan_slot(struct pci_bus *bus, int devfn) |
{ |
int func, nr = 0; |
for (func = 0; func < 8; func++, devfn++) { |
struct pci_dev *dev; |
dev = pci_scan_device(bus, devfn); |
if (func == 0) { |
if (!dev) |
break; |
} else { |
if (!dev) |
continue; |
dev->multifunction = 1; |
} |
/* Fix up broken headers */ |
pci_fixup_device(PCI_FIXUP_HEADER, dev); |
/* |
* Add the device to our list of discovered devices |
* and the bus list for fixup functions, etc. |
*/ |
INIT_LIST_HEAD(&dev->global_list); |
list_add_tail(&dev->bus_list, &bus->devices); |
nr++; |
/* |
* If this is a single function device, |
* don't scan past the first function. |
*/ |
if (!dev->multifunction) |
break; |
} |
return nr; |
} |
static unsigned int __devinit pci_scan_child_bus(struct pci_bus *bus) |
{ |
unsigned int devfn, pass, max = bus->secondary; |
struct pci_dev *dev; |
DBG("Scanning bus %02x\n", bus->number); |
/* Go find them, Rover! */ |
for (devfn = 0; devfn < 0x100; devfn += 8) |
pci_scan_slot(bus, devfn); |
/* |
* After performing arch-dependent fixup of the bus, look behind |
* all PCI-to-PCI bridges on this bus. |
*/ |
DBG("Fixups for bus %02x\n", bus->number); |
pcibios_fixup_bus(bus); |
for (pass=0; pass < 2; pass++) |
list_for_each_entry(dev, &bus->devices, bus_list) { |
if (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE || |
dev->hdr_type == PCI_HEADER_TYPE_CARDBUS) |
max = pci_scan_bridge(bus, dev, max, pass); |
} |
/* |
* We've scanned the bus and so we know all about what's on |
* the other side of any bridges that may be on this bus plus |
* any devices. |
* |
* Return how far we've got finding sub-buses. |
*/ |
DBG("Bus scan for %02x returning with max=%02x\n", bus->number, max); |
return max; |
} |
unsigned int __devinit pci_do_scan_bus(struct pci_bus *bus) |
{ |
unsigned int max; |
max = pci_scan_child_bus(bus); |
/* |
* Make the discovered devices available. |
*/ |
pci_bus_add_devices(bus); |
return max; |
} |
struct pci_bus * __devinit pci_scan_bus_parented(struct device *parent, int bus, struct pci_ops *ops, void *sysdata) |
{ |
struct pci_bus *b; |
b = pci_alloc_bus(); |
if (!b) |
return NULL; |
b->dev = kmalloc(sizeof(*(b->dev)),GFP_KERNEL); |
if (!b->dev){ |
kfree(b); |
return NULL; |
} |
b->sysdata = sysdata; |
b->ops = ops; |
if (pci_find_bus(pci_domain_nr(b), bus)) { |
/* If we already got to this bus through a different bridge, ignore it */ |
DBG("PCI: Bus %02x already known\n", bus); |
kfree(b->dev); |
kfree(b); |
return NULL; |
} |
list_add_tail(&b->node, &pci_root_buses); |
memset(b->dev,0,sizeof(*(b->dev))); |
b->dev->parent = parent; |
sprintf26(b->dev->bus_id,"pci%04x:%02x", pci_domain_nr(b), bus); |
device_register(b->dev); |
b->number = b->secondary = bus; |
b->resource[0] = &ioport_resource; |
b->resource[1] = &iomem_resource; |
b->subordinate = pci_scan_child_bus(b); |
pci_bus_add_devices(b); |
return b; |
} |
EXPORT_SYMBOL(pci_scan_bus_parented); |
#ifdef CONFIG_HOTPLUG |
EXPORT_SYMBOL(pci_add_new_bus); |
EXPORT_SYMBOL(pci_do_scan_bus); |
EXPORT_SYMBOL(pci_scan_slot); |
EXPORT_SYMBOL(pci_scan_bridge); |
#endif |
/shark/trunk/drivers/pci/pci.ids |
---|
0,0 → 1,7161 |
# |
# List of PCI ID's |
# |
# Maintained by Martin Mares <mj@ucw.cz> and other volunteers from the |
# Linux PCI ID's Project at http://pciids.sf.net/. New data are always |
# welcome (if they are accurate), we're eagerly expecting new entries, |
# so if you have anything to contribute, please visit the home page or |
# send a diff -u against the most recent pci.ids to pci-ids@ucw.cz. |
# |
# $Id: pci.ids,v 1.1 2004-04-25 12:07:34 giacomo Exp $ |
# |
# Vendors, devices and subsystems. Please keep sorted. |
# Syntax: |
# vendor vendor_name |
# device device_name <-- single tab |
# subvendor subdevice subsystem_name <-- two tabs |
0000 Gammagraphx, Inc. |
001a Ascend Communications, Inc. |
0033 Paradyne corp. |
003d Lockheed Martin-Marietta Corp |
# Real TJN ID is e159, but they got it wrong several times --mj |
0059 Tiger Jet Network Inc. (Wrong ID) |
0070 Hauppauge computer works Inc. |
0100 Ncipher Corp Ltd |
0675 Dynalink |
1700 IS64PH ISDN Adapter |
1702 IS64PH ISDN Adapter |
# Wrong ID used in subsystem ID of VIA USB controllers. |
0925 VIA Technologies, Inc. (Wrong ID) |
09c1 Arris |
0704 CM 200E Cable Modem |
0a89 BREA Technologies Inc |
0e11 Compaq Computer Corporation |
0001 PCI to EISA Bridge |
0002 PCI to ISA Bridge |
0049 NC7132 Gigabit Upgrade Module |
004a NC6136 Gigabit Server Adapter |
0508 Netelligent 4/16 Token Ring |
1000 Triflex/Pentium Bridge, Model 1000 |
2000 Triflex/Pentium Bridge, Model 2000 |
3032 QVision 1280/p |
3033 QVision 1280/p |
3034 QVision 1280/p |
4000 4000 [Triflex] |
6010 HotPlug PCI Bridge 6010 |
7020 USB Controller |
a0ec Fibre Channel Host Controller |
a0f0 Advanced System Management Controller |
a0f3 Triflex PCI to ISA Bridge |
a0f7 PCI Hotplug Controller |
8086 002a PCI Hotplug Controller A |
8086 002b PCI Hotplug Controller B |
a0f8 ZFMicro Chipset USB |
a0fc Fibre Channel Host Controller |
ae10 Smart-2/P RAID Controller |
0e11 4030 Smart-2/P Array Controller |
0e11 4031 Smart-2SL Array Controller |
0e11 4032 Smart Array Controller |
0e11 4033 Smart 3100ES Array Controller |
ae29 MIS-L |
ae2a MPC |
ae2b MIS-E |
ae31 System Management Controller |
ae32 Netelligent 10/100 |
ae33 Triflex Dual EIDE Controller |
ae34 Netelligent 10 |
ae35 Integrated NetFlex-3/P |
ae40 Netelligent 10/100 Dual |
ae43 ProLiant Integrated Netelligent 10/100 |
ae69 CETUS-L |
ae6c Northstar |
ae6d NorthStar CPU to PCI Bridge |
b011 Integrated Netelligent 10/100 |
b012 Netelligent 10 T/2 |
b01e NC3120 Fast Ethernet NIC |
b01f NC3122 Fast Ethernet NIC |
b02f NC1120 Ethernet NIC |
b030 Netelligent WS 5100 |
b04a 10/100 TX PCI Intel WOL UTP Controller |
b060 Smart Array 5300 Controller |
b0c6 NC3161 Fast Ethernet NIC |
b0c7 NC3160 Fast Ethernet NIC |
b0d7 NC3121 Fast Ethernet NIC |
b0dd NC3131 Fast Ethernet NIC |
b0de NC3132 Fast Ethernet Module |
b0df NC6132 Gigabit Module |
b0e0 NC6133 Gigabit Module |
b0e1 NC3133 Fast Ethernet Module |
b123 NC6134 Gigabit NIC |
b134 NC3163 Fast Ethernet NIC |
b13c NC3162 Fast Ethernet NIC |
b144 NC3123 Fast Ethernet NIC |
b163 NC3134 Fast Ethernet NIC |
b164 NC3165 Fast Ethernet Upgrade Module |
b178 Smart Array 5i/532 |
b1a4 NC7131 Gigabit Server Adapter |
f130 NetFlex-3/P ThunderLAN 1.0 |
f150 NetFlex-3/P ThunderLAN 2.3 |
0e55 HaSoTec GmbH |
# Formerly NCR |
1000 LSI Logic / Symbios Logic |
0001 53c810 |
1000 1000 8100S |
0002 53c820 |
0003 53c825 |
0004 53c815 |
0005 53c810AP |
0006 53c860 |
000a 53c1510 |
000b 53c896 |
000c 53c895 |
1de1 3907 DC-390U2W |
000d 53c885 |
000f 53c875 |
0e11 7004 Embedded Ultra Wide SCSI Controller |
1092 8760 FirePort 40 Dual SCSI Controller |
1de1 3904 DC390F Ultra Wide SCSI Controller |
0010 53c895 |
0e11 4040 Integrated Array Controller |
0e11 4048 Integrated Array Controller |
0012 53c895a |
0013 53c875a |
0020 53c1010 Ultra3 SCSI Adapter |
1de1 1020 DC-390U3W |
0021 53c1010 66MHz Ultra3 SCSI Adapter |
0030 53c1030 |
1028 1010 LSI U320 SCSI Controller |
0040 53c1035 |
008f 53c875J |
1092 8000 FirePort 40 SCSI Controller |
1092 8760 FirePort 40 Dual SCSI Host Adapter |
0621 FC909 |
0622 FC929 |
0623 FC929 LAN |
0624 FC919 |
0625 FC919 LAN |
0626 FC929X |
0627 FC929X LAN |
0628 FC919X |
0629 FC919X LAN |
0701 83C885 NT50 DigitalScape Fast Ethernet |
0702 Yellowfin G-NIC gigabit ethernet |
1318 0000 PEI100X |
0901 61C102 |
1000 63C815 |
1960 PowerEdge Expandable RAID Controller 4 |
1028 0518 PowerEdge Expandable RAID Controller 4/DC |
1028 0520 PowerEdge Expandable RAID Controller 4/SC |
1028 0531 PowerEdge Expandable RAID Controller 4/QC |
1001 Kolter Electronic |
0010 PCI 1616 Measurement card with 32 digital I/O lines |
0011 OPTO-PCI Opto-Isolated digital I/O board |
0012 PCI-AD/DA Analogue I/O board |
0013 PCI-OPTO-RELAIS Digital I/O board with relay outputs |
0014 PCI-Counter/Timer Counter Timer board |
0015 PCI-DAC416 Analogue output board |
0016 PCI-MFB Analogue I/O board |
0017 PROTO-3 PCI Prototyping board |
9100 INI-9100/9100W SCSI Host |
1002 ATI Technologies Inc |
4158 68800AX [Mach32] |
4242 Radeon R200 BB [Radeon All in Wonder 8500DV] |
1002 02aa Radeon 8500 AIW DV Edition |
4336 Radeon Mobility U1 |
4354 215CT [Mach64 CT] |
4358 210888CX [Mach64 CX] |
4554 210888ET [Mach64 ET] |
4654 Mach64 VT |
4742 3D Rage Pro AGP 1X/2X |
1002 0040 Rage Pro Turbo AGP 2X |
1002 0044 Rage Pro Turbo AGP 2X |
1002 0061 Rage Pro AIW AGP 2X |
1002 0062 Rage Pro AIW AGP 2X |
1002 0063 Rage Pro AIW AGP 2X |
1002 0080 Rage Pro Turbo AGP 2X |
1002 0084 Rage Pro Turbo AGP 2X |
1002 4742 Rage Pro Turbo AGP 2X |
1002 8001 Rage Pro Turbo AGP 2X |
1028 0082 Rage Pro Turbo AGP 2X |
1028 4082 Optiplex GX1 Onboard Display Adapter |
1028 8082 Rage Pro Turbo AGP 2X |
1028 c082 Rage Pro Turbo AGP 2X |
8086 4152 Xpert 98D AGP 2X |
8086 464a Rage Pro Turbo AGP 2X |
4744 3D Rage Pro AGP 1X |
1002 4744 Rage Pro Turbo AGP |
4747 3D Rage Pro |
4749 3D Rage Pro |
1002 0061 Rage Pro AIW |
1002 0062 Rage Pro AIW |
474c Rage XC |
474d Rage XL AGP 2X |
1002 0004 Xpert 98 RXL AGP 2X |
1002 0008 Xpert 98 RXL AGP 2X |
1002 0080 Rage XL AGP 2X |
1002 0084 Xpert 98 AGP 2X |
1002 474d Rage XL AGP |
1033 806a Rage XL AGP |
474e Rage XC AGP |
1002 474e Rage XC AGP |
474f Rage XL |
1002 0008 Rage XL |
1002 474f Rage XL |
4750 3D Rage Pro 215GP |
1002 0040 Rage Pro Turbo |
1002 0044 Rage Pro Turbo |
1002 0080 Rage Pro Turbo |
1002 0084 Rage Pro Turbo |
1002 4750 Rage Pro Turbo |
4751 3D Rage Pro 215GQ |
4752 Rage XL |
1002 0008 Rage XL |
1002 4752 Rage XL |
1028 00d1 PowerEdge 2550 |
4753 Rage XC |
1002 4753 Rage XC |
4754 3D Rage I/II 215GT [Mach64 GT] |
4755 3D Rage II+ 215GTB [Mach64 GTB] |
4756 3D Rage IIC 215IIC [Mach64 GT IIC] |
1002 4756 Rage IIC |
4757 3D Rage IIC AGP |
1002 4757 Rage IIC AGP |
1028 0089 Rage 3D IIC |
1028 4082 Rage 3D IIC |
1028 8082 Rage 3D IIC |
1028 c082 Rage 3D IIC |
4758 210888GX [Mach64 GX] |
4759 3D Rage IIC |
475a 3D Rage IIC AGP |
1002 0087 Rage 3D IIC |
1002 475a Rage IIC AGP |
4964 Radeon R250 Id [Radeon 9000] |
4965 Radeon R250 Ie [Radeon 9000] |
4966 Radeon R250 If [Radeon 9000] |
10f1 0002 R250 If [Tachyon G9000 PRO] |
148c 2039 R250 If [Radeon 9000 Pro "Evil Commando"] |
1509 9a00 R250 If [Radeon 9000 "AT009"] |
174b 7176 R250 If [Sapphire Radeon 9000 Pro] |
174b 7192 R250 If [Radeon 9000 "Atlantis"] |
17af 2005 R250 If [Excalibur Radeon 9000 Pro] |
17af 2006 R250 If [Excalibur Radeon 9000] |
4967 Radeon R250 Ig [Radeon 9000] |
496e Radeon R250 [Radeon 9000] (Secondary) |
4c42 3D Rage LT Pro AGP-133 |
0e11 b0e8 Rage 3D LT Pro |
0e11 b10e 3D Rage LT Pro (Compaq Armada 1750) |
1002 0040 Rage LT Pro AGP 2X |
1002 0044 Rage LT Pro AGP 2X |
1002 4c42 Rage LT Pro AGP 2X |
1002 8001 Rage LT Pro AGP 2X |
1028 0085 Rage 3D LT Pro |
4c44 3D Rage LT Pro AGP-66 |
4c45 Rage Mobility M3 AGP |
4c46 Rage Mobility M3 AGP 2x |
4c47 3D Rage LT-G 215LG |
4c49 3D Rage LT Pro |
1002 0004 Rage LT Pro |
1002 0040 Rage LT Pro |
1002 0044 Rage LT Pro |
1002 4c49 Rage LT Pro |
4c4d Rage Mobility P/M AGP 2x |
1002 0084 Xpert 98 AGP 2X (Mobility) |
1014 0154 ThinkPad A20m |
4c4e Rage Mobility L AGP 2x |
4c50 3D Rage LT Pro |
1002 4c50 Rage LT Pro |
4c51 3D Rage LT Pro |
4c52 Rage Mobility P/M |
4c53 Rage Mobility L |
4c54 264LT [Mach64 LT] |
4c57 Radeon Mobility M7 LW [Radeon Mobility 7500] |
1014 0517 ThinkPad T30 |
1028 00e6 Radeon Mobility M7 LW (Dell Inspiron 8100) |
4c58 Radeon Mobility M7 LX [Radeon Mobility FireGL 7800] |
4c59 Radeon Mobility M6 LY |
1014 0235 ThinkPad A30p (2653-64G) |
1014 0239 ThinkPad X22/X23/X24 |
104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP |
4c5a Radeon Mobility M6 LZ |
4c64 Radeon R250 Ld [Radeon Mobility 9000] |
4c65 Radeon R250 Le [Radeon Mobility 9000] |
4c66 Radeon R250 Lf [Radeon Mobility 9000] |
4c67 Radeon R250 Lg [Radeon Mobility 9000] |
4d46 Rage Mobility M4 AGP |
4d4c Rage Mobility M4 AGP |
4e44 Radeon R300 ND [Radeon 9700] |
4e45 Radeon R300 NE [Radeon 9700] |
4e46 Radeon R300 NF [Radeon 9700] |
4e47 Radeon R300 NG [Radeon 9700] |
4e64 Radeon R300 [Radeon 9700] (Secondary) |
5041 Rage 128 PA/PRO |
5042 Rage 128 PB/PRO AGP 2x |
5043 Rage 128 PC/PRO AGP 4x |
5044 Rage 128 PD/PRO TMDS |
1002 0028 Rage 128 AIW |
1002 0029 Rage 128 AIW |
5045 Rage 128 PE/PRO AGP 2x TMDS |
5046 Rage 128 PF/PRO AGP 4x TMDS |
1002 0004 Rage Fury Pro |
1002 0008 Rage Fury Pro/Xpert 2000 Pro |
1002 0014 Rage Fury Pro |
1002 0018 Rage Fury Pro/Xpert 2000 Pro |
1002 0028 Rage 128 Pro AIW AGP |
1002 002a Rage 128 Pro AIW AGP |
1002 0048 Rage Fury Pro |
1002 2000 Rage Fury MAXX AGP 4x (TMDS) (VGA device) |
1002 2001 Rage Fury MAXX AGP 4x (TMDS) (Extra device?!) |
5047 Rage 128 PG/PRO |
5048 Rage 128 PH/PRO AGP 2x |
5049 Rage 128 PI/PRO AGP 4x |
504a Rage 128 PJ/PRO TMDS |
504b Rage 128 PK/PRO AGP 2x TMDS |
504c Rage 128 PL/PRO AGP 4x TMDS |
504d Rage 128 PM/PRO |
504e Rage 128 PN/PRO AGP 2x |
504f Rage 128 PO/PRO AGP 4x |
5050 Rage 128 PP/PRO TMDS [Xpert 128] |
1002 0008 Xpert 128 |
5051 Rage 128 PQ/PRO AGP 2x TMDS |
5052 Rage 128 PR/PRO AGP 4x TMDS |
5053 Rage 128 PS/PRO |
5054 Rage 128 PT/PRO AGP 2x |
5055 Rage 128 PU/PRO AGP 4x |
5056 Rage 128 PV/PRO TMDS |
5057 Rage 128 PW/PRO AGP 2x TMDS |
5058 Rage 128 PX/PRO AGP 4x TMDS |
5144 Radeon R100 QD [Radeon 64 DDR] |
1002 0008 Radeon 7000/Radeon VE |
1002 0009 Radeon 7000/Radeon |
1002 000a Radeon 7000/Radeon |
1002 001a Radeon 7000/Radeon |
1002 0029 Radeon AIW |
1002 0038 Radeon 7000/Radeon |
1002 0039 Radeon 7000/Radeon |
1002 008a Radeon 7000/Radeon |
1002 00ba Radeon 7000/Radeon |
1002 0139 Radeon 7000/Radeon |
1002 028a Radeon 7000/Radeon |
1002 02aa Radeon AIW |
1002 053a Radeon 7000/Radeon |
5145 Radeon R100 QE |
5146 Radeon R100 QF |
5147 Radeon R100 QG |
5148 Radeon R200 QH [Radeon 8500] |
1002 0152 FireGL 8800 |
1002 0172 FireGL 8700 |
5149 Radeon R200 QI |
514a Radeon R200 QJ |
514b Radeon R200 QK |
514c Radeon R200 QL [Radeon 8500 LE] |
1002 003a Radeon R200 QL [Radeon 8500 LE] |
1002 013a Radeon 8500 |
148c 2026 R200 QL [Radeon 8500 Evil Master II Multi Display Edition] |
174b 7149 Radeon R200 QL [Sapphire Radeon 8500 LE] |
5157 Radeon RV200 QW [Radeon 7500] |
1002 013a Radeon 7500 |
1458 4000 RV200 QW [RADEON 7500 PRO MAYA AR] |
148c 2024 RV200 QW [Radeon 7500LE Dual Display] |
148c 2025 RV200 QW [Radeon 7500 Evil Master Multi Display Edition] |
148c 2036 RV200 QW [Radeon 7500 PCI Dual Display] |
174b 7147 RV200 QW [Sapphire Radeon 7500LE] |
174b 7161 Radeon RV200 QW [Radeon 7500 LE] |
17af 0202 RV200 QW [Excalibur Radeon 7500LE] |
5158 Radeon RV200 QX [Radeon 7500] |
5159 Radeon VE QY |
1002 000a Radeon 7000/Radeon VE |
1002 000b Radeon 7000 |
1002 0038 Radeon 7000/Radeon VE |
1002 003a Radeon 7000/Radeon VE |
1002 00ba Radeon 7000/Radeon VE |
1002 013a Radeon 7000/Radeon VE |
1458 4002 RV100 QY [RADEON 7000 PRO MAYA AV Series] |
148c 2003 RV100 QY [Radeon 7000 Multi-Display Edition] |
148c 2023 RV100 QY [Radeon 7000 Evil Master Multi-Display] |
174b 7112 RV100 QY [Sapphire Radeon VE 7000] |
1787 0202 RV100 QY [Excalibur Radeon 7000] |
515a Radeon VE QZ |
5168 Radeon R200 Qh |
5169 Radeon R200 Qi |
516a Radeon R200 Qj |
516b Radeon R200 Qk |
5245 Rage 128 RE/SG |
1002 0008 Xpert 128 |
1002 0028 Rage 128 AIW |
1002 0029 Rage 128 AIW |
1002 0068 Rage 128 AIW |
5246 Rage 128 RF/SG AGP |
1002 0004 Magnum/Xpert 128/Xpert 99 |
1002 0008 Magnum/Xpert128/X99/Xpert2000 |
1002 0028 Rage 128 AIW AGP |
1002 0044 Rage Fury/Xpert 128/Xpert 2000 |
1002 0068 Rage 128 AIW AGP |
1002 0448 Rage Fury |
5247 Rage 128 RG |
524b Rage 128 RK/VR |
524c Rage 128 RL/VR AGP |
1002 0008 Xpert 99/Xpert 2000 |
1002 0088 Xpert 99 |
5345 Rage 128 SE/4x |
5346 Rage 128 SF/4x AGP 2x |
5347 Rage 128 SG/4x AGP 4x |
5348 Rage 128 SH |
534b Rage 128 SK/4x |
534c Rage 128 SL/4x AGP 2x |
534d Rage 128 SM/4x AGP 4x |
1002 0008 Xpert 99/Xpert 2000 |
1002 0018 Xpert 2000 |
534e Rage 128 4x |
5354 Mach 64 VT |
1002 5654 Mach 64 reference |
5446 Rage 128 Pro Ultra TF |
1002 0004 Rage Fury Pro |
1002 0008 Rage Fury Pro/Xpert 2000 Pro |
1002 0018 Rage Fury Pro/Xpert 2000 Pro |
1002 0028 Rage 128 AIW Pro AGP |
1002 0029 Rage 128 AIW |
1002 002a Rage 128 AIW Pro AGP |
1002 002b Rage 128 AIW |
1002 0048 Xpert 2000 Pro |
544c Rage 128 Pro Ultra TL |
5452 Rage 128 Pro Ultra TR |
1002 001c Rage 128 Pro 4XL |
103c 1279 Rage 128 Pro 4XL |
5453 Rage 128 Pro Ultra TS |
5454 Rage 128 Pro Ultra TT |
5455 Rage 128 Pro Ultra TU |
5654 264VT [Mach64 VT] |
1002 5654 Mach64VT Reference |
5655 264VT3 [Mach64 VT3] |
5656 264VT4 [Mach64 VT4] |
700f U1/A3 AGP Bridge [IGP 320M] |
1003 ULSI Systems |
0201 US201 |
1004 VLSI Technology Inc |
0005 82C592-FC1 |
0006 82C593-FC1 |
0007 82C594-AFC2 |
0008 82C596/7 [Wildcat] |
0009 82C597-AFC2 |
000c 82C541 [Lynx] |
000d 82C543 [Lynx] |
0101 82C532 |
0102 82C534 [Eagle] |
0103 82C538 |
0104 82C535 |
0105 82C147 |
0200 82C975 |
0280 82C925 |
0304 QSound ThunderBird PCI Audio |
1004 0304 QSound ThunderBird PCI Audio |
122d 1206 DSP368 Audio |
1483 5020 XWave Thunder 3D Audio |
0305 QSound ThunderBird PCI Audio Gameport |
1004 0305 QSound ThunderBird PCI Audio Gameport |
122d 1207 DSP368 Audio Gameport |
1483 5021 XWave Thunder 3D Audio Gameport |
0306 QSound ThunderBird PCI Audio Support Registers |
1004 0306 QSound ThunderBird PCI Audio Support Registers |
122d 1208 DSP368 Audio Support Registers |
1483 5022 XWave Thunder 3D Audio Support Registers |
0307 Thunderbird |
0308 Thunderbird |
0702 VAS96011 [Golden Gate II] |
0703 Tollgate |
1005 Avance Logic Inc. [ALI] |
2064 ALG2032/2064 |
2128 ALG2364A |
2301 ALG2301 |
2302 ALG2302 |
2364 ALG2364 |
2464 ALG2364A |
2501 ALG2564A/25128A |
1006 Reply Group |
1007 NetFrame Systems Inc |
1008 Epson |
100a Phoenix Technologies |
100b National Semiconductor Corporation |
0001 DP83810 |
0002 87415/87560 IDE |
000e 87560 Legacy I/O |
000f FireWire Controller |
0011 NS87560 National PCI System I/O |
0012 USB Controller |
0020 DP83815 (MacPhyter) Ethernet Controller |
0022 DP83820 10/100/1000 Ethernet Controller |
0500 SCx200 Bridge |
0501 SCx200 SMI |
0502 SCx200 IDE |
0503 SCx200 Audio |
0504 SCx200 Video |
0505 SCx200 XBus |
d001 87410 IDE |
100c Tseng Labs Inc |
3202 ET4000/W32p rev A |
3205 ET4000/W32p rev B |
3206 ET4000/W32p rev C |
3207 ET4000/W32p rev D |
3208 ET6000 |
4702 ET6300 |
100d AST Research Inc |
100e Weitek |
9000 P9000 Viper |
9001 P9000 Viper |
9002 P9000 Viper |
9100 P9100 Viper Pro/SE |
1010 Video Logic, Ltd. |
1011 Digital Equipment Corporation |
0001 DECchip 21050 |
0002 DECchip 21040 [Tulip] |
0004 DECchip 21030 [TGA] |
0007 NVRAM [Zephyr NVRAM] |
0008 KZPSA [KZPSA] |
0009 DECchip 21140 [FasterNet] |
1025 0310 21140 Fast Ethernet |
10b8 2001 SMC9332BDT EtherPower 10/100 |
10b8 2002 SMC9332BVT EtherPower T4 10/100 |
10b8 2003 SMC9334BDT EtherPower 10/100 (1-port) |
1109 2400 ANA-6944A/TX Fast Ethernet |
1112 2300 RNS2300 Fast Ethernet |
1112 2320 RNS2320 Fast Ethernet |
1112 2340 RNS2340 Fast Ethernet |
1113 1207 EN-1207-TX Fast Ethernet |
1186 1100 DFE-500TX Fast Ethernet |
1186 1112 DFE-570TX Fast Ethernet |
1186 1140 DFE-660 Cardbus Ethernet 10/100 |
1186 1142 DFE-660 Cardbus Ethernet 10/100 |
11f6 0503 Freedomline Fast Ethernet |
1282 9100 AEF-380TXD Fast Ethernet |
1385 1100 FA310TX Fast Ethernet |
2646 0001 KNE100TX Fast Ethernet |
000a 21230 Video Codec |
000d PBXGB [TGA2] |
000f DEFPA |
0014 DECchip 21041 [Tulip Pass 3] |
1186 0100 DE-530+ |
0016 DGLPB [OPPO] |
0019 DECchip 21142/43 |
1011 500a DE500A Fast Ethernet |
1011 500b DE500B Fast Ethernet |
1014 0001 10/100 EtherJet Cardbus |
1025 0315 ALN315 Fast Ethernet |
1033 800c PC-9821-CS01 100BASE-TX Interface Card |
1033 800d PC-9821NR-B06 100BASE-TX Interface Card |
108d 0016 Rapidfire 2327 10/100 Ethernet |
108d 0017 GoCard 2250 Ethernet 10/100 Cardbus |
10b8 2005 SMC8032DT Extreme Ethernet 10/100 |
10b8 8034 SMC8034 Extreme Ethernet 10/100 |
10ef 8169 Cardbus Fast Ethernet |
1109 2a00 ANA-6911A/TX Fast Ethernet |
1109 2b00 ANA-6911A/TXC Fast Ethernet |
1109 3000 ANA-6922/TX Fast Ethernet |
1113 1207 Cheetah Fast Ethernet |
1113 2220 Cardbus Fast Ethernet |
115d 0002 Cardbus Ethernet 10/100 |
1179 0203 Fast Ethernet |
1179 0204 Cardbus Fast Ethernet |
1186 1100 DFE-500TX Fast Ethernet |
1186 1101 DFE-500TX Fast Ethernet |
1186 1102 DFE-500TX Fast Ethernet |
1259 2800 AT-2800Tx Fast Ethernet |
1266 0004 Eagle Fast EtherMAX |
12af 0019 NetFlyer Cardbus Fast Ethernet |
1374 0001 Cardbus Ethernet Card 10/100 |
1374 0002 Cardbus Ethernet Card 10/100 |
1374 0007 Cardbus Ethernet Card 10/100 |
1374 0008 Cardbus Ethernet Card 10/100 |
1395 0001 10/100 Ethernet CardBus PC Card |
13d1 ab01 EtherFast 10/100 Cardbus (PCMPC200) |
8086 0001 EtherExpress PRO/100 Mobile CardBus 32 |
001a Farallon PN9000SX |
0021 DECchip 21052 |
0022 DECchip 21150 |
0023 DECchip 21150 |
0024 DECchip 21152 |
0025 DECchip 21153 |
0026 DECchip 21154 |
0034 56k Modem Cardbus |
1374 0003 56k Modem Cardbus |
0045 DECchip 21553 |
0046 DECchip 21554 |
0e11 4050 Integrated Smart Array |
0e11 4051 Integrated Smart Array |
0e11 4058 Integrated Smart Array |
103c 10c2 Hewlett-Packard NetRAID-4M |
12d9 000a VoIP PCI Gateway |
9005 0365 Adaptec 5400S |
9005 1364 Dell PowerEdge RAID Controller 2 |
9005 1365 Dell PowerEdge RAID Controller 2 |
e4bf 1000 CC8-1-BLUES |
1065 StrongARM DC21285 |
1069 0020 DAC960P / DAC1164P |
1012 Micronics Computers Inc |
1013 Cirrus Logic |
0038 GD 7548 |
0040 GD 7555 Flat Panel GUI Accelerator |
004c GD 7556 Video/Graphics LCD/CRT Ctrlr |
00a0 GD 5430/40 [Alpine] |
00a2 GD 5432 [Alpine] |
00a4 GD 5434-4 [Alpine] |
00a8 GD 5434-8 [Alpine] |
00ac GD 5436 [Alpine] |
00b0 GD 5440 |
00b8 GD 5446 |
00bc GD 5480 |
1013 00bc CL-GD5480 |
00d0 GD 5462 |
00d2 GD 5462 [Laguna I] |
00d4 GD 5464 [Laguna] |
00d5 GD 5464 BD [Laguna] |
00d6 GD 5465 [Laguna] |
13ce 8031 Barco Metheus 2 Megapixel, Dual Head |
13cf 8031 Barco Metheus 2 Megapixel, Dual Head |
00e8 GD 5436U |
1100 CL 6729 |
1110 PD 6832 PCMCIA/CardBus Ctrlr |
1112 PD 6834 PCMCIA/CardBus Ctrlr |
1113 PD 6833 PCMCIA/CardBus Ctrlr |
1200 GD 7542 [Nordic] |
1202 GD 7543 [Viking] |
1204 GD 7541 [Nordic Light] |
4400 CD 4400 |
6001 CS 4610/11 [CrystalClear SoundFusion Audio Accelerator] |
1014 1010 CS4610 SoundFusion Audio Accelerator |
6003 CS 4614/22/24 [CrystalClear SoundFusion Audio Accelerator] |
1013 4280 Crystal SoundFusion PCI Audio Accelerator |
1681 0050 Game Theater XP |
1681 a011 Fortissimo III 7.1 |
6004 CS 4614/22/24 [CrystalClear SoundFusion Audio Accelerator] |
6005 Crystal CS4281 PCI Audio |
1013 4281 Crystal CS4281 PCI Audio |
10cf 10a8 Crystal CS4281 PCI Audio |
10cf 10a9 Crystal CS4281 PCI Audio |
10cf 10aa Crystal CS4281 PCI Audio |
10cf 10ab Crystal CS4281 PCI Audio |
10cf 10ac Crystal CS4281 PCI Audio |
10cf 10ad Crystal CS4281 PCI Audio |
10cf 10b4 Crystal CS4281 PCI Audio |
1179 0001 Crystal CS4281 PCI Audio |
14c0 000c Crystal CS4281 PCI Audio |
1014 IBM |
0002 PCI to MCA Bridge |
0005 Alta Lite |
0007 Alta MP |
000a Fire Coral |
0017 CPU to PCI Bridge |
0018 TR Auto LANstreamer |
001b GXT-150P |
001c Carrera |
001d 82G2675 |
0020 MCA |
0022 IBM27-82351 |
002d Python |
002e ServeRAID Controller |
1014 002e ServeRAID-3x |
1014 022e ServeRAID-4H |
0036 Miami |
003a CPU to PCI Bridge |
003e 16/4 Token ring UTP/STP controller |
1014 003e Token-Ring Adapter |
1014 00cd Token-Ring Adapter + Wake-On-LAN |
1014 00ce 16/4 Token-Ring Adapter 2 |
1014 00cf 16/4 Token-Ring Adapter Special |
1014 00e4 High-Speed 100/16/4 Token-Ring Adapter |
1014 00e5 16/4 Token-Ring Adapter 2 + Wake-On-LAN |
1014 016d iSeries 2744 Card |
0045 SSA Adapter |
0046 MPIC interrupt controller |
0047 PCI to PCI Bridge |
0048 PCI to PCI Bridge |
0049 Warhead SCSI Controller |
004e ATM Controller (14104e00) |
004f ATM Controller (14104f00) |
0050 ATM Controller (14105000) |
0053 25 MBit ATM Controller |
0057 MPEG PCI Bridge |
005c i82557B 10/100 |
007c ATM Controller (14107c00) |
007d 3780IDSP [MWave] |
0090 GXT 3000P |
1014 008e GXT-3000P |
0095 20H2999 PCI Docking Bridge |
0096 Chukar chipset SCSI controller |
1014 0097 iSeries 2778 DASD IOA |
1014 0098 iSeries 2763 DASD IOA |
1014 0099 iSeries 2748 DASD IOA |
00a5 ATM Controller (1410a500) |
00a6 ATM 155MBPS MM Controller (1410a600) |
00b7 256-bit Graphics Rasterizer [Fire GL1] |
00be ATM 622MBPS Controller (1410be00) |
00dc Advanced Systems Management Adapter (ASMA) |
00fc CPC710 Dual Bridge and Memory Controller (PCI-64) |
0105 CPC710 Dual Bridge and Memory Controller (PCI-32) |
010f Remote Supervisor Adapter (RSA) |
0142 Yotta Video Compositor Input |
1014 0143 Yotta Input Controller (ytin) |
0144 Yotta Video Compositor Output |
1014 0145 Yotta Output Controller (ytout) |
0156 405GP PLB to PCI Bridge |
01a7 PCI-X to PCI-X Bridge |
01bd ServeRAID Controller |
1014 01be ServeRAID-4M |
1014 01bf ServeRAID-4L |
1014 0208 ServeRAID-4Mx |
1014 020e ServeRAID-4Lx |
1014 022e ServeRAID-4H |
1014 0258 ServeRAID-5i |
1014 0259 ServeRAID-5i |
0302 XA-32 chipset [Summit] |
ffff MPIC-2 interrupt controller |
1015 LSI Logic Corp of Canada |
1016 ICL Personal Systems |
1017 SPEA Software AG |
5343 SPEA 3D Accelerator |
1018 Unisys Systems |
1019 Elitegroup Computer Systems |
101a AT&T GIS (NCR) |
0005 100VG ethernet |
101b Vitesse Semiconductor |
101c Western Digital |
0193 33C193A |
0196 33C196A |
0197 33C197A |
0296 33C296A |
3193 7193 |
3197 7197 |
3296 33C296A |
4296 34C296 |
9710 Pipeline 9710 |
9712 Pipeline 9712 |
c24a 90C |
101e American Megatrends Inc. |
1960 MegaRAID |
101e 0471 MegaRAID 471 Enterprise 1600 RAID Controller |
101e 0475 MegaRAID 475 Express 500 RAID Controller |
101e 0493 MegaRAID 493 Elite 1600 RAID Controller |
1028 0471 PowerEdge RAID Controller 3/QC |
1028 0475 PowerEdge RAID Controller 3/SC |
1028 0493 PowerEdge RAID Controller 3/DC |
1028 0511 PowerEdge Cost Effective RAID Controller ATA100/4Ch |
9010 MegaRAID 428 Ultra RAID Controller |
9030 EIDE Controller |
9031 EIDE Controller |
9032 EIDE & SCSI Controller |
9033 SCSI Controller |
9040 Multimedia card |
9060 MegaRAID 434 Ultra GT RAID Controller |
9063 MegaRAC |
101e 0767 Dell Remote Assistant Card 2 |
101f PictureTel |
1020 Hitachi Computer Products |
1021 OKI Electric Industry Co. Ltd. |
1022 Advanced Micro Devices [AMD] |
1100 K8 NorthBridge |
1101 K8 NorthBridge |
1102 K8 NorthBridge |
1103 K8 NorthBridge |
2000 79c970 [PCnet32 LANCE] |
1014 2000 NetFinity 10/100 Fast Ethernet |
103c 104c Ethernet with LAN remote power Adapter |
103c 1064 Ethernet with LAN remote power Adapter |
103c 1065 Ethernet with LAN remote power Adapter |
103c 106c Ethernet with LAN remote power Adapter |
103c 106e Ethernet with LAN remote power Adapter |
103c 10ea Ethernet with LAN remote power Adapter |
1113 1220 EN1220 10/100 Fast Ethernet |
1259 2450 AT-2450 10/100 Fast Ethernet |
1259 2454 AT-2450v4 10Mb Ethernet Adapter |
1259 2700 AT-2700TX 10/100 Fast Ethernet |
1259 2701 AT-2700FX 100Mb Ethernet |
2001 79c978 [HomePNA] |
1092 0a78 Multimedia Home Network Adapter |
1668 0299 ActionLink Home Network Adapter |
2020 53c974 [PCscsi] |
2040 79c974 |
3000 ELanSC520 Microcontroller |
7006 AMD-751 [Irongate] System Controller |
7007 AMD-751 [Irongate] AGP Bridge |
700c AMD-760 MP [IGD4-2P] System Controller |
700d AMD-760 MP [IGD4-2P] AGP Bridge |
700e AMD-760 [IGD4-1P] System Controller |
700f AMD-760 [IGD4-1P] AGP Bridge |
7400 AMD-755 [Cobra] ISA |
7401 AMD-755 [Cobra] IDE |
7403 AMD-755 [Cobra] ACPI |
7404 AMD-755 [Cobra] USB |
7408 AMD-756 [Viper] ISA |
7409 AMD-756 [Viper] IDE |
740b AMD-756 [Viper] ACPI |
740c AMD-756 [Viper] USB |
7410 AMD-766 [ViperPlus] ISA |
7411 AMD-766 [ViperPlus] IDE |
7413 AMD-766 [ViperPlus] ACPI |
7414 AMD-766 [ViperPlus] USB |
7440 AMD-768 [Opus] ISA |
1043 8044 A7M-D Mainboard |
7441 AMD-768 [Opus] IDE |
7443 AMD-768 [Opus] ACPI |
1043 8044 A7M-D Mainboard |
7445 AMD-768 [Opus] Audio |
7446 AMD-768 [Opus] MC97 Modem (Smart Link HAMR5600 compatible) |
7448 AMD-768 [Opus] PCI |
7449 AMD-768 [Opus] USB |
7450 AMD-8131 PCI-X Bridge |
7451 AMD-8131 PCI-X APIC |
7454 AMD-8151 System Controller |
7455 AMD-8151 AGP Bridge |
7460 AMD-8111 PCI |
7461 AMD-8111 USB |
7462 AMD-8111 Ethernet |
7464 AMD-8111 USB |
7468 AMD-8111 LPC |
7469 AMD-8111 IDE |
746a AMD-8111 SMBus 2.0 |
746b AMD-8111 ACPI |
746d AMD-8111 AC97 Audio |
746e AMD-8111 MC97 Modem |
1023 Trident Microsystems |
0194 82C194 |
2000 4DWave DX |
2001 4DWave NX |
8400 CyberBlade/i7 |
1023 8400 CyberBlade i7 AGP |
8420 CyberBlade/i7d |
0e11 b15a CyberBlade i7 AGP |
8500 CyberBlade/i1 |
8520 CyberBlade i1 |
0e11 b16e CyberBlade i1 AGP |
1023 8520 CyberBlade i1 AGP |
8620 CyberBlade/i1 |
1014 0502 ThinkPad T30 |
8820 CyberBlade XPAi1 |
9320 TGUI 9320 |
9350 GUI Accelerator |
9360 Flat panel GUI Accelerator |
9382 Cyber 9382 [Reference design] |
9383 Cyber 9383 [Reference design] |
9385 Cyber 9385 [Reference design] |
9386 Cyber 9386 |
9388 Cyber 9388 |
9397 Cyber 9397 |
939a Cyber 9397DVD |
9420 TGUI 9420 |
9430 TGUI 9430 |
9440 TGUI 9440 |
9460 TGUI 9460 |
9470 TGUI 9470 |
9520 Cyber 9520 |
9525 Cyber 9525 |
10cf 1094 Lifebook C6155 |
9540 Cyber 9540 |
9660 TGUI 9660/938x/968x |
9680 TGUI 9680 |
9682 TGUI 9682 |
9683 TGUI 9683 |
9685 ProVIDIA 9685 |
9750 3DImage 9750 |
1014 9750 3DImage 9750 |
1023 9750 3DImage 9750 |
9753 TGUI 9753 |
9754 TGUI 9754 |
9759 TGUI 975 |
9783 TGUI 9783 |
9785 TGUI 9785 |
9850 3DImage 9850 |
9880 Blade 3D PCI/AGP |
1023 9880 Blade 3D |
9910 CyberBlade/XP |
9930 CyberBlade/XPm |
1024 Zenith Data Systems |
1025 Acer Incorporated [ALI] |
1435 M1435 |
1445 M1445 |
1449 M1449 |
1451 M1451 |
1461 M1461 |
1489 M1489 |
1511 M1511 |
1512 ALI M1512 Aladdin |
1513 M1513 |
1521 ALI M1521 Aladdin III CPU Bridge |
10b9 1521 ALI M1521 Aladdin III CPU Bridge |
1523 ALI M1523 ISA Bridge |
10b9 1523 ALI M1523 ISA Bridge |
1531 M1531 Northbridge [Aladdin IV/IV+] |
1533 M1533 PCI-to-ISA Bridge |
10b9 1533 ALI M1533 Aladdin IV/V ISA South Bridge |
1535 M1535 PCI Bridge + Super I/O + FIR |
1541 M1541 Northbridge [Aladdin V] |
10b9 1541 ALI M1541 Aladdin V/V+ AGP+PCI North Bridge |
1542 M1542 Northbridge [Aladdin V] |
1543 M1543 PCI-to-ISA Bridge + Super I/O + FIR |
1561 M1561 Northbridge [Aladdin 7] |
1621 M1621 Northbridge [Aladdin-Pro II] |
1631 M1631 Northbridge+3D Graphics [Aladdin TNT2] |
1641 M1641 Northbridge [Aladdin-Pro IV] |
1647 M1647 [MaGiK1] PCI North Bridge |
3141 M3141 |
3143 M3143 |
3145 M3145 |
3147 M3147 |
3149 M3149 |
3151 M3151 |
3307 M3307 MPEG-I Video Controller |
3309 M3309 MPEG-II Video w/ Software Audio Decoder |
3321 M3321 MPEG-II Audio/Video Decoder |
5212 M4803 |
5215 ALI PCI EIDE Controller |
5217 M5217H |
5219 M5219 |
5225 M5225 |
5229 M5229 |
5235 M5235 |
5237 M5237 PCI USB Host Controller |
5240 EIDE Controller |
5241 PCMCIA Bridge |
5242 General Purpose Controller |
5243 PCI to PCI Bridge Controller |
5244 Floppy Disk Controller |
5247 M1541 PCI to PCI Bridge |
5251 M5251 P1394 Controller |
5427 PCI to AGP Bridge |
5451 M5451 PCI AC-Link Controller Audio Device |
5453 M5453 PCI AC-Link Controller Modem Device |
7101 M7101 PCI PMU Power Management Controller |
10b9 7101 M7101 PCI PMU Power Management Controller |
1028 Dell Computer Corporation |
0001 PowerEdge Expandable RAID Controller 2/Si |
1028 0001 PowerEdge Expandable RAID Controller 2/Si |
0002 PowerEdge Expandable RAID Controller 3 |
1028 0002 PowerEdge Expandable RAID Controller 3/Di |
1028 00d1 PowerEdge Expandable RAID Controller 3/Di |
1028 00d9 PowerEdge Expandable RAID Controller 3/Di |
0003 PowerEdge Expandable RAID Controller 3/Si |
1028 0003 PowerEdge Expandable RAID Controller 3/Si |
0004 PowerEdge Expandable RAID Controller 3/Si |
1028 00d0 PowerEdge Expandable RAID Controller 3/Si |
0005 PowerEdge Expandable RAID Controller 3/Di |
0006 PowerEdge Expandable RAID Controller 3/Di |
0007 Remote Assistant Card 3 |
0008 PowerEdge Expandable RAID Controller 3/Di |
000a PowerEdge Expandable RAID Controller 3 |
1028 0106 PowerEdge Expandable RAID Controller 3/Di |
1028 011b PowerEdge Expandable RAID Controller 3/Di |
1028 0121 PowerEdge Expandable RAID Controller 3/Di |
000c Embedded Systems Management Device 4 |
000e PowerEdge Expandable RAID Controller |
000f PowerEdge Expandable RAID Controller 4/Di |
1029 Siemens Nixdorf IS |
102a LSI Logic |
0000 HYDRA |
0010 ASPEN |
102b Matrox Graphics, Inc. |
# DJ: I've a suspicion that 0010 is a duplicate of 0d10. |
0010 MGA-I [Impression?] |
0518 MGA-II [Athena] |
0519 MGA 2064W [Millennium] |
051a MGA 1064SG [Mystique] |
102b 1100 MGA-1084SG Mystique |
102b 1200 MGA-1084SG Mystique |
1100 102b MGA-1084SG Mystique |
110a 0018 Scenic Pro C5 (D1025) |
051b MGA 2164W [Millennium II] |
102b 051b MGA-2164W Millennium II |
102b 1100 MGA-2164W Millennium II |
102b 1200 MGA-2164W Millennium II |
051e MGA 1064SG [Mystique] AGP |
051f MGA 2164W [Millennium II] AGP |
0520 MGA G200 |
102b dbc2 G200 Multi-Monitor |
102b dbc8 G200 Multi-Monitor |
102b dbe2 G200 Multi-Monitor |
102b dbe8 G200 Multi-Monitor |
102b ff03 Millennium G200 SD |
102b ff04 Marvel G200 |
0521 MGA G200 AGP |
1014 ff03 Millennium G200 AGP |
102b 48e9 Mystique G200 AGP |
102b 48f8 Millennium G200 SD AGP |
102b 4a60 Millennium G200 LE AGP |
102b 4a64 Millennium G200 AGP |
102b c93c Millennium G200 AGP |
102b c9b0 Millennium G200 AGP |
102b c9bc Millennium G200 AGP |
102b ca60 Millennium G250 LE AGP |
102b ca6c Millennium G250 AGP |
102b dbbc Millennium G200 AGP |
102b dbc2 Millennium G200 MMS (Dual G200) |
102b dbc3 G200 Multi-Monitor |
102b dbc8 Millennium G200 MMS (Dual G200) |
102b dbd2 G200 Multi-Monitor |
102b dbd3 G200 Multi-Monitor |
102b dbd4 G200 Multi-Monitor |
102b dbd5 G200 Multi-Monitor |
102b dbd8 G200 Multi-Monitor |
102b dbd9 G200 Multi-Monitor |
102b dbe2 Millennium G200 MMS (Quad G200) |
102b dbe3 G200 Multi-Monitor |
102b dbe8 Millennium G200 MMS (Quad G200) |
102b dbf2 G200 Multi-Monitor |
102b dbf3 G200 Multi-Monitor |
102b dbf4 G200 Multi-Monitor |
102b dbf5 G200 Multi-Monitor |
102b dbf8 G200 Multi-Monitor |
102b dbf9 G200 Multi-Monitor |
102b f806 Mystique G200 Video AGP |
102b ff00 MGA-G200 AGP |
102b ff02 Mystique G200 AGP |
102b ff03 Millennium G200 AGP |
102b ff04 Marvel G200 AGP |
110a 0032 MGA-G200 AGP |
0525 MGA G400 AGP |
0e11 b16f MGA-G400 AGP |
102b 0328 Millennium G400 16Mb SDRAM |
102b 0338 Millennium G400 16Mb SDRAM |
102b 0378 Millennium G400 32Mb SDRAM |
102b 0541 Millennium G450 Dual Head |
102b 0542 Millennium G450 Dual Head LX |
102b 0543 Millennium G450 Single Head LX |
102b 0641 Millennium G450 32Mb SDRAM Dual Head |
102b 0642 Millennium G450 32Mb SDRAM Dual Head LX |
102b 0643 Millennium G450 32Mb SDRAM Single Head LX |
102b 07c0 Millennium G450 Dual Head LE |
102b 07c1 Millennium G450 SDR Dual Head LE |
102b 0d41 Millennium G450 Dual Head PCI |
102b 0d42 Millennium G450 Dual Head LX PCI |
102b 0e00 Marvel G450 eTV |
102b 0e01 Marvel G450 eTV |
102b 0e02 Marvel G450 eTV |
102b 0e03 Marvel G450 eTV |
102b 0f80 Millennium G450 Low Profile |
102b 0f81 Millennium G450 Low Profile |
102b 0f82 Millennium G450 Low Profile DVI |
102b 0f83 Millennium G450 Low Profile DVI |
102b 19d8 Millennium G400 16Mb SGRAM |
102b 19f8 Millennium G400 32Mb SGRAM |
102b 2159 Millennium G400 Dual Head 16Mb |
102b 2179 Millennium G400 MAX/Dual Head 32Mb |
102b 217d Millennium G400 Dual Head Max |
102b 23c0 Millennium G450 |
102b 23c1 Millennium G450 |
102b 23c2 Millennium G450 DVI |
102b 23c3 Millennium G450 DVI |
102b 2f58 Millennium G400 |
102b 2f78 Millennium G400 |
102b 3693 Marvel G400 AGP |
102b 5dd0 4Sight II |
102b 5f50 4Sight II |
102b 5f51 4Sight II |
102b 5f52 4Sight II |
102b 9010 Millennium G400 Dual Head |
1458 0400 GA-G400 |
1705 0001 Millennium G450 32MB SGRAM |
1705 0002 Millennium G450 16MB SGRAM |
1705 0003 Millennium G450 32MB |
1705 0004 Millennium G450 16MB |
0527 MGA Parhelia AGP |
102b 0840 Parhelia 128Mb |
0d10 MGA Ultima/Impression |
1000 MGA G100 [Productiva] |
102b ff01 Productiva G100 |
102b ff05 Productiva G100 Multi-Monitor |
1001 MGA G100 [Productiva] AGP |
102b 1001 MGA-G100 AGP |
102b ff00 MGA-G100 AGP |
102b ff01 MGA-G100 Productiva AGP |
102b ff03 Millennium G100 AGP |
102b ff04 MGA-G100 AGP |
102b ff05 MGA-G100 Productiva AGP Multi-Monitor |
110a 001e MGA-G100 AGP |
2007 MGA Mistral |
2527 MGA G550 AGP |
102b 0f83 Millennium G550 |
102b 0f84 Millennium G550 Dual Head DDR 32Mb |
102b 1e41 Millennium G550 |
4536 VIA Framegrabber |
6573 Shark 10/100 Multiport SwitchNIC |
102c Chips and Technologies |
00b8 F64310 |
00c0 F69000 HiQVideo |
102c 00c0 F69000 HiQVideo |
00d0 F65545 |
00d8 F65545 |
00dc F65548 |
00e0 F65550 |
00e4 F65554 |
00e5 F65555 HiQVPro |
0e11 b049 Armada 1700 Laptop Display Controller |
00f0 F68554 |
00f4 F68554 HiQVision |
00f5 F68555 |
0c30 F69030 |
102d Wyse Technology Inc. |
50dc 3328 Audio |
102e Olivetti Advanced Technology |
102f Toshiba America |
0009 r4x00 |
0020 ATM Meteor 155 |
102f 00f8 ATM Meteor 155 |
1030 TMC Research |
1031 Miro Computer Products AG |
5601 DC20 ASIC |
5607 Video I/O & motion JPEG compressor |
5631 Media 3D |
6057 MiroVideo DC10/DC30+ |
1032 Compaq |
1033 NEC Corporation |
0001 PCI to 486-like bus Bridge |
0002 PCI to VL98 Bridge |
0003 ATM Controller |
0004 R4000 PCI Bridge |
0005 PCI to 486-like bus Bridge |
0006 PC-9800 Graphic Accelerator |
0007 PCI to UX-Bus Bridge |
0008 PC-9800 Graphic Accelerator |
0009 PCI to PC9800 Core-Graph Bridge |
0016 PCI to VL Bridge |
001a [Nile II] |
0021 Vrc4373 [Nile I] |
0029 PowerVR PCX1 |
002a PowerVR 3D |
002c Star Alpha 2 |
002d PCI to C-bus Bridge |
0035 USB |
1179 0001 USB |
12ee 7000 Root Hub |
1799 0001 Root Hub |
003b PCI to C-bus Bridge |
003e NAPCCARD Cardbus Controller |
0046 PowerVR PCX2 [midas] |
005a Vrc5074 [Nile 4] |
0063 Firewarden |
0067 PowerVR Neon 250 Chipset |
1010 0020 PowerVR Neon 250 AGP 32Mb |
1010 0080 PowerVR Neon 250 AGP 16Mb |
1010 0088 PowerVR Neon 250 16Mb |
1010 0090 PowerVR Neon 250 AGP 16Mb |
1010 0098 PowerVR Neon 250 16Mb |
1010 00a0 PowerVR Neon 250 AGP 32Mb |
1010 00a8 PowerVR Neon 250 32Mb |
1010 0120 PowerVR Neon 250 AGP 32Mb |
0074 56k Voice Modem |
1033 8014 RCV56ACF 56k Voice Modem |
009b Vrc5476 |
00a6 VRC5477 AC97 |
00cd IEEE 1394 [OrangeLink] Host Controller |
12ee 8011 Root hub |
00e0 USB 2.0 |
12ee 7001 Root hub |
1799 0002 Root Hub |
1034 Framatome Connectors USA Inc. |
1035 Comp. & Comm. Research Lab |
1036 Future Domain Corp. |
0000 TMC-18C30 [36C70] |
1037 Hitachi Micro Systems |
1038 AMP, Inc |
1039 Silicon Integrated Systems [SiS] |
0001 5591/5592 AGP |
0002 SG86C202 |
0006 85C501/2/3 |
0008 85C503/5513 |
0009 ACPI |
0018 SiS85C503/5513 (LPC Bridge) |
0200 5597/5598/6326 VGA |
1039 0000 SiS5597 SVGA (Shared RAM) |
0204 82C204 |
0205 SG86C205 |
0300 300/200 |
107d 2720 Leadtek WinFast VR300 |
0406 85C501/2 |
0496 85C496 |
0530 530 Host |
0540 540 Host |
0597 5513C |
0601 85C601 |
0620 620 Host |
0630 630 Host |
0633 633 Host |
0635 635 Host |
0645 SiS645 Host & Memory & AGP Controller |
0646 SiS645DX Host & Memory & AGP Controller |
0650 650 Host |
0651 SiS651 Host |
0730 730 Host |
0733 733 Host |
0735 735 Host |
0740 740 Host |
0745 745 Host |
0900 SiS900 10/100 Ethernet |
1039 0900 SiS900 10/100 Ethernet Adapter |
0961 SiS961 [MuTIOL Media IO] |
0962 SiS962 [MuTIOL Media IO] |
3602 83C602 |
5107 5107 |
5300 SiS540 PCI Display Adapter |
5401 486 PCI Chipset |
5511 5511/5512 |
5513 5513 [IDE] |
1019 0970 P6STP-FL motherboard |
1039 5513 SiS5513 EIDE Controller (A,B step) |
5517 5517 |
5571 5571 |
5581 5581 Pentium Chipset |
5582 5582 |
5591 5591/5592 Host |
5596 5596 Pentium Chipset |
5597 5597 [SiS5582] |
5600 5600 Host |
6204 Video decoder & MPEG interface |
6205 VGA Controller |
6236 6236 3D-AGP |
6300 SiS630 GUI Accelerator+3D |
1019 0970 P6STP-FL motherboard |
6306 SiS530 3D PCI/AGP |
1039 6306 SiS530,620 GUI Accelerator+3D |
6326 86C326 5598/6326 |
1039 6326 SiS6326 GUI Accelerator |
1092 0a50 SpeedStar A50 |
1092 0a70 SpeedStar A70 |
1092 4910 SpeedStar A70 |
1092 4920 SpeedStar A70 |
1569 6326 SiS6326 GUI Accelerator |
7001 7001 |
1039 7000 Onboard USB Controller |
7002 SiS7002 USB 2.0 |
1509 7002 Onboard USB Controller |
7007 FireWire Controller |
7012 SiS7012 PCI Audio Accelerator |
7013 56k Winmodem (Smart Link HAMR5600 compatible) |
7016 SiS7016 10/100 Ethernet Adapter |
1039 7016 SiS7016 10/100 Ethernet Adapter |
7018 SiS PCI Audio Accelerator |
1014 01b6 SiS PCI Audio Accelerator |
1014 01b7 SiS PCI Audio Accelerator |
1019 7018 SiS PCI Audio Accelerator |
1025 000e SiS PCI Audio Accelerator |
1025 0018 SiS PCI Audio Accelerator |
1039 7018 SiS PCI Audio Accelerator |
1043 800b SiS PCI Audio Accelerator |
1054 7018 SiS PCI Audio Accelerator |
107d 5330 SiS PCI Audio Accelerator |
107d 5350 SiS PCI Audio Accelerator |
1170 3209 SiS PCI Audio Accelerator |
1462 400a SiS PCI Audio Accelerator |
14a4 2089 SiS PCI Audio Accelerator |
14cd 2194 SiS PCI Audio Accelerator |
14ff 1100 SiS PCI Audio Accelerator |
152d 8808 SiS PCI Audio Accelerator |
1558 1103 SiS PCI Audio Accelerator |
1558 2200 SiS PCI Audio Accelerator |
1563 7018 SiS PCI Audio Accelerator |
15c5 0111 SiS PCI Audio Accelerator |
270f a171 SiS PCI Audio Accelerator |
a0a0 0022 SiS PCI Audio Accelerator |
103a Seiko Epson Corporation |
103b Tatung Co. of America |
103c Hewlett-Packard Company |
1005 A4977A Visualize EG |
1006 Visualize FX6 |
1008 Visualize FX4 |
100a Visualize FX2 |
1028 Tach TL Fibre Channel Host Adapter |
1029 Tach XL2 Fibre Channel Host Adapter |
107e 000f Interphase 5560 Fibre Channel Adapter |
9004 9210 1Gb/2Gb Family Fibre Channel Controller |
9004 9211 1Gb/2Gb Family Fibre Channel Controller |
102a Tach TS Fibre Channel Host Adapter |
107e 000e Interphase 5540/5541 Fibre Channel Adapter |
9004 9110 1Gb/2Gb Family Fibre Channel Controller |
9004 9111 1Gb/2Gb Family Fibre Channel Controller |
1030 J2585A DeskDirect 10/100VG NIC |
1031 J2585B HP 10/100VG PCI LAN Adapter |
103c 1040 J2973A DeskDirect 10BaseT NIC |
103c 1041 J2585B DeskDirect 10/100VG NIC |
103c 1042 J2970A DeskDirect 10BaseT/2 NIC |
1040 J2973A DeskDirect 10BaseT NIC |
1041 J2585B DeskDirect 10/100 NIC |
1042 J2970A DeskDirect 10BaseT/2 NIC |
1048 Diva Serial [GSP] Multiport UART |
103c 1049 Tosca Console |
103c 104a Tosca Secondary |
103c 104b Maestro SP2 |
103c 1223 Halfdome Console |
103c 1226 Keystone SP2 |
103c 1227 Powerbar SP2 |
103c 1282 Everest SP2 |
1054 PCI Local Bus Adapter |
1064 79C970 PCnet Ethernet Controller |
108b Visualize FXe |
10c1 NetServer Smart IRQ Router |
10ed TopTools Remote Control |
1200 82557B 10/100 NIC |
1219 NetServer PCI Hot-Plug Controller |
121a NetServer SMIC Controller |
121b NetServer Legacy COM Port Decoder |
121c NetServer PCI COM Port Decoder |
1229 zx1 System Bus Adapter |
122a zx1 I/O Controller |
122e PCI-X/AGP Local Bus Adapter |
1290 Auxiliary Diva Serial Port |
2910 E2910A PCIBus Exerciser |
2925 E2925A 32 Bit, 33 MHzPCI Exerciser & Analyzer |
103e Solliday Engineering |
103f Synopsys/Logic Modeling Group |
1040 Accelgraphics Inc. |
1041 Computrend |
1042 Micron |
1000 FDC 37C665 |
1001 37C922 |
3000 Samurai_0 |
3010 Samurai_1 |
3020 Samurai_IDE |
1043 Asustek Computer, Inc. |
0675 ISDNLink P-IN100-ST-D |
1044 Distributed Processing Technology |
1012 Domino RAID Engine |
a400 SmartCache/Raid I-IV Controller |
a500 PCI Bridge |
a501 SmartRAID V Controller |
1044 c001 PM1554U2 Ultra2 Single Channel |
1044 c002 PM1654U2 Ultra2 Single Channel |
1044 c003 PM1564U3 Ultra3 Single Channel |
1044 c004 PM1564U3 Ultra3 Dual Channel |
1044 c005 PM1554U2 Ultra2 Single Channel (NON ACPI) |
1044 c00a PM2554U2 Ultra2 Single Channel |
1044 c00b PM2654U2 Ultra2 Single Channel |
1044 c00c PM2664U3 Ultra3 Single Channel |
1044 c00d PM2664U3 Ultra3 Dual Channel |
1044 c00e PM2554U2 Ultra2 Single Channel (NON ACPI) |
1044 c00f PM2654U2 Ultra2 Single Channel (NON ACPI) |
1044 c014 PM3754U2 Ultra2 Single Channel (NON ACPI) |
1044 c015 PM3755U2B Ultra2 Single Channel (NON ACPI) |
1044 c016 PM3755F Fibre Channel (NON ACPI) |
1044 c01e PM3757U2 Ultra2 Single Channel |
1044 c01f PM3757U2 Ultra2 Dual Channel |
1044 c020 PM3767U3 Ultra3 Dual Channel |
1044 c021 PM3767U3 Ultra3 Quad Channel |
1044 c028 PM2865U3 Ultra3 Single Channel |
1044 c029 PM2865U3 Ultra3 Dual Channel |
1044 c02a PM2865F Fibre Channel |
1044 c03c 2000S Ultra3 Single Channel |
1044 c03d 2000S Ultra3 Dual Channel |
1044 c03e 2000F Fibre Channel |
1044 c046 3000S Ultra3 Single Channel |
1044 c047 3000S Ultra3 Dual Channel |
1044 c048 3000F Fibre Channel |
1044 c050 5000S Ultra3 Single Channel |
1044 c051 5000S Ultra3 Dual Channel |
1044 c052 5000F Fibre Channel |
1044 c05a 2400A UDMA Four Channel |
1044 c05b 2400A UDMA Four Channel DAC |
1044 c064 3010S Ultra3 Dual Channel |
1044 c065 3010S Ultra3 Four Channel |
1044 c066 3010S Fibre Channel |
a511 SmartRAID V Controller |
1045 OPTi Inc. |
a0f8 82C750 [Vendetta] USB Controller |
c101 92C264 |
c178 92C178 |
c556 82X556 [Viper] |
c557 82C557 [Viper-M] |
c558 82C558 [Viper-M ISA+IDE] |
c567 82C750 [Vendetta], device 0 |
c568 82C750 [Vendetta], device 1 |
c569 82C579 [Viper XPress+ Chipset] |
c621 82C621 [Viper-M/N+] |
c700 82C700 [FireStar] |
c701 82C701 [FireStar Plus] |
c814 82C814 [Firebridge 1] |
c822 82C822 |
c824 82C824 |
c825 82C825 [Firebridge 2] |
c832 82C832 |
c861 82C861 |
c895 82C895 |
c935 EV1935 ECTIVA MachOne PCI Audio |
d568 82C825 [Firebridge 2] |
d721 IDE [FireStar] |
1046 IPC Corporation, Ltd. |
1047 Genoa Systems Corp |
1048 Elsa AG |
0d22 Quadro4 900XGL [ELSA GLoria4 900XGL] |
1000 QuickStep 1000 |
3000 QuickStep 3000 |
1049 Fountain Technologies, Inc. |
104a SGS Thomson Microelectronics |
0008 STG 2000X |
0009 STG 1764X |
0010 STG4000 [3D Prophet Kyro Series] |
0981 DEC-Tulip compatible 10/100 Ethernet |
1746 STG 1764X |
2774 DEC-Tulip compatible 10/100 Ethernet |
3520 MPEG-II decoder card |
104b BusLogic |
0140 BT-946C (old) [multimaster 01] |
1040 BT-946C (BA80C30) [MultiMaster 10] |
8130 Flashpoint LT |
104c Texas Instruments |
0500 100 MBit LAN Controller |
0508 TMS380C2X Compressor Interface |
1000 Eagle i/f AS |
3d04 TVP4010 [Permedia] |
3d07 TVP4020 [Permedia 2] |
1011 4d10 Comet |
1040 000f AccelStar II |
1040 0011 AccelStar II |
1048 0a31 WINNER 2000 |
1048 0a32 GLoria Synergy |
1048 0a35 GLoria Synergy |
107d 2633 WinFast 3D L2300 |
1092 0127 FIRE GL 1000 PRO |
1092 0136 FIRE GL 1000 PRO |
1092 0141 FIRE GL 1000 PRO |
1092 0146 FIRE GL 1000 PRO |
1092 0148 FIRE GL 1000 PRO |
1092 0149 FIRE GL 1000 PRO |
1092 0152 FIRE GL 1000 PRO |
1092 0154 FIRE GL 1000 PRO |
1092 0155 FIRE GL 1000 PRO |
1092 0156 FIRE GL 1000 PRO |
1092 0157 FIRE GL 1000 PRO |
1097 3d01 Jeronimo Pro |
1102 100f Graphics Blaster Extreme |
3d3d 0100 Reference Permedia 2 3D |
8000 PCILynx/PCILynx2 IEEE 1394 Link Layer Controller |
e4bf 1010 CF1-1-SNARE |
e4bf 1020 CF1-2-SNARE |
8009 FireWire Controller |
104d 8032 8032 OHCI i.LINK (IEEE 1394) Controller |
8017 PCI4410 FireWire Controller |
8019 TSB12LV23 IEEE-1394 Controller |
11bd 000a Studio DV500-1394 |
11bd 000e Studio DV |
e4bf 1010 CF2-1-CYMBAL |
8020 TSB12LV26 IEEE-1394 Controller (Link) |
8021 TSB43AA22 IEEE-1394 Controller (PHY/Link Integrated) |
104d 80df Vaio PCG-FX403 |
104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP |
8022 TSB43AB22 IEEE-1394a-2000 Controller (PHY/Link) |
8023 TSB43AB22/A IEEE-1394a-2000 Controller (PHY/Link) |
8024 TSB43AB23 IEEE-1394a-2000 Controller (PHY/Link) |
8026 TSB43AB21 IEEE-1394a-2000 Controller (PHY/Link) |
8027 PCI4451 IEEE-1394 Controller |
1028 00e6 PCI4451 IEEE-1394 Controller (Dell Inspiron 8100) |
8400 USR2210 22Mbps Wireless PC Card |
a001 TDC1570 |
a100 TDC1561 |
a102 TNETA1575 HyperSAR Plus w/PCI Host i/f & UTOPIA i/f |
a106 TMS320C6205 |
ac10 PCI1050 |
ac11 PCI1053 |
ac12 PCI1130 |
ac13 PCI1031 |
ac15 PCI1131 |
ac16 PCI1250 |
ac17 PCI1220 |
ac18 PCI1260 |
ac19 PCI1221 |
ac1a PCI1210 |
ac1b PCI1450 |
ac1c PCI1225 |
ac1d PCI1251A |
ac1e PCI1211 |
ac1f PCI1251B |
ac20 TI 2030 |
ac21 PCI2031 |
ac22 PCI2032 PCI Docking Bridge |
ac23 PCI2250 PCI-to-PCI Bridge |
ac28 PCI2050 PCI-to-PCI Bridge |
ac30 PCI1260 PC card Cardbus Controller |
ac40 PCI4450 PC card Cardbus Controller |
ac41 PCI4410 PC card Cardbus Controller |
ac42 PCI4451 PC card Cardbus Controller |
1028 00e6 PCI4451 PC card CardBus Controller (Dell Inspiron 8100) |
ac50 PCI1410 PC card Cardbus Controller |
ac51 PCI1420 |
1014 023b ThinkPad T23 (2647-4MG) |
10cf 1095 Lifebook C6155 |
e4bf 1000 CP2-2-HIPHOP |
ac52 PCI1451 PC card Cardbus Controller |
ac53 PCI1421 PC card Cardbus Controller |
ac55 PCI1250 PC card Cardbus Controller |
1014 0512 ThinkPad T30 |
ac60 PCI2040 PCI to DSP Bridge Controller |
fe00 FireWire Host Controller |
fe03 12C01A FireWire Host Controller |
104d Sony Corporation |
8009 CXD1947Q i.LINK Controller |
8039 CXD3222 i.LINK Controller |
8056 Rockwell HCF 56K modem |
808a Memory Stick Controller |
104e Oak Technology, Inc |
0017 OTI-64017 |
0107 OTI-107 [Spitfire] |
0109 Video Adapter |
0111 OTI-64111 [Spitfire] |
0217 OTI-64217 |
0317 OTI-64317 |
104f Co-time Computer Ltd |
1050 Winbond Electronics Corp |
0000 NE2000 |
0001 W83769F |
0105 W82C105 |
0840 W89C840 |
1050 0001 W89C840 Ethernet Adapter |
1050 0840 W89C840 Ethernet Adapter |
0940 W89C940 |
5a5a W89C940F |
6692 W6692 |
9970 W9970CF |
1051 Anigma, Inc. |
1052 ?Young Micro Systems |
1053 Young Micro Systems |
1054 Hitachi, Ltd |
1055 Efar Microsystems |
9130 SLC90E66 [Victory66] IDE |
9460 SLC90E66 [Victory66] ISA |
9462 SLC90E66 [Victory66] USB |
9463 SLC90E66 [Victory66] ACPI |
1056 ICL |
# Motorola made a mistake and used 1507 instead of 1057 in some chips. Please look at the 1507 entry as well when updating this. |
1057 Motorola |
0001 MPC105 [Eagle] |
0002 MPC106 [Grackle] |
0003 MPC8240 [Kahlua] |
0004 MPC107 |
0006 MPC8245 [Unity] |
0100 MC145575 [HFC-PCI] |
0431 KTI829c 100VG |
1801 Audio I/O Controller (MIDI) |
ecc0 0030 Layla |
18c0 MPC8265A/MPC8266 |
4801 Raven |
4802 Falcon |
4803 Hawk |
4806 CPX8216 |
4d68 20268 |
5600 SM56 PCI Modem |
1057 0300 SM56 PCI Speakerphone Modem |
1057 0301 SM56 PCI Voice Modem |
1057 0302 SM56 PCI Fax Modem |
1057 5600 SM56 PCI Voice modem |
13d2 0300 SM56 PCI Speakerphone Modem |
13d2 0301 SM56 PCI Voice modem |
13d2 0302 SM56 PCI Fax Modem |
1436 0300 SM56 PCI Speakerphone Modem |
1436 0301 SM56 PCI Voice modem |
1436 0302 SM56 PCI Fax Modem |
144f 100c SM56 PCI Fax Modem |
1494 0300 SM56 PCI Speakerphone Modem |
1494 0301 SM56 PCI Voice modem |
14c8 0300 SM56 PCI Speakerphone Modem |
14c8 0302 SM56 PCI Fax Modem |
1668 0300 SM56 PCI Speakerphone Modem |
1668 0302 SM56 PCI Fax Modem |
6400 MPC190 Security Processor (S1 family, encryption) |
1058 Electronics & Telecommunications RSH |
1059 Teknor Industrial Computers Inc |
105a Promise Technology, Inc. |
0d30 20265 |
105a 4d33 Ultra100 |
0d38 20263 |
105a 4d39 Fasttrak66 |
1275 20275 |
3376 PDC20376 |
4d30 20267 |
105a 4d33 Ultra100 |
105a 4d39 Fasttrak100 |
4d33 20246 |
105a 4d33 20246 IDE Controller |
4d38 20262 |
105a 4d30 Ultra Device on SuperTrak |
105a 4d33 Ultra66 |
105a 4d39 Fasttrak66 |
4d68 20268 |
105a 4d68 Ultra100TX2 |
4d69 20269 |
5275 PDC20276 IDE |
105a 0275 SuperTrak SX6000 IDE |
5300 DC5300 |
6268 20268R |
6269 PDC20271 |
105a 6269 FastTrak TX2/TX2000 |
6621 PDC20621 [SX4000] 4 Channel IDE RAID Controller |
7275 PDC20277 |
105b Foxconn International, Inc. |
105c Wipro Infotech Limited |
105d Number 9 Computer Company |
2309 Imagine 128 |
2339 Imagine 128-II |
105d 0000 Imagine 128 series 2 4Mb VRAM |
105d 0001 Imagine 128 series 2 4Mb VRAM |
105d 0002 Imagine 128 series 2 4Mb VRAM |
105d 0003 Imagine 128 series 2 4Mb VRAM |
105d 0004 Imagine 128 series 2 4Mb VRAM |
105d 0005 Imagine 128 series 2 4Mb VRAM |
105d 0006 Imagine 128 series 2 4Mb VRAM |
105d 0007 Imagine 128 series 2 4Mb VRAM |
105d 0008 Imagine 128 series 2e 4Mb DRAM |
105d 0009 Imagine 128 series 2e 4Mb DRAM |
105d 000a Imagine 128 series 2 8Mb VRAM |
105d 000b Imagine 128 series 2 8Mb H-VRAM |
11a4 000a Barco Metheus 5 Megapixel |
13cc 0000 Barco Metheus 5 Megapixel |
13cc 0004 Barco Metheus 5 Megapixel |
13cc 0005 Barco Metheus 5 Megapixel |
13cc 0006 Barco Metheus 5 Megapixel |
13cc 0008 Barco Metheus 5 Megapixel |
13cc 0009 Barco Metheus 5 Megapixel |
13cc 000a Barco Metheus 5 Megapixel |
13cc 000c Barco Metheus 5 Megapixel |
493d Imagine 128 T2R [Ticket to Ride] |
11a4 000a Barco Metheus 5 Megapixel, Dual Head |
11a4 000b Barco Metheus 5 Megapixel, Dual Head |
13cc 0002 Barco Metheus 4 Megapixel, Dual Head |
13cc 0003 Barco Metheus 5 Megapixel, Dual Head |
13cc 0007 Barco Metheus 5 Megapixel, Dual Head |
13cc 0008 Barco Metheus 5 Megapixel, Dual Head |
13cc 0009 Barco Metheus 5 Megapixel, Dual Head |
13cc 000a Barco Metheus 5 Megapixel, Dual Head |
5348 Revolution 4 |
105e Vtech Computers Ltd |
105f Infotronic America Inc |
1060 United Microelectronics [UMC] |
0001 UM82C881 |
0002 UM82C886 |
0101 UM8673F |
0881 UM8881 |
0886 UM8886F |
0891 UM8891A |
1001 UM886A |
673a UM8886BF |
673b EIDE Master/DMA |
8710 UM8710 |
886a UM8886A |
8881 UM8881F |
8886 UM8886F |
888a UM8886A |
8891 UM8891A |
9017 UM9017F |
9018 UM9018 |
9026 UM9026 |
e881 UM8881N |
e886 UM8886N |
e88a UM8886N |
e891 UM8891N |
1061 I.I.T. |
0001 AGX016 |
0002 IIT3204/3501 |
1062 Maspar Computer Corp |
1063 Ocean Office Automation |
1064 Alcatel |
1065 Texas Microsystems |
1066 PicoPower Technology |
0000 PT80C826 |
0001 PT86C521 [Vesuvius v1] Host Bridge |
0002 PT86C523 [Vesuvius v3] PCI-ISA Bridge Master |
0003 PT86C524 [Nile] PCI-to-PCI Bridge |
0004 PT86C525 [Nile-II] PCI-to-PCI Bridge |
0005 National PC87550 System Controller |
8002 PT86C523 [Vesuvius v3] PCI-ISA Bridge Slave |
1067 Mitsubishi Electric |
1002 VG500 [VolumePro Volume Rendering Accelerator] |
1068 Diversified Technology |
1069 Mylex Corporation |
0001 DAC960P |
0002 DAC960PD |
0010 DAC960PX |
0050 AcceleRAID 352/170/160 support Device |
ba55 eXtremeRAID 1100 support Device |
ba56 eXtremeRAID 2000/3000 support Device |
106a Aten Research Inc |
106b Apple Computer Inc. |
0001 Bandit PowerPC host bridge |
0002 Grand Central I/O |
0003 Control Video |
0004 PlanB Video-In |
0007 O'Hare I/O |
000e Hydra Mac I/O |
0010 Heathrow Mac I/O |
0017 Paddington Mac I/O |
0018 UniNorth FireWire |
0019 KeyLargo USB |
001e UniNorth Internal PCI |
001f UniNorth PCI |
0020 UniNorth AGP |
0021 UniNorth GMAC (Sun GEM) |
0022 KeyLargo Mac I/O |
0024 UniNorth/Pangea GMAC (Sun GEM) |
0025 KeyLargo/Pangea Mac I/O |
0026 KeyLargo/Pangea USB |
0027 UniNorth/Pangea AGP |
0028 UniNorth/Pangea PCI |
0029 UniNorth/Pangea Internal PCI |
002d UniNorth 1.5 AGP |
002e UniNorth 1.5 PCI |
002f UniNorth 1.5 Internal PCI |
0030 UniNorth/Pangea FireWire |
0031 UniNorth 2 FireWire |
0032 UniNorth 2 GMAC (Sun GEM) |
0033 UniNorth 2 ATA/100 |
0034 UniNorth 2 AGP |
1645 Tigon3 Gigabit Ethernet NIC (BCM5701) |
106c Hyundai Electronics America |
8801 Dual Pentium ISA/PCI Motherboard |
8802 PowerPC ISA/PCI Motherboard |
8803 Dual Window Graphics Accelerator |
8804 LAN Controller |
8805 100-BaseT LAN |
106d Sequent Computer Systems |
106e DFI, Inc |
106f City Gate Development Ltd |
1070 Daewoo Telecom Ltd |
1071 Mitac |
1072 GIT Co Ltd |
1073 Yamaha Corporation |
0001 3D GUI Accelerator |
0002 YGV615 [RPA3 3D-Graphics Controller] |
0003 YMF-740 |
0004 YMF-724 |
1073 0004 YMF724-Based PCI Audio Adapter |
0005 DS1 Audio |
1073 0005 DS-XG PCI Audio CODEC |
0006 DS1 Audio |
0008 DS1 Audio |
1073 0008 DS-XG PCI Audio CODEC |
000a DS1L Audio |
1073 0004 DS-XG PCI Audio CODEC |
1073 000a DS-XG PCI Audio CODEC |
000c YMF-740C [DS-1L Audio Controller] |
107a 000c DS-XG PCI Audio CODEC |
000d YMF-724F [DS-1 Audio Controller] |
1073 000d DS-XG PCI Audio CODEC |
0010 YMF-744B [DS-1S Audio Controller] |
1073 0006 DS-XG PCI Audio CODEC |
1073 0010 DS-XG PCI Audio CODEC |
0012 YMF-754 [DS-1E Audio Controller] |
1073 0012 DS-XG PCI Audio Codec |
0020 DS-1 Audio |
2000 DS2416 Digital Mixing Card |
1073 2000 DS2416 Digital Mixing Card |
1074 NexGen Microsystems |
4e78 82c500/1 |
1075 Advanced Integrations Research |
1076 Chaintech Computer Co. Ltd |
1077 QLogic Corp. |
1016 ISP10160 Single Channel Ultra3 SCSI Processor |
1020 ISP1020 Fast-wide SCSI |
1022 ISP1022 Fast-wide SCSI |
1080 ISP1080 SCSI Host Adapter |
1216 ISP12160 Dual Channel Ultra3 SCSI Processor |
101e 8471 QLA12160 on AMI MegaRAID |
101e 8493 QLA12160 on AMI MegaRAID |
1240 ISP1240 SCSI Host Adapter |
1280 ISP1280 |
2020 ISP2020A Fast!SCSI Basic Adapter |
2100 QLA2100 64-bit Fibre Channel Adapter |
1077 0001 QLA2100 64-bit Fibre Channel Adapter |
2200 QLA2200 |
2300 QLA2300 64-bit FC-AL Adapter |
2312 QLA2312 Fibre Channel Adapter |
1078 Cyrix Corporation |
0000 5510 [Grappa] |
0001 PCI Master |
0002 5520 [Cognac] |
0100 5530 Legacy [Kahlua] |
0101 5530 SMI [Kahlua] |
0102 5530 IDE [Kahlua] |
0103 5530 Audio [Kahlua] |
0104 5530 Video [Kahlua] |
0400 ZFMicro PCI Bridge |
0401 ZFMicro Chipset SMI |
0402 ZFMicro Chipset IDE |
0403 ZFMicro Expansion Bus |
1079 I-Bus |
107a NetWorth |
107b Gateway 2000 |
107c LG Electronics [Lucky Goldstar Co. Ltd] |
107d LeadTek Research Inc. |
0000 P86C850 |
107e Interphase Corporation |
0001 5515 ATM Adapter [Flipper] |
0002 100 VG AnyLan Controller |
0004 5526 Fibre Channel Host Adapter |
0005 x526 Fibre Channel Host Adapter |
0008 5525/5575 ATM Adapter (155 Mbit) [Atlantic] |
9003 5535-4P-BRI-ST |
9007 5535-4P-BRI-U |
9008 5535-1P-SR |
900c 5535-1P-SR-ST |
900e 5535-1P-SR-U |
9011 5535-1P-PRI |
9013 5535-2P-PRI |
9023 5536-4P-BRI-ST |
9027 5536-4P-BRI-U |
9031 5536-1P-PRI |
9033 5536-2P-PRI |
107f Data Technology Corporation |
0802 SL82C105 |
1080 Contaq Microsystems |
0600 82C599 |
c691 Cypress CY82C691 |
c693 82c693 |
1081 Supermac Technology |
0d47 Radius PCI to NuBUS Bridge |
1082 EFA Corporation of America |
1083 Forex Computer Corporation |
0001 FR710 |
1084 Parador |
1085 Tulip Computers Int.B.V. |
1086 J. Bond Computer Systems |
1087 Cache Computer |
1088 Microcomputer Systems (M) Son |
1089 Data General Corporation |
# Formerly Bit3 Computer Corp. |
108a SBS Technologies |
0001 VME Bridge Model 617 |
0010 VME Bridge Model 618 |
0040 dataBLIZZARD |
3000 VME Bridge Model 2706 |
108c Oakleigh Systems Inc. |
108d Olicom |
0001 Token-Ring 16/4 PCI Adapter (3136/3137) |
0002 16/4 Token Ring |
0004 RapidFire 3139 Token-Ring 16/4 PCI Adapter |
108d 0004 OC-3139/3140 RapidFire Token-Ring 16/4 Adapter |
0005 GoCard 3250 Token-Ring 16/4 CardBus PC Card |
0006 OC-3530 RapidFire Token-Ring 100 |
0007 RapidFire 3141 Token-Ring 16/4 PCI Fiber Adapter |
108d 0007 OC-3141 RapidFire Token-Ring 16/4 Adapter |
0008 RapidFire 3540 HSTR 100/16/4 PCI Adapter |
108d 0008 OC-3540 RapidFire HSTR 100/16/4 Adapter |
0011 OC-2315 |
0012 OC-2325 |
0013 OC-2183/2185 |
0014 OC-2326 |
0019 OC-2327/2250 10/100 Ethernet Adapter |
108d 0016 OC-2327 Rapidfire 10/100 Ethernet Adapter |
108d 0017 OC-2250 GoCard 10/100 Ethernet Adapter |
0021 OC-6151/6152 [RapidFire ATM 155] |
0022 ATM Adapter |
108e Sun Microsystems Computer Corp. |
0001 EBUS |
1000 EBUS |
1001 Happy Meal |
1100 RIO EBUS |
1101 RIO GEM |
1102 RIO 1394 |
1103 RIO USB |
2bad GEM |
5000 Simba Advanced PCI Bridge |
5043 SunPCI Co-processor |
8000 Psycho PCI Bus Module |
8001 Schizo PCI Bus Module |
a000 Ultra IIi |
a001 Ultra IIe |
a801 Tomatillo PCI Bus Module |
108f Systemsoft |
1090 Encore Computer Corporation |
1091 Intergraph Corporation |
0020 3D graphics processor |
0021 3D graphics processor w/Texturing |
0040 3D graphics frame buffer |
0041 3D graphics frame buffer |
0060 Proprietary bus bridge |
00e4 Powerstorm 4D50T |
0720 Motion JPEG codec |
1092 Diamond Multimedia Systems |
00a0 Speedstar Pro SE |
00a8 Speedstar 64 |
0550 Viper V550 |
08d4 Supra 2260 Modem |
094c SupraExpress 56i Pro |
1092 Viper V330 |
6120 Maximum DVD |
8810 Stealth SE |
8811 Stealth 64/SE |
8880 Stealth |
8881 Stealth |
88b0 Stealth 64 |
88b1 Stealth 64 |
88c0 Stealth 64 |
88c1 Stealth 64 |
88d0 Stealth 64 |
88d1 Stealth 64 |
88f0 Stealth 64 |
88f1 Stealth 64 |
9999 DMD-I0928-1 "Monster sound" sound chip |
1093 National Instruments |
0160 PCI-DIO-96 |
0162 PCI-MIO-16XE-50 |
1170 PCI-MIO-16XE-10 |
1180 PCI-MIO-16E-1 |
1190 PCI-MIO-16E-4 |
1330 PCI-6031E |
1350 PCI-6071E |
2a60 PCI-6023E |
b001 IMAQ-PCI-1408 |
b011 IMAQ-PXI-1408 |
b021 IMAQ-PCI-1424 |
b031 IMAQ-PCI-1413 |
b041 IMAQ-PCI-1407 |
b051 IMAQ-PXI-1407 |
b061 IMAQ-PCI-1411 |
b071 IMAQ-PCI-1422 |
b081 IMAQ-PXI-1422 |
b091 IMAQ-PXI-1411 |
c801 PCI-GPIB |
c831 PCI-GPIB bridge |
1094 First International Computers [FIC] |
1095 CMD Technology Inc |
0640 PCI0640 |
0643 PCI0643 |
0646 PCI0646 |
0647 PCI0647 |
0648 PCI0648 |
0649 PCI0649 |
0e11 005d Integrated Ultra ATA-100 Dual Channel Controller |
0e11 007e Integrated Ultra ATA-100 IDE RAID Controller |
101e 0649 AMI MegaRAID IDE 100 Controller |
0650 PBC0650A |
0670 USB0670 |
1095 0670 USB0670 |
0673 USB0673 |
0680 PCI0680 |
1096 Alacron |
1097 Appian Technology |
1098 Quantum Designs (H.K.) Ltd |
0001 QD-8500 |
0002 QD-8580 |
1099 Samsung Electronics Co., Ltd |
109a Packard Bell |
109b Gemlight Computer Ltd. |
109c Megachips Corporation |
109d Zida Technologies Ltd. |
109e Brooktree Corporation |
0350 Bt848 Video Capture |
0351 Bt849A Video capture |
0369 Bt878 Video Capture |
1002 0001 TV-Wonder |
1002 0003 TV-Wonder/VE |
036c Bt879(??) Video Capture |
13e9 0070 Win/TV (Video Section) |
036e Bt878 Video Capture |
0070 13eb WinTV/GO |
0070 ff01 Viewcast Osprey 200 |
11bd 001c PCTV Sat (DBC receiver) |
127a 0001 Bt878 Mediastream Controller NTSC |
127a 0002 Bt878 Mediastream Controller PAL BG |
127a 0003 Bt878a Mediastream Controller PAL BG |
127a 0048 Bt878/832 Mediastream Controller |
144f 3000 MagicTView CPH060 - Video |
1461 0004 AVerTV WDM Video Capture |
14f1 0001 Bt878 Mediastream Controller NTSC |
14f1 0002 Bt878 Mediastream Controller PAL BG |
14f1 0003 Bt878a Mediastream Controller PAL BG |
14f1 0048 Bt878/832 Mediastream Controller |
1851 1850 FlyVideo'98 - Video |
1851 1851 FlyVideo II |
1852 1852 FlyVideo'98 - Video (with FM Tuner) |
bd11 1200 PCTV pro (TV + FM stereo receiver) |
036f Bt879 Video Capture |
127a 0044 Bt879 Video Capture NTSC |
127a 0122 Bt879 Video Capture PAL I |
127a 0144 Bt879 Video Capture NTSC |
127a 0222 Bt879 Video Capture PAL BG |
127a 0244 Bt879a Video Capture NTSC |
127a 0322 Bt879 Video Capture NTSC |
127a 0422 Bt879 Video Capture NTSC |
127a 1122 Bt879 Video Capture PAL I |
127a 1222 Bt879 Video Capture PAL BG |
127a 1322 Bt879 Video Capture NTSC |
127a 1522 Bt879a Video Capture PAL I |
127a 1622 Bt879a Video Capture PAL BG |
127a 1722 Bt879a Video Capture NTSC |
14f1 0044 Bt879 Video Capture NTSC |
14f1 0122 Bt879 Video Capture PAL I |
14f1 0144 Bt879 Video Capture NTSC |
14f1 0222 Bt879 Video Capture PAL BG |
14f1 0244 Bt879a Video Capture NTSC |
14f1 0322 Bt879 Video Capture NTSC |
14f1 0422 Bt879 Video Capture NTSC |
14f1 1122 Bt879 Video Capture PAL I |
14f1 1222 Bt879 Video Capture PAL BG |
14f1 1322 Bt879 Video Capture NTSC |
14f1 1522 Bt879a Video Capture PAL I |
14f1 1622 Bt879a Video Capture PAL BG |
14f1 1722 Bt879a Video Capture NTSC |
1851 1850 FlyVideo'98 - Video |
1851 1851 FlyVideo II |
1852 1852 FlyVideo'98 - Video (with FM Tuner) |
0370 Bt880 Video Capture |
1851 1850 FlyVideo'98 |
1851 1851 FlyVideo'98 EZ - video |
1852 1852 FlyVideo'98 (with FM Tuner) |
0878 Bt878 Audio Capture |
0070 13eb WinTV/GO |
0070 ff01 Viewcast Osprey 200 |
1002 0001 TV-Wonder |
1002 0003 TV-Wonder/VE |
11bd 001c PCTV Sat (DBC receiver) |
127a 0001 Bt878 Video Capture (Audio Section) |
127a 0002 Bt878 Video Capture (Audio Section) |
127a 0003 Bt878 Video Capture (Audio Section) |
127a 0048 Bt878 Video Capture (Audio Section) |
13e9 0070 Win/TV (Audio Section) |
144f 3000 MagicTView CPH060 - Audio |
1461 0004 AVerTV WDM Audio Capture |
14f1 0001 Bt878 Video Capture (Audio Section) |
14f1 0002 Bt878 Video Capture (Audio Section) |
14f1 0003 Bt878 Video Capture (Audio Section) |
14f1 0048 Bt878 Video Capture (Audio Section) |
bd11 1200 PCTV pro (TV + FM stereo receiver, audio section) |
0879 Bt879 Audio Capture |
127a 0044 Bt879 Video Capture (Audio Section) |
127a 0122 Bt879 Video Capture (Audio Section) |
127a 0144 Bt879 Video Capture (Audio Section) |
127a 0222 Bt879 Video Capture (Audio Section) |
127a 0244 Bt879 Video Capture (Audio Section) |
127a 0322 Bt879 Video Capture (Audio Section) |
127a 0422 Bt879 Video Capture (Audio Section) |
127a 1122 Bt879 Video Capture (Audio Section) |
127a 1222 Bt879 Video Capture (Audio Section) |
127a 1322 Bt879 Video Capture (Audio Section) |
127a 1522 Bt879 Video Capture (Audio Section) |
127a 1622 Bt879 Video Capture (Audio Section) |
127a 1722 Bt879 Video Capture (Audio Section) |
14f1 0044 Bt879 Video Capture (Audio Section) |
14f1 0122 Bt879 Video Capture (Audio Section) |
14f1 0144 Bt879 Video Capture (Audio Section) |
14f1 0222 Bt879 Video Capture (Audio Section) |
14f1 0244 Bt879 Video Capture (Audio Section) |
14f1 0322 Bt879 Video Capture (Audio Section) |
14f1 0422 Bt879 Video Capture (Audio Section) |
14f1 1122 Bt879 Video Capture (Audio Section) |
14f1 1222 Bt879 Video Capture (Audio Section) |
14f1 1322 Bt879 Video Capture (Audio Section) |
14f1 1522 Bt879 Video Capture (Audio Section) |
14f1 1622 Bt879 Video Capture (Audio Section) |
14f1 1722 Bt879 Video Capture (Audio Section) |
0880 Bt880 Audio Capture |
2115 BtV 2115 Mediastream controller |
2125 BtV 2125 Mediastream controller |
2164 BtV 2164 |
2165 BtV 2165 |
8230 Bt8230 ATM Segment/Reassembly Ctrlr (SRC) |
8472 Bt8472 |
8474 Bt8474 |
109f Trigem Computer Inc. |
10a0 Meidensha Corporation |
10a1 Juko Electronics Ind. Co. Ltd |
10a2 Quantum Corporation |
10a3 Everex Systems Inc |
10a4 Globe Manufacturing Sales |
10a5 Smart Link Ltd. |
5449 SmartPCI561 modem |
10a6 Informtech Industrial Ltd. |
10a7 Benchmarq Microelectronics |
10a8 Sierra Semiconductor |
0000 STB Horizon 64 |
10a9 Silicon Graphics, Inc. |
0001 Crosstalk to PCI Bridge |
0002 Linc I/O controller |
0003 IOC3 I/O controller |
0004 O2 MACE |
0005 RAD Audio |
0006 HPCEX |
0007 RPCEX |
0008 DiVO VIP |
0009 Alteon Gigabit Ethernet |
0010 AMP Video I/O |
0011 GRIP |
0012 SGH PSHAC GSN |
1001 Magic Carpet |
1002 Lithium |
1003 Dual JPEG 1 |
1004 Dual JPEG 2 |
1005 Dual JPEG 3 |
1006 Dual JPEG 4 |
1007 Dual JPEG 5 |
1008 Cesium |
2001 Fibre Channel |
2002 ASDE |
8001 O2 1394 |
8002 G-net NT |
10aa ACC Microelectronics |
0000 ACCM 2188 |
10ab Digicom |
10ac Honeywell IAC |
10ad Symphony Labs |
0001 W83769F |
0003 SL82C103 |
0005 SL82C105 |
0103 SL82c103 |
0105 SL82c105 |
0565 W83C553 |
10ae Cornerstone Technology |
10af Micro Computer Systems Inc |
10b0 CardExpert Technology |
10b1 Cabletron Systems Inc |
10b2 Raytheon Company |
10b3 Databook Inc |
3106 DB87144 |
b106 DB87144 |
10b4 STB Systems Inc |
1b1d Velocity 128 3D |
10b4 237e Velocity 4400 |
10b5 PLX Technology, Inc. |
0001 i960 PCI bus interface |
1076 VScom 800 8 port serial adaptor |
1077 VScom 400 4 port serial adaptor |
1078 VScom 210 2 port serial and 1 port parallel adaptor |
1103 VScom 200 2 port serial adaptor |
1146 VScom 010 1 port parallel adaptor |
1147 VScom 020 2 port parallel adaptor |
2724 Thales PCSM Security Card |
9030 PCI <-> IOBus Bridge Hot Swap |
15ed 1002 MCCS 8-port Serial Hot Swap |
15ed 1003 MCCS 16-port Serial Hot Swap |
9036 9036 |
9050 PCI <-> IOBus Bridge |
10b5 2036 SatPak GPS |
10b5 2273 SH-ARC SoHard ARCnet card |
10b5 9050 MP9050 |
1522 0001 RockForce 4 Port V.90 Data/Fax/Voice Modem |
1522 0002 RockForce 2 Port V.90 Data/Fax/Voice Modem |
1522 0003 RockForce 6 Port V.90 Data/Fax/Voice Modem |
1522 0004 RockForce 8 Port V.90 Data/Fax/Voice Modem |
1522 0010 RockForce2000 4 Port V.90 Data/Fax/Voice Modem |
1522 0020 RockForce2000 2 Port V.90 Data/Fax/Voice Modem |
15ed 1000 Macrolink MCCS 8-port Serial |
15ed 1001 Macrolink MCCS 16-port Serial |
15ed 1002 Macrolink MCCS 8-port Serial Hot Swap |
15ed 1003 Macrolink MCCS 16-port Serial Hot Swap |
d531 c002 PCIntelliCAN 2xSJA1000 CAN bus |
d84d 4006 EX-4006 1P |
d84d 4008 EX-4008 1P EPP/ECP |
d84d 4014 EX-4014 2P |
d84d 4018 EX-4018 3P EPP/ECP |
d84d 4025 EX-4025 1S(16C550) RS-232 |
d84d 4027 EX-4027 1S(16C650) RS-232 |
d84d 4028 EX-4028 1S(16C850) RS-232 |
d84d 4036 EX-4036 2S(16C650) RS-232 |
d84d 4037 EX-4037 2S(16C650) RS-232 |
d84d 4038 EX-4038 2S(16C850) RS-232 |
d84d 4052 EX-4052 1S(16C550) RS-422/485 |
d84d 4053 EX-4053 2S(16C550) RS-422/485 |
d84d 4055 EX-4055 4S(16C550) RS-232 |
d84d 4058 EX-4055 4S(16C650) RS-232 |
d84d 4065 EX-4065 8S(16C550) RS-232 |
d84d 4068 EX-4068 8S(16C650) RS-232 |
d84d 4078 EX-4078 2S(16C552) RS-232+1P |
9054 PCI <-> IOBus Bridge |
10b5 2455 Wessex Techology PHIL-PCI |
9060 9060 |
906d 9060SD |
125c 0640 Aries 16000P |
906e 9060ES |
9080 9080 |
10b5 9080 9080 [real subsystem ID not set] |
129d 0002 Aculab PCI Prosidy card |
10b6 Madge Networks |
0001 Smart 16/4 PCI Ringnode |
0002 Smart 16/4 PCI Ringnode Mk2 |
10b6 0002 Smart 16/4 PCI Ringnode Mk2 |
10b6 0006 16/4 CardBus Adapter |
0003 Smart 16/4 PCI Ringnode Mk3 |
0e11 b0fd Compaq NC4621 PCI, 4/16, WOL |
10b6 0003 Smart 16/4 PCI Ringnode Mk3 |
10b6 0007 Presto PCI Plus Adapter |
0004 Smart 16/4 PCI Ringnode Mk1 |
0006 16/4 Cardbus Adapter |
10b6 0006 16/4 CardBus Adapter |
0007 Presto PCI Adapter |
10b6 0007 Presto PCI |
0009 Smart 100/16/4 PCI-HS Ringnode |
10b6 0009 Smart 100/16/4 PCI-HS Ringnode |
000a Smart 100/16/4 PCI Ringnode |
10b6 000a Smart 100/16/4 PCI Ringnode |
000b 16/4 CardBus Adapter Mk2 |
10b6 0008 16/4 CardBus Adapter Mk2 |
10b6 000b 16/4 Cardbus Adapter Mk2 |
000c RapidFire 3140V2 16/4 TR Adapter |
10b6 000c RapidFire 3140V2 16/4 TR Adapter |
1000 Collage 25/155 ATM Client Adapter |
1001 Collage 155 ATM Server Adapter |
10b7 3Com Corporation |
0001 3c985 1000BaseSX (SX/TX) |
1006 MINI PCI type 3B Data Fax Modem |
1007 Mini PCI 56k Winmodem |
10b7 615c Mini PCI 56K Modem |
1700 Gigabit Ethernet Adapter |
10b7 0010 3Com 3C940 Gigabit LOM Ethernet Adapter |
10b7 0020 3Com 3C941 Gigabit LOM Ethernet Adapter |
3390 3c339 TokenLink Velocity |
3590 3c359 TokenLink Velocity XL |
10b7 3590 TokenLink Velocity XL Adapter (3C359/359B) |
4500 3c450 Cyclone/unknown |
5055 3c555 Laptop Hurricane |
5057 3c575 [Megahertz] 10/100 LAN CardBus |
10b7 5a57 3C575 Megahertz 10/100 LAN Cardbus PC Card |
5157 3c575 [Megahertz] 10/100 LAN CardBus |
10b7 5b57 3C575 Megahertz 10/100 LAN Cardbus PC Card |
5257 3CCFE575CT Cyclone CardBus |
10b7 5c57 FE575C-3Com 10/100 LAN CardBus-Fast Ethernet |
5900 3c590 10BaseT [Vortex] |
5920 3c592 EISA 10mbps Demon/Vortex |
5950 3c595 100BaseTX [Vortex] |
5951 3c595 100BaseT4 [Vortex] |
5952 3c595 100Base-MII [Vortex] |
5970 3c597 EISA Fast Demon/Vortex |
5b57 3c595 [Megahertz] 10/100 LAN CardBus |
10b7 5b57 3C575 Megahertz 10/100 LAN Cardbus PC Card |
6055 3c556 Hurricane CardBus |
6056 3c556B Hurricane CardBus |
10b7 6556 10/100 Mini PCI Ethernet Adapter |
6560 3CCFE656 Cyclone CardBus |
10b7 656a 3CCFEM656 10/100 LAN+56K Modem CardBus |
6561 3CCFEM656 10/100 LAN+56K Modem CardBus |
10b7 656b 3CCFEM656 10/100 LAN+56K Modem CardBus |
6562 3CCFEM656 [id 6562] Cyclone CardBus |
10b7 656b 3CCFEM656B 10/100 LAN+56K Modem CardBus |
6563 3CCFEM656B 10/100 LAN+56K Modem CardBus |
10b7 656b 3CCFEM656 10/100 LAN+56K Modem CardBus |
6564 3CCFEM656 [id 6564] Cyclone CardBus |
7646 3cSOHO100-TX Hurricane |
7940 3c803 FDDILink UTP Controller |
7980 3c804 FDDILink SAS Controller |
7990 3c805 FDDILink DAS Controller |
8811 Token ring |
9000 3c900 10BaseT [Boomerang] |
9001 3c900 Combo [Boomerang] |
9004 3c900B-TPO [Etherlink XL TPO] |
10b7 9004 3C900B-TPO Etherlink XL TPO 10Mb |
9005 3c900B-Combo [Etherlink XL Combo] |
10b7 9005 3C900B-Combo Etherlink XL Combo |
9006 3c900B-TPC [Etherlink XL TPC] |
900a 3c900B-FL [Etherlink XL FL] |
9050 3c905 100BaseTX [Boomerang] |
9051 3c905 100BaseT4 [Boomerang] |
9055 3c905B 100BaseTX [Cyclone] |
1028 0080 3C905B Fast Etherlink XL 10/100 |
1028 0081 3C905B Fast Etherlink XL 10/100 |
1028 0082 3C905B Fast Etherlink XL 10/100 |
1028 0083 3C905B Fast Etherlink XL 10/100 |
1028 0084 3C905B Fast Etherlink XL 10/100 |
1028 0085 3C905B Fast Etherlink XL 10/100 |
1028 0086 3C905B Fast Etherlink XL 10/100 |
1028 0087 3C905B Fast Etherlink XL 10/100 |
1028 0088 3C905B Fast Etherlink XL 10/100 |
1028 0089 3C905B Fast Etherlink XL 10/100 |
1028 0090 3C905B Fast Etherlink XL 10/100 |
1028 0091 3C905B Fast Etherlink XL 10/100 |
1028 0092 3C905B Fast Etherlink XL 10/100 |
1028 0093 3C905B Fast Etherlink XL 10/100 |
1028 0094 3C905B Fast Etherlink XL 10/100 |
1028 0095 3C905B Fast Etherlink XL 10/100 |
1028 0096 3C905B Fast Etherlink XL 10/100 |
1028 0097 3C905B Fast Etherlink XL 10/100 |
1028 0098 3C905B Fast Etherlink XL 10/100 |
1028 0099 3C905B Fast Etherlink XL 10/100 |
10b7 9055 3C905B Fast Etherlink XL 10/100 |
9056 3c905B-T4 [Fast EtherLink XL 10/100] |
9058 3c905B-Combo [Deluxe Etherlink XL 10/100] |
905a 3c905B-FX [Fast Etherlink XL FX 10/100] |
9200 3c905C-TX/TX-M [Tornado] |
1028 0095 Integrated 3C905C-TX Fast Etherlink for PC Management NIC |
10b7 1000 3C905C-TX Fast Etherlink for PC Management NIC |
10b7 7000 10/100 Mini PCI Ethernet Adapter |
9210 3C920B-EMB-WNM Integrated Fast Ethernet Controller |
9300 3CSOHO100B-TX [910-A01] |
9800 3c980-TX [Fast Etherlink XL Server Adapter] |
10b7 9800 3c980-TX Fast Etherlink XL Server Adapter |
9805 3c980-TX 10/100baseTX NIC [Python-T] |
10b7 1201 3c982-TXM 10/100baseTX Dual Port A [Hydra] |
10b7 1202 3c982-TXM 10/100baseTX Dual Port B [Hydra] |
10b7 9805 3c980 10/100baseTX NIC [Python-T] |
9900 3C990-TX [Typhoon] |
9902 3CR990-TX-95 [Typhoon 56-bit] |
9903 3CR990-TX-97 [Typhoon 168-bit] |
9904 3C990B-TX-M/3C990BSVR [Typhoon2] |
10b7 1000 3CR990B-TX-M [Typhoon2] |
10b7 2000 3CR990BSVR [Typhoon2 Server] |
9905 3CR990-FX-95/97/95 [Typhon Fiber] |
10b7 1101 3CR990-FX-95 [Typhoon Fiber 56-bit] |
10b7 1102 3CR990-FX-97 [Typhoon Fiber 168-bit] |
10b7 2101 3CR990-FX-95 Server [Typhoon Fiber 56-bit] |
10b7 2102 3CR990-FX-97 Server [Typhoon Fiber 168-bit] |
9908 3CR990SVR95 [Typhoon Server 56-bit] |
9909 3CR990SVR97 [Typhoon Server 168-bit] |
990b 3C990SVR [Typhoon Server] |
10b8 Standard Microsystems Corp [SMC] |
0005 83C170QF |
1055 e000 LANEPIC 10/100 [EVB171Q-PCI] |
1055 e002 LANEPIC 10/100 [EVB171G-PCI] |
10b8 a011 EtherPower II 10/100 |
10b8 a014 EtherPower II 10/100 |
10b8 a015 EtherPower II 10/100 |
10b8 a016 EtherPower II 10/100 |
10b8 a017 EtherPower II 10/100 |
0006 LANEPIC |
1055 e100 LANEPIC Cardbus Fast Ethernet Adapter |
1055 e102 LANEPIC Cardbus Fast Ethernet Adapter |
1055 e300 LANEPIC Cardbus Fast Ethernet Adapter |
1055 e302 LANEPIC Cardbus Fast Ethernet Adapter |
10b8 a012 LANEPIC Cardbus Fast Ethernet Adapter |
13a2 8002 LANEPIC Cardbus Fast Ethernet Adapter |
13a2 8006 LANEPIC Cardbus Fast Ethernet Adapter |
1000 FDC 37c665 |
1001 FDC 37C922 |
a011 83C170QF |
b106 SMC34C90 |
10b9 ALi Corporation |
0111 C-Media CMI8738/C3DX Audio Device (OEM) |
10b9 0111 C-Media CMI8738/C3DX Audio Device (OEM) |
1435 M1435 |
1445 M1445 |
1449 M1449 |
1451 M1451 |
1461 M1461 |
1489 M1489 |
1511 M1511 [Aladdin] |
1512 M1512 [Aladdin] |
1513 M1513 [Aladdin] |
1521 M1521 [Aladdin III] |
10b9 1521 ALI M1521 Aladdin III CPU Bridge |
1523 M1523 |
10b9 1523 ALI M1523 ISA Bridge |
1531 M1531 [Aladdin IV] |
1533 M1533 PCI to ISA Bridge [Aladdin IV] |
10b9 1533 ALI M1533 Aladdin IV ISA Bridge |
1541 M1541 |
10b9 1541 ALI M1541 Aladdin V/V+ AGP System Controller |
1543 M1543 |
1563 M1563 HyperTransport South Bridge |
1621 M1621 |
1631 ALI M1631 PCI North Bridge Aladdin Pro III |
1632 M1632M Northbridge+Trident |
1641 ALI M1641 PCI North Bridge Aladdin Pro IV |
1644 M1644/M1644T Northbridge+Trident |
1646 M1646 Northbridge+Trident |
1647 M1647 Northbridge [MAGiK 1 / MobileMAGiK 1] |
1651 M1651/M1651T Northbridge [Aladdin-Pro 5/5M,Aladdin-Pro 5T/5TM] |
1671 M1671 Super P4 Northbridge [AGP4X,PCI and SDR/DDR] |
1681 M1681 P4 Northbridge [AGP8X,HyperTransport and SDR/DDR] |
1687 M1687 K8 Northbridge [AGP8X and HyperTransport] |
3141 M3141 |
3143 M3143 |
3145 M3145 |
3147 M3147 |
3149 M3149 |
3151 M3151 |
3307 M3307 |
3309 M3309 |
5212 M4803 |
5215 MS4803 |
5217 M5217H |
5219 M5219 |
5225 M5225 |
5229 M5229 IDE |
1043 8053 A7A266 Motherboard IDE |
5235 M5225 |
5237 USB 1.1 Controller |
5239 USB 2.0 Controller |
5243 M1541 PCI to AGP Controller |
5247 PCI to AGP Controller |
5249 M5249 HTT to PCI Bridge |
5251 M5251 P1394 OHCI 1.0 Controller |
5253 M5253 P1394 OHCI 1.1 Controller |
5261 M5261 Ethernet Controller |
5451 M5451 PCI AC-Link Controller Audio Device |
1014 0506 ThinkPad R30 |
5453 M5453 PCI AC-Link Controller Modem Device |
5455 M5455 PCI AC-Link Controller Audio Device |
5457 M5457 AC-Link Modem Interface Controller |
5459 SmartPCI561 56K Modem |
5471 M5471 Memory Stick Controller |
5473 M5473 SD-MMC Controller |
7101 M7101 PMU |
10b9 7101 ALI M7101 Power Management Controller |
10ba Mitsubishi Electric Corp. |
0301 AccelGraphics AccelECLIPSE |
10bb Dapha Electronics Corporation |
10bc Advanced Logic Research |
10bd Surecom Technology |
0e34 NE-34 |
10be Tseng Labs International Co. |
10bf Most Inc |
10c0 Boca Research Inc. |
10c1 ICM Co., Ltd. |
10c2 Auspex Systems Inc. |
10c3 Samsung Semiconductors, Inc. |
1100 Smartether100 SC1100 LAN Adapter (i82557B) |
10c4 Award Software International Inc. |
10c5 Xerox Corporation |
10c6 Rambus Inc. |
10c7 Media Vision |
10c8 Neomagic Corporation |
0001 NM2070 [MagicGraph 128] |
0002 NM2090 [MagicGraph 128V] |
0003 NM2093 [MagicGraph 128ZV] |
0004 NM2160 [MagicGraph 128XD] |
1014 00ba MagicGraph 128XD |
1025 1007 MagicGraph 128XD |
1028 0074 MagicGraph 128XD |
1028 0075 MagicGraph 128XD |
1028 007d MagicGraph 128XD |
1028 007e MagicGraph 128XD |
1033 802f MagicGraph 128XD |
104d 801b MagicGraph 128XD |
104d 802f MagicGraph 128XD |
104d 830b MagicGraph 128XD |
10ba 0e00 MagicGraph 128XD |
10c8 0004 MagicGraph 128XD |
10cf 1029 MagicGraph 128XD |
10f7 8308 MagicGraph 128XD |
10f7 8309 MagicGraph 128XD |
10f7 830b MagicGraph 128XD |
10f7 830d MagicGraph 128XD |
10f7 8312 MagicGraph 128XD |
0005 NM2200 [MagicGraph 256AV] |
1014 00dd ThinkPad 570 |
0006 NM2360 [MagicMedia 256ZX] |
0016 NM2380 [MagicMedia 256XL+] |
10c8 0016 MagicMedia 256XL+ |
0025 NM2230 [MagicGraph 256AV+] |
0083 NM2093 [MagicGraph 128ZV+] |
8005 NM2200 [MagicMedia 256AV Audio] |
0e11 b0d1 MagicMedia 256AV Audio Device on Discovery |
0e11 b126 MagicMedia 256AV Audio Device on Durango |
1014 00dd MagicMedia 256AV Audio Device on BlackTip Thinkpad |
1025 1003 MagicMedia 256AV Audio Device on TravelMate 720 |
1028 008f MagicMedia 256AV Audio Device on Colorado Inspiron |
103c 0007 MagicMedia 256AV Audio Device on Voyager II |
103c 0008 MagicMedia 256AV Audio Device on Voyager III |
103c 000d MagicMedia 256AV Audio Device on Omnibook 900 |
10c8 8005 MagicMedia 256AV Audio Device on FireAnt |
110a 8005 MagicMedia 256AV Audio Device |
14c0 0004 MagicMedia 256AV Audio Device |
8006 NM2360 [MagicMedia 256ZX Audio] |
8016 NM2380 [MagicMedia 256XL+ Audio] |
10c9 Dataexpert Corporation |
10ca Fujitsu Microelectr., Inc. |
10cb Omron Corporation |
10cc Mentor ARC Inc |
10cd Advanced System Products, Inc |
1100 ASC1100 |
1200 ASC1200 [(abp940) Fast SCSI-II] |
1300 ABP940-U / ABP960-U |
10cd 1310 ASC1300 SCSI Adapter |
2300 ABP940-UW |
2500 ABP940-U2W |
10ce Radius |
10cf Citicorp TTI |
2001 mb86605 |
10d0 Fujitsu Limited |
10d1 FuturePlus Systems Corp. |
10d2 Molex Incorporated |
10d3 Jabil Circuit Inc |
10d4 Hualon Microelectronics |
10d5 Autologic Inc. |
10d6 Cetia |
10d7 BCM Advanced Research |
10d8 Advanced Peripherals Labs |
10d9 Macronix, Inc. [MXIC] |
0512 MX98713 |
0531 MX987x5 |
1186 1200 DFE-540TX ProFAST 10/100 Adapter |
8625 MX86250 |
8888 MX86200 |
10da Compaq IPG-Austin |
0508 TC4048 Token Ring 4/16 |
3390 Tl3c3x9 |
10db Rohm LSI Systems, Inc. |
10dc CERN/ECP/EDU |
0001 STAR/RD24 SCI-PCI (PMC) |
0002 TAR/RD24 SCI-PCI (PMC) |
0021 HIPPI destination |
0022 HIPPI source |
10dc ATT2C15-3 FPGA |
10dd Evans & Sutherland |
10de nVidia Corporation |
0008 NV1 [EDGE 3D] |
0009 NV1 [EDGE 3D] |
0010 NV2 [Mutara V08] |
0020 NV4 [Riva TnT] |
1043 0200 V3400 TNT |
1048 0c18 Erazor II SGRAM |
1048 0c1b Erazor II |
1092 0550 Viper V550 |
1092 0552 Viper V550 |
1092 4804 Viper V550 |
1092 4808 Viper V550 |
1092 4810 Viper V550 |
1092 4812 Viper V550 |
1092 4815 Viper V550 |
1092 4820 Viper V550 with TV out |
1092 4822 Viper V550 |
1092 4904 Viper V550 |
1092 4914 Viper V550 |
1092 8225 Viper V550 |
10b4 273d Velocity 4400 |
10b4 273e Velocity 4400 |
10b4 2740 Velocity 4400 |
10de 0020 Riva TNT |
1102 1015 Graphics Blaster CT6710 |
1102 1016 Graphics Blaster RIVA TNT |
0028 NV5 [Riva TnT2] |
1043 0200 AGP-V3800 SGRAM |
1043 0201 AGP-V3800 SDRAM |
1043 0205 PCI-V3800 |
1043 4000 AGP-V3800PRO |
1092 4804 Viper V770 |
1092 4a00 Viper V770 |
1092 4a02 Viper V770 Ultra |
1092 5a00 RIVA TNT2/TNT2 Pro |
1092 6a02 Viper V770 Ultra |
1092 7a02 Viper V770 Ultra |
10de 0005 RIVA TNT2 Pro |
10de 000f Compaq NVIDIA TNT2 Pro |
1102 1020 3D Blaster RIVA TNT2 |
1102 1026 3D Blaster RIVA TNT2 Digital |
14af 5810 Maxi Gamer Xentor |
0029 NV5 [Riva TnT2 Ultra] |
1043 0200 AGP-V3800 Deluxe |
1043 0201 AGP-V3800 Ultra SDRAM |
1043 0205 PCI-V3800 Ultra |
1102 1021 3D Blaster RIVA TNT2 Ultra |
1102 1029 3D Blaster RIVA TNT2 Ultra |
1102 102f 3D Blaster RIVA TNT2 Ultra |
14af 5820 Maxi Gamer Xentor 32 |
002a NV5 [Riva TnT2] |
002b NV5 [Riva TnT2] |
002c NV6 [Vanta] |
1043 0200 AGP-V3800 Combat SDRAM |
1043 0201 AGP-V3800 Combat |
1092 6820 Viper V730 |
1102 1031 CT6938 VANTA 8MB |
1102 1034 CT6894 VANTA 16MB |
14af 5008 Maxi Gamer Phoenix 2 |
002d RIVA TNT2 Model 64 |
1043 0200 AGP-V3800M |
1043 0201 AGP-V3800M |
1048 0c3a Erazor III LT |
1102 1023 CT6892 RIVA TNT2 Value |
1102 1024 CT6932 RIVA TNT2 Value 32Mb |
1102 102c CT6931 RIVA TNT2 Value [Jumper] |
1462 8808 MSI-8808 |
1554 1041 PixelView RIVA TNT2 M64 32MB |
002e NV6 [Vanta] |
002f NV6 [Vanta] |
00a0 NV5 [Riva TNT2] |
14af 5810 Maxi Gamer Xentor |
0100 NV10 [GeForce 256 SDR] |
1043 0200 AGP-V6600 SGRAM |
1043 0201 AGP-V6600 SDRAM |
1043 4008 AGP-V6600 SGRAM |
1043 4009 AGP-V6600 SDRAM |
1102 102d CT6941 GeForce 256 |
14af 5022 3D Prophet SE |
0101 NV10 [GeForce 256 DDR] |
1043 0202 AGP-V6800 DDR |
1043 400a AGP-V6800 DDR SGRAM |
1043 400b AGP-V6800 DDR SDRAM |
1102 102e CT6971 GeForce 256 DDR |
14af 5021 3D Prophet DDR-DVI |
0103 NV10 [Quadro] |
0110 NV11 [GeForce2 MX] |
1043 4015 AGP-V7100 Pro |
1043 4031 V7100 Pro with TV output |
14af 7102 3D Prophet II MX |
14af 7103 3D Prophet II MX Dual-Display |
0111 NV11 [GeForce2 MX DDR] |
0112 NV11 [GeForce2 Go] |
0113 NV11 [GeForce2 MXR] |
0150 NV15 [GeForce2 GTS] |
1043 4016 V7700 AGP Video Card |
107d 2840 WinFast GeForce2 GTS with TV output |
1462 8831 Creative GeForce2 Pro |
0151 NV15 [GeForce2 Ti] |
1043 405f V7700Ti |
0152 NV15 [GeForce2 Ultra, Bladerunner] |
1048 0c56 GLADIAC Ultra |
0153 NV15 [Quadro2 Pro] |
0170 NV17 [GeForce4 MX460] |
0171 NV17 [GeForce4 MX440] |
1462 8661 G4MX440-VTP |
0172 NV17 [GeForce4 MX420] |
0173 NV1x |
0174 NV17 [GeForce4 440 Go] |
0175 NV17 [GeForce4 420 Go] |
0176 NV17 [GeForce4 420 Go 32M] |
0178 Quadro4 500XGL |
0179 NV17 [GeForce4 440 Go 64M] |
017a Quadro4 200/400NVS |
017b Quadro4 550XGL |
017c Quadro4 550 GoGL |
0181 NV18 [GeForce4 MX440 AGP 8x] |
01a0 NV15 [GeForce2 - nForce GPU] |
01a4 nForce CPU bridge |
01ab nForce 420 Memory Controller (DDR) |
01ac nForce 220/420 Memory Controller |
01ad nForce 220/420 Memory Controller |
01b1 nForce Audio |
01b2 nForce ISA Bridge |
01b4 nForce PCI System Management |
01b7 nForce AGP to PCI Bridge |
01b8 nForce PCI-to-PCI bridge |
01bc nForce IDE |
01c1 nForce MC97 Modem (Smart Link HAMR5600 compatible) |
01c2 nForce USB Controller |
01c3 nForce Ethernet Controller |
0200 NV20 [GeForce3] |
1043 402f AGP-V8200 DDR |
0201 NV20 [GeForce3 Ti200] |
0202 NV20 [GeForce3 Ti500] |
1043 405b V8200 T5 |
1545 002f Xtasy 6964 |
0203 NV20 [Quadro DCC] |
0250 NV25 [GeForce4 Ti4600] |
0251 NV25 [GeForce4 Ti4400] |
0253 NV25 [GeForce4 Ti4200] |
107d 2896 WinFast A250 LE TD (Dual VGA/TV-out/DVI) |
147b 8f09 Siluro (Dual VGA/TV-out/DVI) |
0258 Quadro4 900XGL |
0259 Quadro4 750XGL |
025b Quadro4 700XGL |
10df Emulex Corporation |
1ae5 LP6000 Fibre Channel Host Adapter |
f085 LP850 Fibre Channel Adapter |
f095 LP952 Fibre Channel Adapter |
f098 LP982 Fibre Channel Adapter |
f700 LP7000 Fibre Channel Host Adapter |
f800 LP8000 Fibre Channel Host Adapter |
f900 LP9000 Fibre Channel Host Adapter |
f980 LP9802 Fibre Channel Adapter |
10e0 Integrated Micro Solutions Inc. |
5026 IMS5026/27/28 |
5027 IMS5027 |
5028 IMS5028 |
8849 IMS8849 |
8853 IMS8853 |
9128 IMS9128 [Twin turbo 128] |
10e1 Tekram Technology Co.,Ltd. |
0391 TRM-S1040 |
10e1 0391 DC-315U SCSI-3 Host Adapter |
690c DC-690c |
dc29 DC-290 |
10e2 Aptix Corporation |
10e3 Tundra Semiconductor Corp. |
0000 CA91C042 [Universe] |
0860 CA91C860 [QSpan] |
10e4 Tandem Computers |
10e5 Micro Industries Corporation |
10e6 Gainbery Computer Products Inc. |
10e7 Vadem |
10e8 Applied Micro Circuits Corp. |
2011 Q-Motion Video Capture/Edit board |
4750 S5930 [Matchmaker] |
5920 S5920 |
8043 LANai4.x [Myrinet LANai interface chip] |
8062 S5933_PARASTATION |
807d S5933 [Matchmaker] |
8088 Kongsberg Spacetec Format Synchronizer |
8089 Kongsberg Spacetec Serial Output Board |
809c S5933_HEPC3 |
80d7 PCI-9112 |
80d9 PCI-9118 |
80da PCI-9812 |
811a PCI-IEEE1355-DS-DE Interface |
8170 S5933 [Matchmaker] (Chipset Development Tool) |
82db AJA HDNTV HD SDI Framestore |
10e9 Alps Electric Co., Ltd. |
10ea Intergraphics Systems |
1680 IGA-1680 |
1682 IGA-1682 |
1683 IGA-1683 |
2000 CyberPro 2000 |
2010 CyberPro 2000A |
5000 CyberPro 5000 |
5050 CyberPro 5050 |
10eb Artists Graphics |
0101 3GA |
8111 Twist3 Frame Grabber |
10ec Realtek Semiconductor Co., Ltd. |
8029 RTL-8029(AS) |
10b8 2011 EZ-Card (SMC1208) |
10ec 8029 RTL-8029(AS) |
1113 1208 EN1208 |
1186 0300 DE-528 |
1259 2400 AT-2400 |
8129 RTL-8129 |
10ec 8129 RT8129 Fast Ethernet Adapter |
8138 RT8139 (B/C) Cardbus Fast Ethernet Adapter |
10ec 8138 RT8139 (B/C) Fast Ethernet Adapter |
8139 RTL-8139/8139C/8139C+ |
1025 8920 ALN-325 |
1025 8921 ALN-325 |
10bd 0320 EP-320X-R |
10ec 8139 RT8139 |
1186 1300 DFE-538TX |
1186 1320 SN5200 |
1186 8139 DRN-32TX |
11f6 8139 FN22-3(A) LinxPRO Ethernet Adapter |
1259 2500 AT-2500TX |
1259 2503 AT-2500TX/ACPI |
1429 d010 ND010 |
1432 9130 EN-9130TX |
1436 8139 RT8139 |
146c 1439 FE-1439TX |
1489 6001 GF100TXRII |
1489 6002 GF100TXRA |
149c 139a LFE-8139ATX |
149c 8139 LFE-8139TX |
2646 0001 EtheRx |
8e2e 7000 KF-230TX |
8e2e 7100 KF-230TX/2 |
a0a0 0007 ALN-325C |
8169 RTL-8169 |
8197 SmartLAN56 56K Modem |
10ed Ascii Corporation |
7310 V7310 |
10ee Xilinx Corporation |
3fc0 RME Digi96 |
3fc1 RME Digi96/8 |
3fc2 RME Digi96/8 Pro |
3fc3 RME Digi96/8 Pad |
3fc4 RME Digi9652 (Hammerfall) |
3fc5 RME Hammerfall DSP |
10ef Racore Computer Products, Inc. |
8154 M815x Token Ring Adapter |
10f0 Peritek Corporation |
10f1 Tyan Computer |
10f2 Achme Computer, Inc. |
10f3 Alaris, Inc. |
10f4 S-MOS Systems, Inc. |
10f5 NKK Corporation |
a001 NDR4000 [NR4600 Bridge] |
10f6 Creative Electronic Systems SA |
10f7 Matsushita Electric Industrial Co., Ltd. |
10f8 Altos India Ltd |
10f9 PC Direct |
10fa Truevision |
000c TARGA 1000 |
10fb Thesys Gesellschaft für Mikroelektronik mbH |
186f TH 6255 |
10fc I-O Data Device, Inc. |
# What's in the cardbus end of a Sony ACR-A01 card, comes with newer Vaio CD-RW drives |
0003 Cardbus IDE Controller |
0005 Cardbus SCSI CBSC II |
10fd Soyo Computer, Inc |
10fe Fast Multimedia AG |
10ff NCube |
1100 Jazz Multimedia |
1101 Initio Corporation |
1060 INI-A100U2W |
9100 INI-9100/9100W |
9400 INI-940 |
9401 INI-950 |
9500 360P |
1102 Creative Labs |
0002 SB Live! EMU10k1 |
1102 0020 CT4850 SBLive! Value |
1102 0021 CT4620 SBLive! |
1102 002f SBLive! mainboard implementation |
1102 4001 E-mu APS |
1102 8022 CT4780 SBLive! Value |
1102 8023 CT4790 SoundBlaster PCI512 |
1102 8024 CT4760 SBLive! |
1102 8025 SBLive! Mainboard Implementation |
1102 8026 CT4830 SBLive! Value |
1102 8027 CT4832 SBLive! Value |
1102 8028 CT4760 SBLive! OEM version |
1102 8031 CT4831 SBLive! Value |
1102 8040 CT4760 SBLive! |
1102 8051 CT4850 SBLive! Value |
1102 8061 SBLive! Player 5.1 |
0004 SB Audigy |
1102 0051 SB0090 Audigy Player |
1102 0053 SB0090 Audigy Player/OEM |
0006 [SB Live! Value] EMU10k1X |
4001 SB Audigy FireWire Port |
1102 0010 SB Audigy FireWire Port |
7002 SB Live! MIDI/Game Port |
1102 0020 Gameport Joystick |
7003 SB Audigy MIDI/Game port |
1102 0040 SB Audigy MIDI/Game Port |
7004 [SB Live! Value] Input device controller |
8938 ES1371 |
1103 Triones Technologies, Inc. |
0003 HPT343 |
# Revisions: 01=HPT366, 03=HPT370, 04=HPT370A, 05=HPT372 |
0004 HPT366/368/370/370A/372 |
1103 0001 HPT370A |
1103 0005 HPT370 UDMA100 |
0005 HPT372A |
0006 HPT302 |
0007 HPT371 |
0008 HPT374 |
1104 RasterOps Corp. |
1105 Sigma Designs, Inc. |
1105 REALmagic Xcard MPEG 1/2/3/4 DVD Decoder |
8300 REALmagic Hollywood Plus DVD Decoder |
8400 EM840x REALmagic DVD/MPEG-2 Audio/Video Decoder |
1106 VIA Technologies, Inc. |
0102 Embedded VIA Ethernet Controller |
0130 VT6305 1394.A Controller |
0305 VT8363/8365 [KT133/KM133] |
1043 8033 A7V Mainboard |
1043 8042 A7V133/A7V133-C Mainboard |
147b a401 KT7/KT7-RAID/KT7A/KT7A-RAID Mainboard |
0391 VT8371 [KX133] |
0501 VT8501 [Apollo MVP4] |
0505 VT82C505 |
0561 VT82C561 |
0571 VT82C586/B/686A/B PIPC Bus Master IDE |
1043 8052 VT8233A Bus Master ATA100/66/33 IDE |
1106 0571 VT8235 Bus Master ATA133/100/66/33 IDE |
1458 5002 GA-7VAX Mainboard |
0576 VT82C576 3V [Apollo Master] |
0585 VT82C585VP [Apollo VP1/VPX] |
0586 VT82C586/A/B PCI-to-ISA [Apollo VP] |
1106 0000 MVP3 ISA Bridge |
0595 VT82C595 [Apollo VP2] |
0596 VT82C596 ISA [Mobile South] |
1106 0000 VT82C596/A/B PCI to ISA Bridge |
1458 0596 VT82C596/A/B PCI to ISA Bridge |
0597 VT82C597 [Apollo VP3] |
0598 VT82C598 [Apollo MVP3] |
0601 VT8601 [Apollo ProMedia] |
0605 VT8605 [ProSavage PM133] |
0680 VT82C680 [Apollo P6] |
0686 VT82C686 [Apollo Super South] |
1043 8033 A7V Mainboard |
1043 8040 A7M266 Mainboard |
1043 8042 A7V133/A7V133-C Mainboard |
1106 0000 VT82C686/A PCI to ISA Bridge |
1106 0686 VT82C686/A PCI to ISA Bridge |
0691 VT82C693A/694x [Apollo PRO133x] |
1458 0691 VT82C691 Apollo Pro System Controller |
0693 VT82C693 [Apollo Pro Plus] |
0698 VT82C693A [Apollo Pro133 AGP] |
0926 VT82C926 [Amazon] |
1000 VT82C570MV |
1106 VT82C570MV |
1571 VT82C416MV |
1595 VT82C595/97 [Apollo VP2/97] |
3038 USB |
0925 1234 MVP3 USB Controller |
3040 VT82C586B ACPI |
3043 VT86C100A [Rhine] |
10bd 0000 VT86C100A Fast Ethernet Adapter |
1106 0100 VT86C100A Fast Ethernet Adapter |
1186 1400 DFE-530TX rev A |
3044 IEEE 1394 Host Controller |
3050 VT82C596 Power Management |
3051 VT82C596 Power Management |
3057 VT82C686 [Apollo Super ACPI] |
1043 8033 A7V Mainboard |
1043 8040 A7M266 Mainboard |
1043 8042 A7V133/A7V133-C Mainboard |
3058 VT82C686 AC97 Audio Controller |
0e11 b194 Soundmax integrated digital audio |
1106 4511 Onboard Audio on EP7KXA |
1458 7600 Onboard Audio |
1462 3091 MS-6309 Onboard Audio |
15dd 7609 Onboard Audio |
3059 VT8233 AC97 Audio Controller |
1458 a002 GA-7VAX Onboard Audio (Realtek ALC650) |
3065 VT6102 [Rhine-II] |
1106 0102 VT6102 [Rhine II] Embeded Ethernet Controller on VT8235 |
1186 1400 DFE-530TX rev A |
1186 1401 DFE-530TX rev B |
3068 AC97 Modem Controller |
3074 VT8233 PCI to ISA Bridge |
1043 8052 VT8233A |
3091 VT8633 [Apollo Pro266] |
3099 VT8366/A/7 [Apollo KT266/A/333] |
1043 8064 A7V266-E Mainboard |
1043 807f A7V333 Mainboard |
3101 VT8653 Host Bridge |
3102 VT8662 Host Bridge |
3103 VT8615 Host Bridge |
3104 USB 2.0 |
1458 5004 GA-7VAX Mainboard |
3106 VT6105 [Rhine-III] |
3109 VT8233C PCI to ISA Bridge |
3112 VT8361 [KLE133] Host Bridge |
3116 VT8375 [KM266] Host Bridge |
3128 VT8753 [P4X266 AGP] |
3133 VT3133 Host Bridge |
3147 VT8233A ISA Bridge |
3148 P4M266 Host Bridge |
3156 P/KN266 Host Bridge |
3168 VT8374 P4X400 Host Controller/AGP Bridge |
3177 VT8235 ISA Bridge |
1458 5001 GA-7VAX Mainboard |
3189 VT8377 [KT400 AGP] Host Bridge |
1458 5000 GA-7VAX Mainboard |
5030 VT82C596 ACPI [Apollo PRO] |
6100 VT85C100A [Rhine II] |
8231 VT8231 [PCI-to-ISA Bridge] |
8235 VT8235 ACPI |
8305 VT8363/8365 [KT133/KM133 AGP] |
8391 VT8371 [KX133 AGP] |
8501 VT8501 [Apollo MVP4 AGP] |
8596 VT82C596 [Apollo PRO AGP] |
8597 VT82C597 [Apollo VP3 AGP] |
8598 VT82C598/694x [Apollo MVP3/Pro133x AGP] |
8601 VT8601 [Apollo ProMedia AGP] |
8605 VT8605 [PM133 AGP] |
8691 VT82C691 [Apollo Pro] |
8693 VT82C693 [Apollo Pro Plus] PCI Bridge |
b091 VT8633 [Apollo Pro266 AGP] |
b099 VT8366/A/7 [Apollo KT266/A/333 AGP] |
b101 VT8653 AGP Bridge |
b102 VT8362 AGP Bridge |
b103 VT8615 AGP Bridge |
b112 VT8361 [KLE133] AGP Bridge |
b168 VT8235 PCI Bridge |
1107 Stratus Computers |
0576 VIA VT82C570MV [Apollo] (Wrong vendor ID!) |
1108 Proteon, Inc. |
0100 p1690plus_AA |
0101 p1690plus_AB |
0105 P1690Plus |
0108 P1690Plus |
0138 P1690Plus |
0139 P1690Plus |
013c P1690Plus |
013d P1690Plus |
1109 Cogent Data Technologies, Inc. |
1400 EM110TX [EX110TX] |
110a Siemens Nixdorf AG |
0002 Pirahna 2-port |
0005 Tulip controller, power management, switch extender |
2102 DSCC4 WAN adapter |
4942 FPGA I-Bus Tracer for MBD |
6120 SZB6120 |
110b Chromatic Research Inc. |
0001 Mpact Media Processor |
0004 Mpact 2 |
110c Mini-Max Technology, Inc. |
110d Znyx Advanced Systems |
110e CPU Technology |
110f Ross Technology |
1110 Powerhouse Systems |
6037 Firepower Powerized SMP I/O ASIC |
6073 Firepower Powerized SMP I/O ASIC |
1111 Santa Cruz Operation |
# Also claimed to be RNS or Rockwell International, current PCISIG records list Osicom |
1112 Osicom Technologies Inc |
2200 FDDI Adapter |
2300 Fast Ethernet Adapter |
2340 4 Port Fast Ethernet Adapter |
2400 ATM Adapter |
1113 Accton Technology Corporation |
1211 SMC2-1211TX |
103c 1207 EN-1207D Fast Ethernet Adapter |
1113 1211 EN-1207D Fast Ethernet Adapter |
1216 EN-1216 Ethernet Adapter |
111a 1020 SpeedStream 1020 PCI 10/100 Ethernet Adaptor [EN-1207F-TX ?] |
1217 EN-1217 Ethernet Adapter |
5105 10Mbps Network card |
9211 EN-1207D Fast Ethernet Adapter |
1113 9211 EN-1207D Fast Ethernet Adapter |
9511 Fast Ethernet Adapter |
1114 Atmel Corporation |
1115 3D Labs |
1116 Data Translation |
0022 DT3001 |
0023 DT3002 |
0024 DT3003 |
0025 DT3004 |
0026 DT3005 |
0027 DT3001-PGL |
0028 DT3003-PGL |
1117 Datacube, Inc |
9500 Max-1C SVGA card |
9501 Max-1C image processing |
1118 Berg Electronics |
1119 ICP Vortex Computersysteme GmbH |
0000 GDT 6000/6020/6050 |
0001 GDT 6000B/6010 |
0002 GDT 6110/6510 |
0003 GDT 6120/6520 |
0004 GDT 6530 |
0005 GDT 6550 |
0006 GDT 6x17 |
0007 GDT 6x27 |
0008 GDT 6537 |
0009 GDT 6557 |
000a GDT 6115/6515 |
000b GDT 6125/6525 |
000c GDT 6535 |
000d GDT 6555 |
0100 GDT 6117RP/6517RP |
0101 GDT 6127RP/6527RP |
0102 GDT 6537RP |
0103 GDT 6557RP |
0104 GDT 6111RP/6511RP |
0105 GDT 6121RP/6521RP |
0110 GDT 6117RD/6517RD |
0111 GDT 6127RD/6527RD |
0112 GDT 6537RD |
0113 GDT 6557RD |
0114 GDT 6111RD/6511RD |
0115 GDT 6121RD/6521RD |
0118 GDT 6118RD/6518RD/6618RD |
0119 GDT 6128RD/6528RD/6628RD |
011a GDT 6538RD/6638RD |
011b GDT 6558RD/6658RD |
0120 GDT 6117RP2/6517RP2 |
0121 GDT 6127RP2/6527RP2 |
0122 GDT 6537RP2 |
0123 GDT 6557RP2 |
0124 GDT 6111RP2/6511RP2 |
0125 GDT 6121RP2/6521RP2 |
0136 GDT 6113RS/6513RS |
0137 GDT 6123RS/6523RS |
0138 GDT 6118RS/6518RS/6618RS |
0139 GDT 6128RS/6528RS/6628RS |
013a GDT 6538RS/6638RS |
013b GDT 6558RS/6658RS |
013c GDT 6533RS/6633RS |
013d GDT 6543RS/6643RS |
013e GDT 6553RS/6653RS |
013f GDT 6563RS/6663RS |
0166 GDT 7113RN/7513RN/7613RN |
0167 GDT 7123RN/7523RN/7623RN |
0168 GDT 7118RN/7518RN/7518RN |
0169 GDT 7128RN/7528RN/7628RN |
016a GDT 7538RN/7638RN |
016b GDT 7558RN/7658RN |
016c GDT 7533RN/7633RN |
016d GDT 7543RN/7643RN |
016e GDT 7553RN/7653RN |
016f GDT 7563RN/7663RN |
01d6 GDT 4x13RZ |
01d7 GDT 4x23RZ |
01f6 GDT 8x13RZ |
01f7 GDT 8x23RZ |
01fc GDT 8x33RZ |
01fd GDT 8x43RZ |
01fe GDT 8x53RZ |
01ff GDT 8x63RZ |
0210 GDT 6519RD/6619RD |
0211 GDT 6529RD/6629RD |
0260 GDT 7519RN/7619RN |
0261 GDT 7529RN/7629RN |
0300 GDT Raid Controller |
111a Efficient Networks, Inc |
0000 155P-MF1 (FPGA) |
0002 155P-MF1 (ASIC) |
0003 ENI-25P ATM |
111a 0000 ENI-25p Miniport ATM Adapter |
0005 SpeedStream (LANAI) |
111a 0001 ENI-3010 ATM |
111a 0009 ENI-3060 ADSL (VPI=0) |
111a 0101 ENI-3010 ATM |
111a 0109 ENI-3060CO ADSL (VPI=0) |
111a 0809 ENI-3060 ADSL (VPI=0 or 8) |
111a 0909 ENI-3060CO ADSL (VPI=0 or 8) |
111a 0a09 ENI-3060 ADSL (VPI=<0..15>) |
0007 SpeedStream ADSL |
111a 1001 ENI-3061 ADSL [ASIC] |
111b Teledyne Electronic Systems |
111c Tricord Systems Inc. |
0001 Powerbis Bridge |
111d Integrated Device Tech |
0001 IDT77211 ATM Adapter |
0003 IDT77252 ATM network controller |
111e Eldec |
111f Precision Digital Images |
4a47 Precision MX Video engine interface |
5243 Frame capture bus interface |
1120 EMC Corporation |
1121 Zilog |
1122 Multi-tech Systems, Inc. |
1123 Excellent Design, Inc. |
1124 Leutron Vision AG |
1125 Eurocore |
1126 Vigra |
1127 FORE Systems Inc |
0200 ForeRunner PCA-200 ATM |
0210 PCA-200PC |
0250 ATM |
0300 ForeRunner PCA-200EPC ATM |
0310 ATM |
0400 ForeRunnerHE ATM Adapter |
1127 0400 ForeRunnerHE ATM |
1129 Firmworks |
112a Hermes Electronics Company, Ltd. |
112b Linotype - Hell AG |
112c Zenith Data Systems |
112d Ravicad |
112e Infomedia Microelectronics Inc. |
112f Imaging Technology Inc |
0000 MVC IC-PCI |
0001 MVC IM-PCI Video frame grabber/processor |
1130 Computervision |
1131 Philips Semiconductors |
3400 SmartPCI56(UCB1500) 56K Modem |
7130 SAA7130 Video Broadcast Decoder |
# PCI audio and video broadcast decoder (http://www.semiconductors.philips.com/pip/saa7134hl) |
7134 SAA7134 |
7145 SAA7145 |
7146 SAA7146 |
114b 2003 DVRaptor Video Edit/Capture Card |
11bd 0006 DV500 Overlay |
11bd 000a DV500 Overlay |
1132 Mitel Corp. |
1133 Eicon Technology Corporation |
7901 EiconCard S90 |
7902 EiconCard S90 |
7911 EiconCard S91 |
7912 EiconCard S91 |
7941 EiconCard S94 |
7942 EiconCard S94 |
7943 EiconCard S94 |
7944 EiconCard S94 |
b921 EiconCard P92 |
b922 EiconCard P92 |
b923 EiconCard P92 |
e001 DIVA 20PRO |
1133 e001 DIVA Pro 2.0 S/T |
e002 DIVA 20 |
1133 e002 DIVA 2.0 S/T |
e003 DIVA 20PRO_U |
1133 e003 DIVA Pro 2.0 U |
e004 DIVA 20_U |
1133 e004 DIVA 2.0 U |
e005 DIVA LOW |
1133 e005 DIVA 2.01 S/T |
e00b Eicon Diva 2.02 |
e010 DIVA Server BRI-2M |
1133 e010 DIVA Server BRI-2M |
e012 DIVA Server BRI-8M |
1133 e012 DIVA Server BRI-8M |
e014 DIVA Server PRI-30M |
1133 e014 DIVA Server PRI-30M |
e018 DIVA Server BRI-2M/-2F |
1134 Mercury Computer Systems |
0001 Raceway Bridge |
1135 Fuji Xerox Co Ltd |
0001 Printer controller |
1136 Momentum Data Systems |
1137 Cisco Systems Inc |
1138 Ziatech Corporation |
8905 8905 [STD 32 Bridge] |
1139 Dynamic Pictures, Inc |
0001 VGA Compatable 3D Graphics |
113a FWB Inc |
113b Network Computing Devices |
113c Cyclone Microsystems, Inc. |
0000 PCI-9060 i960 Bridge |
0001 PCI-SDK [PCI i960 Evaluation Platform] |
0911 PCI-911 [i960Jx-based Intelligent I/O Controller] |
0912 PCI-912 [i960CF-based Intelligent I/O Controller] |
0913 PCI-913 |
0914 PCI-914 [I/O Controller w/ secondary PCI bus] |
113d Leading Edge Products Inc |
113e Sanyo Electric Co - Computer Engineering Dept |
113f Equinox Systems, Inc. |
0808 SST-64P Adapter |
1010 SST-128P Adapter |
80c0 SST-16P DB Adapter |
80c4 SST-16P RJ Adapter |
80c8 SST-16P Adapter |
8888 SST-4P Adapter |
9090 SST-8P Adapter |
1140 Intervoice Inc |
1141 Crest Microsystem Inc |
1142 Alliance Semiconductor Corporation |
3210 AP6410 |
6422 ProVideo 6422 |
6424 ProVideo 6424 |
6425 ProMotion AT25 |
643d ProMotion AT3D |
1143 NetPower, Inc |
1144 Cincinnati Milacron |
0001 Noservo controller |
1145 Workbit Corporation |
8007 NinjaSCSI-32 Workbit |
f007 NinjaSCSI-32 KME |
f010 NinjaSCSI-32 Workbit |
f012 NinjaSCSI-32 Logitec |
f013 NinjaSCSI-32 Logitec |
f015 NinjaSCSI-32 Melco |
1146 Force Computers |
1147 Interface Corp |
1148 Syskonnect (Schneider & Koch) |
4000 FDDI Adapter |
0e11 b03b Netelligent 100 FDDI DAS Fibre SC |
0e11 b03c Netelligent 100 FDDI SAS Fibre SC |
0e11 b03d Netelligent 100 FDDI DAS UTP |
0e11 b03e Netelligent 100 FDDI SAS UTP |
0e11 b03f Netelligent 100 FDDI SAS Fibre MIC |
1148 5521 FDDI SK-5521 (SK-NET FDDI-UP) |
1148 5522 FDDI SK-5522 (SK-NET FDDI-UP DAS) |
1148 5541 FDDI SK-5541 (SK-NET FDDI-FP) |
1148 5543 FDDI SK-5543 (SK-NET FDDI-LP) |
1148 5544 FDDI SK-5544 (SK-NET FDDI-LP DAS) |
1148 5821 FDDI SK-5821 (SK-NET FDDI-UP64) |
1148 5822 FDDI SK-5822 (SK-NET FDDI-UP64 DAS) |
1148 5841 FDDI SK-5841 (SK-NET FDDI-FP64) |
1148 5843 FDDI SK-5843 (SK-NET FDDI-LP64) |
1148 5844 FDDI SK-5844 (SK-NET FDDI-LP64 DAS) |
4200 Token Ring adapter |
4300 SK-98xx Gigabit Ethernet Server Adapter |
1148 9821 SK-9821 Gigabit Ethernet Server Adapter (SK-NET GE-T) |
1148 9822 SK-9822 Gigabit Ethernet Server Adapter (SK-NET GE-T dual link) |
1148 9841 SK-9841 Gigabit Ethernet Server Adapter (SK-NET GE-LX) |
1148 9842 SK-9842 Gigabit Ethernet Server Adapter (SK-NET GE-LX dual link) |
1148 9843 SK-9843 Gigabit Ethernet Server Adapter (SK-NET GE-SX) |
1148 9844 SK-9844 Gigabit Ethernet Server Adapter (SK-NET GE-SX dual link) |
1148 9861 SK-9861 Gigabit Ethernet Server Adapter (SK-NET GE-SX Volition) |
1148 9862 SK-9862 Gigabit Ethernet Server Adapter (SK-NET GE-SX Volition dual link) |
1148 9871 SK-9871 Gigabit Ethernet Server Adapter (SK-NET GE-ZX) |
1148 9872 SK-9872 Gigabit Ethernet Server Adapter (SK-NET GE-ZX dual link) |
1259 2970 Allied Telesyn AT-2970SX Gigabit Ethernet Adapter |
1259 2971 Allied Telesyn AT-2970LX Gigabit Ethernet Adapter |
1259 2972 Allied Telesyn AT-2970TX Gigabit Ethernet Adapter |
1259 2973 Allied Telesyn AT-2971SX Gigabit Ethernet Adapter |
1259 2974 Allied Telesyn AT-2971T Gigabit Ethernet Adapter |
1259 2975 Allied Telesyn AT-2970SX/2SC Gigabit Ethernet Adapter |
1259 2976 Allied Telesyn AT-2970LX/2SC Gigabit Ethernet Adapter |
1259 2977 Allied Telesyn AT-2970TX/2TX Gigabit Ethernet Adapter |
4320 SK-98xx V2.0 Gigabit Ethernet Adapter |
1148 0121 Marvell RDK-8001 Adapter |
1148 0221 Marvell RDK-8002 Adapter |
1148 0321 Marvell RDK-8003 Adapter |
1148 0421 Marvell RDK-8004 Adapter |
1148 0621 Marvell RDK-8006 Adapter |
1148 0721 Marvell RDK-8007 Adapter |
1148 0821 Marvell RDK-8008 Adapter |
1148 0921 Marvell RDK-8009 Adapter |
1148 1121 Marvell RDK-8011 Adapter |
1148 1221 Marvell RDK-8012 Adapter |
1148 3221 SK-9521 V2.0 10/100/1000Base-T Adapter |
1148 5021 SK-9821 V2.0 Gigabit Ethernet 10/100/1000Base-T Adapter |
1148 5041 SK-9841 V2.0 Gigabit Ethernet 1000Base-LX Adapter |
1148 5043 SK-9843 V2.0 Gigabit Ethernet 1000Base-SX Adapter |
1148 5051 SK-9851 V2.0 Gigabit Ethernet 1000Base-SX Adapter |
1148 5061 SK-9861 V2.0 Gigabit Ethernet 1000Base-SX Adapter |
1148 5071 SK-9871 V2.0 Gigabit Ethernet 1000Base-ZX Adapter |
1148 9521 SK-9521 10/100/1000Base-T Adapter |
4400 SK-9Dxx Gigabit Ethernet Adapter |
4500 SK-9Mxx Gigabit Ethernet Adapter |
1149 Win System Corporation |
114a VMIC |
5579 VMIPCI-5579 (Reflective Memory Card) |
5587 VMIPCI-5587 (Reflective Memory Card) |
6504 VMIC PCI 7755 FPGA |
7587 VMIVME-7587 |
114b Canopus Co., Ltd |
114c Annabooks |
114d IC Corporation |
114e Nikon Systems Inc |
114f Digi International |
0002 AccelePort EPC |
0003 RightSwitch SE-6 |
0004 AccelePort Xem |
0005 AccelePort Xr |
0006 AccelePort Xr,C/X |
0009 AccelePort Xr/J |
000a AccelePort EPC/J |
000c DataFirePRIme T1 (1-port) |
000d SyncPort 2-Port (x.25/FR) |
0011 AccelePort 8r EIA-232 (IBM) |
0012 AccelePort 8r EIA-422 |
0013 AccelePort Xr |
0014 AccelePort 8r EIA-422 |
0015 AccelePort Xem |
0016 AccelePort EPC/X |
0017 AccelePort C/X |
001a DataFirePRIme E1 (1-port) |
001b AccelePort C/X (IBM) |
001d DataFire RAS T1/E1/PRI |
114f 0050 DataFire RAS E1 Adapter |
114f 0051 DataFire RAS Dual E1 Adapter |
114f 0052 DataFire RAS T1 Adapter |
114f 0053 DataFire RAS Dual T1 Adapter |
0023 AccelePort RAS |
0024 DataFire RAS B4 ST/U |
114f 0030 DataFire RAS BRI U Adapter |
114f 0031 DataFire RAS BRI S/T Adapter |
0026 AccelePort 4r 920 |
0027 AccelePort Xr 920 |
0034 AccelePort 2r 920 |
0035 DataFire DSP T1/E1/PRI cPCI |
0040 AccelePort Xp |
0042 AccelePort 2p PCI |
0070 Datafire Micro V IOM2 (Europe) |
0071 Datafire Micro V (Europe) |
0072 Datafire Micro V IOM2 (North America) |
0073 Datafire Micro V (North America) |
6001 Avanstar |
1150 Thinking Machines Corp |
1151 JAE Electronics Inc. |
1152 Megatek |
1153 Land Win Electronic Corp |
1154 Melco Inc |
1155 Pine Technology Ltd |
1156 Periscope Engineering |
1157 Avsys Corporation |
1158 Voarx R & D Inc |
3011 Tokenet/vg 1001/10m anylan |
9050 Lanfleet/Truevalue |
9051 Lanfleet/Truevalue |
1159 Mutech Corp |
0001 MV-1000 |
115a Harlequin Ltd |
115b Parallax Graphics |
115c Photron Ltd. |
115d Xircom |
0003 Cardbus Ethernet 10/100 |
1014 0181 10/100 EtherJet Cardbus Adapter |
1014 1181 10/100 EtherJet Cardbus Adapter |
1014 8181 10/100 EtherJet Cardbus Adapter |
1014 9181 10/100 EtherJet Cardbus Adapter |
115d 0181 Cardbus Ethernet 10/100 |
115d 1181 Cardbus Ethernet 10/100 |
1179 0181 Cardbus Ethernet 10/100 |
8086 8181 EtherExpress PRO/100 Mobile CardBus 32 Adapter |
8086 9181 EtherExpress PRO/100 Mobile CardBus 32 Adapter |
0005 Cardbus Ethernet 10/100 |
1014 0182 10/100 EtherJet Cardbus Adapter |
1014 1182 10/100 EtherJet Cardbus Adapter |
115d 0182 Cardbus Ethernet 10/100 |
115d 1182 Cardbus Ethernet 10/100 |
0007 Cardbus Ethernet 10/100 |
1014 0182 10/100 EtherJet Cardbus Adapter |
1014 1182 10/100 EtherJet Cardbus Adapter |
115d 0182 Cardbus Ethernet 10/100 |
115d 1182 Cardbus Ethernet 10/100 |
000b Cardbus Ethernet 10/100 |
1014 0183 10/100 EtherJet Cardbus Adapter |
115d 0183 Cardbus Ethernet 10/100 |
000c Mini-PCI V.90 56k Modem |
000f Cardbus Ethernet 10/100 |
1014 0183 10/100 EtherJet Cardbus Adapter |
115d 0183 Cardbus Ethernet 10/100 |
0101 Cardbus 56k modem |
115d 1081 Cardbus 56k Modem |
0103 Cardbus Ethernet + 56k Modem |
1014 9181 Cardbus 56k Modem |
1115 1181 Cardbus Ethernet 100 + 56k Modem |
115d 1181 CBEM56G-100 Ethernet + 56k Modem |
8086 9181 PRO/100 LAN + Modem56 CardBus |
115e Peer Protocols Inc |
115f Maxtor Corporation |
1160 Megasoft Inc |
1161 PFU Limited |
1162 OA Laboratory Co Ltd |
1163 Rendition |
0001 Verite 1000 |
2000 Verite V2000/V2100/V2200 |
1092 2000 Stealth II S220 |
1164 Advanced Peripherals Technologies |
1165 Imagraph Corporation |
0001 Motion TPEG Recorder/Player with audio |
1166 ServerWorks |
0005 CNB20-LE Host Bridge |
0007 CNB20-LE Host Bridge |
0008 CNB20HE Host Bridge |
0009 CNB20LE Host Bridge |
0010 CIOB30 |
0011 CMIC-HE |
0012 CMIC-LE |
0013 CNB20-HE Host Bridge |
0014 CNB20-HE Host Bridge |
0015 CMIC-GC Host Bridge |
0016 CMIC-GC Host Bridge |
0017 GCNB-LE Host Bridge |
0200 OSB4 South Bridge |
0201 CSB5 South Bridge |
0203 CSB6 South Bridge |
0211 OSB4 IDE Controller |
0212 CSB5 IDE Controller |
0213 CSB6 RAID/IDE Controller |
0220 OSB4/CSB5 OHCI USB Controller |
0221 CSB6 OHCI USB Controller |
0225 GCLE Host Bridge |
0227 GCLE-2 Host Bridge |
1167 Mutoh Industries Inc |
1168 Thine Electronics Inc |
1169 Centre for Development of Advanced Computing |
116a Polaris Communications |
6100 Bus/Tag Channel |
6800 Escon Channel |
7100 Bus/Tag Channel |
7800 Escon Channel |
116b Connectware Inc |
116c Intelligent Resources Integrated Systems |
116d Martin-Marietta |
116e Electronics for Imaging |
116f Workstation Technology |
1170 Inventec Corporation |
1171 Loughborough Sound Images Plc |
1172 Altera Corporation |
1173 Adobe Systems, Inc |
1174 Bridgeport Machines |
1175 Mitron Computer Inc. |
1176 SBE Incorporated |
1177 Silicon Engineering |
1178 Alfa, Inc. |
afa1 Fast Ethernet Adapter |
1179 Toshiba America Info Systems |
0103 EX-IDE Type-B |
0404 DVD Decoder card |
0406 Tecra Video Capture device |
0407 DVD Decoder card (Version 2) |
0601 601 |
0603 ToPIC95 PCI to CardBus Bridge for Notebooks |
060a ToPIC95 |
060f ToPIC97 |
0617 ToPIC95 PCI to Cardbus Bridge with ZV Support |
0618 CPU to PCI and PCI to ISA bridge |
# Claimed to be Lucent DSP1645 [Mars], but that's apparently incorrect. Does anyone know the correct ID? |
0701 FIR Port |
0804 TC6371AF SmartMedia Controller |
0805 SD TypA Controller |
0d01 FIR Port Type-DO |
1179 0001 FIR Port Type-DO |
117a A-Trend Technology |
117b L G Electronics, Inc. |
117c Atto Technology |
117d Becton & Dickinson |
117e T/R Systems |
117f Integrated Circuit Systems |
1180 Ricoh Co Ltd |
0465 RL5c465 |
0466 RL5c466 |
0475 RL5c475 |
0476 RL5c476 II |
104d 80df Vaio PCG-FX403 |
104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP |
0477 RL5c477 |
0478 RL5c478 |
1014 0184 ThinkPad A30p (2653-64G) |
0522 R5C522 IEEE 1394 Controller |
1014 01cf ThinkPad A30p (2653-64G) |
0551 R5C551 IEEE 1394 Controller |
0552 R5C552 IEEE 1394 Controller |
1181 Telmatics International |
1183 Fujikura Ltd |
1184 Forks Inc |
1185 Dataworld International Ltd |
1186 D-Link System Inc |
0100 DC21041 |
1002 DL10050 Sundance Ethernet |
1186 1002 DFE-550TX |
1186 1012 DFE-580TX |
1300 RTL8139 Ethernet |
1186 1300 DFE-538TX 10/100 Ethernet Adapter |
1186 1301 DFE-530TX+ 10/100 Ethernet Adapter |
1340 DFE-690TXD CardBus PC Card |
1561 DRP-32TXD Cardbus PC Card |
4000 DL2K Ethernet |
4c00 Gigabit Ethernet Adapter |
1186 4c00 DGE-530T Gigabit Ethernet Adapter |
1187 Advanced Technology Laboratories, Inc. |
1188 Shima Seiki Manufacturing Ltd. |
1189 Matsushita Electronics Co Ltd |
118a Hilevel Technology |
118b Hypertec Pty Limited |
118c Corollary, Inc |
0014 PCIB [C-bus II to PCI bus host bridge chip] |
1117 Intel 8-way XEON Profusion Chipset [Cache Coherency Filter] |
118d BitFlow Inc |
0001 Raptor-PCI framegrabber |
0012 Model 12 Road Runner Frame Grabber |
0014 Model 14 Road Runner Frame Grabber |
0024 Model 24 Road Runner Frame Grabber |
0044 Model 44 Road Runner Frame Grabber |
0112 Model 12 Road Runner Frame Grabber |
0114 Model 14 Road Runner Frame Grabber |
0124 Model 24 Road Runner Frame Grabber |
0144 Model 44 Road Runner Frame Grabber |
0212 Model 12 Road Runner Frame Grabber |
0214 Model 14 Road Runner Frame Grabber |
0224 Model 24 Road Runner Frame Grabber |
0244 Model 44 Road Runner Frame Grabber |
0312 Model 12 Road Runner Frame Grabber |
0314 Model 14 Road Runner Frame Grabber |
0324 Model 24 Road Runner Frame Grabber |
0344 Model 44 Road Runner Frame Grabber |
118e Hermstedt GmbH |
118f Green Logic |
1190 Tripace |
c731 TP-910/920/940 PCI Ultra(Wide) SCSI Adapter |
1191 Artop Electronic Corp |
0003 SCSI Cache Host Adapter |
0004 ATP8400 |
0005 ATP850UF |
0006 ATP860 NO-BIOS |
0007 ATP860 |
0008 ATP865 NO-ROM |
0009 ATP865 |
8002 AEC6710 SCSI-2 Host Adapter |
8010 AEC6712UW SCSI |
8020 AEC6712U SCSI |
8030 AEC6712S SCSI |
8040 AEC6712D SCSI |
8050 AEC6712SUW SCSI |
1192 Densan Company Ltd |
1193 Zeitnet Inc. |
0001 1221 |
0002 1225 |
1194 Toucan Technology |
1195 Ratoc System Inc |
1196 Hytec Electronics Ltd |
1197 Gage Applied Sciences, Inc. |
1198 Lambda Systems Inc |
1199 Attachmate Corporation |
119a Mind Share, Inc. |
119b Omega Micro Inc. |
1221 82C092G |
119c Information Technology Inst. |
119d Bug, Inc. Sapporo Japan |
119e Fujitsu Microelectronics Ltd. |
0001 FireStream 155 |
0003 FireStream 50 |
119f Bull HN Information Systems |
11a0 Convex Computer Corporation |
11a1 Hamamatsu Photonics K.K. |
11a2 Sierra Research and Technology |
11a3 Deuretzbacher GmbH & Co. Eng. KG |
11a4 Barco Graphics NV |
11a5 Microunity Systems Eng. Inc |
11a6 Pure Data Ltd. |
11a7 Power Computing Corp. |
11a8 Systech Corp. |
11a9 InnoSys Inc. |
4240 AMCC S933Q Intelligent Serial Card |
11aa Actel |
11ab Galileo Technology Ltd. |
0146 GT-64010/64010A System Controller |
4320 Gigabit Ethernet Adapter |
11ab 9521 Marvell Yukon Gigabit Ethernet 10/100/1000Base-T Adapter |
4611 GT-64115 System Controller |
4620 GT-64120/64120A/64121A System Controller |
4801 GT-48001 |
f003 GT-64010 Primary Image Piranha Image Generator |
11ac Canon Information Systems Research Aust. |
11ad Lite-On Communications Inc |
0002 LNE100TX |
11ad 0002 LNE100TX |
11ad 0003 LNE100TX |
11ad f003 LNE100TX |
11ad ffff LNE100TX |
1385 f004 FA310TX |
c115 LNE100TX [Linksys EtherFast 10/100] |
11ad c001 LNE100TX [ver 2.0] |
11ae Aztech System Ltd |
11af Avid Technology Inc. |
11b0 V3 Semiconductor Inc. |
0002 V300PSC |
0292 V292PBC [Am29030/40 Bridge] |
0960 V96xPBC |
c960 V96DPC |
11b1 Apricot Computers |
11b2 Eastman Kodak |
11b3 Barr Systems Inc. |
11b4 Leitch Technology International |
11b5 Radstone Technology Plc |
11b6 United Video Corp |
11b7 Motorola |
11b8 XPoint Technologies, Inc |
0001 Quad PeerMaster |
11b9 Pathlight Technology Inc. |
c0ed SSA Controller |
11ba Videotron Corp |
11bb Pyramid Technology |
11bc Network Peripherals Inc |
0001 NP-PCI |
11bd Pinnacle Systems Inc. |
11be International Microcircuits Inc |
11bf Astrodesign, Inc. |
11c0 Hewlett Packard |
11c1 Lucent Microelectronics |
0440 56k WinModem |
1033 8015 LT WinModem 56k Data+Fax+Voice+Dsvd |
1033 8047 LT WinModem 56k Data+Fax+Voice+Dsvd |
1033 804f LT WinModem 56k Data+Fax+Voice+Dsvd |
10cf 102c LB LT Modem V.90 56k |
10cf 104a BIBLO LT Modem 56k |
10cf 105f LB2 LT Modem V.90 56k |
1179 0001 Internal V.90 Modem |
11c1 0440 LT WinModem 56k Data+Fax+Voice+Dsvd |
122d 4101 MDP7800-U Modem |
122d 4102 MDP7800SP-U Modem |
13e0 0040 LT WinModem 56k Data+Fax+Voice+Dsvd |
13e0 0440 LT WinModem 56k Data+Fax+Voice+Dsvd |
13e0 0441 LT WinModem 56k Data+Fax+Voice+Dsvd |
13e0 0450 LT WinModem 56k Data+Fax+Voice+Dsvd |
13e0 f100 LT WinModem 56k Data+Fax+Voice+Dsvd |
13e0 f101 LT WinModem 56k Data+Fax+Voice+Dsvd |
144d 2101 LT56PV Modem |
149f 0440 LT WinModem 56k Data+Fax+Voice+Dsvd |
0441 56k WinModem |
1033 804d LT WinModem 56k Data+Fax |
1033 8065 LT WinModem 56k Data+Fax |
1092 0440 Supra 56i |
1179 0001 Internal V.90 Modem |
11c1 0440 LT WinModem 56k Data+Fax |
11c1 0441 LT WinModem 56k Data+Fax |
122d 4100 MDP7800-U Modem |
13e0 0040 LT WinModem 56k Data+Fax |
13e0 0100 LT WinModem 56k Data+Fax |
13e0 0410 LT WinModem 56k Data+Fax |
13e0 0420 TelePath Internet 56k WinModem |
13e0 0440 LT WinModem 56k Data+Fax |
13e0 0443 LT WinModem 56k Data+Fax |
13e0 f102 LT WinModem 56k Data+Fax |
1416 9804 CommWave 56k Modem |
141d 0440 LT WinModem 56k Data+Fax |
144f 0441 Lucent 56k V.90 DF Modem |
144f 0449 Lucent 56k V.90 DF Modem |
144f 110d Lucent Win Modem |
1468 0441 Presario 56k V.90 DF Modem |
1668 0440 Lucent Win Modem |
0442 56k WinModem |
11c1 0440 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd |
11c1 0442 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd |
13e0 0412 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd |
13e0 0442 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd |
13fc 2471 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd |
144d 2104 LT56PT Modem |
144f 1104 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd |
149f 0440 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd |
1668 0440 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd |
0443 LT WinModem |
0444 LT WinModem |
0445 LT WinModem |
0446 LT WinModem |
0447 LT WinModem |
0448 WinModem 56k |
1014 0131 Lucent Win Modem |
1033 8066 LT WinModem 56k Data+Fax+Voice+Dsvd |
13e0 0030 56k Voice Modem |
13e0 0040 LT WinModem 56k Data+Fax+Voice+Dsvd |
# Actiontech eth+modem card as used by Dell &c. |
1668 2400 LT WinModem 56k (MiniPCI Ethernet+Modem) |
0449 WinModem 56k |
0e11 b14d 56k V.90 Modem |
13e0 0020 LT WinModem 56k Data+Fax |
13e0 0041 TelePath Internet 56k WinModem |
1436 0440 Lucent Win Modem |
144f 0449 Lucent 56k V.90 DFi Modem |
1468 0410 IBM ThinkPad T23 (2647-4MG) |
1468 0440 Lucent Win Modem |
1468 0449 Presario 56k V.90 DFi Modem |
044a F-1156IV WinModem (V90, 56KFlex) |
10cf 1072 LB Global LT Modem |
13e0 0012 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd |
13e0 0042 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd |
144f 1005 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd |
044b LT WinModem |
044c LT WinModem |
044d LT WinModem |
044e LT WinModem |
044f V90 WildWire Modem |
0450 LT WinModem |
144f 4005 Magnia SG20 |
0451 LT WinModem |
0452 LT WinModem |
0453 LT WinModem |
0454 LT WinModem |
0455 LT WinModem |
0456 LT WinModem |
0457 LT WinModem |
0458 LT WinModem |
0459 LT WinModem |
045a LT WinModem |
045c LT WinModem |
0461 V90 WildWire Modem |
0462 V90 WildWire Modem |
0480 Venus Modem (V90, 56KFlex) |
5801 USB |
5802 USS-312 USB Controller |
5811 FW323 |
dead 0800 FireWire Host Bus Adapter |
11c2 Sand Microelectronics |
11c3 NEC Corporation |
11c4 Document Technologies, Inc |
11c5 Shiva Corporation |
11c6 Dainippon Screen Mfg. Co. Ltd |
11c7 D.C.M. Data Systems |
11c8 Dolphin Interconnect Solutions AS |
0658 PSB32 SCI-Adapter D31x |
d665 PSB64 SCI-Adapter D32x |
d667 PSB66 SCI-Adapter D33x |
11c9 Magma |
0010 16-line serial port w/- DMA |
0011 4-line serial port w/- DMA |
11ca LSI Systems, Inc |
11cb Specialix Research Ltd. |
2000 PCI_9050 |
11cb 0200 SX |
11cb b008 I/O8+ |
4000 SUPI_1 |
8000 T225 |
11cc Michels & Kleberhoff Computer GmbH |
11cd HAL Computer Systems, Inc. |
11ce Netaccess |
11cf Pioneer Electronic Corporation |
11d0 Lockheed Martin Federal Systems-Manassas |
11d1 Auravision |
01f7 VxP524 |
11d2 Intercom Inc. |
11d3 Trancell Systems Inc |
11d4 Analog Devices |
1805 SM56 PCI modem |
1889 AD1889 sound chip |
11d5 Ikon Corporation |
0115 10115 |
0117 10117 |
11d6 Tekelec Telecom |
11d7 Trenton Technology, Inc. |
11d8 Image Technologies Development |
11d9 TEC Corporation |
11da Novell |
11db Sega Enterprises Ltd |
11dc Questra Corporation |
11dd Crosfield Electronics Limited |
11de Zoran Corporation |
6057 ZR36057PQC Video cutting chipset |
1031 7efe DC10 Plus |
1031 fc00 MiroVIDEO DC50, Motion JPEG Capture/CODEC Board |
13ca 4231 JPEG/TV Card |
6120 ZR36120 |
1328 f001 Cinemaster C DVD Decoder |
11df New Wave PDG |
11e0 Cray Communications A/S |
11e1 GEC Plessey Semi Inc. |
11e2 Samsung Information Systems America |
11e3 Quicklogic Corporation |
5030 PC Watchdog |
11e4 Second Wave Inc |
11e5 IIX Consulting |
11e6 Mitsui-Zosen System Research |
11e7 Toshiba America, Elec. Company |
11e8 Digital Processing Systems Inc. |
11e9 Highwater Designs Ltd. |
11ea Elsag Bailey |
11eb Formation Inc. |
11ec Coreco Inc |
11ed Mediamatics |
11ee Dome Imaging Systems Inc |
11ef Nicolet Technologies B.V. |
11f0 Compu-Shack |
4231 FDDI |
4232 FASTline UTP Quattro |
4233 FASTline FO |
4234 FASTline UTP |
4235 FASTline-II UTP |
4236 FASTline-II FO |
4731 GIGAline |
11f1 Symbios Logic Inc |
11f2 Picture Tel Japan K.K. |
11f3 Keithley Metrabyte |
11f4 Kinetic Systems Corporation |
2915 CAMAC controller |
11f5 Computing Devices International |
11f6 Compex |
0112 ENet100VG4 |
0113 FreedomLine 100 |
1401 ReadyLink 2000 |
2011 RL100-ATX 10/100 |
11f6 2011 RL100-ATX |
2201 ReadyLink 100TX (Winbond W89C840) |
11f6 2011 ReadyLink 100TX |
9881 RL100TX |
11f7 Scientific Atlanta |
11f8 PMC-Sierra Inc. |
7375 PM7375 [LASAR-155 ATM SAR] |
11f9 I-Cube Inc |
11fa Kasan Electronics Company, Ltd. |
11fb Datel Inc |
11fc Silicon Magic |
11fd High Street Consultants |
11fe Comtrol Corporation |
0001 Rocketport 32 port w/external I/F |
0002 Rocketport 8 port w/external I/F |
0003 Rocketport 16 port w/external I/F |
0004 Rocketport 4 port w/quad cable |
0005 Rocketport 8 port w/octa cable |
0006 Rocketport 8 port w/RJ11 connectors |
0007 Rocketport 4 port w/RJ11 connectors |
0008 Rocketport 8 port w/ DB78 SNI (Siemens) connector |
0009 Rocketport 16 port w/ DB78 SNI (Siemens) connector |
000a Rocketport Plus 4 port |
000b Rocketport Plus 8 port |
000c RocketModem 6 port |
000d RocketModem 4-port |
000e Rocketport Plus 2 port RS232 |
000f Rocketport Plus 2 port RS422 |
0801 Rocketport UPCI 32 port w/external I/F |
0802 Rocketport UPCI 8 port w/external I/F |
0803 Rocketport UPCI 16 port w/external I/F |
0805 Rocketport UPCI 8 port w/octa cable |
080C RocketModem III 8 port |
080D RocketModem III 4 port |
0903 Rocketport Compact PCI 16 port w/external I/F |
11ff Scion Corporation |
1200 CSS Corporation |
1201 Vista Controls Corp |
1202 Network General Corp. |
1203 Bayer Corporation, Agfa Division |
1204 Lattice Semiconductor Corporation |
1205 Array Corporation |
1206 Amdahl Corporation |
1208 Parsytec GmbH |
4853 HS-Link Device |
1209 SCI Systems Inc |
120a Synaptel |
120b Adaptive Solutions |
120c Technical Corp. |
120d Compression Labs, Inc. |
120e Cyclades Corporation |
0100 Cyclom-Y below first megabyte |
0101 Cyclom-Y above first megabyte |
0102 Cyclom-4Y below first megabyte |
0103 Cyclom-4Y above first megabyte |
0104 Cyclom-8Y below first megabyte |
0105 Cyclom-8Y above first megabyte |
0200 Cyclades-Z below first megabyte |
0201 Cyclades-Z above first megabyte |
0300 PC300/RSV or /X21 (2 ports) |
0301 PC300/RSV or /X21 (1 port) |
0310 PC300/TE (2 ports) |
0311 PC300/TE (1 port) |
0320 PC300/TE-M (2 ports) |
0321 PC300/TE-M (1 port) |
0400 PC400 |
120f Essential Communications |
0001 Roadrunner serial HIPPI |
1210 Hyperparallel Technologies |
1211 Braintech Inc |
1212 Kingston Technology Corp. |
1213 Applied Intelligent Systems, Inc. |
1214 Performance Technologies, Inc. |
1215 Interware Co., Ltd |
1216 Purup Prepress A/S |
1217 O2 Micro, Inc. |
6729 OZ6729 |
673a OZ6730 |
6832 OZ6832/6833 Cardbus Controller |
6836 OZ6836/6860 Cardbus Controller |
6872 OZ6812 Cardbus Controller |
6925 OZ6922 Cardbus Controller |
6933 OZ6933 Cardbus Controller |
1025 1016 Travelmate 612 TX |
6972 OZ6912 Cardbus Controller |
1218 Hybricon Corp. |
1219 First Virtual Corporation |
121a 3Dfx Interactive, Inc. |
0001 Voodoo |
0002 Voodoo 2 |
0003 Voodoo Banshee |
1092 0003 Monster Fusion |
1092 4000 Monster Fusion |
1092 4002 Monster Fusion |
1092 4801 Monster Fusion AGP |
1092 4803 Monster Fusion AGP |
1092 8030 Monster Fusion |
1092 8035 Monster Fusion AGP |
10b0 0001 Dragon 4000 |
1102 1018 3D Blaster Banshee VE |
121a 0001 Voodoo Banshee AGP |
121a 0003 Voodoo Banshee AGP SGRAM |
121a 0004 Voodoo Banshee |
139c 0016 Raven |
139c 0017 Raven |
14af 0002 Maxi Gamer Phoenix |
0004 Voodoo Banshee [Velocity 100] |
0005 Voodoo 3 |
121a 0004 Voodoo3 AGP |
121a 0030 Voodoo3 AGP |
121a 0031 Voodoo3 AGP |
121a 0034 Voodoo3 AGP |
121a 0036 Voodoo3 |
121a 0037 Voodoo3 AGP |
121a 0038 Voodoo3 AGP |
121a 003a Voodoo3 AGP |
121a 0044 Voodoo3 |
121a 004b Velocity 100 |
121a 004c Velocity 200 |
121a 004d Voodoo3 AGP |
121a 004e Voodoo3 AGP |
121a 0051 Voodoo3 AGP |
121a 0052 Voodoo3 AGP |
121a 0060 Voodoo3 3500 TV (NTSC) |
121a 0061 Voodoo3 3500 TV (PAL) |
121a 0062 Voodoo3 3500 TV (SECAM) |
0009 Voodoo 4 / Voodoo 5 |
121a 0009 Voodoo5 AGP 5500/6000 |
0057 Voodoo 3/3000 [Avenger] |
121b Advanced Telecommunications Modules |
121c Nippon Texaco., Ltd |
121d Lippert Automationstechnik GmbH |
121e CSPI |
121f Arcus Technology, Inc. |
1220 Ariel Corporation |
1220 AMCC 5933 TMS320C80 DSP/Imaging board |
1221 Contec Co., Ltd |
1222 Ancor Communications, Inc. |
1223 Artesyn Communication Products |
0003 PM/Link |
0004 PM/T1 |
0005 PM/E1 |
0008 PM/SLS |
0009 BajaSpan Resource Target |
000a BajaSpan Section 0 |
000b BajaSpan Section 1 |
000c BajaSpan Section 2 |
000d BajaSpan Section 3 |
000e PM/PPC |
1224 Interactive Images |
1225 Power I/O, Inc. |
1227 Tech-Source |
1228 Norsk Elektro Optikk A/S |
1229 Data Kinesis Inc. |
122a Integrated Telecom |
122b LG Industrial Systems Co., Ltd |
122c Sican GmbH |
122d Aztech System Ltd |
1206 368DSP |
50dc 3328 Audio |
122d 0001 3328 Audio |
80da 3328 Audio |
122d 0001 3328 Audio |
122e Xyratex |
122f Andrew Corporation |
1230 Fishcamp Engineering |
1231 Woodward McCoach, Inc. |
1232 GPT Limited |
1233 Bus-Tech, Inc. |
1234 Technical Corp. |
1235 Risq Modular Systems, Inc. |
1236 Sigma Designs Corporation |
0000 RealMagic64/GX |
6401 REALmagic 64/GX (SD 6425) |
1237 Alta Technology Corporation |
1238 Adtran |
1239 3DO Company |
123a Visicom Laboratories, Inc. |
123b Seeq Technology, Inc. |
123c Century Systems, Inc. |
123d Engineering Design Team, Inc. |
0000 EasyConnect 8/32 |
0002 EasyConnect 8/64 |
0003 EasyIO |
123e Simutech, Inc. |
123f C-Cube Microsystems |
00e4 MPEG |
8120 E4? |
11bd 0006 DV500 E4 |
11bd 000a DV500 E4 |
8888 Cinemaster C 3.0 DVD Decoder |
1002 0001 Cinemaster C 3.0 DVD Decoder |
1002 0002 Cinemaster C 3.0 DVD Decoder |
1328 0001 Cinemaster C 3.0 DVD Decoder |
1240 Marathon Technologies Corp. |
1241 DSC Communications |
# Formerly Jaycor Networks, Inc. |
1242 JNI Corporation |
1560 JNIC-1560 PCI-X Fibre Channel Controller |
1242 6562 FCX2-6562 Dual Channel PCI-X Fibre Channel Adapter |
1242 656a FCX-6562 PCI-X Fibre Channel Adapter |
4643 FCI-1063 Fibre Channel Adapter |
1243 Delphax |
1244 AVM Audiovisuelles MKTG & Computer System GmbH |
0700 B1 ISDN |
0800 C4 ISDN |
0a00 A1 ISDN [Fritz] |
1244 0a00 FRITZ!Card ISDN Controller |
0e00 Fritz!PCI v2.0 ISDN |
1100 C2 ISDN |
1200 T1 ISDN |
1245 A.P.D., S.A. |
1246 Dipix Technologies, Inc. |
1247 Xylon Research, Inc. |
1248 Central Data Corporation |
1249 Samsung Electronics Co., Ltd. |
124a AEG Electrocom GmbH |
124b SBS/Greenspring Modular I/O |
0040 PCI-40A or cPCI-200 Quad IndustryPack carrier |
124b 9080 PCI9080 Bridge |
124c Solitron Technologies, Inc. |
124d Stallion Technologies, Inc. |
0000 EasyConnection 8/32 |
0002 EasyConnection 8/64 |
0003 EasyIO |
0004 EasyConnection/RA |
124e Cylink |
124f Infotrend Technology, Inc. |
0041 IFT-2000 Series RAID Controller |
1250 Hitachi Microcomputer System Ltd |
1251 VLSI Solutions Oy |
1253 Guzik Technical Enterprises |
1254 Linear Systems Ltd. |
1255 Optibase Ltd |
1110 MPEG Forge |
1210 MPEG Fusion |
2110 VideoPlex |
2120 VideoPlex CC |
2130 VideoQuest |
1256 Perceptive Solutions, Inc. |
4201 PCI-2220I |
4401 PCI-2240I |
5201 PCI-2000 |
1257 Vertex Networks, Inc. |
1258 Gilbarco, Inc. |
1259 Allied Telesyn International |
2560 AT-2560 Fast Ethernet Adapter (i82557B) |
125a ABB Power Systems |
125b Asix Electronics Corporation |
1400 ALFA GFC2204 |
125c Aurora Technologies, Inc. |
0640 Aries 16000P |
125d ESS Technology |
0000 ES336H Fax Modem (Early Model) |
1948 Solo? |
1968 ES1968 Maestro 2 |
1028 0085 ES1968 Maestro-2 PCI |
1033 8051 ES1968 Maestro-2 Audiodrive |
1969 ES1969 Solo-1 Audiodrive |
1014 0166 ES1969 SOLO-1 AudioDrive on IBM Aptiva Mainboard |
125d 8888 Solo-1 Audio Adapter |
1978 ES1978 Maestro 2E |
1033 803c ES1978 Maestro-2E Audiodrive |
1033 8058 ES1978 Maestro-2E Audiodrive |
1092 4000 Monster Sound MX400 |
1179 0001 ES1978 Maestro-2E Audiodrive |
1988 ES1988 Allegro-1 |
1092 4100 Sonic Impact S100 |
125d 1988 ESS Allegro-1 Audiodrive |
1989 ESS Modem |
125d 1989 ESS Modem |
1998 ES1983S Maestro-3i PCI Audio Accelerator |
1028 00e6 ES1983S Maestro-3i (Dell Inspiron 8100) |
1999 ES1983S Maestro-3i PCI Modem Accelerator |
199a ES1983S Maestro-3i PCI Audio Accelerator |
199b ES1983S Maestro-3i PCI Modem Accelerator |
2808 ES336H Fax Modem (Later Model) |
2838 ES2838/2839 SuperLink Modem |
2898 ES2898 Modem |
125d 0424 ES56-PI Data Fax Modem |
125d 0425 ES56T-PI Data Fax Modem |
125d 0426 ES56V-PI Data Fax Modem |
125d 0427 VW-PI Data Fax Modem |
125d 0428 ES56ST-PI Data Fax Modem |
125d 0429 ES56SV-PI Data Fax Modem |
147a c001 ES56-PI Data Fax Modem |
14fe 0428 ES56-PI Data Fax Modem |
14fe 0429 ES56-PI Data Fax Modem |
125e Specialvideo Engineering SRL |
125f Concurrent Technologies, Inc. |
1260 Harris Semiconductor |
3873 Prism 2.5 Wavelan chipset |
1186 3501 DWL-520 Wireless PCI Adapter |
1668 0414 HWP01170-01 802.11b PCI Wireless Adapter |
1737 3874 WMP11 Wireless 802.11b PCI Adaptor |
8086 2513 Wireless 802.11b MiniPCI Adapter |
8130 HMP8130 NTSC/PAL Video Decoder |
8131 HMP8131 NTSC/PAL Video Decoder |
1261 Matsushita-Kotobuki Electronics Industries, Ltd. |
1262 ES Computer Company, Ltd. |
1263 Sonic Solutions |
1264 Aval Nagasaki Corporation |
1265 Casio Computer Co., Ltd. |
1266 Microdyne Corporation |
0001 NE10/100 Adapter (i82557B) |
1910 NE2000Plus (RT8029) Ethernet Adapter |
1266 1910 NE2000Plus Ethernet Adapter |
1267 S. A. Telecommunications |
5352 PCR2101 |
5a4b Telsat Turbo |
1268 Tektronix |
1269 Thomson-CSF/TTM |
126a Lexmark International, Inc. |
126b Adax, Inc. |
126c Northern Telecom |
126d Splash Technology, Inc. |
126e Sumitomo Metal Industries, Ltd. |
126f Silicon Motion, Inc. |
0710 SM710 LynxEM |
0712 SM712 LynxEM+ |
0720 SM720 Lynx3DM |
0810 SM810 LynxE |
0811 SM811 LynxE |
0820 SM820 Lynx3D |
0910 SM910 |
1270 Olympus Optical Co., Ltd. |
1271 GW Instruments |
1272 Telematics International |
1273 Hughes Network Systems |
0002 DirecPC |
1274 Ensoniq |
1371 ES1371 [AudioPCI-97] |
0e11 0024 AudioPCI on Motherboard Compaq Deskpro |
0e11 b1a7 ES1371, ES1373 AudioPCI |
1033 80ac ES1371, ES1373 AudioPCI |
1042 1854 Tazer |
107b 8054 Tabor2 |
1274 1371 Creative Sound Blaster AudioPCI64V, AudioPCI128 |
1462 6470 ES1371, ES1373 AudioPCI On Motherboard MS-6147 1.1A |
1462 6560 ES1371, ES1373 AudioPCI On Motherboard MS-6156 1.10 |
1462 6630 ES1371, ES1373 AudioPCI On Motherboard MS-6163BX 1.0A |
1462 6631 ES1371, ES1373 AudioPCI On Motherboard MS-6163VIA 1.0A |
1462 6632 ES1371, ES1373 AudioPCI On Motherboard MS-6163BX 2.0A |
1462 6633 ES1371, ES1373 AudioPCI On Motherboard MS-6163VIA 2.0A |
1462 6820 ES1371, ES1373 AudioPCI On Motherboard MS-6182 1.00 |
1462 6822 ES1371, ES1373 AudioPCI On Motherboard MS-6182 1.00A |
1462 6830 ES1371, ES1373 AudioPCI On Motherboard MS-6183 1.00 |
1462 6880 ES1371, ES1373 AudioPCI On Motherboard MS-6188 1.00 |
1462 6900 ES1371, ES1373 AudioPCI On Motherboard MS-6190 1.00 |
1462 6910 ES1371, ES1373 AudioPCI On Motherboard MS-6191 |
1462 6930 ES1371, ES1373 AudioPCI On Motherboard MS-6193 |
1462 6990 ES1371, ES1373 AudioPCI On Motherboard MS-6199BX 2.0A |
1462 6991 ES1371, ES1373 AudioPCI On Motherboard MS-6199VIA 2.0A |
14a4 2077 ES1371, ES1373 AudioPCI On Motherboard KR639 |
14a4 2105 ES1371, ES1373 AudioPCI On Motherboard MR800 |
14a4 2107 ES1371, ES1373 AudioPCI On Motherboard MR801 |
14a4 2172 ES1371, ES1373 AudioPCI On Motherboard DR739 |
1509 9902 ES1371, ES1373 AudioPCI On Motherboard KW11 |
1509 9903 ES1371, ES1373 AudioPCI On Motherboard KW31 |
1509 9904 ES1371, ES1373 AudioPCI On Motherboard KA11 |
1509 9905 ES1371, ES1373 AudioPCI On Motherboard KC13 |
152d 8801 ES1371, ES1373 AudioPCI On Motherboard CP810E |
152d 8802 ES1371, ES1373 AudioPCI On Motherboard CP810 |
152d 8803 ES1371, ES1373 AudioPCI On Motherboard P3810E |
152d 8804 ES1371, ES1373 AudioPCI On Motherboard P3810-S |
152d 8805 ES1371, ES1373 AudioPCI On Motherboard P3820-S |
270f 2001 ES1371, ES1373 AudioPCI On Motherboard 6CTR |
270f 2200 ES1371, ES1373 AudioPCI On Motherboard 6WTX |
270f 3000 ES1371, ES1373 AudioPCI On Motherboard 6WSV |
270f 3100 ES1371, ES1373 AudioPCI On Motherboard 6WIV2 |
270f 3102 ES1371, ES1373 AudioPCI On Motherboard 6WIV |
270f 7060 ES1371, ES1373 AudioPCI On Motherboard 6ASA2 |
8086 4249 ES1371, ES1373 AudioPCI On Motherboard BI440ZX |
8086 424c ES1371, ES1373 AudioPCI On Motherboard BL440ZX |
8086 425a ES1371, ES1373 AudioPCI On Motherboard BZ440ZX |
8086 4341 ES1371, ES1373 AudioPCI On Motherboard Cayman |
8086 4343 ES1371, ES1373 AudioPCI On Motherboard Cape Cod |
8086 4649 ES1371, ES1373 AudioPCI On Motherboard Fire Island |
8086 464a ES1371, ES1373 AudioPCI On Motherboard FJ440ZX |
8086 4d4f ES1371, ES1373 AudioPCI On Motherboard Montreal |
8086 4f43 ES1371, ES1373 AudioPCI On Motherboard OC440LX |
8086 5243 ES1371, ES1373 AudioPCI On Motherboard RC440BX |
8086 5352 ES1371, ES1373 AudioPCI On Motherboard SunRiver |
8086 5643 ES1371, ES1373 AudioPCI On Motherboard Vancouver |
8086 5753 ES1371, ES1373 AudioPCI On Motherboard WS440BX |
5000 ES1370 [AudioPCI] |
5880 5880 AudioPCI |
1274 2000 Creative Sound Blaster AudioPCI128 |
1274 2003 Creative SoundBlaster AudioPCI 128 |
1274 5880 Creative Sound Blaster AudioPCI128 |
1458 a000 5880 AudioPCI On Motherboard 6OXET |
1462 6880 5880 AudioPCI On Motherboard MS-6188 1.00 |
270f 2001 5880 AudioPCI On Motherboard 6CTR |
270f 2200 5880 AudioPCI On Motherboard 6WTX |
270f 7040 5880 AudioPCI On Motherboard 6ATA4 |
1275 Network Appliance Corporation |
1276 Switched Network Technologies, Inc. |
1277 Comstream |
1278 Transtech Parallel Systems Ltd. |
0701 TPE3/TM3 PowerPC Node |
1279 Transmeta Corporation |
0295 Northbridge |
0395 LongRun Northbridge |
0396 SDRAM controller |
0397 BIOS scratchpad |
127a Rockwell International |
1002 HCF 56k Data/Fax Modem |
1092 094c SupraExpress 56i PRO [Diamond SUP2380] |
122d 4002 HPG / MDP3858-U |
122d 4005 MDP3858-E |
122d 4007 MDP3858-A/-NZ |
122d 4012 MDP3858-SA |
122d 4017 MDP3858-W |
122d 4018 MDP3858-W |
127a 1002 Rockwell 56K D/F HCF Modem |
1003 HCF 56k Data/Fax Modem |
0e11 b0bc 229-DF Zephyr |
0e11 b114 229-DF Cheetah |
1033 802b 229-DF |
13df 1003 PCI56RX Modem |
13e0 0117 IBM |
13e0 0147 IBM F-1156IV+/R3 Spain V.90 Modem |
13e0 0197 IBM |
13e0 01c7 IBM F-1156IV+/R3 WW V.90 Modem |
13e0 01f7 IBM |
1436 1003 IBM |
1436 1103 IBM 5614PM3G V.90 Modem |
1436 1602 Compaq 229-DF Ducati |
1004 HCF 56k Data/Fax/Voice Modem |
1048 1500 MicroLink 56k Modem |
10cf 1059 Fujitsu 229-DFRT |
1005 HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem |
1033 8029 229-DFSV |
1033 8054 Modem |
10cf 103c Fujitsu |
10cf 1055 Fujitsu 229-DFSV |
10cf 1056 Fujitsu 229-DFSV |
122d 4003 MDP3858SP-U |
122d 4006 Packard Bell MDP3858V-E |
122d 4008 MDP3858SP-A/SP-NZ |
122d 4009 MDP3858SP-E |
122d 4010 MDP3858V-U |
122d 4011 MDP3858SP-SA |
122d 4013 MDP3858V-A/V-NZ |
122d 4015 MDP3858SP-W |
122d 4016 MDP3858V-W |
122d 4019 MDP3858V-SA |
13df 1005 PCI56RVP Modem |
13e0 0187 IBM |
13e0 01a7 IBM |
13e0 01b7 IBM DF-1156IV+/R3 Spain V.90 Modem |
13e0 01d7 IBM DF-1156IV+/R3 WW V.90 Modem |
1436 1005 IBM |
1436 1105 IBM |
1437 1105 IBM 5614PS3G V.90 Modem |
1022 HCF 56k Modem |
1436 1303 M3-5614PM3G V.90 Modem |
1023 HCF 56k Data/Fax Modem |
122d 4020 Packard Bell MDP3858-WE |
122d 4023 MDP3858-UE |
13e0 0247 IBM F-1156IV+/R6 Spain V.90 Modem |
13e0 0297 IBM |
13e0 02c7 IBM F-1156IV+/R6 WW V.90 Modem |
1436 1203 IBM |
1436 1303 IBM |
1024 HCF 56k Data/Fax/Voice Modem |
1025 HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem |
10cf 106a Fujitsu 235-DFSV |
122d 4021 Packard Bell MDP3858V-WE |
122d 4022 MDP3858SP-WE |
122d 4024 MDP3858V-UE |
122d 4025 MDP3858SP-UE |
1026 HCF 56k PCI Speakerphone Modem |
1032 HCF 56k Modem |
1033 HCF 56k Modem |
1034 HCF 56k Modem |
1035 HCF 56k PCI Speakerphone Modem |
1036 HCF 56k Modem |
1085 HCF 56k Volcano PCI Modem |
2005 HCF 56k Data/Fax Modem |
104d 8044 229-DFSV |
104d 8045 229-DFSV |
104d 8055 PBE/Aztech 235W-DFSV |
104d 8056 235-DFSV |
104d 805a Modem |
104d 805f Modem |
104d 8074 Modem |
2013 HSF 56k Data/Fax Modem |
1179 0001 Modem |
1179 ff00 Modem |
2014 HSF 56k Data/Fax/Voice Modem |
10cf 1057 Fujitsu Citicorp III |
122d 4050 MSP3880-U |
122d 4055 MSP3880-W |
2015 HSF 56k Data/Fax/Voice/Spkp (w/Handset) Modem |
10cf 1063 Fujitsu |
10cf 1064 Fujitsu |
1468 2015 Fujitsu |
2016 HSF 56k Data/Fax/Voice/Spkp Modem |
122d 4051 MSP3880V-W |
122d 4052 MSP3880SP-W |
122d 4054 MSP3880V-U |
122d 4056 MSP3880SP-U |
122d 4057 MSP3880SP-A |
4311 Riptide HSF 56k PCI Modem |
127a 4311 Ring Modular? Riptide HSF RT HP Dom |
13e0 0210 HP-GVC |
4320 Riptide PCI Audio Controller |
1235 4320 Riptide PCI Audio Controller |
4321 Riptide HCF 56k PCI Modem |
1235 4321 Hewlett Packard DF |
1235 4324 Hewlett Packard DF |
13e0 0210 Hewlett Packard DF |
144d 2321 Riptide |
4322 Riptide PCI Game Controller |
1235 4322 Riptide PCI Game Controller |
8234 RapidFire 616X ATM155 Adapter |
108d 0022 RapidFire 616X ATM155 Adapter |
108d 0027 RapidFire 616X ATM155 Adapter |
127b Pixera Corporation |
127c Crosspoint Solutions, Inc. |
127d Vela Research |
127e Winnov, L.P. |
127f Fujifilm |
1280 Photoscript Group Ltd. |
1281 Yokogawa Electric Corporation |
1282 Davicom Semiconductor, Inc. |
9009 Ethernet 100/10 MBit |
9100 Ethernet 100/10 MBit |
9102 Ethernet 100/10 MBit |
9132 Ethernet 100/10 MBit |
1283 Integrated Technology Express, Inc. |
673a IT8330G |
8330 IT8330G |
8888 IT8888F PCI to ISA Bridge with SMB |
8889 IT8889F PCI to ISA Bridge |
e886 IT8330G |
1284 Sahara Networks, Inc. |
1285 Platform Technologies, Inc. |
0100 AGOGO sound chip (aka ESS Maestro 1) |
1286 Mazet GmbH |
1287 M-Pact, Inc. |
001e LS220D DVD Decoder |
001f LS220C DVD Decoder |
1288 Timestep Corporation |
1289 AVC Technology, Inc. |
128a Asante Technologies, Inc. |
128b Transwitch Corporation |
128c Retix Corporation |
128d G2 Networks, Inc. |
0021 ATM155 Adapter |
128e Hoontech Corporation/Samho Multi Tech Ltd. |
0008 ST128 WSS/SB |
0009 ST128 SAM9407 |
000a ST128 Game Port |
000b ST128 MPU Port |
000c ST128 Ctrl Port |
128f Tateno Dennou, Inc. |
1290 Sord Computer Corporation |
1291 NCS Computer Italia |
1292 Tritech Microelectronics Inc |
1293 Media Reality Technology |
1294 Rhetorex, Inc. |
1295 Imagenation Corporation |
1296 Kofax Image Products |
1297 Holco Enterprise Co, Ltd/Shuttle Computer |
1298 Spellcaster Telecommunications Inc. |
1299 Knowledge Technology Lab. |
129a VMetro, inc. |
0615 PBT-615 PCI-X Bus Analyzer |
129b Image Access |
129c Jaycor |
129d Compcore Multimedia, Inc. |
129e Victor Company of Japan, Ltd. |
129f OEC Medical Systems, Inc. |
12a0 Allen-Bradley Company |
12a1 Simpact Associates, Inc. |
12a2 Newgen Systems Corporation |
12a3 Lucent Technologies |
12a4 NTT Electronics Technology Company |
12a5 Vision Dynamics Ltd. |
12a6 Scalable Networks, Inc. |
12a7 AMO GmbH |
12a8 News Datacom |
12a9 Xiotech Corporation |
12aa SDL Communications, Inc. |
12ab Yuan Yuan Enterprise Co., Ltd. |
3000 MPG-200C PCI DVD Decoder Card |
12ac Measurex Corporation |
12ad Multidata GmbH |
12ae Alteon Networks Inc. |
0001 AceNIC Gigabit Ethernet |
12ae 0001 Gigabit Ethernet-SX (Universal) |
1410 0104 Gigabit Ethernet-SX PCI Adapter |
0002 AceNIC Gigabit Ethernet (Copper) |
12ae 0002 Gigabit Ethernet-T (3C986-T) |
12af TDK USA Corp |
12b0 Jorge Scientific Corp |
12b1 GammaLink |
12b2 General Signal Networks |
12b3 Inter-Face Co Ltd |
12b4 FutureTel Inc |
12b5 Granite Systems Inc. |
12b6 Natural Microsystems |
12b7 Cognex Modular Vision Systems Div. - Acumen Inc. |
12b8 Korg |
12b9 US Robotics/3Com |
1006 WinModem |
12b9 005c USR 56k Internal Voice WinModem (Model 3472) |
12b9 005e USR 56k Internal WinModem (Models 662975) |
12b9 0062 USR 56k Internal Voice WinModem (Model 662978) |
12b9 0068 USR 56k Internal Voice WinModem (Model 5690) |
12b9 007a USR 56k Internal Voice WinModem (Model 662974) |
12b9 007f USR 56k Internal WinModem (Models 5698, 5699) |
12b9 0080 USR 56k Internal WinModem (Models 2975, 3528) |
12b9 0081 USR 56k Internal Voice WinModem (Models 2974, 3529) |
12b9 0091 USR 56k Internal Voice WinModem (Model 2978) |
1007 USR 56k Internal WinModem |
12b9 00a3 USR 56k Internal WinModem (Model 3595) |
1008 56K FaxModem Model 5610 |
12b9 00a2 USR 56k Internal FAX Modem (Model 2977) |
12b9 00aa USR 56k Internal Voice Modem (Model 2976) |
12b9 00ab USR 56k Internal Voice Modem (Model 5609) |
12b9 00ac USR 56k Internal Voice Modem (Model 3298) |
12b9 00ad USR 56k Internal FAX Modem (Model 5610) |
12ba BittWare, Inc. |
12bb Nippon Unisoft Corporation |
12bc Array Microsystems |
12bd Computerm Corp. |
12be Anchor Chips Inc. |
3041 AN3041Q CO-MEM |
3042 AN3042Q CO-MEM Lite |
12be 3042 Anchor Chips Lite Evaluation Board |
12bf Fujifilm Microdevices |
12c0 Infimed |
12c1 GMM Research Corp |
12c2 Mentec Limited |
12c3 Holtek Microelectronics Inc |
0058 PCI NE2K Ethernet |
5598 PCI NE2K Ethernet |
12c4 Connect Tech Inc |
12c5 Picture Elements Incorporated |
007e Imaging/Scanning Subsystem Engine |
007f Imaging/Scanning Subsystem Engine |
0081 PCIVST [Grayscale Thresholding Engine] |
0085 Video Simulator/Sender |
0086 THR2 Multi-scale Thresholder |
12c6 Mitani Corporation |
12c7 Dialogic Corp |
12c8 G Force Co, Ltd |
12c9 Gigi Operations |
12ca Integrated Computing Engines |
12cb Antex Electronics Corporation |
12cc Pluto Technologies International |
12cd Aims Lab |
12ce Netspeed Inc. |
12cf Prophet Systems, Inc. |
12d0 GDE Systems, Inc. |
12d1 PSITech |
12d2 NVidia / SGS Thomson (Joint Venture) |
0008 NV1 |
0009 DAC64 |
0018 Riva128 |
1048 0c10 VICTORY Erazor |
107b 8030 STB Velocity 128 |
1092 0350 Viper V330 |
1092 1092 Viper V330 |
10b4 1b1b STB Velocity 128 |
10b4 1b1d STB Velocity 128 |
10b4 1b1e STB Velocity 128, PAL TV-Out |
10b4 1b20 STB Velocity 128 Sapphire |
10b4 1b21 STB Velocity 128 |
10b4 1b22 STB Velocity 128 AGP, NTSC TV-Out |
10b4 1b23 STB Velocity 128 AGP, PAL TV-Out |
10b4 1b27 STB Velocity 128 DVD |
10b4 1b88 MVP Pro 128 |
10b4 222a STB Velocity 128 AGP |
10b4 2230 STB Velocity 128 |
10b4 2232 STB Velocity 128 |
10b4 2235 STB Velocity 128 AGP |
2a15 54a3 3DVision-SAGP / 3DexPlorer 3000 |
0019 Riva128ZX |
0020 TNT |
0028 TNT2 |
0029 UTNT2 |
002c VTNT2 |
00a0 ITNT2 |
12d3 Vingmed Sound A/S |
12d4 Ulticom (Formerly DGM&S) |
12d5 Equator Technologies |
12d6 Analogic Corp |
12d7 Biotronic SRL |
12d8 Pericom Semiconductor |
12d9 Aculab PLC |
12da True Time Inc. |
12db Annapolis Micro Systems, Inc |
12dc Symicron Computer Communication Ltd. |
12dd Management Graphics |
12de Rainbow Technologies |
12df SBS Technologies Inc |
12e0 Chase Research |
0010 ST16C654 Quad UART |
0020 ST16C654 Quad UART |
0030 ST16C654 Quad UART |
12e1 Nintendo Co, Ltd |
12e2 Datum Inc. Bancomm-Timing Division |
12e3 Imation Corp - Medical Imaging Systems |
12e4 Brooktrout Technology Inc |
12e5 Apex Semiconductor Inc |
12e6 Cirel Systems |
12e7 Sunsgroup Corporation |
12e8 Crisc Corp |
12e9 GE Spacenet |
12ea Zuken |
12eb Aureal Semiconductor |
0001 Vortex 1 |
104d 8036 AU8820 Vortex Digital Audio Processor |
1092 2000 Sonic Impact A3D |
1092 2100 Sonic Impact A3D |
1092 2110 Sonic Impact A3D |
1092 2200 Sonic Impact A3D |
122d 1002 AU8820 Vortex Digital Audio Processor |
12eb 0001 AU8820 Vortex Digital Audio Processor |
5053 3355 Montego |
0002 Vortex 2 |
104d 8049 AU8830 Vortex 3D Digital Audio Processor |
104d 807b AU8830 Vortex 3D Digital Audio Processor |
1092 3000 Monster Sound II |
1092 3001 Monster Sound II |
1092 3002 Monster Sound II |
1092 3003 Monster Sound II |
1092 3004 Monster Sound II |
12eb 0001 AU8830 Vortex 3D Digital Audio Processor |
12eb 0002 AU8830 Vortex 3D Digital Audio Processor |
12eb 0088 AU8830 Vortex 3D Digital Audio Processor |
144d 3510 AU8830 Vortex 3D Digital Audio Processor |
5053 3356 Montego II |
0003 AU8810 Vortex Digital Audio Processor |
104d 8049 AU8810 Vortex Digital Audio Processor |
104d 8077 AU8810 Vortex Digital Audio Processor |
109f 1000 AU8810 Vortex Digital Audio Processor |
12eb 0003 AU8810 Vortex Digital Audio Processor |
1462 6780 AU8810 Vortex Digital Audio Processor |
14a4 2073 AU8810 Vortex Digital Audio Processor |
14a4 2091 AU8810 Vortex Digital Audio Processor |
14a4 2104 AU8810 Vortex Digital Audio Processor |
14a4 2106 AU8810 Vortex Digital Audio Processor |
8803 Vortex 56k Software Modem |
12eb 8803 Vortex 56k Software Modem |
12ec 3A International, Inc. |
12ed Optivision Inc. |
12ee Orange Micro |
12ef Vienna Systems |
12f0 Pentek |
12f1 Sorenson Vision Inc |
12f2 Gammagraphx, Inc. |
12f3 Radstone Technology |
12f4 Megatel |
12f5 Forks |
12f6 Dawson France |
12f7 Cognex |
12f8 Electronic Design GmbH |
0002 VideoMaker |
12f9 Four Fold Ltd |
12fb Spectrum Signal Processing |
12fc Capital Equipment Corp |
12fd I2S |
12fe ESD Electronic System Design GmbH |
12ff Lexicon |
1300 Harman International Industries Inc |
1302 Computer Sciences Corp |
1303 Innovative Integration |
1304 Juniper Networks |
1305 Netphone, Inc |
1306 Duet Technologies |
1307 Computer Boards |
0001 PCI-DAS1602/16 |
000b PCI-DIO48H |
000c PCI-PDISO8 |
000d PCI-PDISO16 |
000f PCI-DAS1200 |
0010 PCI-DAS1602/12 |
0014 PCI-DIO24H |
0015 PCI-DIO24H/CTR3 |
0016 PCI-DIO48H/CTR15 |
0017 PCI-DIO96H |
0018 PCI-CTR05 |
0019 PCI-DAS1200/JR |
001a PCI-DAS1001 |
001b PCI-DAS1002 |
001c PCI-DAS1602JR/16 |
001d PCI-DAS6402/16 |
001e PCI-DAS6402/12 |
001f PCI-DAS16/M1 |
0020 PCI-DDA02/12 |
0021 PCI-DDA04/12 |
0022 PCI-DDA08/12 |
0023 PCI-DDA02/16 |
0024 PCI-DDA04/16 |
0025 PCI-DDA08/16 |
0026 PCI-DAC04/12-HS |
0027 PCI-DAC04/16-HS |
0028 PCI-DIO24 |
0029 PCI-DAS08 |
002c PCI-INT32 |
0033 PCI-DUAL-AC5 |
0034 PCI-DAS-TC |
0035 PCI-DAS64/M1/16 |
0036 PCI-DAS64/M2/16 |
0037 PCI-DAS64/M3/16 |
004c PCI-DAS1000 |
1308 Jato Technologies Inc. |
0001 NetCelerator Adapter |
1308 0001 NetCelerator Adapter |
1309 AB Semiconductor Ltd |
130a Mitsubishi Electric Microcomputer |
130b Colorgraphic Communications Corp |
130c Ambex Technologies, Inc |
130d Accelerix Inc |
130e Yamatake-Honeywell Co. Ltd |
130f Advanet Inc |
1310 Gespac |
1311 Videoserver, Inc |
1312 Acuity Imaging, Inc |
1313 Yaskawa Electric Co. |
1316 Teradyne Inc |
1317 Linksys |
0981 Fast Ethernet 10/100 |
0985 Network Everywhere Fast Ethernet 10/100 model NC100 |
1985 Fast Ethernet 10/100 |
1318 Packet Engines Inc. |
0911 PCI Ethernet Adapter |
1319 Fortemedia, Inc |
0801 Xwave QS3000A [FM801] |
0802 Xwave QS3000A [FM801 game port] |
1000 FM801 PCI Audio |
1001 FM801 PCI Joystick |
131a Finisar Corp. |
131c Nippon Electro-Sensory Devices Corp |
131d Sysmic, Inc. |
131e Xinex Networks Inc |
131f Siig Inc |
1000 CyberSerial (1-port) 16550 |
1001 CyberSerial (1-port) 16650 |
1002 CyberSerial (1-port) 16850 |
1010 Duet 1S(16550)+1P |
1011 Duet 1S(16650)+1P |
1012 Duet 1S(16850)+1P |
1020 CyberParallel (1-port) |
1021 CyberParallel (2-port) |
1030 CyberSerial (2-port) 16550 |
1031 CyberSerial (2-port) 16650 |
1032 CyberSerial (2-port) 16850 |
1034 Trio 2S(16550)+1P |
1035 Trio 2S(16650)+1P |
1036 Trio 2S(16850)+1P |
1050 CyberSerial (4-port) 16550 |
1051 CyberSerial (4-port) 16650 |
1052 CyberSerial (4-port) 16850 |
2000 CyberSerial (1-port) 16550 |
2001 CyberSerial (1-port) 16650 |
2002 CyberSerial (1-port) 16850 |
2010 Duet 1S(16550)+1P |
2011 Duet 1S(16650)+1P |
2012 Duet 1S(16850)+1P |
2020 CyberParallel (1-port) |
2021 CyberParallel (2-port) |
2030 CyberSerial (2-port) 16550 |
131f 2030 PCI Serial Card |
2031 CyberSerial (2-port) 16650 |
2032 CyberSerial (2-port) 16850 |
2040 Trio 1S(16550)+2P |
2041 Trio 1S(16650)+2P |
2042 Trio 1S(16850)+2P |
2050 CyberSerial (4-port) 16550 |
2051 CyberSerial (4-port) 16650 |
2052 CyberSerial (4-port) 16850 |
2060 Trio 2S(16550)+1P |
2061 Trio 2S(16650)+1P |
2062 Trio 2S(16850)+1P |
1320 Crypto AG |
1321 Arcobel Graphics BV |
1322 MTT Co., Ltd |
1323 Dome Inc |
1324 Sphere Communications |
1325 Salix Technologies, Inc |
1326 Seachange international |
1327 Voss scientific |
1328 quadrant international |
1329 Productivity Enhancement |
132a Microcom Inc. |
132b Broadband Technologies |
132c Micrel Inc |
132d Integrated Silicon Solution, Inc. |
1330 MMC Networks |
1331 Radisys Corp. |
1332 Micro Memory |
5415 MM-5415CN PCI Memory Module with Battery Backup |
1334 Redcreek Communications, Inc |
1335 Videomail, Inc |
1337 Third Planet Publishing |
1338 BT Electronics |
133a Vtel Corp |
133b Softcom Microsystems |
133c Holontech Corp |
133d SS Technologies |
133e Virtual Computer Corp |
133f SCM Microsystems |
1340 Atalla Corp |
1341 Kyoto Microcomputer Co |
1342 Promax Systems Inc |
1343 Phylon Communications Inc |
1344 Crucial Technology |
1345 Arescom Inc |
1347 Odetics |
1349 Sumitomo Electric Industries, Ltd. |
134a DTC Technology Corp. |
0001 Domex 536 |
0002 Domex DMX3194UP SCSI Adapter |
134b ARK Research Corp. |
134c Chori Joho System Co. Ltd |
134d PCTel Inc |
7890 HSP MicroModem 56 |
7891 HSP MicroModem 56 |
134d 0001 HSP MicroModem 56 |
7892 HSP MicroModem 56 |
7893 HSP MicroModem 56 |
7894 HSP MicroModem 56 |
7895 HSP MicroModem 56 |
7896 HSP MicroModem 56 |
7897 HSP MicroModem 56 |
134e CSTI |
134f Algo System Co Ltd |
1350 Systec Co. Ltd |
1351 Sonix Inc |
1353 Thales Idatys |
0002 Proserver |
0003 PCI-FUT |
0004 PCI-S0 |
0005 PCI-FUT-S0 |
1354 Dwave System Inc |
1355 Kratos Analytical Ltd |
1356 The Logical Co |
1359 Prisa Networks |
135a Brain Boxes |
135b Giganet Inc |
135c Quatech Inc |
0010 QSC-100 |
0020 DSC-100 |
0030 DSC-200/300 |
0040 QSC-200/300 |
0050 ESC-100D |
0060 ESC-100M |
00f0 MPAC-100 Syncronous Serial Card (Zilog 85230) |
0170 QSCLP-100 |
0180 DSCLP-100 |
0190 SSCLP-100 |
01a0 QSCLP-200/300 |
01b0 DSCLP-200/300 |
01c0 SSCLP-200/300 |
135d ABB Network Partner AB |
135e Sealevel Systems Inc |
7101 Single Port RS-232/422/485/530 |
7201 Dual Port RS-232/422/485 Interface |
7202 Dual Port RS-232 Interface |
7401 Four Port RS-232 Interface |
7402 Four Port RS-422/485 Interface |
7801 Eight Port RS-232 Interface |
8001 8001 Digital I/O Adapter |
135f I-Data International A-S |
1360 Meinberg Funkuhren |
1361 Soliton Systems K.K. |
1362 Fujifacom Corporation |
1363 Phoenix Technology Ltd |
1364 ATM Communications Inc |
1365 Hypercope GmbH |
1366 Teijin Seiki Co. Ltd |
1367 Hitachi Zosen Corporation |
1368 Skyware Corporation |
1369 Digigram |
136a High Soft Tech |
136b Kawasaki Steel Corporation |
136c Adtek System Science Co Ltd |
136d Gigalabs Inc |
136f Applied Magic Inc |
1370 ATL Products |
1371 CNet Technology Inc |
434e GigaCard Network Adapter |
1371 434e N-Way PCI-Bus Giga-Card 1000/100/10Mbps(L) |
1373 Silicon Vision Inc |
1374 Silicom Ltd |
1375 Argosystems Inc |
1376 LMC |
1377 Electronic Equipment Production & Distribution GmbH |
1378 Telemann Co. Ltd |
1379 Asahi Kasei Microsystems Co Ltd |
137a Mark of the Unicorn Inc |
137b PPT Vision |
137c Iwatsu Electric Co Ltd |
137d Dynachip Corporation |
137e Patriot Scientific Corporation |
137f Japan Satellite Systems Inc |
1380 Sanritz Automation Co Ltd |
1381 Brains Co. Ltd |
1382 Marian - Electronic & Software |
1383 Controlnet Inc |
1384 Reality Simulation Systems Inc |
1385 Netgear |
4100 802.11b Wireless Adapter (MA301) |
620a GA620 |
622a GA622 |
630a GA630 |
f311 FA311 |
1386 Video Domain Technologies |
1387 Systran Corp |
1388 Hitachi Information Technology Co Ltd |
1389 Applicom International |
0001 PCI1500PFB [Intelligent fieldbus adaptor] |
138a Fusion Micromedia Corp |
138b Tokimec Inc |
138c Silicon Reality |
138d Future Techno Designs pte Ltd |
138e Basler GmbH |
138f Patapsco Designs Inc |
1390 Concept Development Inc |
1391 Development Concepts Inc |
1392 Medialight Inc |
1393 Moxa Technologies Co Ltd |
1040 Smartio C104H/PCI |
1680 Smartio C168H/PCI |
2040 Intellio CP-204J |
2180 Intellio C218 Turbo PCI |
3200 Intellio C320 Turbo PCI |
1394 Level One Communications |
0001 LXT1001 Gigabit Ethernet |
1394 0001 NetCelerator Adapter |
1395 Ambicom Inc |
1396 Cipher Systems Inc |
1397 Cologne Chip Designs GmbH |
2bd0 ISDN network controller [HFC-PCI] |
1397 2bd0 ISDN Board |
e4bf 1000 CI1-1-Harp |
1398 Clarion co. Ltd |
1399 Rios systems Co Ltd |
139a Alacritech Inc |
0001 Quad Port 10/100 Server Accelerator |
0003 Single Port 10/100 Server Accelerator |
0005 Single Port Gigabit Server Accelerator |
139b Mediasonic Multimedia Systems Ltd |
139c Quantum 3d Inc |
139d EPL limited |
139e Media4 |
139f Aethra s.r.l. |
13a0 Crystal Group Inc |
13a1 Kawasaki Heavy Industries Ltd |
13a2 Ositech Communications Inc |
13a3 Hifn Inc. |
0005 7751 Security Processor |
0006 6500 Public Key Processor |
0007 7811 Security Processor |
0012 7951 Security Processor |
0014 78XX Security Processor |
0016 8065 Security Processor |
0017 8165 Security Processor |
0018 8154 Security Processor |
13a4 Rascom Inc |
13a5 Audio Digital Imaging Inc |
13a6 Videonics Inc |
13a7 Teles AG |
13a8 Exar Corp. |
0158 XR17C158 Octal UART |
13a9 Siemens Medical Systems, Ultrasound Group |
13aa Broadband Networks Inc |
13ab Arcom Control Systems Ltd |
13ac Motion Media Technology Ltd |
13ad Nexus Inc |
13ae ALD Technology Ltd |
13af T.Sqware |
13b0 Maxspeed Corp |
13b1 Tamura corporation |
13b2 Techno Chips Co. Ltd |
13b3 Lanart Corporation |
13b4 Wellbean Co Inc |
13b5 ARM |
13b6 Dlog GmbH |
13b7 Logic Devices Inc |
13b8 Nokia Telecommunications oy |
13b9 Elecom Co Ltd |
13ba Oxford Instruments |
13bb Sanyo Technosound Co Ltd |
13bc Bitran Corporation |
13bd Sharp corporation |
13be Miroku Jyoho Service Co. Ltd |
13bf Sharewave Inc |
13c0 Microgate Corporation |
0010 SyncLink Adapter v1 |
0020 SyncLink SCC Adapter |
0030 SyncLink Multiport Adapter |
0210 SyncLink Adapter v2 |
13c1 3ware Inc |
1000 3ware ATA-RAID |
1001 3ware 7000-series ATA-RAID |
1002 3ware ATA-RAID |
13c2 Technotrend Systemtechnik GmbH |
13c3 Janz Computer AG |
13c4 Phase Metrics |
13c5 Alphi Technology Corp |
13c6 Condor Engineering Inc |
13c7 Blue Chip Technology Ltd |
13c8 Apptech Inc |
13c9 Eaton Corporation |
13ca Iomega Corporation |
13cb Yano Electric Co Ltd |
13cc Metheus Corporation |
13cd Compatible Systems Corporation |
13ce Cocom A/S |
13cf Studio Audio & Video Ltd |
13d0 Techsan Electronics Co Ltd |
13d1 Abocom Systems Inc |
ab02 ADMtek Centaur-C rev 17 [D-Link DFE-680TX] CardBus Fast Ethernet Adapter |
ab06 RTL8139 [FE2000VX] CardBus Fast Ethernet Attached Port Adapter |
13d2 Shark Multimedia Inc |
13d3 IMC Networks |
13d4 Graphics Microsystems Inc |
13d5 Media 100 Inc |
13d6 K.I. Technology Co Ltd |
13d7 Toshiba Engineering Corporation |
13d8 Phobos corporation |
13d9 Apex PC Solutions Inc |
13da Intresource Systems pte Ltd |
13db Janich & Klass Computertechnik GmbH |
13dc Netboost Corporation |
13dd Multimedia Bundle Inc |
13de ABB Robotics Products AB |
13df E-Tech Inc |
0001 PCI56RVP Modem |
13df 0001 PCI56RVP Modem |
13e0 GVC Corporation |
13e1 Silicom Multimedia Systems Inc |
13e2 Dynamics Research Corporation |
13e3 Nest Inc |
13e4 Calculex Inc |
13e5 Telesoft Design Ltd |
13e6 Argosy research Inc |
13e7 NAC Incorporated |
13e8 Chip Express Corporation |
13e9 Chip Express Corporation |
13ea Dallas Semiconductor |
13eb Hauppauge Computer Works Inc |
13ec Zydacron Inc |
13ed Raytheion E-Systems |
13ee Hayes Microcomputer Products Inc |
13ef Coppercom Inc |
13f0 Sundance Technology Inc |
0201 ST201 Sundance Ethernet |
13f1 Oce' - Technologies B.V. |
13f2 Ford Microelectronics Inc |
13f3 Mcdata Corporation |
13f4 Troika Networks, Inc. |
1401 Zentai Fibre Channel Adapter |
13f5 Kansai Electric Co. Ltd |
13f6 C-Media Electronics Inc |
0100 CM8338A |
13f6 ffff CMI8338/C3DX PCI Audio Device |
0101 CM8338B |
13f6 0101 CMI8338-031 PCI Audio Device |
0111 CM8738 |
1019 0970 P6STP-FL motherboard |
1043 8077 CMI8738 6-channel audio controller |
1043 80e2 CMI8738 6ch-MX |
13f6 0111 CMI8738/C3DX PCI Audio Device |
0211 CM8738 |
13f7 Wildfire Communications |
13f8 Ad Lib Multimedia Inc |
13f9 NTT Advanced Technology Corp. |
13fa Pentland Systems Ltd |
13fb Aydin Corp |
13fc Computer Peripherals International |
13fd Micro Science Inc |
13fe Advantech Co. Ltd |
1756 PCI-1756 |
13ff Silicon Spice Inc |
1400 Artx Inc |
1401 9432 TX |
1401 CR-Systems A/S |
1402 Meilhaus Electronic GmbH |
1403 Ascor Inc |
1404 Fundamental Software Inc |
1405 Excalibur Systems Inc |
1406 Oce' Printing Systems GmbH |
1407 Lava Computer mfg Inc |
0100 Lava Dual Serial |
0101 Lava Quatro A |
0102 Lava Quatro B |
0180 Lava Octo A |
0181 Lava Octo B |
0200 Lava Port Plus |
0201 Lava Quad A |
0202 Lava Quad B |
0500 Lava Single Serial |
0600 Lava Port 650 |
8000 Lava Parallel |
8001 Dual parallel port controller A |
8002 Lava Dual Parallel port A |
8003 Lava Dual Parallel port B |
8800 BOCA Research IOPPAR |
1408 Aloka Co. Ltd |
1409 Timedia Technology Co Ltd |
7168 PCI2S550 (Dual 16550 UART) |
140a DSP Research Inc |
140b Ramix Inc |
140c Elmic Systems Inc |
140d Matsushita Electric Works Ltd |
140e Goepel Electronic GmbH |
140f Salient Systems Corp |
1410 Midas lab Inc |
1411 Ikos Systems Inc |
1412 IC Ensemble Inc |
1712 ICE1712 [Envy24] |
1724 ICE1724 [Envy24HT] |
1413 Addonics |
1414 Microsoft Corporation |
1415 Oxford Semiconductor Ltd |
8403 VScom 011H-EP1 1 port parallel adaptor |
9501 OX16PCI954 (Quad 16950 UART) function 0 |
15ed 2000 MCCR Serial p0-3 of 8 |
15ed 2001 MCCR Serial p0-3 of 16 |
950a EXSYS EX-41092 Dual 16950 Serial adapter |
950b OXCB950 Cardbus 16950 UART |
9511 OX16PCI954 (Quad 16950 UART) function 1 |
15ed 2000 MCCR Serial p4-7 of 8 |
15ed 2001 MCCR Serial p4-15 of 16 |
9521 OX16PCI952 (Dual 16950 UART) |
1416 Multiwave Innovation pte Ltd |
1417 Convergenet Technologies Inc |
1418 Kyushu electronics systems Inc |
1419 Excel Switching Corp |
141a Apache Micro Peripherals Inc |
141b Zoom Telephonics Inc |
141d Digitan Systems Inc |
141e Fanuc Ltd |
141f Visiontech Ltd |
1420 Psion Dacom plc |
1421 Ads Technologies Inc |
1422 Ygrec Systems Co Ltd |
1423 Custom Technology Corp. |
1424 Videoserver Connections |
1425 ASIC Designers Inc |
1426 Storage Technology Corp. |
1427 Better On-Line Solutions |
1428 Edec Co Ltd |
1429 Unex Technology Corp. |
142a Kingmax Technology Inc |
142b Radiolan |
142c Minton Optic Industry Co Ltd |
142d Pix stream Inc |
142e Vitec Multimedia |
142f Radicom Research Inc |
1430 ITT Aerospace/Communications Division |
1431 Gilat Satellite Networks |
1432 Edimax Computer Co. |
1433 Eltec Elektronik GmbH |
1435 Real Time Devices US Inc. |
1436 CIS Technology Inc |
1437 Nissin Inc Co |
1438 Atmel-dream |
1439 Outsource Engineering & Mfg. Inc |
143a Stargate Solutions Inc |
143b Canon Research Center, America |
143c Amlogic Inc |
143d Tamarack Microelectronics Inc |
143e Jones Futurex Inc |
143f Lightwell Co Ltd - Zax Division |
1440 ALGOL Corp. |
1441 AGIE Ltd |
1442 Phoenix Contact GmbH & Co. |
1443 Unibrain S.A. |
1444 TRW |
1445 Logical DO Ltd |
1446 Graphin Co Ltd |
1447 AIM GmBH |
1448 Alesis Studio Electronics |
1449 TUT Systems Inc |
144a Adlink Technology |
7296 PCI-7296 |
7432 PCI-7432 |
7433 PCI-7433 |
7434 PCI-7434 |
7841 PCI-7841 |
8133 PCI-8133 |
8554 PCI-8554 |
9111 PCI-9111 |
9113 PCI-9113 |
9114 PCI-9114 |
144b Loronix Information Systems Inc |
144c Catalina Research Inc |
144d Samsung Electronics Co Ltd |
144e OLITEC |
144f Askey Computer Corp. |
1450 Octave Communications Ind. |
1451 SP3D Chip Design GmBH |
1453 MYCOM Inc |
1454 Altiga Networks |
1455 Logic Plus Plus Inc |
1456 Advanced Hardware Architectures |
1457 Nuera Communications Inc |
1458 Giga-byte Technology |
1459 DOOIN Electronics |
145a Escalate Networks Inc |
145b PRAIM SRL |
145c Cryptek |
145d Gallant Computer Inc |
145e Aashima Technology B.V. |
145f Baldor Electric Company |
0001 NextMove PCI |
1460 DYNARC INC |
1461 Avermedia Technologies Inc |
1462 Micro-star International Co Ltd |
1463 Fast Corporation |
1464 Interactive Circuits & Systems Ltd |
1465 GN NETTEST Telecom DIV. |
1466 Designpro Inc. |
1467 DIGICOM SPA |
1468 AMBIT Microsystem Corp. |
1469 Cleveland Motion Controls |
146a IFR |
146b Parascan Technologies Ltd |
146c Ruby Tech Corp. |
146d Tachyon, INC. |
146e Williams Electronics Games, Inc. |
146f Multi Dimensional Consulting Inc |
1470 Bay Networks |
1471 Integrated Telecom Express Inc |
1472 DAIKIN Industries, Ltd |
1473 ZAPEX Technologies Inc |
1474 Doug Carson & Associates |
1475 PICAZO Communications |
1476 MORTARA Instrument Inc |
1477 Net Insight |
1478 DIATREND Corporation |
1479 TORAY Industries Inc |
147a FORMOSA Industrial Computing |
147b ABIT Computer Corp. |
147c AWARE, Inc. |
147d Interworks Computer Products |
147e Matsushita Graphic Communication Systems, Inc. |
147f NIHON UNISYS, Ltd. |
1480 SCII Telecom |
1481 BIOPAC Systems Inc |
1482 ISYTEC - Integrierte Systemtechnik GmBH |
1483 LABWAY Corporation |
1484 Logic Corporation |
1485 ERMA - Electronic GmBH |
1486 L3 Communications Telemetry & Instrumentation |
1487 MARQUETTE Medical Systems |
1488 KONTRON Electronik GmBH |
1489 KYE Systems Corporation |
148a OPTO |
148b INNOMEDIALOGIC Inc. |
148c C.P. Technology Co. Ltd |
148d DIGICOM Systems, Inc. |
1003 HCF 56k Data/Fax Modem |
148e OSI Plus Corporation |
148f Plant Equipment, Inc. |
1490 Stone Microsystems PTY Ltd. |
1491 ZEAL Corporation |
1492 Time Logic Corporation |
1493 MAKER Communications |
1494 WINTOP Technology, Inc. |
1495 TOKAI Communications Industry Co. Ltd |
1496 JOYTECH Computer Co., Ltd. |
1497 SMA Regelsysteme GmBH |
1498 TEWS Datentechnik GmBH |
1499 EMTEC CO., Ltd |
149a ANDOR Technology Ltd |
149b SEIKO Instruments Inc |
149c OVISLINK Corp. |
149d NEWTEK Inc |
149e Mapletree Networks Inc. |
149f LECTRON Co Ltd |
14a0 SOFTING GmBH |
14a1 Systembase Co Ltd |
14a2 Millennium Engineering Inc |
14a3 Maverick Networks |
14a4 GVC/BCM Advanced Research |
14a5 XIONICS Document Technologies Inc |
14a6 INOVA Computers GmBH & Co KG |
14a7 MYTHOS Systems Inc |
14a8 FEATRON Technologies Corporation |
14a9 HIVERTEC Inc |
14aa Advanced MOS Technology Inc |
14ab Mentor Graphics Corp. |
14ac Novaweb Technologies Inc |
14ad Time Space Radio AB |
14ae CTI, Inc |
14af Guillemot Corporation |
7102 3D Prophet II MX |
14b0 BST Communication Technology Ltd |
14b1 Nextcom K.K. |
14b2 ENNOVATE Networks Inc |
14b3 XPEED Inc |
0000 DSL NIC |
14b4 PHILIPS Business Electronics B.V. |
14b5 Creamware GmBH |
14b6 Quantum Data Corp. |
14b7 PROXIM Inc |
0001 Symphony 4110 |
14b8 Techsoft Technology Co Ltd |
14b9 AIRONET Wireless Communications |
0001 PC4800 |
0340 PC4800 |
0350 PC4800 |
4500 PC4500 |
4800 PC4800 |
a504 Cisco Aironet Wireless 802.11b |
14ba INTERNIX Inc. |
14bb SEMTECH Corporation |
14bc Globespan Semiconductor Inc. |
14bd CARDIO Control N.V. |
14be L3 Communications |
14bf SPIDER Communications Inc. |
14c0 COMPAL Electronics Inc |
14c1 MYRICOM Inc. |
14c2 DTK Computer |
14c3 MEDIATEK Corp. |
14c4 IWASAKI Information Systems Co Ltd |
14c5 Automation Products AB |
14c6 Data Race Inc |
14c7 Modular Technology Holdings Ltd |
14c8 Turbocomm Tech. Inc. |
14c9 ODIN Telesystems Inc |
14ca PE Logic Corp. |
14cb Billionton Systems Inc |
14cc NAKAYO Telecommunications Inc |
14cd Universal Scientific Ind. |
14ce Whistle Communications |
14cf TEK Microsystems Inc. |
14d0 Ericsson Axe R & D |
14d1 Computer Hi-Tech Co Ltd |
14d2 Titan Electronics Inc |
8001 VScom 010L 1 port parallel adaptor |
8002 VScom 020L 2 port parallel adaptor |
8010 VScom 100L 1 port serial adaptor |
8011 VScom 110L 1 port serial and 1 port parallel adaptor |
8020 VScom 200L 1 port serial adaptor |
8021 VScom 210L 2 port serial and 1 port parallel adaptor |
8040 VScom 400L 4 port serial adaptor |
8080 VScom 800L 8 port serial adaptor |
a000 VScom 010H 1 port parallel adaptor |
a001 VScom 100H 1 port serial adaptor |
a003 VScom 400H 4 port serial adaptor |
a004 VScom 400HF1 4 port serial adaptor |
a005 VScom 200H 2 port serial adaptor |
e001 VScom 010HV2 1 port parallel adaptor |
e010 VScom 100HV2 1 port serial adaptor |
e020 VScom 200HV2 2 port serial adaptor |
14d3 CIRTECH (UK) Ltd |
14d4 Panacom Technology Corp |
14d5 Nitsuko Corporation |
14d6 Accusys Inc |
14d7 Hirakawa Hewtech Corp |
14d8 HOPF Elektronik GmBH |
14d9 Alpha Processor Inc |
14da National Aerospace Laboratories |
14db AFAVLAB Technology Inc |
2120 TK9902 |
14dc Amplicon Liveline Ltd |
0000 PCI230 |
0001 PCI242 |
0002 PCI244 |
0003 PCI247 |
0004 PCI248 |
0005 PCI249 |
0006 PCI260 |
0007 PCI224 |
0008 PCI234 |
0009 PCI236 |
000a PCI272 |
000b PCI215 |
14dd Boulder Design Labs Inc |
14de Applied Integration Corporation |
14df ASIC Communications Corp |
14e1 INVERTEX |
14e2 INFOLIBRIA |
14e3 AMTELCO |
14e4 Broadcom Corporation |
1644 NetXtreme BCM5700 Gigabit Ethernet |
1014 0277 Broadcom Vigil B5700 1000Base-T |
1028 00d1 Broadcom BCM5700 |
1028 0106 Broadcom BCM5700 |
1028 0109 Broadcom BCM5700 1000Base-T |
1028 010a Broadcom BCM5700 1000BaseTX |
10b7 1000 3C996-T 1000Base-T |
10b7 1001 3C996B-T 1000Base-T |
10b7 1002 3C996C-T 1000Base-T |
10b7 1003 3C997-T 1000Base-T Dual Port |
10b7 1004 3C996-SX 1000Base-SX |
10b7 1005 3C997-SX 1000Base-SX Dual Port |
10b7 1008 3C942 Gigabit LOM (31X31) |
14e4 0002 NetXtreme 1000Base-SX |
14e4 0003 NetXtreme 1000Base-SX |
14e4 0004 NetXtreme 1000Base-T |
14e4 1028 NetXtreme 1000BaseTX |
14e4 1644 BCM5700 1000Base-T |
1645 NetXtreme BCM5701 Gigabit Ethernet |
0e11 007c NC7770 Gigabit Server Adapter (PCI-X, 10/100/1000-T) |
0e11 007d NC6770 Gigabit Server Adapter (PCI-X, 1000-SX) |
0e11 0085 NC7780 Gigabit Server Adapter (embedded, WOL) |
0e11 0099 NC7780 Gigabit Server Adapter (embedded, WOL) |
0e11 009a NC7770 Gigabit Server Adapter (PCI-X, 10/100/1000-T) |
0e11 00c1 NC6770 Gigabit Server Adapter (PCI-X, 1000-SX) |
1028 0121 Broadcom BCM5701 1000Base-T |
10b7 1004 3C996-SX 1000Base-SX |
10b7 1006 3C996B-T 1000Base-T |
10b7 1007 3C1000-T 1000Base-T |
10b7 1008 3C940-BR01 1000Base-T |
14e4 0001 BCM5701 1000Base-T |
14e4 0005 BCM5701 1000Base-T |
14e4 0006 BCM5701 1000Base-T |
14e4 0007 BCM5701 1000Base-SX |
14e4 0008 BCM5701 1000Base-T |
14e4 8008 BCM5701 1000Base-T |
1646 NetXtreme BCM5702 Gigabit Ethernet |
0e11 00bb NC7760 1000BaseTX |
1028 0126 Broadcom BCM5702 1000BaseTX |
14e4 8009 BCM5702 1000BaseTX |
1647 NetXtreme BCM5703 Gigabit Ethernet |
0e11 0099 NC7780 1000BaseTX |
0e11 009a NC7770 1000BaseTX |
14e4 0009 BCM5703 1000BaseTX |
14e4 000a BCM5703 1000BaseSX |
14e4 000b BCM5703 1000BaseTX |
14e4 8009 BCM5703 1000BaseTX |
14e4 800a BCM5703 1000BaseTX |
1648 NetXtreme BCM5704 Gigabit Ethernet |
0e11 00cf NC7772 Gigabit Server Adapter (PCI-X, 10,100,1000-T) |
0e11 00d0 NC7782 Gigabit Server Adapter (PCI-X, 10,100,1000-T) |
0e11 00d1 NC7783 Gigabit Server Adapter (PCI-X, 10,100,1000-T) |
10b7 2000 3C998-T Dual Port 10/100/1000 PCI-X |
10b7 3000 3C999-T Quad Port 10/100/1000 PCI-X |
1166 1648 NetXtreme CIOB-E 1000Base-T |
164d NetXtreme BCM5702FE Gigabit Ethernet |
1653 NetXtreme BCM5705 Gigabit Ethernet |
1654 NetXtreme BCM5705 Gigabit Ethernet |
165d NetXtreme BCM5705M Gigabit Ethernet |
165e NetXtreme BCM5705M Gigabit Ethernet |
1696 NetXtreme BCM5782 Gigabit Ethernet |
14e4 000d NetXtreme BCM5782 1000Base-T |
169c NetXtreme BCM5788 Gigabit Ethernet |
16a6 NetXtreme BCM5702 Gigabit Ethernet |
0e11 00bb NC7760 Gigabit Server Adapter (PCI-X, 10/100/1000-T) |
1028 0126 BCM5702 1000Base-T |
14e4 000c BCM5702 1000Base-T |
14e4 8009 BCM5702 1000Base-T |
16a7 NetXtreme BCM5703 Gigabit Ethernet |
0e11 00ca NC7771 Gigabit Server Adapter (PCI-X, 10,100,1000-T) |
0e11 00cb NC7781 Gigabit Server Adapter (PCI-X, 10,100,1000-T) |
14e4 0009 NetXtreme BCM5703 1000Base-T |
14e4 000a NetXtreme BCM5703 1000Base-SX |
14e4 000b NetXtreme BCM5703 1000Base-T |
14e4 800a NetXtreme BCM5703 1000Base-T |
16a8 NetXtreme BCM5704S Gigabit Ethernet |
10b7 2001 3C998-SX Dual Port 1000-SX PCI-X |
16c6 NetXtreme BCM5702 Gigabit Ethernet |
10b7 1100 3C1000B-T 10/100/1000 PCI |
14e4 000c BCM5702 1000Base-T |
14e4 8009 BCM5702 1000Base-T |
16c7 NetXtreme BCM5703 Gigabit Ethernet |
14e4 0009 NetXtreme BCM5703 1000Base-T |
14e4 000a NetXtreme BCM5703 1000Base-SX |
170d NetXtreme BCM5901 Gigabit Ethernet |
170e NetXtreme BCM5901 Gigabit Ethernet |
4210 BCM4210 iLine10 HomePNA 2.0 |
4211 BCM4211 iLine10 HomePNA 2.0 + V.90 56k modem |
4212 BCM4212 v.90 56k modem |
4301 BCM4301 802.11b |
4401 BCM4401 100Base-T |
4402 BCM4402 Integrated 10/100BaseT |
4410 BCM4413 iLine32 HomePNA 2.0 |
4411 BCM4413 V.90 56k modem |
4412 BCM4413 10/100BaseT |
5820 BCM5820 Crypto Accelerator |
5821 BCM5821 Crypto Accelerator |
14e5 Pixelfusion Ltd |
14e6 SHINING Technology Inc |
14e7 3CX |
14e8 RAYCER Inc |
14e9 GARNETS System CO Ltd |
14ea Planex Communications, Inc |
ab06 FNW-3603-TX CardBus Fast Ethernet |
14eb SEIKO EPSON Corp |
14ec ACQIRIS |
14ed DATAKINETICS Ltd |
14ee MASPRO KENKOH Corp |
14ef CARRY Computer ENG. CO Ltd |
14f0 CANON RESEACH CENTRE FRANCE |
14f1 Conexant |
1002 HCF 56k Modem |
1003 HCF 56k Modem |
1004 HCF 56k Modem |
1005 HCF 56k Modem |
1006 HCF 56k Modem |
1022 HCF 56k Modem |
1023 HCF 56k Modem |
1024 HCF 56k Modem |
1025 HCF 56k Modem |
1026 HCF 56k Modem |
1032 HCF 56k Modem |
1033 HCF 56k Data/Fax Modem |
1033 8077 NEC |
122d 4027 Dell Zeus - MDP3880-W(B) Data Fax Modem |
122d 4030 Dell Mercury - MDP3880-U(B) Data Fax Modem |
122d 4034 Dell Thor - MDP3880-W(U) Data Fax Modem |
13e0 020d Dell Copper |
13e0 020e Dell Silver |
13e0 0261 IBM |
13e0 0290 Compaq Goldwing |
13e0 02a0 IBM |
13e0 02b0 IBM |
13e0 02c0 Compaq Scooter |
13e0 02d0 IBM |
144f 1500 IBM P85-DF (1) |
144f 1501 IBM P85-DF (2) |
144f 150a IBM P85-DF (3) |
144f 150b IBM P85-DF Low Profile (1) |
144f 1510 IBM P85-DF Low Profile (2) |
1034 HCF 56k Data/Fax/Voice Modem |
1035 HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem |
10cf 1098 Fujitsu P85-DFSV |
1036 HCF 56k Data/Fax/Voice/Spkp Modem |
104d 8067 HCF 56k Modem |
122d 4029 MDP3880SP-W |
122d 4031 MDP3880SP-U |
13e0 0209 Dell Titanium |
13e0 020a Dell Graphite |
13e0 0260 Gateway Red Owl |
13e0 0270 Gateway White Horse |
1052 HCF 56k Data/Fax Modem (Worldwide) |
1053 HCF 56k Data/Fax Modem (Worldwide) |
1054 HCF 56k Data/Fax/Voice Modem (Worldwide) |
1055 HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem (Worldwide) |
1056 HCF 56k Data/Fax/Voice/Spkp Modem (Worldwide) |
1057 HCF 56k Data/Fax/Voice/Spkp Modem (Worldwide) |
1059 HCF 56k Data/Fax/Voice Modem (Worldwide) |
1063 HCF 56k Data/Fax Modem |
1064 HCF 56k Data/Fax/Voice Modem |
1065 HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem |
1066 HCF 56k Data/Fax/Voice/Spkp Modem |
122d 4033 Dell Athena - MDP3900V-U |
1433 HCF 56k Data/Fax Modem |
1434 HCF 56k Data/Fax/Voice Modem |
1435 HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem |
1436 HCF 56k Data/Fax Modem |
1453 HCF 56k Data/Fax Modem |
13e0 0240 IBM |
13e0 0250 IBM |
144f 1502 IBM P95-DF (1) |
144f 1503 IBM P95-DF (2) |
1454 HCF 56k Data/Fax/Voice Modem |
1455 HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem |
1456 HCF 56k Data/Fax/Voice/Spkp Modem |
122d 4035 Dell Europa - MDP3900V-W |
122d 4302 Dell MP3930V-W(C) MiniPCI |
1610 ADSL AccessRunner PCI Arbitration Device |
1611 AccessRunner PCI ADSL Interface Device |
1803 HCF 56k Modem |
0e11 0023 623-LAN Grizzly |
0e11 0043 623-LAN Yogi |
1815 HCF 56k Modem |
0e11 0022 Grizzly |
0e11 0042 Yogi |
2003 HSF 56k Data/Fax Modem |
2004 HSF 56k Data/Fax/Voice Modem |
2005 HSF 56k Data/Fax/Voice/Spkp (w/Handset) Modem |
2006 HSF 56k Data/Fax/Voice/Spkp Modem |
2013 HSF 56k Data/Fax Modem |
0e11 b195 Bear |
0e11 b196 Seminole 1 |
0e11 b1be Seminole 2 |
1025 8013 Acer |
1033 809d NEC |
1033 80bc NEC |
155d 6793 HP |
155d 8850 E Machines |
2014 HSF 56k Data/Fax/Voice Modem |
2015 HSF 56k Data/Fax/Voice/Spkp (w/Handset) Modem |
2016 HSF 56k Data/Fax/Voice/Spkp Modem |
2043 HSF 56k Data/Fax Modem (WorldW SmartDAA) |
2044 HSF 56k Data/Fax/Voice Modem (WorldW SmartDAA) |
2045 HSF 56k Data/Fax/Voice/Spkp (w/Handset) Modem (WorldW SmartDAA) |
2046 HSF 56k Data/Fax/Voice/Spkp Modem (WorldW SmartDAA) |
2063 HSF 56k Data/Fax Modem (SmartDAA) |
2064 HSF 56k Data/Fax/Voice Modem (SmartDAA) |
2065 HSF 56k Data/Fax/Voice/Spkp (w/Handset) Modem (SmartDAA) |
2066 HSF 56k Data/Fax/Voice/Spkp Modem (SmartDAA) |
2093 HSF 56k Modem |
155d 2f07 Legend |
2143 HSF 56k Data/Fax/Cell Modem (Mob WorldW SmartDAA) |
2144 HSF 56k Data/Fax/Voice/Cell Modem (Mob WorldW SmartDAA) |
2145 HSF 56k Data/Fax/Voice/Spkp (w/HS)/Cell Modem (Mob WorldW SmartDAA) |
2146 HSF 56k Data/Fax/Voice/Spkp/Cell Modem (Mob WorldW SmartDAA) |
2163 HSF 56k Data/Fax/Cell Modem (Mob SmartDAA) |
2164 HSF 56k Data/Fax/Voice/Cell Modem (Mob SmartDAA) |
2165 HSF 56k Data/Fax/Voice/Spkp (w/HS)/Cell Modem (Mob SmartDAA) |
2166 HSF 56k Data/Fax/Voice/Spkp/Cell Modem (Mob SmartDAA) |
2343 HSF 56k Data/Fax CardBus Modem (Mob WorldW SmartDAA) |
2344 HSF 56k Data/Fax/Voice CardBus Modem (Mob WorldW SmartDAA) |
2345 HSF 56k Data/Fax/Voice/Spkp (w/HS) CardBus Modem (Mob WorldW SmartDAA) |
2346 HSF 56k Data/Fax/Voice/Spkp CardBus Modem (Mob WorldW SmartDAA) |
2363 HSF 56k Data/Fax CardBus Modem (Mob SmartDAA) |
2364 HSF 56k Data/Fax/Voice CardBus Modem (Mob SmartDAA) |
2365 HSF 56k Data/Fax/Voice/Spkp (w/HS) CardBus Modem (Mob SmartDAA) |
2366 HSF 56k Data/Fax/Voice/Spkp CardBus Modem (Mob SmartDAA) |
2443 HSF 56k Data/Fax Modem (Mob WorldW SmartDAA) |
104d 8075 Modem |
104d 8083 Modem |
104d 8097 Modem |
2444 HSF 56k Data/Fax/Voice Modem (Mob WorldW SmartDAA) |
2445 HSF 56k Data/Fax/Voice/Spkp (w/HS) Modem (Mob WorldW SmartDAA) |
2446 HSF 56k Data/Fax/Voice/Spkp Modem (Mob WorldW SmartDAA) |
2463 HSF 56k Data/Fax Modem (Mob SmartDAA) |
2464 HSF 56k Data/Fax/Voice Modem (Mob SmartDAA) |
2465 HSF 56k Data/Fax/Voice/Spkp (w/HS) Modem (Mob SmartDAA) |
2466 HSF 56k Data/Fax/Voice/Spkp Modem (Mob SmartDAA) |
2f00 HSF 56k HSFi Modem |
13e0 8d84 IBM HSFi V.90 |
13e0 8d85 Compaq Stinger |
14f1 2004 Dynalink 56PMi |
8234 RS8234 ATM SAR Controller [ServiceSAR Plus] |
14f2 MOBILITY Electronics |
0120 EV1000 bridge |
0121 EV1000 Parallel port |
0122 EV1000 Serial port |
0123 EV1000 Keyboard controller |
0124 EV1000 Mouse controller |
14f3 BROADLOGIC |
14f4 TOKYO Electronic Industry CO Ltd |
14f5 SOPAC Ltd |
14f6 COYOTE Technologies LLC |
14f7 WOLF Technology Inc |
14f8 AUDIOCODES Inc |
14f9 AG COMMUNICATIONS |
14fa WANDEL & GOCHERMANN |
14fb TRANSAS MARINE (UK) Ltd |
14fc Quadrics Ltd |
0000 QsNet Elan3 Network Adapter |
0001 QsNetII Elan4 Network Adapter |
14fd JAPAN Computer Industry Inc |
14fe ARCHTEK TELECOM Corp |
14ff TWINHEAD INTERNATIONAL Corp |
1500 DELTA Electronics, Inc |
1501 BANKSOFT CANADA Ltd |
1502 MITSUBISHI ELECTRIC LOGISTICS SUPPORT Co Ltd |
1503 KAWASAKI LSI USA Inc |
1504 KAISER Electronics |
1505 ITA INGENIEURBURO FUR TESTAUFGABEN GmbH |
1506 CHAMELEON Systems Inc |
# Should be HTEC Ltd, but there are no known HTEC chips and 1507 is already used by mistake by Motorola (see vendor ID 1057). |
1507 Motorola ?? / HTEC |
0001 MPC105 [Eagle] |
0002 MPC106 [Grackle] |
0003 MPC8240 [Kahlua] |
0100 MC145575 [HFC-PCI] |
0431 KTI829c 100VG |
4801 Raven |
4802 Falcon |
4803 Hawk |
4806 CPX8216 |
1508 HONDA CONNECTORS/MHOTRONICS Inc |
1509 FIRST INTERNATIONAL Computer Inc |
150a FORVUS RESEARCH Inc |
150b YAMASHITA Systems Corp |
150c KYOPAL CO Ltd |
150d WARPSPPED Inc |
150e C-PORT Corp |
150f INTEC GmbH |
1510 BEHAVIOR TECH Computer Corp |
1511 CENTILLIUM Technology Corp |
1512 ROSUN Technologies Inc |
1513 Raychem |
1514 TFL LAN Inc |
1515 Advent design |
1516 MYSON Technology Inc |
0803 SURECOM EP-320X-S 100/10M Ethernet PCI Adapter |
1320 10bd SURECOM EP-320X-S 100/10M Ethernet PCI Adapter |
1517 ECHOTEK Corp |
1518 PEP MODULAR Computers GmbH |
1519 TELEFON AKTIEBOLAGET LM Ericsson |
151a Globetek |
1002 PCI-1002 |
1004 PCI-1004 |
1008 PCI-1008 |
151b COMBOX Ltd |
151c DIGITAL AUDIO LABS Inc |
151d Fujitsu Computer Products Of America |
151e MATRIX Corp |
151f TOPIC SEMICONDUCTOR Corp |
0000 TP560 Data/Fax/Voice 56k modem |
1520 CHAPLET System Inc |
1521 BELL Corp |
1522 MainPine Ltd |
0100 PCI <-> IOBus Bridge |
1522 0200 RockForceDUO 2 Port V.92/V.44 Data/Fax/Voice Modem |
1522 0300 RockForceQUATRO 4 Port V.92/V.44 Data/Fax/Voice Modem |
1522 0400 RockForceDUO+ 2 Port V.92/V.44 Data/Fax/Voice Modem |
1522 0500 RockForceQUATRO+ 4 Port V.92/V.44 Data/Fax/Voice Modem |
1522 0600 RockForce+ 2 Port V.90 Data/Fax/Voice Modem |
1523 MUSIC Semiconductors |
1524 ENE Technology Inc |
1211 CB1211 Cardbus Controller |
1225 CB1225 Cardbus Controller |
1410 CB1410 Cardbus Controller |
1420 CB1420 Cardbus Controller |
1525 IMPACT Technologies |
1526 ISS, Inc |
1527 SOLECTRON |
1528 ACKSYS |
1529 AMERICAN MICROSystems Inc |
152a QUICKTURN DESIGN Systems |
152b FLYTECH Technology CO Ltd |
152c MACRAIGOR Systems LLC |
152d QUANTA Computer Inc |
152e MELEC Inc |
152f PHILIPS - CRYPTO |
1530 ACQIS Technology Inc |
1531 CHRYON Corp |
1532 ECHELON Corp |
1533 BALTIMORE |
1534 ROAD Corp |
1535 EVERGREEN Technologies Inc |
1537 DATALEX COMMUNCATIONS |
1538 ARALION Inc |
1539 ATELIER INFORMATIQUES et ELECTRONIQUE ETUDES S.A. |
153a ONO SOKKI |
153b TERRATEC Electronic GmbH |
153c ANTAL Electronic |
153d FILANET Corp |
153e TECHWELL Inc |
153f MIPS DENMARK |
1540 PROVIDEO MULTIMEDIA Co Ltd |
1541 MACHONE Communications |
1542 VIVID Technology Inc |
1543 SILICON Laboratories |
4c22 Si3036 MC'97 DAA |
1544 DCM DATA Systems |
1545 VISIONTEK |
1546 IOI Technology Corp |
1547 MITUTOYO Corp |
1548 JET PROPULSION Laboratory |
1549 INTERCONNECT Systems Solutions |
154a MAX Technologies Inc |
154b COMPUTEX Co Ltd |
154c VISUAL Technology Inc |
154d PAN INTERNATIONAL Industrial Corp |
154e SERVOTEST Ltd |
154f STRATABEAM Technology |
1550 OPEN NETWORK Co Ltd |
1551 SMART Electronic DEVELOPMENT GmBH |
1552 RACAL AIRTECH Ltd |
1553 CHICONY Electronics Co Ltd |
1554 PROLINK Microsystems Corp |
1555 GESYTEC GmBH |
1556 PLD APPLICATIONS |
1557 MEDIASTAR Co Ltd |
1558 CLEVO/KAPOK Computer |
1559 SI LOGIC Ltd |
155a INNOMEDIA Inc |
155b PROTAC INTERNATIONAL Corp |
155c Cemax-Icon Inc |
155d Mac System Co Ltd |
155e LP Elektronik GmbH |
155f Perle Systems Ltd |
1560 Terayon Communications Systems |
1561 Viewgraphics Inc |
1562 Symbol Technologies |
1563 A-Trend Technology Co Ltd |
1564 Yamakatsu Electronics Industry Co Ltd |
1565 Biostar Microtech Int'l Corp |
1566 Ardent Technologies Inc |
1567 Jungsoft |
1568 DDK Electronics Inc |
1569 Palit Microsystems Inc. |
156a Avtec Systems |
156b 2wire Inc |
156c Vidac Electronics GmbH |
156d Alpha-Top Corp |
156e Alfa Inc |
156f M-Systems Flash Disk Pioneers Ltd |
1570 Lecroy Corp |
1571 Contemporary Controls |
a001 CCSI PCI20-485 ARCnet |
a002 CCSI PCI20-485D ARCnet |
a003 CCSI PCI20-485X ARCnet |
a004 CCSI PCI20-CXB ARCnet |
a005 CCSI PCI20-CXS ARCnet |
a006 CCSI PCI20-FOG-SMA ARCnet |
a007 CCSI PCI20-FOG-ST ARCnet |
a008 CCSI PCI20-TB5 ARCnet |
a009 CCSI PCI20-5-485 5Mbit ARCnet |
a00a CCSI PCI20-5-485D 5Mbit ARCnet |
a00b CCSI PCI20-5-485X 5Mbit ARCnet |
a00c CCSI PCI20-5-FOG-ST 5Mbit ARCnet |
a00d CCSI PCI20-5-FOG-SMA 5Mbit ARCnet |
a201 CCSI PCI22-485 10Mbit ARCnet |
a202 CCSI PCI22-485D 10Mbit ARCnet |
a203 CCSI PCI22-485X 10Mbit ARCnet |
a204 CCSI PCI22-CHB 10Mbit ARCnet |
a205 CCSI PCI22-FOG_ST 10Mbit ARCnet |
a206 CCSI PCI22-THB 10Mbit ARCnet |
1572 Otis Elevator Company |
1573 Lattice - Vantis |
1574 Fairchild Semiconductor |
1575 Voltaire Advanced Data Security Ltd |
1576 Viewcast COM |
1578 HITT |
1579 Dual Technology Corp |
157a Japan Elecronics Ind Inc |
157b Star Multimedia Corp |
157c Eurosoft (UK) |
8001 Fix2000 PCI Y2K Compliance Card |
157d Gemflex Networks |
157e Transition Networks |
157f PX Instruments Technology Ltd |
1580 Primex Aerospace Co |
1581 SEH Computertechnik GmbH |
1582 Cytec Corp |
1583 Inet Technologies Inc |
1584 Uniwill Computer Corp |
1585 Logitron |
1586 Lancast Inc |
1587 Konica Corp |
1588 Solidum Systems Corp |
1589 Atlantek Microsystems Pty Ltd |
158a Digalog Systems Inc |
158b Allied Data Technologies |
158c Hitachi Semiconductor & Devices Sales Co Ltd |
158d Point Multimedia Systems |
158e Lara Technology Inc |
158f Ditect Coop |
1590 3pardata Inc |
1591 ARN |
1592 Syba Tech Ltd |
0781 Multi-IO Card |
0782 Parallel Port Card 2xEPP |
0783 Multi-IO Card |
0785 Multi-IO Card |
0786 Multi-IO Card |
0787 Multi-IO Card |
0788 Multi-IO Card |
078a Multi-IO Card |
1593 Bops Inc |
1594 Netgame Ltd |
1595 Diva Systems Corp |
1596 Folsom Research Inc |
1597 Memec Design Services |
1598 Granite Microsystems |
1599 Delta Electronics Inc |
159a General Instrument |
159b Faraday Technology Corp |
159c Stratus Computer Systems |
159d Ningbo Harrison Electronics Co Ltd |
159e A-Max Technology Co Ltd |
159f Galea Network Security |
15a0 Compumaster SRL |
15a1 Geocast Network Systems |
15a2 Catalyst Enterprises Inc |
0001 TA700 PCI Bus Analyzer/Exerciser |
15a3 Italtel |
15a4 X-Net OY |
15a5 Toyota Macs Inc |
15a6 Sunlight Ultrasound Technologies Ltd |
15a7 SSE Telecom Inc |
15a8 Shanghai Communications Technologies Center |
15aa Moreton Bay |
15ab Bluesteel Networks Inc |
15ac North Atlantic Instruments |
15ad VMWare Inc |
0710 Virtual SVGA |
15ae Amersham Pharmacia Biotech |
15b0 Zoltrix International Ltd |
15b1 Source Technology Inc |
15b2 Mosaid Technologies Inc |
15b3 Mellanox Technology |
5274 MT21108 InfiniBridge |
15b4 CCI/TRIAD |
15b5 Cimetrics Inc |
15b6 Texas Memory Systems Inc |
15b7 Sandisk Corp |
15b8 ADDI-DATA GmbH |
15b9 Maestro Digital Communications |
15ba Impacct Technology Corp |
15bb Portwell Inc |
15bc Agilent Technologies |
2929 E2929A PCI/PCI-X Bus Analyzer |
15bd DFI Inc |
15be Sola Electronics |
15bf High Tech Computer Corp (HTC) |
15c0 BVM Ltd |
15c1 Quantel |
15c2 Newer Technology Inc |
15c3 Taiwan Mycomp Co Ltd |
15c4 EVSX Inc |
15c5 Procomp Informatics Ltd |
15c6 Technical University of Budapest |
15c7 Tateyama System Laboratory Co Ltd |
0349 Tateyama C-PCI PLC/NC card Rev.01A |
15c8 Penta Media Co Ltd |
15c9 Serome Technology Inc |
15ca Bitboys OY |
15cb AG Electronics Ltd |
15cc Hotrail Inc |
15cd Dreamtech Co Ltd |
15ce Genrad Inc |
15cf Hilscher GmbH |
15d1 Infineon Technologies AG |
15d2 FIC (First International Computer Inc) |
15d3 NDS Technologies Israel Ltd |
15d4 Iwill Corp |
15d5 Tatung Co |
15d6 Entridia Corp |
15d7 Rockwell-Collins Inc |
15d8 Cybernetics Technology Co Ltd |
15d9 Super Micro Computer Inc |
15da Cyberfirm Inc |
15db Applied Computing Systems Inc |
15dc Litronic Inc |
0001 Argus 300 PCI Cryptography Module |
15dd Sigmatel Inc |
15de Malleable Technologies Inc |
15df Infinilink Corp |
15e0 Cacheflow Inc |
15e1 Voice Technologies Group Inc |
15e2 Quicknet Technologies Inc |
15e3 Networth Technologies Inc |
15e4 VSN Systemen BV |
15e5 Valley technologies Inc |
15e6 Agere Inc |
15e7 Get Engineering Corp |
15e8 National Datacomm Corp |
0130 Wireless PCI Card |
15e9 Pacific Digital Corp |
15ea Tokyo Denshi Sekei K.K. |
15eb Drsearch GmbH |
15ec Beckhoff GmbH |
15ed Macrolink Inc |
15ee In Win Development Inc |
15ef Intelligent Paradigm Inc |
15f0 B-Tree Systems Inc |
15f1 Times N Systems Inc |
15f2 Diagnostic Instruments Inc |
15f3 Digitmedia Corp |
15f4 Valuesoft |
15f5 Power Micro Research |
15f6 Extreme Packet Device Inc |
15f7 Banctec |
15f8 Koga Electronics Co |
15f9 Zenith Electronics Corp |
15fa J.P. Axzam Corp |
15fb Zilog Inc |
15fc Techsan Electronics Co Ltd |
15fd N-CUBED.NET |
15fe Kinpo Electronics Inc |
15ff Fastpoint Technologies Inc |
1600 Northrop Grumman - Canada Ltd |
1601 Tenta Technology |
1602 Prosys-tec Inc |
1603 Nokia Wireless Communications |
1604 Central System Research Co Ltd |
1605 Pairgain Technologies |
1606 Europop AG |
1607 Lava Semiconductor Manufacturing Inc |
1608 Automated Wagering International |
1609 Scimetric Instruments Inc |
1612 Telesynergy Research Inc. |
1619 FarSite Communications Ltd |
0400 FarSync T2P (2 port X.21/V.35/V.24) |
0440 FarSync T4P (4 port X.21/V.35/V.24) |
1629 Kongsberg Spacetec AS |
1003 Format synchronizer v3.0 |
2002 Fast Universal Data Output |
1638 Standard Microsystems Corp [SMC] |
1100 SMC2602W EZConnect / Addtron AWA-100 |
163c Smart Link Ltd. |
5449 SmartPCI561 Modem |
1657 Brocade Communications Systems, Inc. |
165a Epix Inc |
c100 PIXCI(R) CL1 Camera Link Video Capture Board [custom QL5232] |
d200 PIXCI(R) D2X Digital Video Capture Board [custom QL5232] |
d300 PIXCI(R) D3X Digital Video Capture Board [custom QL5232] |
165d Hsing Tech. Enterprise Co., Ltd. |
1661 Worldspace Corp. |
1668 Actiontec Electronics Inc |
1681 Hercules |
16ab Global Sun Technology Inc |
1102 PCMCIA-to-PCI Wireless Network Bridge |
16be Creatix Polymedia GmbH |
16ec U.S. Robotics |
3685 Wireless Access PCI Adapter Model 022415 |
16f6 VideoTele.com, Inc. |
1705 Digital First, Inc. |
170b NetOctave Inc |
170c YottaYotta Inc. |
172a Accelerated Encryption |
1737 Linksys |
1032 Gigabit Network Adapter |
1737 0015 EG1032 v2 Instant Gigabit Network Adapter |
1064 Gigabit Network Adapter |
1737 0016 EG1064 v2 Instant Gigabit Network Adapter |
173b Altima (nee Broadcom) |
03e8 AC1000 Gigabit Ethernet |
03e9 AC1001 Gigabit Ethernet |
03ea AC9100 Gigabit Ethernet |
173b 0001 AC1002 |
03eb AC1003 Gigabit Ethernet |
1743 Peppercon AG |
8139 ROL/F-100 Fast Ethernet Adapter with ROL |
174b PC Partner Limited |
175e Sanera Systems, Inc. |
1787 Hightech Information System Ltd. |
# also used by Struck Innovative Systeme for joint developments |
1796 Research Centre Juelich |
0001 SIS1100 [Gigabit link] |
0002 HOTlink |
0003 Counter Timer |
0004 CAMAC Controller |
0005 PROFIBUS |
0006 AMCC HOTlink |
1799 Belkin |
17af Hightech Information System Ltd. |
1813 Ambient Technologies Inc |
4000 HaM controllerless modem |
16be 0001 V9x HAM Data Fax Modem |
4100 HaM plus Data Fax Modem |
16be 0002 V9x HAM 1394 |
1851 Microtune, Inc. |
1852 Anritsu Corp. |
1a08 Sierra semiconductor |
0000 SC15064 |
1b13 Jaton Corp |
1c1c Symphony |
0001 82C101 |
1d44 DPT |
a400 PM2x24/PM3224 |
1de1 Tekram Technology Co.,Ltd. |
0391 TRM-S1040 |
2020 DC-390 |
690c 690c |
dc29 DC290 |
2001 Temporal Research Ltd |
21c3 21st Century Computer Corp. |
2348 Racore |
2010 8142 100VG/AnyLAN |
2646 Kingston Technologies |
270b Xantel Corporation |
270f Chaintech Computer Co. Ltd |
2711 AVID Technology Inc. |
2a15 3D Vision(???) |
3000 Hansol Electronics Inc. |
3142 Post Impression Systems. |
3388 Hint Corp |
0021 HB1-SE33 PCI-PCI Bridge |
8011 VXPro II Chipset |
3388 8011 VXPro II Chipset CPU to PCI Bridge |
8012 VXPro II Chipset |
3388 8012 VXPro II Chipset PCI to ISA Bridge |
8013 VXPro II IDE |
3388 8013 VXPro II Chipset EIDE Controller |
3411 Quantum Designs (H.K.) Inc |
3513 ARCOM Control Systems Ltd |
38ef 4Links |
3d3d 3DLabs |
0001 GLINT 300SX |
0002 GLINT 500TX |
0003 GLINT Delta |
0004 Permedia |
0005 Permedia |
0006 GLINT MX |
0007 3D Extreme |
0008 GLINT Gamma G1 |
0009 Permedia II 2D+3D |
1040 0011 AccelStar II |
3d3d 0100 AccelStar II 3D Accelerator |
3d3d 0111 Permedia 3:16 |
3d3d 0114 Santa Ana |
3d3d 0116 Oxygen GVX1 |
3d3d 0119 Scirocco |
3d3d 0120 Santa Ana PCL |
3d3d 0125 Oxygen VX1 |
3d3d 0127 Permedia3 Create! |
000a GLINT R3 |
3d3d 0121 Oxygen VX1 |
000c GLINT R3 [Oxygen VX1] |
3d3d 0144 Oxygen VX1-4X AGP [Permedia 4] |
0100 Permedia II 2D+3D |
1004 Permedia |
3d04 Permedia |
ffff Glint VGA |
4005 Avance Logic Inc. |
0300 ALS300 PCI Audio Device |
0308 ALS300+ PCI Audio Device |
0309 PCI Input Controller |
1064 ALG-2064 |
2064 ALG-2064i |
2128 ALG-2364A GUI Accelerator |
2301 ALG-2301 |
2302 ALG-2302 |
2303 AVG-2302 GUI Accelerator |
2364 ALG-2364A |
2464 ALG-2464 |
2501 ALG-2564A/25128A |
4000 ALS4000 Audio Chipset |
4005 4000 ALS4000 Audio Chipset |
4710 ALC200/200P |
4033 Addtron Technology Co, Inc. |
1360 RTL8139 Ethernet |
4143 Digital Equipment Corp |
416c Aladdin Knowledge Systems |
0100 AladdinCARD |
0200 CPC |
4444 Internext Compression Inc |
4468 Bridgeport machines |
4594 Cogetec Informatique Inc |
45fb Baldor Electric Company |
4680 Umax Computer Corp |
4843 Hercules Computer Technology Inc |
4916 RedCreek Communications Inc |
1960 RedCreek PCI adapter |
4943 Growth Networks |
4978 Axil Computer Inc |
4a14 NetVin |
5000 NV5000SC |
4a14 5000 RT8029-Based Ethernet Adapter |
4b10 Buslogic Inc. |
4c48 LUNG HWA Electronics |
4c53 SBS Technologies |
4ca1 Seanix Technology Inc |
4d51 MediaQ Inc. |
0200 MQ-200 |
4d54 Microtechnica Co Ltd |
4ddc ILC Data Device Corp |
0100 DD-42924I5-300 (ARINC 429 Data Bus) |
0801 BU-65570I1 MIL-STD-1553 Test and Simulation |
0802 BU-65570I2 MIL-STD-1553 Test and Simulation |
0811 BU-65572I1 MIL-STD-1553 Test and Simulation |
0812 BU-65572I2 MIL-STD-1553 Test and Simulation |
0881 BU-65570T1 MIL-STD-1553 Test and Simulation |
0882 BU-65570T2 MIL-STD-1553 Test and Simulation |
0891 BU-65572T1 MIL-STD-1553 Test and Simulation |
0892 BU-65572T2 MIL-STD-1553 Test and Simulation |
0901 BU-65565C1 MIL-STD-1553 Data Bus |
0902 BU-65565C2 MIL-STD-1553 Data Bus |
0903 BU-65565C3 MIL-STD-1553 Data Bus |
0904 BU-65565C4 MIL-STD-1553 Data Bus |
0b01 BU-65569I1 MIL-STD-1553 Data Bus |
0b02 BU-65569I2 MIL-STD-1553 Data Bus |
0b03 BU-65569I3 MIL-STD-1553 Data Bus |
0b04 BU-65569I4 MIL-STD-1553 Data Bus |
5046 GemTek Technology Corporation |
1001 PCI Radio |
5053 Voyetra Technologies |
2010 Daytona Audio Adapter |
5136 S S Technologies |
5143 Qualcomm Inc |
5145 Ensoniq (Old) |
3031 Concert AudioPCI |
5301 Alliance Semiconductor Corp. |
0001 ProMotion aT3D |
5333 S3 Inc. |
0551 Plato/PX (system) |
5631 86c325 [ViRGE] |
8800 86c866 [Vision 866] |
8801 86c964 [Vision 964] |
8810 86c764_0 [Trio 32 vers 0] |
8811 86c764/765 [Trio32/64/64V+] |
8812 86cM65 [Aurora64V+] |
8813 86c764_3 [Trio 32/64 vers 3] |
8814 86c767 [Trio 64UV+] |
8815 86cM65 [Aurora 128] |
883d 86c988 [ViRGE/VX] |
8870 FireGL |
8880 86c868 [Vision 868 VRAM] vers 0 |
8881 86c868 [Vision 868 VRAM] vers 1 |
8882 86c868 [Vision 868 VRAM] vers 2 |
8883 86c868 [Vision 868 VRAM] vers 3 |
88b0 86c928 [Vision 928 VRAM] vers 0 |
88b1 86c928 [Vision 928 VRAM] vers 1 |
88b2 86c928 [Vision 928 VRAM] vers 2 |
88b3 86c928 [Vision 928 VRAM] vers 3 |
88c0 86c864 [Vision 864 DRAM] vers 0 |
88c1 86c864 [Vision 864 DRAM] vers 1 |
88c2 86c864 [Vision 864-P DRAM] vers 2 |
88c3 86c864 [Vision 864-P DRAM] vers 3 |
88d0 86c964 [Vision 964 VRAM] vers 0 |
88d1 86c964 [Vision 964 VRAM] vers 1 |
88d2 86c964 [Vision 964-P VRAM] vers 2 |
88d3 86c964 [Vision 964-P VRAM] vers 3 |
88f0 86c968 [Vision 968 VRAM] rev 0 |
88f1 86c968 [Vision 968 VRAM] rev 1 |
88f2 86c968 [Vision 968 VRAM] rev 2 |
88f3 86c968 [Vision 968 VRAM] rev 3 |
8900 86c755 [Trio 64V2/DX] |
5333 8900 86C775 Trio64V2/DX |
8901 86c775/86c785 [Trio 64V2/DX or /GX] |
5333 8901 86C775 Trio64V2/DX, 86C785 Trio64V2/GX |
8902 Plato/PX |
8903 Trio 3D business multimedia |
8904 Trio 64 3D |
1014 00db Integrated Trio3D |
5333 8904 86C365 Trio3D AGP |
8905 Trio 64V+ family |
8906 Trio 64V+ family |
8907 Trio 64V+ family |
8908 Trio 64V+ family |
8909 Trio 64V+ family |
890a Trio 64V+ family |
890b Trio 64V+ family |
890c Trio 64V+ family |
890d Trio 64V+ family |
890e Trio 64V+ family |
890f Trio 64V+ family |
8a01 ViRGE/DX or /GX |
0e11 b032 ViRGE/GX |
10b4 1617 Nitro 3D |
10b4 1717 Nitro 3D |
5333 8a01 ViRGE/DX |
8a10 ViRGE/GX2 |
1092 8a10 Stealth 3D 4000 |
8a13 86c368 [Trio 3D/2X] |
5333 8a13 Trio3D/2X |
8a20 86c794 [Savage 3D] |
5333 8a20 86C391 Savage3D |
8a21 86c390 [Savage 3D/MV] |
5333 8a21 86C390 Savage3D/MV |
8a22 Savage 4 |
1033 8068 Savage 4 |
1033 8069 Savage 4 |
105d 0018 SR9 8Mb SDRAM |
105d 002a SR9 Pro 16Mb SDRAM |
105d 003a SR9 Pro 32Mb SDRAM |
105d 092f SR9 Pro+ 16Mb SGRAM |
1092 4207 Stealth III S540 |
1092 4800 Stealth III S540 |
1092 4807 SpeedStar A90 |
1092 4808 Stealth III S540 |
1092 4809 Stealth III S540 |
1092 480e Stealth III S540 |
1092 4904 Stealth III S520 |
1092 4905 SpeedStar A200 |
1092 4a09 Stealth III S540 |
1092 4a0b Stealth III S540 Xtreme |
1092 4a0f Stealth III S540 |
1092 4e01 Stealth III S540 |
1102 101d 3d Blaster Savage 4 |
1102 101e 3d Blaster Savage 4 |
5333 8100 86C394-397 Savage4 SDRAM 100 |
5333 8110 86C394-397 Savage4 SDRAM 110 |
5333 8125 86C394-397 Savage4 SDRAM 125 |
5333 8143 86C394-397 Savage4 SDRAM 143 |
5333 8a22 86C394-397 Savage4 |
5333 8a2e 86C394-397 Savage4 32bit |
5333 9125 86C394-397 Savage4 SGRAM 125 |
5333 9143 86C394-397 Savage4 SGRAM 143 |
8a23 Savage 4 |
8a25 ProSavage PM133 |
8a26 ProSavage KM133 |
8c00 ViRGE/M3 |
8c01 ViRGE/MX |
1179 0001 ViRGE/MX |
8c02 ViRGE/MX+ |
8c03 ViRGE/MX+MV |
8c10 86C270-294 Savage/MX-MV |
8c11 82C270-294 Savage/MX |
8c12 86C270-294 Savage/IX-MV |
1014 017f ThinkPad T20 |
8c13 86C270-294 Savage/IX |
8c22 SuperSavage MX/128 |
8c24 SuperSavage MX/64 |
8c26 SuperSavage MX/64C |
8c2a SuperSavage IX/128 SDR |
8c2b SuperSavage IX/128 DDR |
8c2c SuperSavage IX/64 SDR |
8c2d SuperSavage IX/64 DDR |
8c2e SuperSavage IX/C SDR |
1014 01fc ThinkPad T23 (2647-4MG) |
8c2f SuperSavage IX/C DDR |
# Integrated in VIA ProSavage PN133 North Bridge |
8d01 VT8603 [ProSavage PN133] AGP4X VGA Controller (Twister) |
8d02 VT8636A [ProSavage KN133] AGP4X VGA Controller (TwisterK) |
8d04 VT8751 [ProSavageDDR P4M266] VGA Controller |
9102 86C410 Savage 2000 |
1092 5932 Viper II Z200 |
1092 5934 Viper II Z200 |
1092 5952 Viper II Z200 |
1092 5954 Viper II Z200 |
1092 5a35 Viper II Z200 |
1092 5a37 Viper II Z200 |
1092 5a55 Viper II Z200 |
1092 5a57 Viper II Z200 |
ca00 SonicVibes |
544c Teralogic Inc |
5455 Technische University Berlin |
4458 S5933 |
5519 Cnet Technologies, Inc. |
5544 Dunord Technologies |
0001 I-30xx Scanner Interface |
5555 Genroco, Inc |
0003 TURBOstor HFP-832 [HiPPI NIC] |
5700 Netpower |
6356 UltraStor |
6374 c't Magazin für Computertechnik |
6773 GPPCI |
6409 Logitec Corp. |
6666 Decision Computer International Co. |
0001 PCCOM4 |
0002 PCCOM8 |
7604 O.N. Electronic Co Ltd. |
7bde MIDAC Corporation |
7fed PowerTV |
8008 Quancom Electronic GmbH |
0010 WDOG1 [PCI-Watchdog 1] |
0011 PWDOG2 [PCI-Watchdog 2] |
8086 Intel Corp. |
0007 82379AB |
0008 Extended Express System Support Controller |
0039 21145 |
0122 82437FX |
0482 82375EB |
0483 82424ZX [Saturn] |
0484 82378IB [SIO ISA Bridge] |
0486 82430ZX [Aries] |
04a3 82434LX [Mercury/Neptune] |
04d0 82437FX [Triton FX] |
0600 RAID Controller |
0960 80960RP [i960 RP Microprocessor/Bridge] |
0962 80960RM [i960RM Bridge] |
0964 80960RP [i960 RP Microprocessor/Bridge] |
1000 82542 Gigabit Ethernet Controller |
0e11 b0df NC1632 Gigabit Ethernet Adapter (1000-SX) |
0e11 b0e0 NC1633 Gigabit Ethernet Adapter (1000-LX) |
0e11 b123 NC1634 Gigabit Ethernet Adapter (1000-SX) |
1014 0119 Netfinity Gigabit Ethernet SX Adapter |
8086 1000 PRO/1000 Gigabit Server Adapter |
1001 82543GC Gigabit Ethernet Controller (Fiber) |
0e11 004a NC6136 Gigabit Server Adapter |
1014 01ea Netfinity Gigabit Ethernet SX Adapter |
8086 1003 PRO/1000 F Server Adapter |
1002 Pro 100 LAN+Modem 56 Cardbus II |
8086 200e Pro 100 LAN+Modem 56 Cardbus II |
8086 2013 Pro 100 SR Mobile Combo Adapter |
8086 2017 Pro 100 S Combo Mobile Adapter |
1004 82543GC Gigabit Ethernet Controller (Copper) |
0e11 0049 NC7132 Gigabit Upgrade Module |
0e11 b1a4 NC7131 Gigabit Server Adapter |
1014 10f2 Gigabit Ethernet Server Adapter |
8086 1004 PRO/1000 T Server Adapter |
8086 2004 PRO/1000 T Server Adapter |
1008 82544EI Gigabit Ethernet Controller (Copper) |
8086 1107 PRO/1000 XT Server Adapter |
8086 2107 PRO/1000 XT Server Adapter |
8086 2110 PRO/1000 XT Server Adapter |
1009 82544EI Gigabit Ethernet Controller (Fiber) |
8086 1109 PRO/1000 XF Server Adapter |
8086 2109 PRO/1000 XF Server Adapter |
100c 82544GC Gigabit Ethernet Controller (Copper) |
8086 1112 PRO/1000 T Desktop Adapter |
8086 2112 PRO/1000 T Desktop Adapter |
100d 82544GC Gigabit Ethernet Controller (LOM) |
100e 82540EM Gigabit Ethernet Controller |
8086 001e PRO/1000 MT Desktop Adapter |
8086 002e PRO/1000 MT Desktop Adapter |
100f 82545EM Gigabit Ethernet Controller (Copper) |
8086 1001 PRO/1000 MT Server Adapter |
1010 82546EB Gigabit Ethernet Controller (Copper) |
8086 1011 PRO/1000 MT Dual Port Server Adapter |
1011 82545EM Gigabit Ethernet Controller (Fiber) |
8086 1002 PRO/1000 MF Server Adapter |
1012 82546EB Gigabit Ethernet Controller (Fiber) |
8086 1012 PRO/1000 MF Dual Port Server Adapter |
1015 82540EM Gigabit Ethernet Controller (LOM) |
1029 82559 Ethernet Controller |
1030 82559 InBusiness 10/100 |
1031 82801CAM (ICH3) PRO/100 VE (LOM) Ethernet Controller |
1014 0209 ThinkPad A30p/T30 |
104d 80e7 Vaio PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP |
107b 5350 EtherExpress PRO/100 VE |
1179 0001 EtherExpress PRO/100 VE |
144d c000 EtherExpress PRO/100 VE |
144d c001 EtherExpress PRO/100 VE |
144d c003 EtherExpress PRO/100 VE |
1032 82801CAM (ICH3) PRO/100 VE Ethernet Controller |
1033 82801CAM (ICH3) PRO/100 VM (LOM) Ethernet Controller |
1034 82801CAM (ICH3) PRO/100 VM Ethernet Controller |
1035 82801CAM (ICH3)/82562EH (LOM) Ethernet Controller |
1036 82801CAM (ICH3) 82562EH Ethernet Controller |
1037 82801CAM (ICH3) Chipset Ethernet Controller |
1038 82801CAM (ICH3) PRO/100 VM (KM) Ethernet Controller |
1039 82801BD PRO/100 VE (LOM) Ethernet Controller |
103a 82801BD PRO/100 VE (CNR) Ethernet Controller |
103b 82801BD PRO/100 VM (LOM) Ethernet Controller |
103c 82801BD PRO/100 VM (CNR) Ethernet Controller |
103d 82801BD PRO/100 VE (MOB) Ethernet Controller |
103e 82801BD PRO/100 VM (MOB) Ethernet Controller |
1040 536EP Data Fax Modem |
16be 1040 V.9X DSP Data Fax Modem |
1048 82597EX 10GbE Ethernet Controller |
8086 a01f PRO/10GbE LR Server Adapter |
8086 a11f PRO/10GbE LR Server Adapter |
1059 82551QM Ethernet Controller |
1130 82815 815 Chipset Host Bridge and Memory Controller Hub |
1025 1016 Travelmate 612 TX |
1043 8027 TUSL2-C Mainboard |
104d 80df Vaio PCG-FX403 |
1131 82815 815 Chipset AGP Bridge |
1132 82815 CGC [Chipset Graphics Controller] |
1025 1016 Travelmate 612 TX |
104d 80df Vaio PCG-FX403 |
1161 82806AA PCI64 Hub Advanced Programmable Interrupt Controller |
8086 1161 82806AA PCI64 Hub APIC |
1162 Xscale 80200 Big Endian Companion Chip |
1200 Intel IXP1200 Network Processor |
172a 0000 AEP SSL Accelerator |
1209 82559ER |
1221 82092AA_0 |
1222 82092AA_1 |
1223 SAA7116 |
1225 82452KX/GX [Orion] |
1226 82596 PRO/10 PCI |
1227 82865 EtherExpress PRO/100A |
1228 82556 EtherExpress PRO/100 Smart |
# the revision field differentiates between them (1-3 is 82557, 4-5 is 82558, 6-8 is 82559, 9 is 82559ER) |
1229 82557/8/9 [Ethernet Pro 100] |
0e11 3001 82559 Fast Ethernet LOM with Alert on LAN* |
0e11 3002 82559 Fast Ethernet LOM with Alert on LAN* |
0e11 3003 82559 Fast Ethernet LOM with Alert on LAN* |
0e11 3004 82559 Fast Ethernet LOM with Alert on LAN* |
0e11 3005 82559 Fast Ethernet LOM with Alert on LAN* |
0e11 3006 82559 Fast Ethernet LOM with Alert on LAN* |
0e11 3007 82559 Fast Ethernet LOM with Alert on LAN* |
0e11 b01e NC3120 Fast Ethernet NIC |
0e11 b01f NC3122 Fast Ethernet NIC (dual port) |
0e11 b02f NC1120 Ethernet NIC |
0e11 b04a Netelligent 10/100TX NIC with Wake on LAN |
0e11 b0c6 NC3161 Fast Ethernet NIC (embedded, WOL) |
0e11 b0c7 NC3160 Fast Ethernet NIC (embedded) |
0e11 b0d7 NC3121 Fast Ethernet NIC (WOL) |
0e11 b0dd NC3131 Fast Ethernet NIC (dual port) |
0e11 b0de NC3132 Fast Ethernet Module (dual port) |
0e11 b0e1 NC3133 Fast Ethernet Module (100-FX) |
0e11 b134 NC3163 Fast Ethernet NIC (embedded, WOL) |
0e11 b13c NC3162 Fast Ethernet NIC (embedded) |
0e11 b144 NC3123 Fast Ethernet NIC (WOL) |
0e11 b163 NC3134 Fast Ethernet NIC (dual port) |
0e11 b164 NC3135 Fast Ethernet Upgrade Module (dual port) |
0e11 b1a4 NC7131 Gigabit Server Adapter |
1014 005c 82558B Ethernet Pro 10/100 |
1014 01bc 82559 Fast Ethernet LAN On Motherboard |
1014 01f1 10/100 Ethernet Server Adapter |
1014 01f2 10/100 Ethernet Server Adapter |
1014 0207 Ethernet Pro/100 S |
1014 0232 10/100 Dual Port Server Adapter |
1014 023a ThinkPad R30 |
1014 105c Netfinity 10/100 |
1014 2205 ThinkPad A22p |
1014 305c 10/100 EtherJet Management Adapter |
1014 405c 10/100 EtherJet Adapter with Alert on LAN |
1014 505c 10/100 EtherJet Secure Management Adapter |
1014 605c 10/100 EtherJet Secure Management Adapter |
1014 705c 10/100 Netfinity 10/100 Ethernet Security Adapter |
1014 805c 10/100 Netfinity 10/100 Ethernet Security Adapter |
1028 009b PowerEdge 2550 |
1033 8000 PC-9821X-B06 |
1033 8016 PK-UG-X006 |
1033 801f PK-UG-X006 |
1033 8026 PK-UG-X006 |
1033 8063 82559-based Fast Ethernet Adapter |
1033 8064 82559-based Fast Ethernet Adapter |
103c 10c0 NetServer 10/100TX |
103c 10c3 NetServer 10/100TX |
103c 10ca NetServer 10/100TX |
103c 10cb NetServer 10/100TX |
103c 10e3 NetServer 10/100TX |
103c 10e4 NetServer 10/100TX |
103c 1200 NetServer 10/100TX |
10c3 1100 SmartEther100 SC1100 |
10cf 1115 8255x-based Ethernet Adapter (10/100) |
10cf 1143 8255x-based Ethernet Adapter (10/100) |
1179 0001 8255x-based Ethernet Adapter (10/100) |
1179 0002 PCI FastEther LAN on Docker |
1179 0003 8255x-based Fast Ethernet |
1259 2560 AT-2560 100 |
1259 2561 AT-2560 100 FX Ethernet Adapter |
1266 0001 NE10/100 Adapter |
144d 2501 SEM-2000 MiniPCI LAN Adapter |
144d 2502 SEM-2100IL MiniPCI LAN Adapter |
1668 1100 EtherExpress PRO/100B (TX) (MiniPCI Ethernet+Modem) |
8086 0001 EtherExpress PRO/100B (TX) |
8086 0002 EtherExpress PRO/100B (T4) |
8086 0003 EtherExpress PRO/10+ |
8086 0004 EtherExpress PRO/100 WfM |
8086 0005 82557 10/100 |
8086 0006 82557 10/100 with Wake on LAN |
8086 0007 82558 10/100 Adapter |
8086 0008 82558 10/100 with Wake on LAN |
8086 0009 EtherExpress PRO/100+ |
8086 000a EtherExpress PRO/100+ Management Adapter |
8086 000b EtherExpress PRO/100+ |
8086 000c EtherExpress PRO/100+ Management Adapter |
8086 000d EtherExpress PRO/100+ Alert On LAN II* Adapter |
8086 000e EtherExpress PRO/100+ Management Adapter with Alert On LAN* |
8086 000f EtherExpress PRO/100 Desktop Adapter |
8086 0010 EtherExpress PRO/100 S Management Adapter |
8086 0011 EtherExpress PRO/100 S Management Adapter |
8086 0012 EtherExpress PRO/100 S Advanced Management Adapter (D) |
8086 0013 EtherExpress PRO/100 S Advanced Management Adapter (E) |
8086 0030 EtherExpress PRO/100 Management Adapter with Alert On LAN* GC |
8086 0031 EtherExpress PRO/100 Desktop Adapter |
8086 0040 EtherExpress PRO/100 S Desktop Adapter |
8086 0041 EtherExpress PRO/100 S Desktop Adapter |
8086 0042 EtherExpress PRO/100 Desktop Adapter |
8086 0050 EtherExpress PRO/100 S Desktop Adapter |
8086 1009 EtherExpress PRO/100+ Server Adapter |
8086 100c EtherExpress PRO/100+ Server Adapter (PILA8470B) |
8086 1012 EtherExpress PRO/100 S Server Adapter (D) |
8086 1013 EtherExpress PRO/100 S Server Adapter (E) |
8086 1015 EtherExpress PRO/100 S Dual Port Server Adapter |
8086 1017 EtherExpress PRO/100+ Dual Port Server Adapter |
8086 1030 EtherExpress PRO/100+ Management Adapter with Alert On LAN* G Server |
8086 1040 EtherExpress PRO/100 S Server Adapter |
8086 1041 EtherExpress PRO/100 S Server Adapter |
8086 1042 EtherExpress PRO/100 Server Adapter |
8086 1050 EtherExpress PRO/100 S Server Adapter |
8086 1051 EtherExpress PRO/100 Server Adapter |
8086 1052 EtherExpress PRO/100 Server Adapter |
8086 10f0 EtherExpress PRO/100+ Dual Port Adapter |
8086 2009 EtherExpress PRO/100 S Mobile Adapter |
8086 200d EtherExpress PRO/100 Cardbus |
8086 200e EtherExpress PRO/100 LAN+V90 Cardbus Modem |
8086 200f EtherExpress PRO/100 SR Mobile Adapter |
8086 2010 EtherExpress PRO/100 S Mobile Combo Adapter |
8086 2013 EtherExpress PRO/100 SR Mobile Combo Adapter |
8086 2016 EtherExpress PRO/100 S Mobile Adapter |
8086 2017 EtherExpress PRO/100 S Combo Mobile Adapter |
8086 2018 EtherExpress PRO/100 SR Mobile Adapter |
8086 2019 EtherExpress PRO/100 SR Combo Mobile Adapter |
8086 2101 EtherExpress PRO/100 P Mobile Adapter |
8086 2102 EtherExpress PRO/100 SP Mobile Adapter |
8086 2103 EtherExpress PRO/100 SP Mobile Adapter |
8086 2104 EtherExpress PRO/100 SP Mobile Adapter |
8086 2105 EtherExpress PRO/100 SP Mobile Adapter |
8086 2106 EtherExpress PRO/100 P Mobile Adapter |
8086 2107 EtherExpress PRO/100 Network Connection |
8086 2108 EtherExpress PRO/100 Network Connection |
8086 2200 EtherExpress PRO/100 P Mobile Combo Adapter |
8086 2201 EtherExpress PRO/100 P Mobile Combo Adapter |
8086 2202 EtherExpress PRO/100 SP Mobile Combo Adapter |
8086 2203 EtherExpress PRO/100+ MiniPCI |
8086 2204 EtherExpress PRO/100+ MiniPCI |
8086 2205 EtherExpress PRO/100 SP Mobile Combo Adapter |
8086 2206 EtherExpress PRO/100 SP Mobile Combo Adapter |
8086 2207 EtherExpress PRO/100 SP Mobile Combo Adapter |
8086 2208 EtherExpress PRO/100 P Mobile Combo Adapter |
8086 2402 EtherExpress PRO/100+ MiniPCI |
8086 2407 EtherExpress PRO/100+ MiniPCI |
8086 2408 EtherExpress PRO/100+ MiniPCI |
8086 2409 EtherExpress PRO/100+ MiniPCI |
8086 240f EtherExpress PRO/100+ MiniPCI |
8086 2410 EtherExpress PRO/100+ MiniPCI |
8086 2411 EtherExpress PRO/100+ MiniPCI |
8086 2412 EtherExpress PRO/100+ MiniPCI |
8086 2413 EtherExpress PRO/100+ MiniPCI |
8086 3000 82559 Fast Ethernet LAN on Motherboard |
8086 3001 82559 Fast Ethernet LOM with Basic Alert on LAN* |
8086 3002 82559 Fast Ethernet LOM with Alert on LAN II* |
8086 3006 EtherExpress PRO/100 S Network Connection |
8086 3007 EtherExpress PRO/100 S Network Connection |
8086 3008 EtherExpress PRO/100 Network Connection |
8086 3010 EtherExpress PRO/100 S Network Connection |
8086 3011 EtherExpress PRO/100 S Network Connection |
8086 3012 EtherExpress PRO/100 Network Connection |
122d 430FX - 82437FX TSC [Triton I] |
122e 82371FB PIIX ISA [Triton I] |
1230 82371FB PIIX IDE [Triton I] |
1231 DSVD Modem |
1234 430MX - 82371MX Mobile PCI I/O IDE Xcelerator (MPIIX) |
1235 430MX - 82437MX Mob. System Ctrlr (MTSC) & 82438MX Data Path (MTDP) |
1237 440FX - 82441FX PMC [Natoma] |
1239 82371FB |
123b 82380PB |
123c 82380AB |
123d 683053 Programmable Interrupt Device |
123f 82466GX Integrated Hot-Plug Controller (IHPC) |
1240 752 AGP |
124b 82380FB |
1250 430HX - 82439HX TXC [Triton II] |
1360 82806AA PCI64 Hub PCI Bridge |
1361 82806AA PCI64 Hub Controller (HRes) |
8086 1361 82806AA PCI64 Hub Controller (HRes) |
8086 8000 82806AA PCI64 Hub Controller (HRes) |
1460 82870P2 P64H2 Hub PCI Bridge |
1461 82870P2 P64H2 I/OxAPIC |
1462 82870P2 P64H2 Hot Plug Controller |
1960 80960RP [i960RP Microprocessor] |
101e 0431 MegaRAID 431 RAID Controller |
101e 0438 MegaRAID 438 Ultra2 LVD RAID Controller |
101e 0466 MegaRAID 466 Express Plus RAID Controller |
101e 0467 MegaRAID 467 Enterprise 1500 RAID Controller |
101e 0490 MegaRAID 490 Express 300 RAID Controller |
101e 0762 MegaRAID 762 Express RAID Controller |
101e 09a0 PowerEdge Expandable RAID Controller 2/SC |
1028 0467 PowerEdge Expandable RAID Controller 2/DC |
1028 1111 PowerEdge Expandable RAID Controller 2/SC |
103c 03a2 MegaRAID |
103c 10c6 MegaRAID 438, HP NetRAID-3Si |
103c 10c7 MegaRAID T5, Integrated HP NetRAID |
103c 10cc MegaRAID, Integrated HP NetRAID |
103c 10cd HP NetRAID-1Si |
105a 0000 SuperTrak |
105a 2168 SuperTrak Pro |
105a 5168 SuperTrak66/100 |
1111 1111 MegaRAID 466, PowerEdge Expandable RAID Controller 2/SC |
1111 1112 PowerEdge Expandable RAID Controller 2/SC |
113c 03a2 MegaRAID |
1962 80960RM [i960RM Microprocessor] |
105a 0000 SuperTrak SX6000 I2O CPU |
1a21 82840 840 (Carmel) Chipset Host Bridge (Hub A) |
1a23 82840 840 (Carmel) Chipset AGP Bridge |
1a24 82840 840 (Carmel) Chipset PCI Bridge (Hub B) |
1a30 82845 845 (Brookdale) Chipset Host Bridge |
1a31 82845 845 (Brookdale) Chipset AGP Bridge |
2410 82801AA ISA Bridge (LPC) |
2411 82801AA IDE |
2412 82801AA USB |
2413 82801AA SMBus |
2415 82801AA AC'97 Audio |
1028 0095 Precision Workstation 220 Integrated Digital Audio |
11d4 0040 SoundMAX Integrated Digital Audio |
11d4 0048 SoundMAX Integrated Digital Audio |
11d4 5340 SoundMAX Integrated Digital Audio |
2416 82801AA AC'97 Modem |
2418 82801AA PCI Bridge |
2420 82801AB ISA Bridge (LPC) |
2421 82801AB IDE |
2422 82801AB USB |
2423 82801AB SMBus |
2425 82801AB AC'97 Audio |
11d4 0040 SoundMAX Integrated Digital Audio |
11d4 0048 SoundMAX Integrated Digital Audio |
2426 82801AB AC'97 Modem |
2428 82801AB PCI Bridge |
2440 82801BA ISA Bridge (LPC) |
2442 82801BA/BAM USB (Hub #1) |
104d 80df Vaio PCG-FX403 |
147b 0507 TH7II-RAID |
2443 82801BA/BAM SMBus |
1025 1016 Travelmate 612 TX |
1043 8027 TUSL2-C Mainboard |
104d 80df Vaio PCG-FX403 |
147b 0507 TH7II-RAID |
2444 82801BA/BAM USB (Hub #2) |
1025 1016 Travelmate 612 TX |
104d 80df Vaio PCG-FX403 |
147b 0507 TH7II-RAID |
2445 82801BA/BAM AC'97 Audio |
1025 1016 Travelmate 612 TX |
104d 80df Vaio PCG-FX403 |
1462 3370 STAC9721 AC |
147b 0507 TH7II-RAID |
2446 82801BA/BAM AC'97 Modem |
1025 1016 Travelmate 612 TX |
104d 80df Vaio PCG-FX403 |
2448 82801BAM/CAM PCI Bridge |
2449 82801BA/BAM/CA/CAM Ethernet Controller |
0e11 0012 EtherExpress PRO/100 VM |
0e11 0091 EtherExpress PRO/100 VE |
1014 01ce EtherExpress PRO/100 VE |
1014 01dc EtherExpress PRO/100 VE |
1014 01eb EtherExpress PRO/100 VE |
1014 01ec EtherExpress PRO/100 VE |
1014 0202 EtherExpress PRO/100 VE |
1014 0205 EtherExpress PRO/100 VE |
1014 0217 EtherExpress PRO/100 VE |
1014 0234 EtherExpress PRO/100 VE |
1014 023d EtherExpress PRO/100 VE |
1014 0244 EtherExpress PRO/100 VE |
1014 0245 EtherExpress PRO/100 VE |
109f 315d EtherExpress PRO/100 VE |
109f 3181 EtherExpress PRO/100 VE |
1186 7801 EtherExpress PRO/100 VE |
144d 2602 HomePNA 1M CNR |
8086 3010 EtherExpress PRO/100 VE |
8086 3011 EtherExpress PRO/100 VM |
8086 3012 82562EH based Phoneline |
8086 3013 EtherExpress PRO/100 VE |
8086 3014 EtherExpress PRO/100 VM |
8086 3015 82562EH based Phoneline |
8086 3016 EtherExpress PRO/100 P Mobile Combo |
8086 3017 EtherExpress PRO/100 P Mobile |
8086 3018 EtherExpress PRO/100 |
244a 82801BAM IDE U100 |
1025 1016 Travelmate 612TX |
104d 80df Vaio PCG-FX403 |
244b 82801BA IDE U100 |
1043 8027 TUSL2-C Mainboard |
147b 0507 TH7II-RAID |
244c 82801BAM ISA Bridge (LPC) |
244e 82801BA/CA/DB PCI Bridge |
2450 82801E ISA Bridge (LPC) |
2452 82801E USB |
2453 82801E SMBus |
2459 82801E Ethernet Controller 0 |
245b 82801E IDE U100 |
245d 82801E Ethernet Controller 1 |
245e 82801E PCI Bridge |
2480 82801CA ISA Bridge (LPC) |
2482 82801CA/CAM USB (Hub #1) |
1014 0220 ThinkPad T23/A30p/T30 |
104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP |
2483 82801CA/CAM SMBus |
1014 0220 ThinkPad T23/A30p/T30 |
104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP |
2484 82801CA/CAM USB (Hub #2) |
1014 0220 ThinkPad T23/A30p/T30 |
104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP |
2485 82801CA/CAM AC'97 Audio |
1014 0222 ThinkPad T23 (2647-4MG) or A30p (2653-64G) |
1014 0508 ThinkPad T30 |
104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP |
2486 82801CA/CAM AC'97 Modem |
1014 0223 ThinkPad A30p (2653-64G) |
1014 0503 ThinkPad R31 2656BBG |
1014 051a ThinkPad T30 |
104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP |
134d 4c21 Dell Inspiron 2100 internal modem |
14f1 5421 MD56ORD V.92 MDC Modem |
2487 82801CA/CAM USB (Hub #3) |
1014 0220 ThinkPad T23/A30p/T30 |
104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP |
248a 82801CAM IDE U100 |
1014 0220 ThinkPad T23/A30p/T30 |
104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP |
248b 82801CA IDE U100 |
248c 82801CAM ISA Bridge (LPC) |
24c0 82801DB ISA Bridge (LPC) |
24c2 82801DB USB (Hub #1) |
24c3 82801DB SMBus |
24c4 82801DB USB (Hub #2) |
24c5 82801DB AC'97 Audio |
24c6 82801DB AC'97 Modem |
24c7 82801DB USB (Hub #3) |
24cb 82801DB ICH4 IDE |
24cd 82801DB USB EHCI Controller |
2500 82820 820 (Camino) Chipset Host Bridge (MCH) |
1028 0095 Precision Workstation 220 Chipset |
1043 801c P3C-2000 system chipset |
2501 82820 820 (Camino) Chipset Host Bridge (MCH) |
1043 801c P3C-2000 system chipset |
250b 82820 820 (Camino) Chipset Host Bridge |
250f 82820 820 (Camino) Chipset AGP Bridge |
2520 82805AA MTH Memory Translator Hub |
2521 82804AA MRH-S Memory Repeater Hub for SDRAM |
2530 82850 850 (Tehama) Chipset Host Bridge (MCH) |
147b 0507 TH7II-RAID |
2531 82860 860 (Wombat) Chipset Host Bridge (MCH) |
2532 82850 850 (Tehama) Chipset AGP Bridge |
2533 82860 860 (Wombat) Chipset AGP Bridge |
2534 82860 860 (Wombat) Chipset PCI Bridge |
2540 e7500 [Plumas] DRAM Controller |
2541 e7500 [Plumas] DRAM Controller Error Reporting |
2543 e7500 [Plumas] HI_B Virtual PCI Bridge (F0) |
2544 e7500 [Plumas] HI_B Virtual PCI Bridge (F1) |
2545 e7500 [Plumas] HI_C Virtual PCI Bridge (F0) |
2546 e7500 [Plumas] HI_C Virtual PCI Bridge (F1) |
2547 e7500 [Plumas] HI_D Virtual PCI Bridge (F0) |
2548 e7500 [Plumas] HI_D Virtual PCI Bridge (F1) |
2560 82845G/GL [Brookdale-G] Chipset Host Bridge |
2561 82845G/GL [Brookdale-G] Chipset AGP Bridge |
2562 82845G/GL [Brookdale-G] Chipset Integrated Graphics Device |
3092 Integrated RAID |
3575 82830 830 Chipset Host Bridge |
1014 021d ThinkPad T23 (2647-4MG) or A30p (2653-64G) |
104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP |
3576 82830 830 Chipset AGP Bridge |
3577 82830 CGC [Chipset Graphics Controller] |
3578 82830 830 Chipset Host Bridge |
5200 EtherExpress PRO/100 Intelligent Server |
5201 EtherExpress PRO/100 Intelligent Server |
8086 0001 EtherExpress PRO/100 Server Ethernet Adapter |
530d 80310 IOP [IO Processor] |
7000 82371SB PIIX3 ISA [Natoma/Triton II] |
7010 82371SB PIIX3 IDE [Natoma/Triton II] |
7020 82371SB PIIX3 USB [Natoma/Triton II] |
7030 430VX - 82437VX TVX [Triton VX] |
7100 430TX - 82439TX MTXC |
7110 82371AB/EB/MB PIIX4 ISA |
7111 82371AB/EB/MB PIIX4 IDE |
7112 82371AB/EB/MB PIIX4 USB |
7113 82371AB/EB/MB PIIX4 ACPI |
7120 82810 GMCH [Graphics Memory Controller Hub] |
7121 82810 CGC [Chipset Graphics Controller] |
7122 82810 DC-100 GMCH [Graphics Memory Controller Hub] |
7123 82810 DC-100 CGC [Chipset Graphics Controller] |
7124 82810E DC-133 GMCH [Graphics Memory Controller Hub] |
7125 82810E DC-133 CGC [Chipset Graphics Controller] |
7126 82810 DC-133 System and Graphics Controller |
7128 82810-M DC-100 System and Graphics Controller |
712a 82810-M DC-133 System and Graphics Controller |
7180 440LX/EX - 82443LX/EX Host bridge |
7181 440LX/EX - 82443LX/EX AGP bridge |
7190 440BX/ZX/DX - 82443BX/ZX/DX Host bridge |
0e11 0500 Armada 1750 Laptop System Chipset |
1179 0001 Toshiba Tecra 8100 Laptop System Chipset |
7191 440BX/ZX/DX - 82443BX/ZX/DX AGP bridge |
7192 440BX/ZX/DX - 82443BX/ZX/DX Host bridge (AGP disabled) |
0e11 0460 Armada 1700 Laptop System Chipset |
7194 82440MX Host Bridge |
7195 82440MX AC'97 Audio Controller |
10cf 1099 QSound_SigmaTel Stac97 PCI Audio |
11d4 0040 SoundMAX Integrated Digital Audio |
11d4 0048 SoundMAX Integrated Digital Audio |
7196 82440MX AC'97 Modem Controller |
7198 82440MX ISA Bridge |
7199 82440MX EIDE Controller |
719a 82440MX USB Universal Host Controller |
719b 82440MX Power Management Controller |
71a0 440GX - 82443GX Host bridge |
71a1 440GX - 82443GX AGP bridge |
71a2 440GX - 82443GX Host bridge (AGP disabled) |
7600 82372FB PIIX5 ISA |
7601 82372FB PIIX5 IDE |
7602 82372FB PIIX5 USB |
7603 82372FB PIIX5 SMBus |
7800 i740 |
003d 0008 Starfighter AGP |
003d 000b Starfighter AGP |
1092 0100 Stealth II G460 |
10b4 201a Lightspeed 740 |
10b4 202f Lightspeed 740 |
8086 0000 Terminator 2x/i |
8086 0100 Intel740 Graphics Accelerator |
84c4 450KX/GX [Orion] - 82454KX/GX PCI bridge |
84c5 450KX/GX [Orion] - 82453KX/GX Memory controller |
84ca 450NX - 82451NX Memory & I/O Controller |
84cb 450NX - 82454NX/84460GX PCI Expander Bridge |
84e0 460GX - 84460GX System Address Controller (SAC) |
84e1 460GX - 84460GX System Data Controller (SDC) |
84e2 460GX - 84460GX AGP Bridge (GXB function 2) |
84e3 460GX - 84460GX Memory Address Controller (MAC) |
84e4 460GX - 84460GX Memory Data Controller (MDC) |
84e6 460GX - 82466GX Wide and fast PCI eXpander Bridge (WXB) |
84ea 460GX - 84460GX AGP Bridge (GXB function 1) |
9621 Integrated RAID |
9622 Integrated RAID |
9641 Integrated RAID |
96a1 Integrated RAID |
b152 21152 PCI-to-PCI Bridge |
# observed, and documented in Intel revision note; new mask of 1011:0026 |
b154 21154 PCI-to-PCI Bridge |
b555 21555 Non transparent PCI-to-PCI Bridge |
e4bf 1000 CC8-1-BLUES |
ffff 450NX/GX [Orion] - 82453KX/GX Memory controller [BUG] |
8800 Trigem Computer Inc. |
2008 Video assistent component |
8866 T-Square Design Inc. |
8888 Silicon Magic |
8e0e Computone Corporation |
8e2e KTI |
3000 ET32P2 |
9004 Adaptec |
1078 AIC-7810 |
1160 AIC-1160 [Family Fibre Channel Adapter] |
2178 AIC-7821 |
3860 AHA-2930CU |
3b78 AHA-4844W/4844UW |
5075 AIC-755x |
5078 AHA-7850 |
9004 7850 AHA-2904/Integrated AIC-7850 |
5175 AIC-755x |
5178 AIC-7851 |
5275 AIC-755x |
5278 AIC-7852 |
5375 AIC-755x |
5378 AIC-7850 |
5475 AIC-755x |
5478 AIC-7850 |
5575 AVA-2930 |
5578 AIC-7855 |
5647 ANA-7711 TCP Offload Engine |
9004 7710 ANA-7711F TCP Offload Engine - Optical |
9004 7711 ANA-7711LP TCP Offload Engine - Copper |
5675 AIC-755x |
5678 AIC-7856 |
5775 AIC-755x |
5778 AIC-7850 |
5800 AIC-5800 |
5900 ANA-5910/5930/5940 ATM155 & 25 LAN Adapter |
5905 ANA-5910A/5930A/5940A ATM Adapter |
6038 AIC-3860 |
6075 AIC-1480 / APA-1480 |
9004 7560 AIC-1480 / APA-1480 Cardbus |
6078 AIC-7860 |
6178 AIC-7861 |
9004 7861 AHA-2940AU Single |
6278 AIC-7860 |
6378 AIC-7860 |
6478 AIC-786x |
6578 AIC-786x |
6678 AIC-786x |
6778 AIC-786x |
6915 ANA620xx/ANA69011A |
9004 0008 ANA69011A/TX 10/100 |
9004 0009 ANA69011A/TX 10/100 |
9004 0010 ANA62022 2-port 10/100 |
9004 0018 ANA62044 4-port 10/100 |
9004 0019 ANA62044 4-port 10/100 |
9004 0020 ANA62022 2-port 10/100 |
9004 0028 ANA69011A/TX 10/100 |
9004 8008 ANA69011A/TX 64 bit 10/100 |
9004 8009 ANA69011A/TX 64 bit 10/100 |
9004 8010 ANA62022 2-port 64 bit 10/100 |
9004 8018 ANA62044 4-port 64 bit 10/100 |
9004 8019 ANA62044 4-port 64 bit 10/100 |
9004 8020 ANA62022 2-port 64 bit 10/100 |
9004 8028 ANA69011A/TX 64 bit 10/100 |
7078 AHA-294x / AIC-7870 |
7178 AHA-2940/2940W / AIC-7871 |
7278 AHA-3940/3940W / AIC-7872 |
7378 AHA-3985 / AIC-7873 |
7478 AHA-2944/2944W / AIC-7874 |
7578 AHA-3944/3944W / AIC-7875 |
7678 AHA-4944W/UW / AIC-7876 |
7778 AIC-787x |
7810 AIC-7810 |
7815 AIC-7815 RAID+Memory Controller IC |
9004 7815 ARO-1130U2 RAID Controller |
9004 7840 AIC-7815 RAID+Memory Controller IC |
7850 AIC-7850 |
7855 AHA-2930 |
7860 AIC-7860 |
7870 AIC-7870 |
7871 AHA-2940 |
7872 AHA-3940 |
7873 AHA-3980 |
7874 AHA-2944 |
7880 AIC-7880P |
7890 AIC-7890 |
7891 AIC-789x |
7892 AIC-789x |
7893 AIC-789x |
7894 AIC-789x |
7895 AHA-2940U/UW / AHA-39xx / AIC-7895 |
9004 7890 AHA-2940U/2940UW Dual AHA-394xAU/AUW/AUWD AIC-7895B |
9004 7891 AHA-2940U/2940UW Dual |
9004 7892 AHA-3940AU/AUW/AUWD/UWD |
9004 7894 AHA-3944AUWD |
9004 7895 AHA-2940U/2940UW Dual AHA-394xAU/AUW/AUWD AIC-7895B |
9004 7896 AHA-2940U/2940UW Dual AHA-394xAU/AUW/AUWD AIC-7895B |
9004 7897 AHA-2940U/2940UW Dual AHA-394xAU/AUW/AUWD AIC-7895B |
7896 AIC-789x |
7897 AIC-789x |
8078 AIC-7880U |
9004 7880 AIC-7880P Ultra/Ultra Wide SCSI Chipset |
8178 AHA-2940U/UW/D / AIC-7881U |
9004 7881 AHA-2940UW SCSI Host Adapter |
8278 AHA-3940U/UW/UWD / AIC-7882U |
8378 AHA-3940U/UW / AIC-7883U |
8478 AHA-2944UW / AIC-7884U |
8578 AHA-3944U/UWD / AIC-7885 |
8678 AHA-4944UW / AIC-7886 |
8778 AHA-2940UW Pro / AIC-788x |
9004 7887 2940UW Pro Ultra-Wide SCSI Controller |
8878 AHA-2930UW / AIC-7888 |
9004 7888 AHA-2930UW SCSI Controller |
8b78 ABA-1030 |
ec78 AHA-4944W/UW |
9005 Adaptec |
0010 AHA-2940U2/U2W |
9005 2180 AHA-2940U2 SCSI Controller |
9005 8100 AHA-2940U2B SCSI Controller |
9005 a180 AHA-2940U2W SCSI Controller |
9005 e100 AHA-2950U2B SCSI Controller |
0011 AHA-2930U2 |
0013 78902 |
9005 0003 AAA-131U2 Array1000 1 Channel RAID Controller |
001f AHA-2940U2/U2W / 7890/7891 |
9005 000f 2940U2W SCSI Controller |
9005 a180 2940U2W SCSI Controller |
0020 AIC-7890 |
002f AIC-7890 |
0030 AIC-7890 |
003f AIC-7890 |
0050 AHA-3940U2x/395U2x |
9005 f500 AHA-3950U2B |
0051 AHA-3950U2D |
9005 b500 AHA-3950U2D |
0053 AIC-7896 SCSI Controller |
9005 ffff AIC-7896 SCSI Controller mainboard implementation |
005f AIC-7896U2/7897U2 |
0080 AIC-7892A U160/m |
0e11 e2a0 Compaq 64-Bit/66MHz Wide Ultra3 SCSI Adapter |
9005 62a0 29160N Ultra160 SCSI Controller |
9005 e220 29160LP Low Profile Ultra160 SCSI Controller |
9005 e2a0 29160 Ultra160 SCSI Controller |
0081 AIC-7892B U160/m |
9005 62a1 19160 Ultra160 SCSI Controller |
0083 AIC-7892D U160/m |
008f AIC-7892P U160/m |
00c0 AHA-3960D / AIC-7899A U160/m |
0e11 f620 Compaq 64-Bit/66MHz Dual Channel Wide Ultra3 SCSI Adapter |
9005 f620 AHA-3960D U160/m |
00c1 AIC-7899B U160/m |
00c3 AIC-7899D U160/m |
00c5 RAID subsystem HBA |
1028 00c5 PowerEdge 2550 |
00cf AIC-7899P U160/m |
1028 00d1 PowerEdge 2550 |
0250 ServeRAID Controller |
1014 0279 ServeRAID-xx |
1014 028c ServeRAID-xx |
0285 AAC-RAID |
1028 0287 PowerEdge Expandable RAID Controller 320/DC |
8000 ASC-29320A U320 |
800f AIC-7901 U320 |
8010 ASC-39320 U320 |
8011 ASC-32320D U320 |
0e11 00ac U320 |
9005 0041 ASC-39320D U320 |
8012 ASC-29320 U320 |
8013 ASC-29320B U320 |
8014 ASC-29320LP U320 |
801e AIC-7901A U320 |
801f AIC-7902 U320 |
8090 ASC-39320 U320 w/HostRAID |
8091 ASC-39320D U320 w/HostRAID |
8092 ASC-29320 U320 w/HostRAID |
8093 ASC-29320B U320 w/HostRAID |
8094 ASC-29320LP U320 w/HostRAID |
809e AIC-7901A U320 w/HostRAID |
809f AIC-7902 U320 w/HostRAID |
907f Atronics |
2015 IDE-2015PL |
919a Gigapixel Corp |
9412 Holtek |
6565 6565 |
9699 Omni Media Technology Inc |
6565 6565 |
9710 NetMos Technology |
9815 VScom 021H-EP2 2 port parallel adaptor |
9835 222N-2 I/O Card (2S+1P) |
a0a0 AOPEN Inc. |
a0f1 UNISYS Corporation |
a200 NEC Corporation |
a259 Hewlett Packard |
a25b Hewlett Packard GmbH PL24-MKT |
a304 Sony |
a727 3Com Corporation |
aa42 Scitex Digital Video |
ac1e Digital Receiver Technology Inc |
b1b3 Shiva Europe Limited |
# Pinnacle should be 11bd, but they got it wrong several times --mj |
bd11 Pinnacle Systems, Inc. (Wrong ID) |
c001 TSI Telsys |
c0a9 Micron/Crucial Technology |
c0de Motorola |
c0fe Motion Engineering, Inc. |
ca50 Varian Australia Pty Ltd |
cafe Chrysalis-ITS |
cccc Catapult Communications |
cddd Tyzx, Inc. |
0101 DeepSea 1 High Speed Stereo Vision Frame Grabber |
0200 DeepSea 2 High Speed Stereo Vision Frame Grabber |
d4d4 Dy4 Systems Inc |
0601 PCI Mezzanine Card |
d531 I+ME ACTIA GmbH |
d84d Exsys |
dead Indigita Corporation |
e000 Winbond |
e000 W89C940 |
e159 Tiger Jet Network Inc. |
0001 Model 300 128k [Catawba TJ] |
0059 0001 128k ISDN-S/T Adapter |
0059 0003 128k ISDN-U Adapter |
0002 Tiger100APC ISDN chipset |
e4bf EKF Elektronik GmbH |
ea01 Eagle Technology |
# The main chip of all these devices is by Xilinx -> It could also be a Xilinx ID. |
ea60 RME |
9896 Digi32 |
9897 Digi32 Pro |
9898 Digi32/8 |
eabb Aashima Technology B.V. |
eace Endace Measurement Systems, Ltd |
3100 DAG 3.10 OC-3/OC-12 |
3200 DAG 3.2x OC-3/OC-12 |
320e DAG 3.2E Fast Ethernet |
340e DAG 3.4E Fast Ethernet |
341e DAG 3.41E Fast Ethernet |
3500 DAG 3.5 OC-3/OC-12 |
351c DAG 3.5ECM Fast Ethernet |
4100 DAG 4.10 OC-48 |
4110 DAG 4.11 OC-48 |
4220 DAG 4.2 OC-48 |
422e DAG 4.2E Dual Gigabit Ethernet |
ec80 Belkin Corporation |
ec00 F5D6000 |
ecc0 Echo Digital Audio Corporation |
0050 Gina24_301 |
0051 Gina24_361 |
0060 Layla24 |
0070 Mona_301_80 |
0071 Mona_301_66 |
0072 Mona_361 |
0080 Mia |
edd8 ARK Logic Inc |
a091 1000PV [Stingray] |
a099 2000PV [Stingray] |
a0a1 2000MT |
a0a9 2000MI |
f1d0 AJA Video |
# All boards I have seen have this ID not efac, though all docs say efac... |
cafe KONA SD SMPTE 259M I/O |
efac KONA SD SMPTE 259M I/O |
facd KONA HD SMPTE 292M I/O |
fa57 Fast Search & Transfer ASA |
febd Ultraview Corp. |
feda Epigram Inc |
fffe VMWare Inc |
0710 Virtual SVGA |
ffff Illegal Vendor ID |
# List of known device classes, subclasses and programming interfaces |
# Syntax: |
# C class class_name |
# subclass subclass_name <-- single tab |
# prog-if prog-if_name <-- two tabs |
C 00 Unclassified device |
00 Non-VGA unclassified device |
01 VGA compatible unclassified device |
C 01 Mass storage controller |
00 SCSI storage controller |
01 IDE interface |
02 Floppy disk controller |
03 IPI bus controller |
04 RAID bus controller |
80 Unknown mass storage controller |
C 02 Network controller |
00 Ethernet controller |
01 Token ring network controller |
02 FDDI network controller |
03 ATM network controller |
04 ISDN controller |
80 Network controller |
C 03 Display controller |
00 VGA compatible controller |
00 VGA |
01 8514 |
01 XGA compatible controller |
02 3D controller |
80 Display controller |
C 04 Multimedia controller |
00 Multimedia video controller |
01 Multimedia audio controller |
02 Computer telephony device |
80 Multimedia controller |
C 05 Memory controller |
00 RAM memory |
01 FLASH memory |
80 Memory controller |
C 06 Bridge |
00 Host bridge |
01 ISA bridge |
02 EISA bridge |
03 MicroChannel bridge |
04 PCI bridge |
00 Normal decode |
01 Subtractive decode |
05 PCMCIA bridge |
06 NuBus bridge |
07 CardBus bridge |
08 RACEway bridge |
00 Transparent mode |
01 Endpoint mode |
09 Semi-transparent PCI-to-PCI bridge |
40 Primary bus towards host CPU |
80 Secondary bus towards host CPU |
0a InfiniBand to PCI host bridge |
80 Bridge |
C 07 Communication controller |
00 Serial controller |
00 8250 |
01 16450 |
02 16550 |
03 16650 |
04 16750 |
05 16850 |
06 16950 |
01 Parallel controller |
00 SPP |
01 BiDir |
02 ECP |
03 IEEE1284 |
fe IEEE1284 Target |
02 Multiport serial controller |
03 Modem |
00 Generic |
01 Hayes/16450 |
02 Hayes/16550 |
03 Hayes/16650 |
04 Hayes/16750 |
80 Communication controller |
C 08 Generic system peripheral |
00 PIC |
00 8259 |
01 ISA PIC |
02 EISA PIC |
10 IO-APIC |
20 IO(X)-APIC |
01 DMA controller |
00 8237 |
01 ISA DMA |
02 EISA DMA |
02 Timer |
00 8254 |
01 ISA Timer |
02 EISA Timers |
03 RTC |
00 Generic |
01 ISA RTC |
04 PCI Hot-plug controller |
80 System peripheral |
C 09 Input device controller |
00 Keyboard controller |
01 Digitizer Pen |
02 Mouse controller |
03 Scanner controller |
04 Gameport controller |
00 Generic |
10 Extended |
80 Input device controller |
C 0a Docking station |
00 Generic Docking Station |
80 Docking Station |
C 0b Processor |
00 386 |
01 486 |
02 Pentium |
10 Alpha |
20 Power PC |
30 MIPS |
40 Co-processor |
C 0c Serial bus controller |
00 FireWire (IEEE 1394) |
00 Generic |
10 OHCI |
01 ACCESS Bus |
02 SSA |
03 USB Controller |
00 UHCI |
10 OHCI |
20 EHCI |
80 Unspecified |
fe USB Device |
04 Fibre Channel |
05 SMBus |
06 InfiniBand |
C 0d Wireless controller |
00 IRDA controller |
01 Consumer IR controller |
10 RF controller |
80 Wireless controller |
C 0e Intelligent controller |
00 I2O |
C 0f Satellite communications controller |
00 Satellite TV controller |
01 Satellite audio communication controller |
03 Satellite voice communication controller |
04 Satellite data communication controller |
C 10 Encryption controller |
00 Network and computing encryption device |
10 Entertainment encryption device |
80 Encryption controller |
C 11 Signal processing controller |
00 DPIO module |
01 Performance counters |
10 Communication synchronizer |
80 Signal processing controller |
/shark/trunk/drivers/pci/pool.c |
---|
0,0 → 1,406 |
#include <linuxcomp.h> |
#include <linux/pci.h> |
#include <linux/slab.h> |
#include <linux/module.h> |
/* |
* Pool allocator ... wraps the pci_alloc_consistent page allocator, so |
* small blocks are easily used by drivers for bus mastering controllers. |
* This should probably be sharing the guts of the slab allocator. |
*/ |
struct pci_pool { /* the pool */ |
struct list_head page_list; |
spinlock_t lock; |
size_t blocks_per_page; |
size_t size; |
struct pci_dev *dev; |
size_t allocation; |
char name [32]; |
wait_queue_head_t waitq; |
struct list_head pools; |
}; |
struct pci_page { /* cacheable header for 'allocation' bytes */ |
struct list_head page_list; |
void *vaddr; |
dma_addr_t dma; |
unsigned in_use; |
unsigned long bitmap [0]; |
}; |
#define POOL_TIMEOUT_JIFFIES ((100 /* msec */ * HZ) / 1000) |
#define POOL_POISON_FREED 0xa7 /* !inuse */ |
#define POOL_POISON_ALLOCATED 0xa9 /* !initted */ |
static DECLARE_MUTEX (pools_lock); |
static ssize_t |
show_pools (struct device *dev, char *buf) |
{ |
struct pci_dev *pdev; |
unsigned temp, size; |
char *next; |
struct list_head *i, *j; |
pdev = container_of (dev, struct pci_dev, dev); |
next = buf; |
size = PAGE_SIZE; |
temp = snprintf26(next, size, "poolinfo - 0.1\n"); |
size -= temp; |
next += temp; |
down (&pools_lock); |
list_for_each (i, &pdev->pools) { |
struct pci_pool *pool; |
unsigned pages = 0, blocks = 0; |
pool = list_entry (i, struct pci_pool, pools); |
list_for_each (j, &pool->page_list) { |
struct pci_page *page; |
page = list_entry (j, struct pci_page, page_list); |
pages++; |
blocks += page->in_use; |
} |
/* per-pool info, no real statistics yet */ |
temp = snprintf26(next, size, "%-16s %4u %4Zu %4Zu %2u\n", |
pool->name, |
blocks, (unsigned int)(pages * pool->blocks_per_page), |
(unsigned int)(pool->size), pages); |
size -= temp; |
next += temp; |
} |
up (&pools_lock); |
return PAGE_SIZE - size; |
} |
static DEVICE_ATTR (pools, S_IRUGO, show_pools, NULL); |
/** |
* pci_pool_create - Creates a pool of pci consistent memory blocks, for dma. |
* @name: name of pool, for diagnostics |
* @pdev: pci device that will be doing the DMA |
* @size: size of the blocks in this pool. |
* @align: alignment requirement for blocks; must be a power of two |
* @allocation: returned blocks won't cross this boundary (or zero) |
* Context: !in_interrupt() |
* |
* Returns a pci allocation pool with the requested characteristics, or |
* null if one can't be created. Given one of these pools, pci_pool_alloc() |
* may be used to allocate memory. Such memory will all have "consistent" |
* DMA mappings, accessible by the device and its driver without using |
* cache flushing primitives. The actual size of blocks allocated may be |
* larger than requested because of alignment. |
* |
* If allocation is nonzero, objects returned from pci_pool_alloc() won't |
* cross that size boundary. This is useful for devices which have |
* addressing restrictions on individual DMA transfers, such as not crossing |
* boundaries of 4KBytes. |
*/ |
struct pci_pool * |
pci_pool_create (const char *name, struct pci_dev *pdev, |
size_t size, size_t align, size_t allocation) |
{ |
struct pci_pool *retval; |
if (align == 0) |
align = 1; |
if (size == 0) |
return 0; |
else if (size < align) |
size = align; |
else if ((size % align) != 0) { |
size += align + 1; |
size &= ~(align - 1); |
} |
if (allocation == 0) { |
if (PAGE_SIZE < size) |
allocation = size; |
else |
allocation = PAGE_SIZE; |
// FIXME: round up for less fragmentation |
} else if (allocation < size) |
return 0; |
if (!(retval = kmalloc (sizeof *retval, SLAB_KERNEL))) |
return retval; |
strlcpy (retval->name, name, sizeof retval->name); |
retval->dev = pdev; |
INIT_LIST_HEAD (&retval->page_list); |
spin_lock_init (&retval->lock); |
retval->size = size; |
retval->allocation = allocation; |
retval->blocks_per_page = allocation / size; |
init_waitqueue_head (&retval->waitq); |
if (pdev) { |
down (&pools_lock); |
if (list_empty (&pdev->pools)) |
device_create_file (&pdev->dev, &dev_attr_pools); |
/* note: not currently insisting "name" be unique */ |
list_add (&retval->pools, &pdev->pools); |
up (&pools_lock); |
} else |
INIT_LIST_HEAD (&retval->pools); |
return retval; |
} |
static struct pci_page * |
pool_alloc_page (struct pci_pool *pool, int mem_flags) |
{ |
struct pci_page *page; |
int mapsize; |
mapsize = pool->blocks_per_page; |
mapsize = (mapsize + BITS_PER_LONG - 1) / BITS_PER_LONG; |
mapsize *= sizeof (long); |
page = (struct pci_page *) kmalloc (mapsize + sizeof *page, mem_flags); |
if (!page) |
return 0; |
page->vaddr = pci_alloc_consistent (pool->dev, |
pool->allocation, |
&page->dma); |
if (page->vaddr) { |
memset (page->bitmap, 0xff, mapsize); // bit set == free |
#ifdef CONFIG_DEBUG_SLAB |
memset (page->vaddr, POOL_POISON_FREED, pool->allocation); |
#endif |
list_add (&page->page_list, &pool->page_list); |
page->in_use = 0; |
} else { |
kfree (page); |
page = 0; |
} |
return page; |
} |
static inline int |
is_page_busy (int blocks, unsigned long *bitmap) |
{ |
while (blocks > 0) { |
if (*bitmap++ != ~0UL) |
return 1; |
blocks -= BITS_PER_LONG; |
} |
return 0; |
} |
static void |
pool_free_page (struct pci_pool *pool, struct pci_page *page) |
{ |
dma_addr_t dma = page->dma; |
#ifdef CONFIG_DEBUG_SLAB |
memset (page->vaddr, POOL_POISON_FREED, pool->allocation); |
#endif |
pci_free_consistent (pool->dev, pool->allocation, page->vaddr, dma); |
list_del (&page->page_list); |
kfree (page); |
} |
/** |
* pci_pool_destroy - destroys a pool of pci memory blocks. |
* @pool: pci pool that will be destroyed |
* Context: !in_interrupt() |
* |
* Caller guarantees that no more memory from the pool is in use, |
* and that nothing will try to use the pool after this call. |
*/ |
void |
pci_pool_destroy (struct pci_pool *pool) |
{ |
down (&pools_lock); |
list_del (&pool->pools); |
if (pool->dev && list_empty (&pool->dev->pools)) |
device_remove_file (&pool->dev->dev, &dev_attr_pools); |
up (&pools_lock); |
while (!list_empty (&pool->page_list)) { |
struct pci_page *page; |
page = list_entry (pool->page_list.next, |
struct pci_page, page_list); |
if (is_page_busy (pool->blocks_per_page, page->bitmap)) { |
printk (KERN_ERR "pci_pool_destroy %s/%s, %p busy\n", |
pool->dev ? pci_name(pool->dev) : NULL, |
pool->name, page->vaddr); |
/* leak the still-in-use consistent memory */ |
list_del (&page->page_list); |
kfree (page); |
} else |
pool_free_page (pool, page); |
} |
kfree (pool); |
} |
/** |
* pci_pool_alloc - get a block of consistent memory |
* @pool: pci pool that will produce the block |
* @mem_flags: SLAB_KERNEL or SLAB_ATOMIC |
* @handle: pointer to dma address of block |
* |
* This returns the kernel virtual address of a currently unused block, |
* and reports its dma address through the handle. |
* If such a memory block can't be allocated, null is returned. |
*/ |
void * |
pci_pool_alloc (struct pci_pool *pool, int mem_flags, dma_addr_t *handle) |
{ |
unsigned long flags; |
struct list_head *entry; |
struct pci_page *page; |
int map, block; |
size_t offset; |
void *retval; |
restart: |
spin_lock_irqsave (&pool->lock, flags); |
list_for_each (entry, &pool->page_list) { |
int i; |
page = list_entry (entry, struct pci_page, page_list); |
/* only cachable accesses here ... */ |
for (map = 0, i = 0; |
i < pool->blocks_per_page; |
i += BITS_PER_LONG, map++) { |
if (page->bitmap [map] == 0) |
continue; |
block = ffz (~ page->bitmap [map]); |
if ((i + block) < pool->blocks_per_page) { |
clear_bit (block, &page->bitmap [map]); |
offset = (BITS_PER_LONG * map) + block; |
offset *= pool->size; |
goto ready; |
} |
} |
} |
if (!(page = pool_alloc_page (pool, SLAB_ATOMIC))) { |
if (mem_flags == SLAB_KERNEL) { |
DECLARE_WAITQUEUE (wait, current); |
//current->state = TASK_INTERRUPTIBLE; |
add_wait_queue (&pool->waitq, &wait); |
spin_unlock_irqrestore (&pool->lock, flags); |
schedule_timeout (POOL_TIMEOUT_JIFFIES); |
remove_wait_queue (&pool->waitq, &wait); |
goto restart; |
} |
retval = 0; |
goto done; |
} |
clear_bit (0, &page->bitmap [0]); |
offset = 0; |
ready: |
page->in_use++; |
retval = offset + page->vaddr; |
*handle = offset + page->dma; |
#ifdef CONFIG_DEBUG_SLAB |
memset (retval, POOL_POISON_ALLOCATED, pool->size); |
#endif |
done: |
spin_unlock_irqrestore (&pool->lock, flags); |
return retval; |
} |
static struct pci_page * |
pool_find_page (struct pci_pool *pool, dma_addr_t dma) |
{ |
unsigned long flags; |
struct list_head *entry; |
struct pci_page *page; |
spin_lock_irqsave (&pool->lock, flags); |
list_for_each (entry, &pool->page_list) { |
page = list_entry (entry, struct pci_page, page_list); |
if (dma < page->dma) |
continue; |
if (dma < (page->dma + pool->allocation)) |
goto done; |
} |
page = 0; |
done: |
spin_unlock_irqrestore (&pool->lock, flags); |
return page; |
} |
/** |
* pci_pool_free - put block back into pci pool |
* @pool: the pci pool holding the block |
* @vaddr: virtual address of block |
* @dma: dma address of block |
* |
* Caller promises neither device nor driver will again touch this block |
* unless it is first re-allocated. |
*/ |
void |
pci_pool_free (struct pci_pool *pool, void *vaddr, dma_addr_t dma) |
{ |
struct pci_page *page; |
unsigned long flags; |
int map, block; |
if ((page = pool_find_page (pool, dma)) == 0) { |
printk (KERN_ERR "pci_pool_free %s/%s, %p/%lx (bad dma)\n", |
pool->dev ? pci_name(pool->dev) : NULL, |
pool->name, vaddr, (unsigned long) dma); |
return; |
} |
block = dma - page->dma; |
block /= pool->size; |
map = block / BITS_PER_LONG; |
block %= BITS_PER_LONG; |
#ifdef CONFIG_DEBUG_SLAB |
if (((dma - page->dma) + (void *)page->vaddr) != vaddr) { |
printk (KERN_ERR "pci_pool_free %s/%s, %p (bad vaddr)/%Lx\n", |
pool->dev ? pci_name(pool->dev) : NULL, |
pool->name, vaddr, (unsigned long long) dma); |
return; |
} |
if (page->bitmap [map] & (1UL << block)) { |
printk (KERN_ERR "pci_pool_free %s/%s, dma %Lx already free\n", |
pool->dev ? pci_name(pool->dev) : NULL, |
pool->name, (unsigned long long)dma); |
return; |
} |
memset (vaddr, POOL_POISON_FREED, pool->size); |
#endif |
spin_lock_irqsave (&pool->lock, flags); |
page->in_use--; |
set_bit (block, &page->bitmap [map]); |
if (waitqueue_active (&pool->waitq)) |
wake_up (&pool->waitq); |
/* |
* Resist a temptation to do |
* if (!is_page_busy(bpp, page->bitmap)) pool_free_page(pool, page); |
* it is not interrupt safe. Better have empty pages hang around. |
*/ |
spin_unlock_irqrestore (&pool->lock, flags); |
} |
EXPORT_SYMBOL (pci_pool_create); |
EXPORT_SYMBOL (pci_pool_destroy); |
EXPORT_SYMBOL (pci_pool_alloc); |
EXPORT_SYMBOL (pci_pool_free); |
/shark/trunk/drivers/pci/syscall.c |
---|
0,0 → 1,144 |
/* |
* pci_syscall.c |
* |
* For architectures where we want to allow direct access |
* to the PCI config stuff - it would probably be preferable |
* on PCs too, but there people just do it by hand with the |
* magic northbridge registers.. |
*/ |
#include <linuxcomp.h> |
#include <linux/sched.h> |
#include <linux/errno.h> |
#include <linux/pci.h> |
#include <linux/smp_lock.h> |
#include <asm/uaccess.h> |
asmlinkage long |
sys_pciconfig_read(unsigned long bus, unsigned long dfn, |
unsigned long off, unsigned long len, void *buf) |
{ |
struct pci_dev *dev; |
u8 byte; |
u16 word; |
u32 dword; |
long err, cfg_ret; |
err = -EPERM; |
if (!capable(CAP_SYS_ADMIN)) |
goto error; |
err = -ENODEV; |
dev = pci_find_slot(bus, dfn); |
if (!dev) |
goto error; |
lock_kernel(); |
switch (len) { |
case 1: |
cfg_ret = pci_read_config_byte(dev, off, &byte); |
break; |
case 2: |
cfg_ret = pci_read_config_word(dev, off, &word); |
break; |
case 4: |
cfg_ret = pci_read_config_dword(dev, off, &dword); |
break; |
default: |
err = -EINVAL; |
unlock_kernel(); |
goto error; |
}; |
unlock_kernel(); |
err = -EIO; |
if (cfg_ret != PCIBIOS_SUCCESSFUL) |
goto error; |
switch (len) { |
case 1: |
err = put_user(byte, (unsigned char *)buf); |
break; |
case 2: |
err = put_user(word, (unsigned short *)buf); |
break; |
case 4: |
err = put_user(dword, (unsigned int *)buf); |
break; |
}; |
return err; |
error: |
/* ??? XFree86 doesn't even check the return value. They |
just look for 0xffffffff in the output, since that's what |
they get instead of a machine check on x86. */ |
switch (len) { |
case 1: |
put_user(-1, (unsigned char *)buf); |
break; |
case 2: |
put_user(-1, (unsigned short *)buf); |
break; |
case 4: |
put_user(-1, (unsigned int *)buf); |
break; |
}; |
return err; |
} |
asmlinkage long |
sys_pciconfig_write(unsigned long bus, unsigned long dfn, |
unsigned long off, unsigned long len, void *buf) |
{ |
struct pci_dev *dev; |
u8 byte; |
u16 word; |
u32 dword; |
int err = 0; |
if (!capable(CAP_SYS_ADMIN)) |
return -EPERM; |
dev = pci_find_slot(bus, dfn); |
if (!dev) |
return -ENODEV; |
lock_kernel(); |
switch(len) { |
case 1: |
err = get_user(byte, (u8 *)buf); |
if (err) |
break; |
err = pci_write_config_byte(dev, off, byte); |
if (err != PCIBIOS_SUCCESSFUL) |
err = -EIO; |
break; |
case 2: |
err = get_user(word, (u16 *)buf); |
if (err) |
break; |
err = pci_write_config_word(dev, off, word); |
if (err != PCIBIOS_SUCCESSFUL) |
err = -EIO; |
break; |
case 4: |
err = get_user(dword, (u32 *)buf); |
if (err) |
break; |
err = pci_write_config_dword(dev, off, dword); |
if (err != PCIBIOS_SUCCESSFUL) |
err = -EIO; |
break; |
default: |
err = -EINVAL; |
break; |
}; |
unlock_kernel(); |
return err; |
} |
/shark/trunk/drivers/pci/direct.c |
---|
0,0 → 1,287 |
/* |
* direct.c - Low-level direct PCI config space access |
*/ |
#include <linuxcomp.h> |
#include <linux/pci.h> |
#include <linux/init.h> |
#include "pci2.h" |
/* |
* Functions for accessing PCI configuration space with type 1 accesses |
*/ |
#define PCI_CONF1_ADDRESS(bus, devfn, reg) \ |
(0x80000000 | (bus << 16) | (devfn << 8) | (reg & ~3)) |
static int pci_conf1_read (int seg, int bus, int devfn, int reg, int len, u32 *value) |
{ |
unsigned long flags; |
if (!value || (bus > 255) || (devfn > 255) || (reg > 255)) |
return -EINVAL; |
spin_lock_irqsave(&pci_config_lock, flags); |
outl(PCI_CONF1_ADDRESS(bus, devfn, reg), 0xCF8); |
switch (len) { |
case 1: |
*value = inb(0xCFC + (reg & 3)); |
break; |
case 2: |
*value = inw(0xCFC + (reg & 2)); |
break; |
case 4: |
*value = inl(0xCFC); |
break; |
} |
spin_unlock_irqrestore(&pci_config_lock, flags); |
return 0; |
} |
static int pci_conf1_write (int seg, int bus, int devfn, int reg, int len, u32 value) |
{ |
unsigned long flags; |
if ((bus > 255) || (devfn > 255) || (reg > 255)) |
return -EINVAL; |
spin_lock_irqsave(&pci_config_lock, flags); |
outl(PCI_CONF1_ADDRESS(bus, devfn, reg), 0xCF8); |
switch (len) { |
case 1: |
outb((u8)value, 0xCFC + (reg & 3)); |
break; |
case 2: |
outw((u16)value, 0xCFC + (reg & 2)); |
break; |
case 4: |
outl((u32)value, 0xCFC); |
break; |
} |
spin_unlock_irqrestore(&pci_config_lock, flags); |
return 0; |
} |
#undef PCI_CONF1_ADDRESS |
struct pci_raw_ops pci_direct_conf1 = { |
.read = pci_conf1_read, |
.write = pci_conf1_write, |
}; |
/* |
* Functions for accessing PCI configuration space with type 2 accesses |
*/ |
#define PCI_CONF2_ADDRESS(dev, reg) (u16)(0xC000 | (dev << 8) | reg) |
static int pci_conf2_read(int seg, int bus, int devfn, int reg, int len, u32 *value) |
{ |
unsigned long flags; |
int dev, fn; |
if (!value || (bus > 255) || (devfn > 255) || (reg > 255)) |
return -EINVAL; |
dev = PCI_SLOT(devfn); |
fn = PCI_FUNC(devfn); |
if (dev & 0x10) |
return PCIBIOS_DEVICE_NOT_FOUND; |
spin_lock_irqsave(&pci_config_lock, flags); |
outb((u8)(0xF0 | (fn << 1)), 0xCF8); |
outb((u8)bus, 0xCFA); |
switch (len) { |
case 1: |
*value = inb(PCI_CONF2_ADDRESS(dev, reg)); |
break; |
case 2: |
*value = inw(PCI_CONF2_ADDRESS(dev, reg)); |
break; |
case 4: |
*value = inl(PCI_CONF2_ADDRESS(dev, reg)); |
break; |
} |
outb(0, 0xCF8); |
spin_unlock_irqrestore(&pci_config_lock, flags); |
return 0; |
} |
static int pci_conf2_write (int seg, int bus, int devfn, int reg, int len, u32 value) |
{ |
unsigned long flags; |
int dev, fn; |
if ((bus > 255) || (devfn > 255) || (reg > 255)) |
return -EINVAL; |
dev = PCI_SLOT(devfn); |
fn = PCI_FUNC(devfn); |
if (dev & 0x10) |
return PCIBIOS_DEVICE_NOT_FOUND; |
spin_lock_irqsave(&pci_config_lock, flags); |
outb((u8)(0xF0 | (fn << 1)), 0xCF8); |
outb((u8)bus, 0xCFA); |
switch (len) { |
case 1: |
outb((u8)value, PCI_CONF2_ADDRESS(dev, reg)); |
break; |
case 2: |
outw((u16)value, PCI_CONF2_ADDRESS(dev, reg)); |
break; |
case 4: |
outl((u32)value, PCI_CONF2_ADDRESS(dev, reg)); |
break; |
} |
outb(0, 0xCF8); |
spin_unlock_irqrestore(&pci_config_lock, flags); |
return 0; |
} |
#undef PCI_CONF2_ADDRESS |
static struct pci_raw_ops pci_direct_conf2 = { |
.read = pci_conf2_read, |
.write = pci_conf2_write, |
}; |
/* |
* Before we decide to use direct hardware access mechanisms, we try to do some |
* trivial checks to ensure it at least _seems_ to be working -- we just test |
* whether bus 00 contains a host bridge (this is similar to checking |
* techniques used in XFree86, but ours should be more reliable since we |
* attempt to make use of direct access hints provided by the PCI BIOS). |
* |
* This should be close to trivial, but it isn't, because there are buggy |
* chipsets (yes, you guessed it, by Intel and Compaq) that have no class ID. |
*/ |
static int __init pci_sanity_check(struct pci_raw_ops *o) |
{ |
u32 x = 0; |
int devfn; |
if (pci_probe & PCI_NO_CHECKS) |
return 1; |
for (devfn = 0; devfn < 0x100; devfn++) { |
if (o->read(0, 0, devfn, PCI_CLASS_DEVICE, 2, &x)) |
continue; |
if (x == PCI_CLASS_BRIDGE_HOST || x == PCI_CLASS_DISPLAY_VGA) |
return 1; |
if (o->read(0, 0, devfn, PCI_VENDOR_ID, 2, &x)) |
continue; |
if (x == PCI_VENDOR_ID_INTEL || x == PCI_VENDOR_ID_COMPAQ) |
return 1; |
} |
DBG("PCI: Sanity check failed\n"); |
return 0; |
} |
static int __init pci_check_type1(void) |
{ |
unsigned long flags; |
unsigned int tmp; |
int works = 0; |
local_irq_save(flags); |
outb(0x01, 0xCFB); |
tmp = inl(0xCF8); |
outl(0x80000000, 0xCF8); |
if (inl(0xCF8) == 0x80000000 && pci_sanity_check(&pci_direct_conf1)) { |
works = 1; |
} |
outl(tmp, 0xCF8); |
local_irq_restore(flags); |
return works; |
} |
static int __init pci_check_type2(void) |
{ |
unsigned long flags; |
int works = 0; |
local_irq_save(flags); |
outb(0x00, 0xCFB); |
outb(0x00, 0xCF8); |
outb(0x00, 0xCFA); |
if (inb(0xCF8) == 0x00 && inb(0xCFA) == 0x00 && |
pci_sanity_check(&pci_direct_conf2)) { |
works = 1; |
} |
local_irq_restore(flags); |
return works; |
} |
int __init pci_direct_init(void) |
{ |
struct resource *region, *region2; |
if ((pci_probe & PCI_PROBE_CONF1) == 0) |
goto type2; |
region = request_region(0xCF8, 8, "PCI conf1"); |
if (!region) |
goto type2; |
if (pci_check_type1()) { |
printk(KERN_INFO "PCI: Using configuration type 1\n"); |
raw_pci_ops = &pci_direct_conf1; |
return 0; |
} |
release_resource(region); |
type2: |
if ((!pci_probe & PCI_PROBE_CONF2) == 0) |
goto out; |
region = request_region(0xCF8, 4, "PCI conf2"); |
if (!region) |
goto out; |
region2 = request_region(0xC000, 0x1000, "PCI conf2"); |
if (!region2) |
goto fail2; |
if (pci_check_type2()) { |
printk(KERN_INFO "PCI: Using configuration type 2\n"); |
raw_pci_ops = &pci_direct_conf2; |
return 0; |
} |
release_resource(region2); |
fail2: |
release_resource(region); |
out: |
return 0; |
} |
arch_initcall(pci_direct_init); |
/shark/trunk/drivers/pci/pci.c |
---|
0,0 → 1,784 |
/* |
* $Id: pci.c,v 1.7 2004-04-25 12:07:34 giacomo Exp $ |
* |
* PCI Bus Services, see include/linux/pci.h for further explanation. |
* |
* Copyright 1993 -- 1997 Drew Eckhardt, Frederic Potter, |
* David Mosberger-Tang |
* |
* Copyright 1997 -- 2000 Martin Mares <mj@ucw.cz> |
*/ |
#include <linuxcomp.h> |
#include <linux/delay.h> |
#include <linux/init.h> |
#include <linux/pci.h> |
#include <linux/module.h> |
#include <linux/spinlock.h> |
#include <asm/dma.h> /* isa_dma_bridge_buggy */ |
//#define DEBUG |
#ifdef DEBUG |
#define DBG(x...) printk(x) |
#else |
#define DBG(x...) |
#endif |
/** |
* pci_bus_max_busnr - returns maximum PCI bus number of given bus' children |
* @bus: pointer to PCI bus structure to search |
* |
* Given a PCI bus, returns the highest PCI bus number present in the set |
* including the given PCI bus and its list of child PCI buses. |
*/ |
unsigned char __devinit |
pci_bus_max_busnr(struct pci_bus* bus) |
{ |
struct list_head *tmp; |
unsigned char max, n; |
max = bus->number; |
list_for_each(tmp, &bus->children) { |
n = pci_bus_max_busnr(pci_bus_b(tmp)); |
if(n > max) |
max = n; |
} |
return max; |
} |
/** |
* pci_max_busnr - returns maximum PCI bus number |
* |
* Returns the highest PCI bus number present in the system global list of |
* PCI buses. |
*/ |
unsigned char __devinit |
pci_max_busnr(void) |
{ |
struct pci_bus *bus = NULL; |
unsigned char max, n; |
max = 0; |
while ((bus = pci_find_next_bus(bus)) != NULL) { |
n = pci_bus_max_busnr(bus); |
if(n > max) |
max = n; |
} |
return max; |
} |
/** |
* pci_find_capability - query for devices' capabilities |
* @dev: PCI device to query |
* @cap: capability code |
* |
* Tell if a device supports a given PCI capability. |
* Returns the address of the requested capability structure within the |
* device's PCI configuration space or 0 in case the device does not |
* support it. Possible values for @cap: |
* |
* %PCI_CAP_ID_PM Power Management |
* |
* %PCI_CAP_ID_AGP Accelerated Graphics Port |
* |
* %PCI_CAP_ID_VPD Vital Product Data |
* |
* %PCI_CAP_ID_SLOTID Slot Identification |
* |
* %PCI_CAP_ID_MSI Message Signalled Interrupts |
* |
* %PCI_CAP_ID_CHSWP CompactPCI HotSwap |
* |
* %PCI_CAP_ID_PCIX PCI-X |
*/ |
int |
pci_find_capability(struct pci_dev *dev, int cap) |
{ |
u16 status; |
u8 pos, id; |
int ttl = 48; |
pci_read_config_word(dev, PCI_STATUS, &status); |
if (!(status & PCI_STATUS_CAP_LIST)) |
return 0; |
switch (dev->hdr_type) { |
case PCI_HEADER_TYPE_NORMAL: |
case PCI_HEADER_TYPE_BRIDGE: |
pci_read_config_byte(dev, PCI_CAPABILITY_LIST, &pos); |
break; |
case PCI_HEADER_TYPE_CARDBUS: |
pci_read_config_byte(dev, PCI_CB_CAPABILITY_LIST, &pos); |
break; |
default: |
return 0; |
} |
while (ttl-- && pos >= 0x40) { |
pos &= ~3; |
pci_read_config_byte(dev, pos + PCI_CAP_LIST_ID, &id); |
if (id == 0xff) |
break; |
if (id == cap) |
return pos; |
pci_read_config_byte(dev, pos + PCI_CAP_LIST_NEXT, &pos); |
} |
return 0; |
} |
/** |
* pci_bus_find_capability - query for devices' capabilities |
* @bus: the PCI bus to query |
* @devfn: PCI device to query |
* @cap: capability code |
* |
* Like pci_find_capability() but works for pci devices that do not have a |
* pci_dev structure set up yet. |
* |
* Returns the address of the requested capability structure within the |
* device's PCI configuration space or 0 in case the device does not |
* support it. |
*/ |
int pci_bus_find_capability(struct pci_bus *bus, unsigned int devfn, int cap) |
{ |
u16 status; |
u8 pos, id; |
int ttl = 48; |
struct pci_dev *dev = bus->self; |
pci_bus_read_config_word(bus, devfn, PCI_STATUS, &status); |
if (!(status & PCI_STATUS_CAP_LIST)) |
return 0; |
switch (dev->hdr_type) { |
case PCI_HEADER_TYPE_NORMAL: |
case PCI_HEADER_TYPE_BRIDGE: |
pci_bus_read_config_byte(bus, devfn, PCI_CAPABILITY_LIST, &pos); |
break; |
case PCI_HEADER_TYPE_CARDBUS: |
pci_bus_read_config_byte(bus, devfn, PCI_CB_CAPABILITY_LIST, &pos); |
break; |
default: |
return 0; |
} |
while (ttl-- && pos >= 0x40) { |
pos &= ~3; |
pci_bus_read_config_byte(bus, devfn, pos + PCI_CAP_LIST_ID, &id); |
if (id == 0xff) |
break; |
if (id == cap) |
return pos; |
pci_bus_read_config_byte(bus, devfn, pos + PCI_CAP_LIST_NEXT, &pos); |
} |
return 0; |
} |
/** |
* pci_find_parent_resource - return resource region of parent bus of given region |
* @dev: PCI device structure contains resources to be searched |
* @res: child resource record for which parent is sought |
* |
* For given resource region of given device, return the resource |
* region of parent bus the given region is contained in or where |
* it should be allocated from. |
*/ |
struct resource * |
pci_find_parent_resource(const struct pci_dev *dev, struct resource *res) |
{ |
const struct pci_bus *bus = dev->bus; |
int i; |
struct resource *best = NULL; |
for(i = 0; i < PCI_BUS_NUM_RESOURCES; i++) { |
struct resource *r = bus->resource[i]; |
if (!r) |
continue; |
if (res->start && !(res->start >= r->start && res->end <= r->end)) |
continue; /* Not contained */ |
if ((res->flags ^ r->flags) & (IORESOURCE_IO | IORESOURCE_MEM)) |
continue; /* Wrong type */ |
if (!((res->flags ^ r->flags) & IORESOURCE_PREFETCH)) |
return r; /* Exact match */ |
if ((res->flags & IORESOURCE_PREFETCH) && !(r->flags & IORESOURCE_PREFETCH)) |
best = r; /* Approximating prefetchable by non-prefetchable */ |
} |
return best; |
} |
/** |
* pci_set_power_state - Set the power state of a PCI device |
* @dev: PCI device to be suspended |
* @state: Power state we're entering |
* |
* Transition a device to a new power state, using the Power Management |
* Capabilities in the device's config space. |
* |
* RETURN VALUE: |
* -EINVAL if trying to enter a lower state than we're already in. |
* 0 if we're already in the requested state. |
* -EIO if device does not support PCI PM. |
* 0 if we can successfully change the power state. |
*/ |
int |
pci_set_power_state(struct pci_dev *dev, int state) |
{ |
int pm; |
u16 pmcsr; |
/* bound the state we're entering */ |
if (state > 3) state = 3; |
/* Validate current state: |
* Can enter D0 from any state, but if we can only go deeper |
* to sleep if we're already in a low power state |
*/ |
if (state > 0 && dev->current_state > state) |
return -EINVAL; |
else if (dev->current_state == state) |
return 0; /* we're already there */ |
/* find PCI PM capability in list */ |
pm = pci_find_capability(dev, PCI_CAP_ID_PM); |
/* abort if the device doesn't support PM capabilities */ |
if (!pm) return -EIO; |
/* check if this device supports the desired state */ |
if (state == 1 || state == 2) { |
u16 pmc; |
pci_read_config_word(dev,pm + PCI_PM_PMC,&pmc); |
if (state == 1 && !(pmc & PCI_PM_CAP_D1)) return -EIO; |
else if (state == 2 && !(pmc & PCI_PM_CAP_D2)) return -EIO; |
} |
/* If we're in D3, force entire word to 0. |
* This doesn't affect PME_Status, disables PME_En, and |
* sets PowerState to 0. |
*/ |
if (dev->current_state >= 3) |
pmcsr = 0; |
else { |
pci_read_config_word(dev, pm + PCI_PM_CTRL, &pmcsr); |
pmcsr &= ~PCI_PM_CTRL_STATE_MASK; |
pmcsr |= state; |
} |
/* enter specified state */ |
pci_write_config_word(dev, pm + PCI_PM_CTRL, pmcsr); |
/* Mandatory power management transition delays */ |
/* see PCI PM 1.1 5.6.1 table 18 */ |
if(state == 3 || dev->current_state == 3) |
{ |
//set_current_state(TASK_UNINTERRUPTIBLE); |
schedule_timeout(HZ/100); |
} |
else if(state == 2 || dev->current_state == 2) |
udelay(200); |
dev->current_state = state; |
return 0; |
} |
/** |
* pci_save_state - save the PCI configuration space of a device before suspending |
* @dev: - PCI device that we're dealing with |
* @buffer: - buffer to hold config space context |
* |
* @buffer must be large enough to hold the entire PCI 2.2 config space |
* (>= 64 bytes). |
*/ |
int |
pci_save_state(struct pci_dev *dev, u32 *buffer) |
{ |
int i; |
if (buffer) { |
/* XXX: 100% dword access ok here? */ |
for (i = 0; i < 16; i++) |
pci_read_config_dword(dev, i * 4,&buffer[i]); |
} |
return 0; |
} |
/** |
* pci_restore_state - Restore the saved state of a PCI device |
* @dev: - PCI device that we're dealing with |
* @buffer: - saved PCI config space |
* |
*/ |
int |
pci_restore_state(struct pci_dev *dev, u32 *buffer) |
{ |
int i; |
if (buffer) { |
for (i = 0; i < 16; i++) |
pci_write_config_dword(dev,i * 4, buffer[i]); |
} |
/* |
* otherwise, write the context information we know from bootup. |
* This works around a problem where warm-booting from Windows |
* combined with a D3(hot)->D0 transition causes PCI config |
* header data to be forgotten. |
*/ |
else { |
for (i = 0; i < 6; i ++) |
pci_write_config_dword(dev, |
PCI_BASE_ADDRESS_0 + (i * 4), |
dev->resource[i].start); |
pci_write_config_byte(dev, PCI_INTERRUPT_LINE, dev->irq); |
} |
return 0; |
} |
/** |
* pci_enable_device_bars - Initialize some of a device for use |
* @dev: PCI device to be initialized |
* @bars: bitmask of BAR's that must be configured |
* |
* Initialize device before it's used by a driver. Ask low-level code |
* to enable selected I/O and memory resources. Wake up the device if it |
* was suspended. Beware, this function can fail. |
*/ |
int |
pci_enable_device_bars(struct pci_dev *dev, int bars) |
{ |
int err; |
pci_set_power_state(dev, 0); |
if ((err = pcibios_enable_device(dev, bars)) < 0) |
return err; |
return 0; |
} |
/** |
* pci_enable_device - Initialize device before it's used by a driver. |
* @dev: PCI device to be initialized |
* |
* Initialize device before it's used by a driver. Ask low-level code |
* to enable I/O and memory. Wake up the device if it was suspended. |
* Beware, this function can fail. |
*/ |
int |
pci_enable_device(struct pci_dev *dev) |
{ |
return pci_enable_device_bars(dev, (1 << PCI_NUM_RESOURCES) - 1); |
} |
/** |
* pci_disable_device - Disable PCI device after use |
* @dev: PCI device to be disabled |
* |
* Signal to the system that the PCI device is not in use by the system |
* anymore. This only involves disabling PCI bus-mastering, if active. |
*/ |
void |
pci_disable_device(struct pci_dev *dev) |
{ |
u16 pci_command; |
pci_read_config_word(dev, PCI_COMMAND, &pci_command); |
if (pci_command & PCI_COMMAND_MASTER) { |
pci_command &= ~PCI_COMMAND_MASTER; |
pci_write_config_word(dev, PCI_COMMAND, pci_command); |
} |
} |
/** |
* pci_enable_wake - enable device to generate PME# when suspended |
* @dev: - PCI device to operate on |
* @state: - Current state of device. |
* @enable: - Flag to enable or disable generation |
* |
* Set the bits in the device's PM Capabilities to generate PME# when |
* the system is suspended. |
* |
* -EIO is returned if device doesn't have PM Capabilities. |
* -EINVAL is returned if device supports it, but can't generate wake events. |
* 0 if operation is successful. |
* |
*/ |
int pci_enable_wake(struct pci_dev *dev, u32 state, int enable) |
{ |
int pm; |
u16 value; |
/* find PCI PM capability in list */ |
pm = pci_find_capability(dev, PCI_CAP_ID_PM); |
/* If device doesn't support PM Capabilities, but request is to disable |
* wake events, it's a nop; otherwise fail */ |
if (!pm) |
return enable ? -EIO : 0; |
/* Check device's ability to generate PME# */ |
pci_read_config_word(dev,pm+PCI_PM_PMC,&value); |
value &= PCI_PM_CAP_PME_MASK; |
value >>= ffs(value); /* First bit of mask */ |
/* Check if it can generate PME# from requested state. */ |
if (!value || !(value & (1 << state))) |
return enable ? -EINVAL : 0; |
pci_read_config_word(dev, pm + PCI_PM_CTRL, &value); |
/* Clear PME_Status by writing 1 to it and enable PME# */ |
value |= PCI_PM_CTRL_PME_STATUS | PCI_PM_CTRL_PME_ENABLE; |
if (!enable) |
value &= ~PCI_PM_CTRL_PME_ENABLE; |
pci_write_config_word(dev, pm + PCI_PM_CTRL, value); |
return 0; |
} |
int |
pci_get_interrupt_pin(struct pci_dev *dev, struct pci_dev **bridge) |
{ |
u8 pin; |
pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &pin); |
if (!pin) |
return -1; |
pin--; |
while (dev->bus->self) { |
pin = (pin + PCI_SLOT(dev->devfn)) % 4; |
dev = dev->bus->self; |
} |
*bridge = dev; |
return pin; |
} |
/** |
* pci_release_region - Release a PCI bar |
* @pdev: PCI device whose resources were previously reserved by pci_request_region |
* @bar: BAR to release |
* |
* Releases the PCI I/O and memory resources previously reserved by a |
* successful call to pci_request_region. Call this function only |
* after all use of the PCI regions has ceased. |
*/ |
void pci_release_region(struct pci_dev *pdev, int bar) |
{ |
if (pci_resource_len(pdev, bar) == 0) |
return; |
if (pci_resource_flags(pdev, bar) & IORESOURCE_IO) |
release_region(pci_resource_start(pdev, bar), |
pci_resource_len(pdev, bar)); |
else if (pci_resource_flags(pdev, bar) & IORESOURCE_MEM) |
release_mem_region(pci_resource_start(pdev, bar), |
pci_resource_len(pdev, bar)); |
} |
/** |
* pci_request_region - Reserved PCI I/O and memory resource |
* @pdev: PCI device whose resources are to be reserved |
* @bar: BAR to be reserved |
* @res_name: Name to be associated with resource. |
* |
* Mark the PCI region associated with PCI device @pdev BR @bar as |
* being reserved by owner @res_name. Do not access any |
* address inside the PCI regions unless this call returns |
* successfully. |
* |
* Returns 0 on success, or %EBUSY on error. A warning |
* message is also printed on failure. |
*/ |
int pci_request_region(struct pci_dev *pdev, int bar, char *res_name) |
{ |
if (pci_resource_len(pdev, bar) == 0) |
return 0; |
if (pci_resource_flags(pdev, bar) & IORESOURCE_IO) { |
if (!request_region(pci_resource_start(pdev, bar), |
pci_resource_len(pdev, bar), res_name)) |
goto err_out; |
} |
else if (pci_resource_flags(pdev, bar) & IORESOURCE_MEM) { |
if (!request_mem_region(pci_resource_start(pdev, bar), |
pci_resource_len(pdev, bar), res_name)) |
goto err_out; |
} |
return 0; |
err_out: |
printk (KERN_WARNING "PCI: Unable to reserve %s region #%d:%lx@%lx for device %s\n", |
pci_resource_flags(pdev, bar) & IORESOURCE_IO ? "I/O" : "mem", |
bar + 1, /* PCI BAR # */ |
pci_resource_len(pdev, bar), pci_resource_start(pdev, bar), |
pci_name(pdev)); |
return -EBUSY; |
} |
/** |
* pci_release_regions - Release reserved PCI I/O and memory resources |
* @pdev: PCI device whose resources were previously reserved by pci_request_regions |
* |
* Releases all PCI I/O and memory resources previously reserved by a |
* successful call to pci_request_regions. Call this function only |
* after all use of the PCI regions has ceased. |
*/ |
void pci_release_regions(struct pci_dev *pdev) |
{ |
int i; |
for (i = 0; i < 6; i++) |
pci_release_region(pdev, i); |
} |
/** |
* pci_request_regions - Reserved PCI I/O and memory resources |
* @pdev: PCI device whose resources are to be reserved |
* @res_name: Name to be associated with resource. |
* |
* Mark all PCI regions associated with PCI device @pdev as |
* being reserved by owner @res_name. Do not access any |
* address inside the PCI regions unless this call returns |
* successfully. |
* |
* Returns 0 on success, or %EBUSY on error. A warning |
* message is also printed on failure. |
*/ |
int pci_request_regions(struct pci_dev *pdev, char *res_name) |
{ |
int i; |
for (i = 0; i < 6; i++) |
if(pci_request_region(pdev, i, res_name)) |
goto err_out; |
return 0; |
err_out: |
printk (KERN_WARNING "PCI: Unable to reserve %s region #%d:%lx@%lx for device %s\n", |
pci_resource_flags(pdev, i) & IORESOURCE_IO ? "I/O" : "mem", |
i + 1, /* PCI BAR # */ |
pci_resource_len(pdev, i), pci_resource_start(pdev, i), |
pci_name(pdev)); |
while(--i >= 0) |
pci_release_region(pdev, i); |
return -EBUSY; |
} |
/** |
* pci_set_master - enables bus-mastering for device dev |
* @dev: the PCI device to enable |
* |
* Enables bus-mastering on the device and calls pcibios_set_master() |
* to do the needed arch specific settings. |
*/ |
void |
pci_set_master(struct pci_dev *dev) |
{ |
u16 cmd; |
pci_read_config_word(dev, PCI_COMMAND, &cmd); |
if (! (cmd & PCI_COMMAND_MASTER)) { |
DBG("PCI: Enabling bus mastering for device %s\n", pci_name(dev)); |
cmd |= PCI_COMMAND_MASTER; |
pci_write_config_word(dev, PCI_COMMAND, cmd); |
} |
pcibios_set_master(dev); |
} |
#ifndef HAVE_ARCH_PCI_MWI |
/* This can be overridden by arch code. */ |
u8 pci_cache_line_size = L1_CACHE_BYTES >> 2; |
/** |
* pci_generic_prep_mwi - helper function for pci_set_mwi |
* @dev: the PCI device for which MWI is enabled |
* |
* Helper function for generic implementation of pcibios_prep_mwi |
* function. Originally copied from drivers/net/acenic.c. |
* Copyright 1998-2001 by Jes Sorensen, <jes@trained-monkey.org>. |
* |
* RETURNS: An appropriate -ERRNO error value on error, or zero for success. |
*/ |
static int |
pci_generic_prep_mwi(struct pci_dev *dev) |
{ |
u8 cacheline_size; |
if (!pci_cache_line_size) |
return -EINVAL; /* The system doesn't support MWI. */ |
/* Validate current setting: the PCI_CACHE_LINE_SIZE must be |
equal to or multiple of the right value. */ |
pci_read_config_byte(dev, PCI_CACHE_LINE_SIZE, &cacheline_size); |
if (cacheline_size >= pci_cache_line_size && |
(cacheline_size % pci_cache_line_size) == 0) |
return 0; |
/* Write the correct value. */ |
pci_write_config_byte(dev, PCI_CACHE_LINE_SIZE, pci_cache_line_size); |
/* Read it back. */ |
pci_read_config_byte(dev, PCI_CACHE_LINE_SIZE, &cacheline_size); |
if (cacheline_size == pci_cache_line_size) |
return 0; |
printk(KERN_WARNING "PCI: cache line size of %d is not supported " |
"by device %s\n", pci_cache_line_size << 2, pci_name(dev)); |
return -EINVAL; |
} |
#endif /* !HAVE_ARCH_PCI_MWI */ |
/** |
* pci_set_mwi - enables memory-write-invalidate PCI transaction |
* @dev: the PCI device for which MWI is enabled |
* |
* Enables the Memory-Write-Invalidate transaction in %PCI_COMMAND, |
* and then calls @pcibios_set_mwi to do the needed arch specific |
* operations or a generic mwi-prep function. |
* |
* RETURNS: An appropriate -ERRNO error value on error, or zero for success. |
*/ |
int |
pci_set_mwi(struct pci_dev *dev) |
{ |
int rc; |
u16 cmd; |
#ifdef HAVE_ARCH_PCI_MWI |
rc = pcibios_prep_mwi(dev); |
#else |
rc = pci_generic_prep_mwi(dev); |
#endif |
if (rc) |
return rc; |
pci_read_config_word(dev, PCI_COMMAND, &cmd); |
if (! (cmd & PCI_COMMAND_INVALIDATE)) { |
DBG("PCI: Enabling Mem-Wr-Inval for device %s\n", pci_name(dev)); |
cmd |= PCI_COMMAND_INVALIDATE; |
pci_write_config_word(dev, PCI_COMMAND, cmd); |
} |
return 0; |
} |
/** |
* pci_clear_mwi - disables Memory-Write-Invalidate for device dev |
* @dev: the PCI device to disable |
* |
* Disables PCI Memory-Write-Invalidate transaction on the device |
*/ |
void |
pci_clear_mwi(struct pci_dev *dev) |
{ |
u16 cmd; |
pci_read_config_word(dev, PCI_COMMAND, &cmd); |
if (cmd & PCI_COMMAND_INVALIDATE) { |
cmd &= ~PCI_COMMAND_INVALIDATE; |
pci_write_config_word(dev, PCI_COMMAND, cmd); |
} |
} |
int |
pci_set_dma_mask(struct pci_dev *dev, u64 mask) |
{ |
if (!pci_dma_supported(dev, mask)) |
return -EIO; |
dev->dma_mask = mask; |
return 0; |
} |
int |
pci_dac_set_dma_mask(struct pci_dev *dev, u64 mask) |
{ |
if (!pci_dac_dma_supported(dev, mask)) |
return -EIO; |
dev->dma_mask = mask; |
return 0; |
} |
int |
pci_set_consistent_dma_mask(struct pci_dev *dev, u64 mask) |
{ |
if (!pci_dma_supported(dev, mask)) |
return -EIO; |
dev->consistent_dma_mask = mask; |
return 0; |
} |
int __devinit pci_init(void) |
{ |
struct pci_dev *dev = NULL; |
while ((dev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) { |
pci_fixup_device(PCI_FIXUP_FINAL, dev); |
} |
return 0; |
} |
static int __devinit pci_setup(char *str) |
{ |
while (str) { |
char *k = strchr(str, ','); |
if (k) |
*k++ = 0; |
if (*str && (str = pcibios_setup(str)) && *str) { |
/* PCI layer options should be handled here */ |
printk(KERN_ERR "PCI: Unknown option `%s'\n", str); |
} |
str = k; |
} |
return 1; |
} |
device_initcall(pci_init); |
__setup("pci=", pci_setup); |
#if defined(CONFIG_ISA) || defined(CONFIG_EISA) |
/* FIXME: Some boxes have multiple ISA bridges! */ |
struct pci_dev *isa_bridge; |
EXPORT_SYMBOL(isa_bridge); |
#endif |
EXPORT_SYMBOL(pci_enable_device_bars); |
EXPORT_SYMBOL(pci_enable_device); |
EXPORT_SYMBOL(pci_disable_device); |
EXPORT_SYMBOL(pci_max_busnr); |
EXPORT_SYMBOL(pci_bus_max_busnr); |
EXPORT_SYMBOL(pci_find_capability); |
EXPORT_SYMBOL(pci_bus_find_capability); |
EXPORT_SYMBOL(pci_release_regions); |
EXPORT_SYMBOL(pci_request_regions); |
EXPORT_SYMBOL(pci_release_region); |
EXPORT_SYMBOL(pci_request_region); |
EXPORT_SYMBOL(pci_set_master); |
EXPORT_SYMBOL(pci_set_mwi); |
EXPORT_SYMBOL(pci_clear_mwi); |
EXPORT_SYMBOL(pci_set_dma_mask); |
EXPORT_SYMBOL(pci_dac_set_dma_mask); |
EXPORT_SYMBOL(pci_set_consistent_dma_mask); |
EXPORT_SYMBOL(pci_assign_resource); |
EXPORT_SYMBOL(pci_find_parent_resource); |
EXPORT_SYMBOL(pci_set_power_state); |
EXPORT_SYMBOL(pci_save_state); |
EXPORT_SYMBOL(pci_restore_state); |
EXPORT_SYMBOL(pci_enable_wake); |
/* Quirk info */ |
EXPORT_SYMBOL(isa_dma_bridge_buggy); |
EXPORT_SYMBOL(pci_pci_problems); |
/shark/trunk/drivers/pci/shark_pci26.c |
---|
0,0 → 1,57 |
/* |
* Project: S.Ha.R.K. |
* |
* Coordinators: |
* Giorgio Buttazzo <giorgio@sssup.it> |
* Paolo Gai <pj@gandalf.sssup.it> |
* |
* Authors : |
* Giacomo Guidi <giacomo@gandalf.sssup.it> |
* |
* |
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy) |
* |
* http://www.sssup.it |
* http://retis.sssup.it |
* http://shark.sssup.it |
*/ |
/* Glue Layer for Linux PCI 2.6 Driver */ |
#include <kernel/kern.h> |
extern int pci_direct_init(void); |
extern int pcibios_init(void); |
extern int pcibios_irq_init(void); |
extern int pci_driver_init(void); |
extern int pci_legacy_init(void); |
extern int pci_init(void); |
static int pci_installed = FALSE; |
/* Init the Linux PCI 2.6 Driver */ |
int PCI26_installed(void) |
{ |
return pci_installed; |
} |
int PCI26_init() { |
if (pci_installed == TRUE) |
return 0; |
pci_direct_init(); |
pcibios_init(); |
pci_driver_init(); |
pci_legacy_init(); |
pcibios_irq_init(); |
pci_init(); |
return 0; |
} |
/shark/trunk/drivers/pci/quirks.c |
---|
0,0 → 1,977 |
/* |
* $Id: quirks.c,v 1.1 2004-04-25 12:07:36 giacomo Exp $ |
* |
* This file contains work-arounds for many known PCI hardware |
* bugs. Devices present only on certain architectures (host |
* bridges et cetera) should be handled in arch-specific code. |
* |
* Copyright (c) 1999 Martin Mares <mj@ucw.cz> |
* |
* The bridge optimization stuff has been removed. If you really |
* have a silly BIOS which is unable to set your host bridge right, |
* use the PowerTweak utility (see http://powertweak.sourceforge.net). |
*/ |
#include <linuxcomp.h> |
#include <linux/config.h> |
#include <linux/types.h> |
#include <linux/kernel.h> |
#include <linux/pci.h> |
#include <linux/init.h> |
#include <linux/delay.h> |
//#define DEBUG |
/* Deal with broken BIOS'es that neglect to enable passive release, |
which can cause problems in combination with the 82441FX/PPro MTRRs */ |
static void __devinit quirk_passive_release(struct pci_dev *dev) |
{ |
struct pci_dev *d = NULL; |
unsigned char dlc; |
/* We have to make sure a particular bit is set in the PIIX3 |
ISA bridge, so we have to go out and find it. */ |
while ((d = pci_find_device(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371SB_0, d))) { |
pci_read_config_byte(d, 0x82, &dlc); |
if (!(dlc & 1<<1)) { |
printk(KERN_ERR "PCI: PIIX3: Enabling Passive Release on %s\n", pci_name(d)); |
dlc |= 1<<1; |
pci_write_config_byte(d, 0x82, dlc); |
} |
} |
} |
/* The VIA VP2/VP3/MVP3 seem to have some 'features'. There may be a workaround |
but VIA don't answer queries. If you happen to have good contacts at VIA |
ask them for me please -- Alan |
This appears to be BIOS not version dependent. So presumably there is a |
chipset level fix */ |
int isa_dma_bridge_buggy; /* Exported */ |
static void __devinit quirk_isa_dma_hangs(struct pci_dev *dev) |
{ |
if (!isa_dma_bridge_buggy) { |
isa_dma_bridge_buggy=1; |
printk(KERN_INFO "Activating ISA DMA hang workarounds.\n"); |
} |
} |
int pci_pci_problems; |
/* |
* Chipsets where PCI->PCI transfers vanish or hang |
*/ |
static void __devinit quirk_nopcipci(struct pci_dev *dev) |
{ |
if((pci_pci_problems&PCIPCI_FAIL)==0) |
{ |
printk(KERN_INFO "Disabling direct PCI/PCI transfers.\n"); |
pci_pci_problems|=PCIPCI_FAIL; |
} |
} |
/* |
* Triton requires workarounds to be used by the drivers |
*/ |
static void __devinit quirk_triton(struct pci_dev *dev) |
{ |
if((pci_pci_problems&PCIPCI_TRITON)==0) |
{ |
printk(KERN_INFO "Limiting direct PCI/PCI transfers.\n"); |
pci_pci_problems|=PCIPCI_TRITON; |
} |
} |
/* |
* VIA Apollo KT133 needs PCI latency patch |
* Made according to a windows driver based patch by George E. Breese |
* see PCI Latency Adjust on http://www.viahardware.com/download/viatweak.shtm |
* Also see http://www.au-ja.org/review-kt133a-1-en.phtml for |
* the info on which Mr Breese based his work. |
* |
* Updated based on further information from the site and also on |
* information provided by VIA |
*/ |
static void __devinit quirk_vialatency(struct pci_dev *dev) |
{ |
struct pci_dev *p; |
u8 rev; |
u8 busarb; |
/* Ok we have a potential problem chipset here. Now see if we have |
a buggy southbridge */ |
p=pci_find_device(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C686, NULL); |
if(p!=NULL) |
{ |
pci_read_config_byte(p, PCI_CLASS_REVISION, &rev); |
/* 0x40 - 0x4f == 686B, 0x10 - 0x2f == 686A; thanks Dan Hollis */ |
/* Check for buggy part revisions */ |
if (rev < 0x40 || rev > 0x42) |
return; |
} |
else |
{ |
p = pci_find_device(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8231, NULL); |
if(p==NULL) /* No problem parts */ |
return; |
pci_read_config_byte(p, PCI_CLASS_REVISION, &rev); |
/* Check for buggy part revisions */ |
if (rev < 0x10 || rev > 0x12) |
return; |
} |
/* |
* Ok we have the problem. Now set the PCI master grant to |
* occur every master grant. The apparent bug is that under high |
* PCI load (quite common in Linux of course) you can get data |
* loss when the CPU is held off the bus for 3 bus master requests |
* This happens to include the IDE controllers.... |
* |
* VIA only apply this fix when an SB Live! is present but under |
* both Linux and Windows this isnt enough, and we have seen |
* corruption without SB Live! but with things like 3 UDMA IDE |
* controllers. So we ignore that bit of the VIA recommendation.. |
*/ |
pci_read_config_byte(dev, 0x76, &busarb); |
/* Set bit 4 and bi 5 of byte 76 to 0x01 |
"Master priority rotation on every PCI master grant */ |
busarb &= ~(1<<5); |
busarb |= (1<<4); |
pci_write_config_byte(dev, 0x76, busarb); |
printk(KERN_INFO "Applying VIA southbridge workaround.\n"); |
} |
/* |
* VIA Apollo VP3 needs ETBF on BT848/878 |
*/ |
static void __devinit quirk_viaetbf(struct pci_dev *dev) |
{ |
if((pci_pci_problems&PCIPCI_VIAETBF)==0) |
{ |
printk(KERN_INFO "Limiting direct PCI/PCI transfers.\n"); |
pci_pci_problems|=PCIPCI_VIAETBF; |
} |
} |
static void __devinit quirk_vsfx(struct pci_dev *dev) |
{ |
if((pci_pci_problems&PCIPCI_VSFX)==0) |
{ |
printk(KERN_INFO "Limiting direct PCI/PCI transfers.\n"); |
pci_pci_problems|=PCIPCI_VSFX; |
} |
} |
/* |
* Ali Magik requires workarounds to be used by the drivers |
* that DMA to AGP space. Latency must be set to 0xA and triton |
* workaround applied too |
* [Info kindly provided by ALi] |
*/ |
static void __init quirk_alimagik(struct pci_dev *dev) |
{ |
if((pci_pci_problems&PCIPCI_ALIMAGIK)==0) |
{ |
printk(KERN_INFO "Limiting direct PCI/PCI transfers.\n"); |
pci_pci_problems|=PCIPCI_ALIMAGIK|PCIPCI_TRITON; |
} |
} |
/* |
* Natoma has some interesting boundary conditions with Zoran stuff |
* at least |
*/ |
static void __devinit quirk_natoma(struct pci_dev *dev) |
{ |
if((pci_pci_problems&PCIPCI_NATOMA)==0) |
{ |
printk(KERN_INFO "Limiting direct PCI/PCI transfers.\n"); |
pci_pci_problems|=PCIPCI_NATOMA; |
} |
} |
/* |
* S3 868 and 968 chips report region size equal to 32M, but they decode 64M. |
* If it's needed, re-allocate the region. |
*/ |
static void __devinit quirk_s3_64M(struct pci_dev *dev) |
{ |
struct resource *r = &dev->resource[0]; |
if ((r->start & 0x3ffffff) || r->end != r->start + 0x3ffffff) { |
r->start = 0; |
r->end = 0x3ffffff; |
} |
} |
static void __devinit quirk_io_region(struct pci_dev *dev, unsigned region, unsigned size, int nr) |
{ |
region &= ~(size-1); |
if (region) { |
struct resource *res = dev->resource + nr; |
res->name = pci_name(dev); |
res->start = region; |
res->end = region + size - 1; |
res->flags = IORESOURCE_IO; |
pci_claim_resource(dev, nr); |
} |
} |
/* |
* ATI Northbridge setups MCE the processor if you even |
* read somewhere between 0x3b0->0x3bb or read 0x3d3 |
*/ |
static void __devinit quirk_ati_exploding_mce(struct pci_dev *dev) |
{ |
printk(KERN_INFO "ATI Northbridge, reserving I/O ports 0x3b0 to 0x3bb.\n"); |
/* Mae rhaid i ni beidio ag edrych ar y lleoliadiau I/O hyn */ |
request_region(0x3b0, 0x0C, "RadeonIGP"); |
request_region(0x3d3, 0x01, "RadeonIGP"); |
} |
/* |
* Let's make the southbridge information explicit instead |
* of having to worry about people probing the ACPI areas, |
* for example.. (Yes, it happens, and if you read the wrong |
* ACPI register it will put the machine to sleep with no |
* way of waking it up again. Bummer). |
* |
* ALI M7101: Two IO regions pointed to by words at |
* 0xE0 (64 bytes of ACPI registers) |
* 0xE2 (32 bytes of SMB registers) |
*/ |
static void __devinit quirk_ali7101_acpi(struct pci_dev *dev) |
{ |
u16 region; |
pci_read_config_word(dev, 0xE0, ®ion); |
quirk_io_region(dev, region, 64, PCI_BRIDGE_RESOURCES); |
pci_read_config_word(dev, 0xE2, ®ion); |
quirk_io_region(dev, region, 32, PCI_BRIDGE_RESOURCES+1); |
} |
/* |
* PIIX4 ACPI: Two IO regions pointed to by longwords at |
* 0x40 (64 bytes of ACPI registers) |
* 0x90 (32 bytes of SMB registers) |
*/ |
static void __devinit quirk_piix4_acpi(struct pci_dev *dev) |
{ |
u32 region; |
pci_read_config_dword(dev, 0x40, ®ion); |
quirk_io_region(dev, region, 64, PCI_BRIDGE_RESOURCES); |
pci_read_config_dword(dev, 0x90, ®ion); |
quirk_io_region(dev, region, 32, PCI_BRIDGE_RESOURCES+1); |
} |
/* |
* ICH4, ICH4-M, ICH5, ICH5-M ACPI: Three IO regions pointed to by longwords at |
* 0x40 (128 bytes of ACPI, GPIO & TCO registers) |
* 0x58 (64 bytes of GPIO I/O space) |
*/ |
static void __devinit quirk_ich4_lpc_acpi(struct pci_dev *dev) |
{ |
u32 region; |
pci_read_config_dword(dev, 0x40, ®ion); |
quirk_io_region(dev, region, 128, PCI_BRIDGE_RESOURCES); |
pci_read_config_dword(dev, 0x58, ®ion); |
quirk_io_region(dev, region, 64, PCI_BRIDGE_RESOURCES+1); |
} |
/* |
* VIA ACPI: One IO region pointed to by longword at |
* 0x48 or 0x20 (256 bytes of ACPI registers) |
*/ |
static void __devinit quirk_vt82c586_acpi(struct pci_dev *dev) |
{ |
u8 rev; |
u32 region; |
pci_read_config_byte(dev, PCI_CLASS_REVISION, &rev); |
if (rev & 0x10) { |
pci_read_config_dword(dev, 0x48, ®ion); |
region &= PCI_BASE_ADDRESS_IO_MASK; |
quirk_io_region(dev, region, 256, PCI_BRIDGE_RESOURCES); |
} |
} |
/* |
* VIA VT82C686 ACPI: Three IO region pointed to by (long)words at |
* 0x48 (256 bytes of ACPI registers) |
* 0x70 (128 bytes of hardware monitoring register) |
* 0x90 (16 bytes of SMB registers) |
*/ |
static void __devinit quirk_vt82c686_acpi(struct pci_dev *dev) |
{ |
u16 hm; |
u32 smb; |
quirk_vt82c586_acpi(dev); |
pci_read_config_word(dev, 0x70, &hm); |
hm &= PCI_BASE_ADDRESS_IO_MASK; |
quirk_io_region(dev, hm, 128, PCI_BRIDGE_RESOURCES + 1); |
pci_read_config_dword(dev, 0x90, &smb); |
smb &= PCI_BASE_ADDRESS_IO_MASK; |
quirk_io_region(dev, smb, 16, PCI_BRIDGE_RESOURCES + 2); |
} |
#ifdef CONFIG_X86_IO_APIC |
#include <asm/io_apic.h> |
/* |
* VIA 686A/B: If an IO-APIC is active, we need to route all on-chip |
* devices to the external APIC. |
* |
* TODO: When we have device-specific interrupt routers, |
* this code will go away from quirks. |
*/ |
static void __devinit quirk_via_ioapic(struct pci_dev *dev) |
{ |
u8 tmp; |
if (nr_ioapics < 1) |
tmp = 0; /* nothing routed to external APIC */ |
else |
tmp = 0x1f; /* all known bits (4-0) routed to external APIC */ |
printk(KERN_INFO "PCI: %sbling Via external APIC routing\n", |
tmp == 0 ? "Disa" : "Ena"); |
/* Offset 0x58: External APIC IRQ output control */ |
pci_write_config_byte (dev, 0x58, tmp); |
} |
/* |
* The AMD io apic can hang the box when an apic irq is masked. |
* We check all revs >= B0 (yet not in the pre production!) as the bug |
* is currently marked NoFix |
* |
* We have multiple reports of hangs with this chipset that went away with |
* noapic specified. For the moment we assume its the errata. We may be wrong |
* of course. However the advice is demonstrably good even if so.. |
*/ |
static void __devinit quirk_amd_ioapic(struct pci_dev *dev) |
{ |
u8 rev; |
pci_read_config_byte(dev, PCI_REVISION_ID, &rev); |
if(rev >= 0x02) |
{ |
printk(KERN_WARNING "I/O APIC: AMD Errata #22 may be present. In the event of instability try\n"); |
printk(KERN_WARNING " : booting with the \"noapic\" option.\n"); |
} |
} |
static void __init quirk_ioapic_rmw(struct pci_dev *dev) |
{ |
if (dev->devfn == 0 && dev->bus->number == 0) |
sis_apic_bug = 1; |
} |
#define AMD8131_revA0 0x01 |
#define AMD8131_revB0 0x11 |
#define AMD8131_MISC 0x40 |
#define AMD8131_NIOAMODE_BIT 0 |
static void __init quirk_amd_8131_ioapic(struct pci_dev *dev) |
{ |
unsigned char revid, tmp; |
if (nr_ioapics == 0) |
return; |
pci_read_config_byte(dev, PCI_REVISION_ID, &revid); |
if (revid == AMD8131_revA0 || revid == AMD8131_revB0) { |
printk(KERN_INFO "Fixing up AMD8131 IOAPIC mode\n"); |
pci_read_config_byte( dev, AMD8131_MISC, &tmp); |
tmp &= ~(1 << AMD8131_NIOAMODE_BIT); |
pci_write_config_byte( dev, AMD8131_MISC, tmp); |
} |
} |
#endif /* CONFIG_X86_IO_APIC */ |
/* |
* Via 686A/B: The PCI_INTERRUPT_LINE register for the on-chip |
* devices, USB0/1, AC97, MC97, and ACPI, has an unusual feature: |
* when written, it makes an internal connection to the PIC. |
* For these devices, this register is defined to be 4 bits wide. |
* Normally this is fine. However for IO-APIC motherboards, or |
* non-x86 architectures (yes Via exists on PPC among other places), |
* we must mask the PCI_INTERRUPT_LINE value versus 0xf to get |
* interrupts delivered properly. |
* |
* TODO: When we have device-specific interrupt routers, |
* quirk_via_irqpic will go away from quirks. |
*/ |
/* |
* FIXME: it is questionable that quirk_via_acpi |
* is needed. It shows up as an ISA bridge, and does not |
* support the PCI_INTERRUPT_LINE register at all. Therefore |
* it seems like setting the pci_dev's 'irq' to the |
* value of the ACPI SCI interrupt is only done for convenience. |
* -jgarzik |
*/ |
static void __devinit quirk_via_acpi(struct pci_dev *d) |
{ |
/* |
* VIA ACPI device: SCI IRQ line in PCI config byte 0x42 |
*/ |
u8 irq; |
pci_read_config_byte(d, 0x42, &irq); |
irq &= 0xf; |
if (irq && (irq != 2)) |
d->irq = irq; |
} |
static void __devinit quirk_via_irqpic(struct pci_dev *dev) |
{ |
u8 irq, new_irq = dev->irq & 0xf; |
pci_read_config_byte(dev, PCI_INTERRUPT_LINE, &irq); |
if (new_irq != irq) { |
printk(KERN_INFO "PCI: Via IRQ fixup for %s, from %d to %d\n", |
pci_name(dev), irq, new_irq); |
udelay(15); |
pci_write_config_byte(dev, PCI_INTERRUPT_LINE, new_irq); |
} |
} |
/* |
* PIIX3 USB: We have to disable USB interrupts that are |
* hardwired to PIRQD# and may be shared with an |
* external device. |
* |
* Legacy Support Register (LEGSUP): |
* bit13: USB PIRQ Enable (USBPIRQDEN), |
* bit4: Trap/SMI On IRQ Enable (USBSMIEN). |
* |
* We mask out all r/wc bits, too. |
*/ |
static void __devinit quirk_piix3_usb(struct pci_dev *dev) |
{ |
u16 legsup; |
pci_read_config_word(dev, 0xc0, &legsup); |
legsup &= 0x50ef; |
pci_write_config_word(dev, 0xc0, legsup); |
} |
/* |
* VIA VT82C598 has its device ID settable and many BIOSes |
* set it to the ID of VT82C597 for backward compatibility. |
* We need to switch it off to be able to recognize the real |
* type of the chip. |
*/ |
static void __devinit quirk_vt82c598_id(struct pci_dev *dev) |
{ |
pci_write_config_byte(dev, 0xfc, 0); |
pci_read_config_word(dev, PCI_DEVICE_ID, &dev->device); |
} |
/* |
* CardBus controllers have a legacy base address that enables them |
* to respond as i82365 pcmcia controllers. We don't want them to |
* do this even if the Linux CardBus driver is not loaded, because |
* the Linux i82365 driver does not (and should not) handle CardBus. |
*/ |
static void __devinit quirk_cardbus_legacy(struct pci_dev *dev) |
{ |
if ((PCI_CLASS_BRIDGE_CARDBUS << 8) ^ dev->class) |
return; |
pci_write_config_dword(dev, PCI_CB_LEGACY_MODE_BASE, 0); |
} |
/* |
* Following the PCI ordering rules is optional on the AMD762. I'm not |
* sure what the designers were smoking but let's not inhale... |
* |
* To be fair to AMD, it follows the spec by default, its BIOS people |
* who turn it off! |
*/ |
static void __devinit quirk_amd_ordering(struct pci_dev *dev) |
{ |
u32 pcic; |
pci_read_config_dword(dev, 0x4C, &pcic); |
if((pcic&6)!=6) |
{ |
pcic |= 6; |
printk(KERN_WARNING "BIOS failed to enable PCI standards compliance, fixing this error.\n"); |
pci_write_config_dword(dev, 0x4C, pcic); |
pci_read_config_dword(dev, 0x84, &pcic); |
pcic |= (1<<23); /* Required in this mode */ |
pci_write_config_dword(dev, 0x84, pcic); |
} |
} |
/* |
* DreamWorks provided workaround for Dunord I-3000 problem |
* |
* This card decodes and responds to addresses not apparently |
* assigned to it. We force a larger allocation to ensure that |
* nothing gets put too close to it. |
*/ |
static void __devinit quirk_dunord ( struct pci_dev * dev ) |
{ |
struct resource * r = & dev -> resource [ 1 ]; |
r -> start = 0; |
r -> end = 0xffffff; |
} |
static void __devinit quirk_transparent_bridge(struct pci_dev *dev) |
{ |
dev->transparent = 1; |
} |
/* |
* Common misconfiguration of the MediaGX/Geode PCI master that will |
* reduce PCI bandwidth from 70MB/s to 25MB/s. See the GXM/GXLV/GX1 |
* datasheets found at http://www.national.com/ds/GX for info on what |
* these bits do. <christer@weinigel.se> |
*/ |
static void __init quirk_mediagx_master(struct pci_dev *dev) |
{ |
u8 reg; |
pci_read_config_byte(dev, 0x41, ®); |
if (reg & 2) { |
reg &= ~2; |
printk(KERN_INFO "PCI: Fixup for MediaGX/Geode Slave Disconnect Boundary (0x41=0x%02x)\n", reg); |
pci_write_config_byte(dev, 0x41, reg); |
} |
} |
/* |
* As per PCI spec, ignore base address registers 0-3 of the IDE controllers |
* running in Compatible mode (bits 0 and 2 in the ProgIf for primary and |
* secondary channels respectively). If the device reports Compatible mode |
* but does use BAR0-3 for address decoding, we assume that firmware has |
* programmed these BARs with standard values (0x1f0,0x3f4 and 0x170,0x374). |
* Exceptions (if they exist) must be handled in chip/architecture specific |
* fixups. |
* |
* Note: for non x86 people. You may need an arch specific quirk to handle |
* moving IDE devices to native mode as well. Some plug in card devices power |
* up in compatible mode and assume the BIOS will adjust them. |
* |
* Q: should we load the 0x1f0,0x3f4 into the registers or zap them as |
* we do now ? We don't want is pci_enable_device to come along |
* and assign new resources. Both approaches work for that. |
*/ |
static void __devinit quirk_ide_bases(struct pci_dev *dev) |
{ |
struct resource *res; |
int first_bar = 2, last_bar = 0; |
if ((dev->class >> 8) != PCI_CLASS_STORAGE_IDE) |
return; |
res = &dev->resource[0]; |
/* primary channel: ProgIf bit 0, BAR0, BAR1 */ |
if (!(dev->class & 1) && (res[0].flags || res[1].flags)) { |
res[0].start = res[0].end = res[0].flags = 0; |
res[1].start = res[1].end = res[1].flags = 0; |
first_bar = 0; |
last_bar = 1; |
} |
/* secondary channel: ProgIf bit 2, BAR2, BAR3 */ |
if (!(dev->class & 4) && (res[2].flags || res[3].flags)) { |
res[2].start = res[2].end = res[2].flags = 0; |
res[3].start = res[3].end = res[3].flags = 0; |
last_bar = 3; |
} |
if (!last_bar) |
return; |
printk(KERN_INFO "PCI: Ignoring BAR%d-%d of IDE controller %s\n", |
first_bar, last_bar, pci_name(dev)); |
} |
/* |
* Ensure C0 rev restreaming is off. This is normally done by |
* the BIOS but in the odd case it is not the results are corruption |
* hence the presence of a Linux check |
*/ |
static void __init quirk_disable_pxb(struct pci_dev *pdev) |
{ |
u16 config; |
u8 rev; |
pci_read_config_byte(pdev, PCI_REVISION_ID, &rev); |
if(rev != 0x04) /* Only C0 requires this */ |
return; |
pci_read_config_word(pdev, 0x40, &config); |
if(config & (1<<6)) |
{ |
config &= ~(1<<6); |
pci_write_config_word(pdev, 0x40, config); |
printk(KERN_INFO "PCI: C0 revision 450NX. Disabling PCI restreaming.\n"); |
} |
} |
/* |
* VIA northbridges care about PCI_INTERRUPT_LINE |
*/ |
int interrupt_line_quirk; |
static void __devinit quirk_via_bridge(struct pci_dev *pdev) |
{ |
if(pdev->devfn == 0) |
interrupt_line_quirk = 1; |
} |
/* |
* Serverworks CSB5 IDE does not fully support native mode |
*/ |
static void __init quirk_svwks_csb5ide(struct pci_dev *pdev) |
{ |
u8 prog; |
pci_read_config_byte(pdev, PCI_CLASS_PROG, &prog); |
if (prog & 5) { |
prog &= ~5; |
pdev->class &= ~5; |
pci_write_config_byte(pdev, PCI_CLASS_PROG, prog); |
/* need to re-assign BARs for compat mode */ |
quirk_ide_bases(pdev); |
} |
} |
/* This was originally an Alpha specific thing, but it really fits here. |
* The i82375 PCI/EISA bridge appears as non-classified. Fix that. |
*/ |
static void __init quirk_eisa_bridge(struct pci_dev *dev) |
{ |
dev->class = PCI_CLASS_BRIDGE_EISA << 8; |
} |
/* |
* On ASUS P4B boards, the SMBus PCI Device within the ICH2/4 southbridge |
* is not activated. The myth is that Asus said that they do not want the |
* users to be irritated by just another PCI Device in the Win98 device |
* manager. (see the file prog/hotplug/README.p4b in the lm_sensors |
* package 2.7.0 for details) |
* |
* The SMBus PCI Device can be activated by setting a bit in the ICH LPC |
* bridge. Unfortunately, this device has no subvendor/subdevice ID. So it |
* becomes necessary to do this tweak in two steps -- I've chosen the Host |
* bridge as trigger. |
*/ |
static int __initdata asus_hides_smbus = 0; |
static void __init asus_hides_smbus_hostbridge(struct pci_dev *dev) |
{ |
if (likely(dev->subsystem_vendor != PCI_VENDOR_ID_ASUSTEK)) |
return; |
if (dev->device == PCI_DEVICE_ID_INTEL_82845_HB) |
switch(dev->subsystem_device) { |
case 0x8070: /* P4B */ |
case 0x8088: /* P4B533 */ |
asus_hides_smbus = 1; |
} |
if ((dev->device == PCI_DEVICE_ID_INTEL_82845G_HB) && |
(dev->subsystem_device == 0x80b2)) /* P4PE */ |
asus_hides_smbus = 1; |
if ((dev->device == PCI_DEVICE_ID_INTEL_82850_HB) && |
(dev->subsystem_device == 0x8030)) /* P4T533 */ |
asus_hides_smbus = 1; |
if ((dev->device == PCI_DEVICE_ID_INTEL_7205_0) && |
(dev->subsystem_device == 0x8070)) /* P4G8X Deluxe */ |
asus_hides_smbus = 1; |
return; |
} |
static void __init asus_hides_smbus_lpc(struct pci_dev *dev) |
{ |
u16 val; |
if (likely(!asus_hides_smbus)) |
return; |
pci_read_config_word(dev, 0xF2, &val); |
if (val & 0x8) { |
pci_write_config_word(dev, 0xF2, val & (~0x8)); |
pci_read_config_word(dev, 0xF2, &val); |
if(val & 0x8) |
printk(KERN_INFO "PCI: i801 SMBus device continues to play 'hide and seek'! 0x%x\n", val); |
else |
printk(KERN_INFO "PCI: Enabled i801 SMBus device\n"); |
} |
} |
/* |
* SiS 96x south bridge: BIOS typically hides SMBus device... |
*/ |
static void __init quirk_sis_96x_smbus(struct pci_dev *dev) |
{ |
u8 val = 0; |
printk(KERN_INFO "Enabling SiS 96x SMBus.\n"); |
pci_read_config_byte(dev, 0x77, &val); |
pci_write_config_byte(dev, 0x77, val & ~0x10); |
pci_read_config_byte(dev, 0x77, &val); |
} |
/* |
* ... This is further complicated by the fact that some SiS96x south |
* bridges pretend to be 85C503/5513 instead. In that case see if we |
* spotted a compatible north bridge to make sure. |
* (pci_find_device doesn't work yet) |
* |
* We can also enable the sis96x bit in the discovery register.. |
*/ |
static int __devinitdata sis_96x_compatible = 0; |
#define SIS_DETECT_REGISTER 0x40 |
static void __init quirk_sis_503_smbus(struct pci_dev *dev) |
{ |
u8 reg; |
u16 devid; |
pci_read_config_byte(dev, SIS_DETECT_REGISTER, ®); |
pci_write_config_byte(dev, SIS_DETECT_REGISTER, reg | (1 << 6)); |
pci_read_config_word(dev, PCI_DEVICE_ID, &devid); |
if ((devid & 0xfff0) != 0x0960) { |
pci_write_config_byte(dev, SIS_DETECT_REGISTER, reg); |
return; |
} |
/* Make people aware that we changed the config.. */ |
printk(KERN_WARNING "Uncovering SIS%x that hid as a SIS503 (compatible=%d)\n", devid, sis_96x_compatible); |
/* |
* Ok, it now shows up as a 96x.. The 96x quirks are after |
* the 503 quirk in the quirk table, so they'll automatically |
* run and enable things like the SMBus device |
*/ |
dev->device = devid; |
} |
static void __init quirk_sis_96x_compatible(struct pci_dev *dev) |
{ |
sis_96x_compatible = 1; |
} |
#ifdef CONFIG_SCSI_SATA |
static void __init quirk_intel_ide_combined(struct pci_dev *pdev) |
{ |
u8 prog, comb, tmp; |
/* |
* Narrow down to Intel SATA PCI devices. |
*/ |
switch (pdev->device) { |
/* PCI ids taken from drivers/scsi/ata_piix.c */ |
case 0x24d1: |
case 0x24df: |
case 0x25a3: |
case 0x25b0: |
break; |
default: |
/* we do not handle this PCI device */ |
return; |
} |
/* |
* Read combined mode register. |
*/ |
pci_read_config_byte(pdev, 0x90, &tmp); /* combined mode reg */ |
tmp &= 0x6; /* interesting bits 2:1, PATA primary/secondary */ |
if (tmp == 0x4) /* bits 10x */ |
comb = (1 << 0); /* SATA port 0, PATA port 1 */ |
else if (tmp == 0x6) /* bits 11x */ |
comb = (1 << 2); /* PATA port 0, SATA port 1 */ |
else |
return; /* not in combined mode */ |
/* |
* Read programming interface register. |
* (Tells us if it's legacy or native mode) |
*/ |
pci_read_config_byte(pdev, PCI_CLASS_PROG, &prog); |
/* if SATA port is in native mode, we're ok. */ |
if (prog & comb) |
return; |
/* SATA port is in legacy mode. Reserve port so that |
* IDE driver does not attempt to use it. If request_region |
* fails, it will be obvious at boot time, so we don't bother |
* checking return values. |
*/ |
if (comb == (1 << 0)) |
request_region(0x1f0, 8, "libata"); /* port 0 */ |
else |
request_region(0x170, 8, "libata"); /* port 1 */ |
} |
#endif /* CONFIG_SCSI_SATA */ |
/* |
* The main table of quirks. |
* |
* Note: any hooks for hotpluggable devices in this table must _NOT_ |
* be declared __init. |
*/ |
static struct pci_fixup pci_fixups[] __devinitdata = { |
{ PCI_FIXUP_HEADER, PCI_VENDOR_ID_DUNORD, PCI_DEVICE_ID_DUNORD_I3000, quirk_dunord }, |
{ PCI_FIXUP_FINAL, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82441, quirk_passive_release }, |
{ PCI_FIXUP_FINAL, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82441, quirk_passive_release }, |
/* |
* Its not totally clear which chipsets are the problematic ones |
* We know 82C586 and 82C596 variants are affected. |
*/ |
{ PCI_FIXUP_FINAL, PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_0, quirk_isa_dma_hangs }, |
{ PCI_FIXUP_FINAL, PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C596, quirk_isa_dma_hangs }, |
{ PCI_FIXUP_FINAL, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371SB_0, quirk_isa_dma_hangs }, |
{ PCI_FIXUP_FINAL, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82454NX, quirk_disable_pxb }, |
{ PCI_FIXUP_FINAL, PCI_VENDOR_ID_NEC, PCI_DEVICE_ID_NEC_CBUS_1, quirk_isa_dma_hangs }, |
{ PCI_FIXUP_FINAL, PCI_VENDOR_ID_NEC, PCI_DEVICE_ID_NEC_CBUS_2, quirk_isa_dma_hangs }, |
{ PCI_FIXUP_FINAL, PCI_VENDOR_ID_NEC, PCI_DEVICE_ID_NEC_CBUS_3, quirk_isa_dma_hangs }, |
{ PCI_FIXUP_HEADER, PCI_VENDOR_ID_S3, PCI_DEVICE_ID_S3_868, quirk_s3_64M }, |
{ PCI_FIXUP_HEADER, PCI_VENDOR_ID_S3, PCI_DEVICE_ID_S3_968, quirk_s3_64M }, |
{ PCI_FIXUP_FINAL, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82437, quirk_triton }, |
{ PCI_FIXUP_FINAL, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82437VX, quirk_triton }, |
{ PCI_FIXUP_FINAL, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82439, quirk_triton }, |
{ PCI_FIXUP_FINAL, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82439TX, quirk_triton }, |
{ PCI_FIXUP_FINAL, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82441, quirk_natoma }, |
{ PCI_FIXUP_FINAL, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82443LX_0, quirk_natoma }, |
{ PCI_FIXUP_FINAL, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82443LX_1, quirk_natoma }, |
{ PCI_FIXUP_FINAL, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82443BX_0, quirk_natoma }, |
{ PCI_FIXUP_FINAL, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82443BX_1, quirk_natoma }, |
{ PCI_FIXUP_FINAL, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82443BX_2, quirk_natoma }, |
{ PCI_FIXUP_FINAL, PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_5597, quirk_nopcipci }, |
{ PCI_FIXUP_FINAL, PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_496, quirk_nopcipci }, |
{ PCI_FIXUP_HEADER, PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_503, quirk_sis_503_smbus }, |
{ PCI_FIXUP_HEADER, PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_645, quirk_sis_96x_compatible }, |
{ PCI_FIXUP_HEADER, PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_646, quirk_sis_96x_compatible }, |
{ PCI_FIXUP_HEADER, PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_648, quirk_sis_96x_compatible }, |
{ PCI_FIXUP_HEADER, PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_650, quirk_sis_96x_compatible }, |
{ PCI_FIXUP_HEADER, PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_651, quirk_sis_96x_compatible }, |
{ PCI_FIXUP_HEADER, PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_961, quirk_sis_96x_smbus }, |
{ PCI_FIXUP_HEADER, PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_962, quirk_sis_96x_smbus }, |
{ PCI_FIXUP_HEADER, PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_963, quirk_sis_96x_smbus }, |
{ PCI_FIXUP_FINAL, PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M1647, quirk_alimagik }, |
{ PCI_FIXUP_FINAL, PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M1651, quirk_alimagik }, |
{ PCI_FIXUP_FINAL, PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8363_0, quirk_vialatency }, |
{ PCI_FIXUP_FINAL, PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8371_1, quirk_vialatency }, |
{ PCI_FIXUP_FINAL, PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8361, quirk_vialatency }, |
{ PCI_FIXUP_FINAL, PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C576, quirk_vsfx }, |
{ PCI_FIXUP_FINAL, PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C597_0, quirk_viaetbf }, |
{ PCI_FIXUP_HEADER, PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C597_0, quirk_vt82c598_id }, |
{ PCI_FIXUP_HEADER, PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_3, quirk_vt82c586_acpi }, |
{ PCI_FIXUP_HEADER, PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C686_4, quirk_vt82c686_acpi }, |
{ PCI_FIXUP_HEADER, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371AB_3, quirk_piix4_acpi }, |
{ PCI_FIXUP_HEADER, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_12, quirk_ich4_lpc_acpi }, |
{ PCI_FIXUP_HEADER, PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M7101, quirk_ali7101_acpi }, |
{ PCI_FIXUP_HEADER, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371SB_2, quirk_piix3_usb }, |
{ PCI_FIXUP_HEADER, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371AB_2, quirk_piix3_usb }, |
{ PCI_FIXUP_HEADER, PCI_ANY_ID, PCI_ANY_ID, quirk_ide_bases }, |
{ PCI_FIXUP_HEADER, PCI_VENDOR_ID_VIA, PCI_ANY_ID, quirk_via_bridge }, |
{ PCI_FIXUP_FINAL, PCI_ANY_ID, PCI_ANY_ID, quirk_cardbus_legacy }, |
#ifdef CONFIG_X86_IO_APIC |
{ PCI_FIXUP_FINAL, PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C686, quirk_via_ioapic }, |
{ PCI_FIXUP_FINAL, PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_VIPER_7410, quirk_amd_ioapic }, |
{ PCI_FIXUP_FINAL, PCI_VENDOR_ID_SI, PCI_ANY_ID, quirk_ioapic_rmw }, |
{ PCI_FIXUP_FINAL, PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_8131_APIC, |
quirk_amd_8131_ioapic }, |
#endif |
{ PCI_FIXUP_HEADER, PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_3, quirk_via_acpi }, |
{ PCI_FIXUP_HEADER, PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C686_4, quirk_via_acpi }, |
{ PCI_FIXUP_FINAL, PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_2, quirk_via_irqpic }, |
{ PCI_FIXUP_FINAL, PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C686_5, quirk_via_irqpic }, |
{ PCI_FIXUP_FINAL, PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C686_6, quirk_via_irqpic }, |
{ PCI_FIXUP_FINAL, PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_FE_GATE_700C, quirk_amd_ordering }, |
{ PCI_FIXUP_FINAL, PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RS100, quirk_ati_exploding_mce }, |
/* |
* i82380FB mobile docking controller: its PCI-to-PCI bridge |
* is subtractive decoding (transparent), and does indicate this |
* in the ProgIf. Unfortunately, the ProgIf value is wrong - 0x80 |
* instead of 0x01. |
*/ |
{ PCI_FIXUP_HEADER, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82380FB, quirk_transparent_bridge }, |
{ PCI_FIXUP_HEADER, PCI_VENDOR_ID_TOSHIBA, 0x605, quirk_transparent_bridge }, |
{ PCI_FIXUP_FINAL, PCI_VENDOR_ID_CYRIX, PCI_DEVICE_ID_CYRIX_PCI_MASTER, quirk_mediagx_master }, |
{ PCI_FIXUP_HEADER, PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_CSB5IDE, quirk_svwks_csb5ide }, |
{ PCI_FIXUP_HEADER, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82375, quirk_eisa_bridge }, |
/* |
* on Asus P4B boards, the i801SMBus device is disabled at startup. |
*/ |
{ PCI_FIXUP_HEADER, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82845_HB, asus_hides_smbus_hostbridge }, |
{ PCI_FIXUP_HEADER, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82845G_HB, asus_hides_smbus_hostbridge }, |
{ PCI_FIXUP_HEADER, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82850_HB, asus_hides_smbus_hostbridge }, |
{ PCI_FIXUP_HEADER, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_7205_0, asus_hides_smbus_hostbridge }, |
{ PCI_FIXUP_HEADER, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_0, asus_hides_smbus_lpc }, |
{ PCI_FIXUP_HEADER, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801BA_0, asus_hides_smbus_lpc }, |
#ifdef CONFIG_SCSI_SATA |
/* Fixup BIOSes that configure Parallel ATA (PATA / IDE) and |
* Serial ATA (SATA) into the same PCI ID. |
*/ |
{ PCI_FIXUP_FINAL, PCI_VENDOR_ID_INTEL, PCI_ANY_ID, |
quirk_intel_ide_combined }, |
#endif /* CONFIG_SCSI_SATA */ |
{ 0 } |
}; |
static void pci_do_fixups(struct pci_dev *dev, int pass, struct pci_fixup *f) |
{ |
while (f->pass) { |
if (f->pass == pass && |
(f->vendor == dev->vendor || f->vendor == (u16) PCI_ANY_ID) && |
(f->device == dev->device || f->device == (u16) PCI_ANY_ID)) { |
f->hook(dev); |
} |
f++; |
} |
} |
void pci_fixup_device(int pass, struct pci_dev *dev) |
{ |
pci_do_fixups(dev, pass, pcibios_fixups); |
pci_do_fixups(dev, pass, pci_fixups); |
} |
/shark/trunk/drivers/pci/pcbios.c |
---|
0,0 → 1,487 |
/* |
* BIOS32 and PCI BIOS handling. |
*/ |
#include <linuxcomp.h> |
#include <linux/pci.h> |
#include <linux/init.h> |
#include "pci2.h" |
#include "pci-functions.h" |
/* BIOS32 signature: "_32_" */ |
#define BIOS32_SIGNATURE (('_' << 0) + ('3' << 8) + ('2' << 16) + ('_' << 24)) |
/* PCI signature: "PCI " */ |
#define PCI_SIGNATURE (('P' << 0) + ('C' << 8) + ('I' << 16) + (' ' << 24)) |
/* PCI service signature: "$PCI" */ |
#define PCI_SERVICE (('$' << 0) + ('P' << 8) + ('C' << 16) + ('I' << 24)) |
/* PCI BIOS hardware mechanism flags */ |
#define PCIBIOS_HW_TYPE1 0x01 |
#define PCIBIOS_HW_TYPE2 0x02 |
#define PCIBIOS_HW_TYPE1_SPEC 0x10 |
#define PCIBIOS_HW_TYPE2_SPEC 0x20 |
/* |
* This is the standard structure used to identify the entry point |
* to the BIOS32 Service Directory, as documented in |
* Standard BIOS 32-bit Service Directory Proposal |
* Revision 0.4 May 24, 1993 |
* Phoenix Technologies Ltd. |
* Norwood, MA |
* and the PCI BIOS specification. |
*/ |
union bios32 { |
struct { |
unsigned long signature; /* _32_ */ |
unsigned long entry; /* 32 bit physical address */ |
unsigned char revision; /* Revision level, 0 */ |
unsigned char length; /* Length in paragraphs should be 01 */ |
unsigned char checksum; /* All bytes must add up to zero */ |
unsigned char reserved[5]; /* Must be zero */ |
} fields; |
char chars[16]; |
}; |
/* |
* Physical address of the service directory. I don't know if we're |
* allowed to have more than one of these or not, so just in case |
* we'll make pcibios_present() take a memory start parameter and store |
* the array there. |
*/ |
static struct { |
unsigned long address; |
unsigned short segment; |
} bios32_indirect = { 0, __KERNEL_CS }; |
/* |
* Returns the entry point for the given service, NULL on error |
*/ |
static unsigned long bios32_service(unsigned long service) |
{ |
unsigned char return_code; /* %al */ |
unsigned long address; /* %ebx */ |
unsigned long length; /* %ecx */ |
unsigned long entry; /* %edx */ |
unsigned long flags; |
local_irq_save(flags); |
__asm__("lcall *(%%edi); cld" |
: "=a" (return_code), |
"=b" (address), |
"=c" (length), |
"=d" (entry) |
: "0" (service), |
"1" (PCIBIOS_PCI_BIOS_PRESENT), |
"D" (&bios32_indirect)); |
local_irq_restore(flags); |
printk("Breakpoint\n"); |
switch (return_code) { |
case 0: |
return address + entry; |
case 0x80: /* Not present */ |
printk(KERN_WARNING "bios32_service(0x%lx): not present\n", service); |
return 0; |
default: /* Shouldn't happen */ |
printk(KERN_WARNING "bios32_service(0x%lx): returned 0x%x -- BIOS bug!\n", |
service, return_code); |
return 0; |
} |
} |
static struct { |
unsigned long address; |
unsigned short segment; |
} pci_indirect = { 0, 0 /*__KERNEL_CS*/ }; |
static int pci_bios_present; |
static int __devinit check_pcibios(void) |
{ |
u32 signature, eax, ebx, ecx; |
u8 status, major_ver, minor_ver, hw_mech; |
unsigned long flags, pcibios_entry; |
if ((pcibios_entry = bios32_service(PCI_SERVICE))) { |
pci_indirect.address = pcibios_entry + PAGE_OFFSET; |
local_irq_save(flags); |
__asm__( |
"lcall *(%%edi); cld\n\t" |
"jc 1f\n\t" |
"xor %%ah, %%ah\n" |
"1:" |
: "=d" (signature), |
"=a" (eax), |
"=b" (ebx), |
"=c" (ecx) |
: "1" (PCIBIOS_PCI_BIOS_PRESENT), |
"D" (&pci_indirect) |
: "memory"); |
local_irq_restore(flags); |
status = (eax >> 8) & 0xff; |
hw_mech = eax & 0xff; |
major_ver = (ebx >> 8) & 0xff; |
minor_ver = ebx & 0xff; |
if (pcibios_last_bus < 0) |
pcibios_last_bus = ecx & 0xff; |
DBG("PCI: BIOS probe returned s=%02x hw=%02x ver=%02x.%02x l=%02x\n", |
status, hw_mech, major_ver, minor_ver, pcibios_last_bus); |
if (status || signature != PCI_SIGNATURE) { |
printk (KERN_ERR "PCI: BIOS BUG #%x[%08x] found\n", |
status, signature); |
return 0; |
} |
printk(KERN_INFO "PCI: PCI BIOS revision %x.%02x entry at 0x%lx, last bus=%d\n", |
major_ver, minor_ver, pcibios_entry, pcibios_last_bus); |
#ifdef CONFIG_PCI_DIRECT |
if (!(hw_mech & PCIBIOS_HW_TYPE1)) |
pci_probe &= ~PCI_PROBE_CONF1; |
if (!(hw_mech & PCIBIOS_HW_TYPE2)) |
pci_probe &= ~PCI_PROBE_CONF2; |
#endif |
return 1; |
} |
return 0; |
} |
static int __devinit pci_bios_find_device (unsigned short vendor, unsigned short device_id, |
unsigned short index, unsigned char *bus, unsigned char *device_fn) |
{ |
unsigned short bx; |
unsigned short ret; |
__asm__("lcall *(%%edi); cld\n\t" |
"jc 1f\n\t" |
"xor %%ah, %%ah\n" |
"1:" |
: "=b" (bx), |
"=a" (ret) |
: "1" (PCIBIOS_FIND_PCI_DEVICE), |
"c" (device_id), |
"d" (vendor), |
"S" ((int) index), |
"D" (&pci_indirect)); |
*bus = (bx >> 8) & 0xff; |
*device_fn = bx & 0xff; |
return (int) (ret & 0xff00) >> 8; |
} |
static int pci_bios_read (int seg, int bus, int devfn, int reg, int len, u32 *value) |
{ |
unsigned long result = 0; |
unsigned long flags; |
unsigned long bx = (bus << 8) | devfn; |
if (!value || (bus > 255) || (devfn > 255) || (reg > 255)) |
return -EINVAL; |
spin_lock_irqsave(&pci_config_lock, flags); |
switch (len) { |
case 1: |
__asm__("lcall *(%%esi); cld\n\t" |
"jc 1f\n\t" |
"xor %%ah, %%ah\n" |
"1:" |
: "=c" (*value), |
"=a" (result) |
: "1" (PCIBIOS_READ_CONFIG_BYTE), |
"b" (bx), |
"D" ((long)reg), |
"S" (&pci_indirect)); |
break; |
case 2: |
__asm__("lcall *(%%esi); cld\n\t" |
"jc 1f\n\t" |
"xor %%ah, %%ah\n" |
"1:" |
: "=c" (*value), |
"=a" (result) |
: "1" (PCIBIOS_READ_CONFIG_WORD), |
"b" (bx), |
"D" ((long)reg), |
"S" (&pci_indirect)); |
break; |
case 4: |
__asm__("lcall *(%%esi); cld\n\t" |
"jc 1f\n\t" |
"xor %%ah, %%ah\n" |
"1:" |
: "=c" (*value), |
"=a" (result) |
: "1" (PCIBIOS_READ_CONFIG_DWORD), |
"b" (bx), |
"D" ((long)reg), |
"S" (&pci_indirect)); |
break; |
} |
spin_unlock_irqrestore(&pci_config_lock, flags); |
return (int)((result & 0xff00) >> 8); |
} |
static int pci_bios_write (int seg, int bus, int devfn, int reg, int len, u32 value) |
{ |
unsigned long result = 0; |
unsigned long flags; |
unsigned long bx = (bus << 8) | devfn; |
if ((bus > 255) || (devfn > 255) || (reg > 255)) |
return -EINVAL; |
spin_lock_irqsave(&pci_config_lock, flags); |
switch (len) { |
case 1: |
__asm__("lcall *(%%esi); cld\n\t" |
"jc 1f\n\t" |
"xor %%ah, %%ah\n" |
"1:" |
: "=a" (result) |
: "0" (PCIBIOS_WRITE_CONFIG_BYTE), |
"c" (value), |
"b" (bx), |
"D" ((long)reg), |
"S" (&pci_indirect)); |
break; |
case 2: |
__asm__("lcall *(%%esi); cld\n\t" |
"jc 1f\n\t" |
"xor %%ah, %%ah\n" |
"1:" |
: "=a" (result) |
: "0" (PCIBIOS_WRITE_CONFIG_WORD), |
"c" (value), |
"b" (bx), |
"D" ((long)reg), |
"S" (&pci_indirect)); |
break; |
case 4: |
__asm__("lcall *(%%esi); cld\n\t" |
"jc 1f\n\t" |
"xor %%ah, %%ah\n" |
"1:" |
: "=a" (result) |
: "0" (PCIBIOS_WRITE_CONFIG_DWORD), |
"c" (value), |
"b" (bx), |
"D" ((long)reg), |
"S" (&pci_indirect)); |
break; |
} |
spin_unlock_irqrestore(&pci_config_lock, flags); |
return (int)((result & 0xff00) >> 8); |
} |
/* |
* Function table for BIOS32 access |
*/ |
static struct pci_raw_ops pci_bios_access = { |
.read = pci_bios_read, |
.write = pci_bios_write |
}; |
/* |
* Try to find PCI BIOS. |
*/ |
static struct pci_raw_ops * __devinit pci_find_bios(void) |
{ |
union bios32 *check; |
unsigned char sum; |
int i, length; |
/* |
* Follow the standard procedure for locating the BIOS32 Service |
* directory by scanning the permissible address range from |
* 0xe0000 through 0xfffff for a valid BIOS32 structure. |
*/ |
for (check = (union bios32 *) __va(0xe0000); |
check <= (union bios32 *) __va(0xffff0); |
++check) { |
if (check->fields.signature != BIOS32_SIGNATURE) |
continue; |
length = check->fields.length * 16; |
if (!length) |
continue; |
sum = 0; |
for (i = 0; i < length ; ++i) |
sum += check->chars[i]; |
if (sum != 0) |
continue; |
if (check->fields.revision != 0) { |
printk("PCI: unsupported BIOS32 revision %d at 0x%p\n", |
check->fields.revision, check); |
continue; |
} |
DBG("PCI: BIOS32 Service Directory structure at 0x%p\n", check); |
if (check->fields.entry >= 0x100000) { |
printk("PCI: BIOS32 entry (0x%p) in high memory, cannot use.\n", check); |
return NULL; |
} else { |
unsigned long bios32_entry = check->fields.entry; |
DBG("PCI: BIOS32 Service Directory entry at 0x%lx\n", bios32_entry); |
bios32_indirect.address = bios32_entry + PAGE_OFFSET; |
if (check_pcibios()) |
return &pci_bios_access; |
} |
break; /* Hopefully more than one BIOS32 cannot happen... */ |
} |
return NULL; |
} |
/* |
* Sort the device list according to PCI BIOS. Nasty hack, but since some |
* fool forgot to define the `correct' device order in the PCI BIOS specs |
* and we want to be (possibly bug-to-bug ;-]) compatible with older kernels |
* which used BIOS ordering, we are bound to do this... |
*/ |
void __devinit pcibios_sort(void) |
{ |
LIST_HEAD(sorted_devices); |
struct list_head *ln; |
struct pci_dev *dev, *d; |
int idx, found; |
unsigned char bus, devfn; |
DBG("PCI: Sorting device list...\n"); |
while (!list_empty(&pci_devices)) { |
ln = pci_devices.next; |
dev = pci_dev_g(ln); |
idx = found = 0; |
while (pci_bios_find_device(dev->vendor, dev->device, idx, &bus, &devfn) == PCIBIOS_SUCCESSFUL) { |
idx++; |
for (ln=pci_devices.next; ln != &pci_devices; ln=ln->next) { |
d = pci_dev_g(ln); |
if (d->bus->number == bus && d->devfn == devfn) { |
list_del(&d->global_list); |
list_add_tail(&d->global_list, &sorted_devices); |
if (d == dev) |
found = 1; |
break; |
} |
} |
if (ln == &pci_devices) { |
printk(KERN_WARNING "PCI: BIOS reporting unknown device %02x:%02x\n", bus, devfn); |
/* |
* We must not continue scanning as several buggy BIOSes |
* return garbage after the last device. Grr. |
*/ |
break; |
} |
} |
if (!found) { |
printk(KERN_WARNING "PCI: Device %02x:%02x not found by BIOS\n", |
dev->bus->number, dev->devfn); |
list_del(&dev->global_list); |
list_add_tail(&dev->global_list, &sorted_devices); |
} |
} |
list_splice(&sorted_devices, &pci_devices); |
} |
/* |
* BIOS Functions for IRQ Routing |
*/ |
struct irq_routing_options { |
u16 size; |
struct irq_info *table; |
u16 segment; |
} __attribute__((packed)); |
struct irq_routing_table * __devinit pcibios_get_irq_routing_table(void) |
{ |
struct irq_routing_options opt; |
struct irq_routing_table *rt = NULL; |
int ret, map; |
unsigned long page; |
if (!pci_bios_present) |
return NULL; |
page = (long)kmalloc(PAGE_SIZE,GFP_KERNEL); |
if (!page) |
return NULL; |
opt.table = (struct irq_info *) page; |
opt.size = PAGE_SIZE; |
opt.segment = __KERNEL_DS; |
DBG("PCI: Fetching IRQ routing table... "); |
__asm__("push %%es\n\t" |
"push %%ds\n\t" |
"pop %%es\n\t" |
"lcall *(%%esi); cld\n\t" |
"pop %%es\n\t" |
"jc 1f\n\t" |
"xor %%ah, %%ah\n" |
"1:" |
: "=a" (ret), |
"=b" (map), |
"+m" (opt) |
: "0" (PCIBIOS_GET_ROUTING_OPTIONS), |
"1" (0), |
"D" ((long) &opt), |
"S" (&pci_indirect)); |
DBG("OK ret=%d, size=%d, map=%x\n", ret, opt.size, map); |
if (ret & 0xff00) |
printk(KERN_ERR "PCI: Error %02x when fetching IRQ routing table.\n", (ret >> 8) & 0xff); |
else if (opt.size) { |
rt = kmalloc(sizeof(struct irq_routing_table) + opt.size, GFP_KERNEL); |
if (rt) { |
memset(rt, 0, sizeof(struct irq_routing_table)); |
rt->size = opt.size + sizeof(struct irq_routing_table); |
rt->exclusive_irqs = map; |
memcpy(rt->slots, (void *) page, opt.size); |
printk(KERN_INFO "PCI: Using BIOS Interrupt Routing Table\n"); |
} |
} |
kfree((void *)page); |
return rt; |
} |
int pcibios_set_irq_routing(struct pci_dev *dev, int pin, int irq) |
{ |
int ret; |
__asm__("lcall *(%%esi); cld\n\t" |
"jc 1f\n\t" |
"xor %%ah, %%ah\n" |
"1:" |
: "=a" (ret) |
: "0" (PCIBIOS_SET_PCI_HW_INT), |
"b" ((dev->bus->number << 8) | dev->devfn), |
"c" ((irq << 8) | (pin + 10)), |
"S" (&pci_indirect)); |
return !(ret & 0xff00); |
} |
int __init pci_pcbios_init(void) |
{ |
if ((pci_probe & PCI_PROBE_BIOS) |
&& ((raw_pci_ops = pci_find_bios()))) { |
pci_probe |= PCI_BIOS_SORT; |
pci_bios_present = 1; |
} |
return 0; |
} |
arch_initcall(pci_pcbios_init); |
/shark/trunk/drivers/pci/pci.h |
---|
0,0 → 1,62 |
/* Functions internal to the PCI core code */ |
extern int pci_hotplug (struct device *dev, char **envp, int num_envp, |
char *buffer, int buffer_size); |
extern void pci_create_sysfs_dev_files(struct pci_dev *pdev); |
extern int pci_bus_alloc_resource(struct pci_bus *bus, struct resource *res, |
unsigned long size, unsigned long align, |
unsigned long min, unsigned int type_mask, |
void (*alignf)(void *, struct resource *, |
unsigned long, unsigned long), |
void *alignf_data); |
/* PCI /proc functions */ |
#ifdef CONFIG_PROC_FS |
extern int pci_proc_attach_device(struct pci_dev *dev); |
extern int pci_proc_detach_device(struct pci_dev *dev); |
extern int pci_proc_attach_bus(struct pci_bus *bus); |
extern int pci_proc_detach_bus(struct pci_bus *bus); |
#else |
static inline int pci_proc_attach_device(struct pci_dev *dev) { return 0; } |
static inline int pci_proc_detach_device(struct pci_dev *dev) { return 0; } |
static inline int pci_proc_attach_bus(struct pci_bus *bus) { return 0; } |
static inline int pci_proc_detach_bus(struct pci_bus *bus) { return 0; } |
#endif |
/* Functions for PCI Hotplug drivers to use */ |
extern struct pci_bus * pci_add_new_bus(struct pci_bus *parent, struct pci_dev *dev, int busnr); |
extern unsigned int pci_do_scan_bus(struct pci_bus *bus); |
extern int pci_remove_device_safe(struct pci_dev *dev); |
extern unsigned char pci_max_busnr(void); |
extern unsigned char pci_bus_max_busnr(struct pci_bus *bus); |
extern int pci_bus_find_capability (struct pci_bus *bus, unsigned int devfn, int cap); |
struct pci_dev_wrapped { |
struct pci_dev *dev; |
void *data; |
}; |
struct pci_bus_wrapped { |
struct pci_bus *bus; |
void *data; |
}; |
struct pci_visit { |
int (* pre_visit_pci_bus) (struct pci_bus_wrapped *, |
struct pci_dev_wrapped *); |
int (* post_visit_pci_bus) (struct pci_bus_wrapped *, |
struct pci_dev_wrapped *); |
int (* pre_visit_pci_dev) (struct pci_dev_wrapped *, |
struct pci_bus_wrapped *); |
int (* visit_pci_dev) (struct pci_dev_wrapped *, |
struct pci_bus_wrapped *); |
int (* post_visit_pci_dev) (struct pci_dev_wrapped *, |
struct pci_bus_wrapped *); |
}; |
extern int pci_visit_dev(struct pci_visit *fn, |
struct pci_dev_wrapped *wrapped_dev, |
struct pci_bus_wrapped *wrapped_parent); |
/* Lock for read/write access to pci device and bus lists */ |
extern spinlock_t pci_bus_lock; |
/shark/trunk/drivers/pci/pci-functions.h |
---|
0,0 → 1,19 |
/* |
* PCI BIOS function numbering for conventional PCI BIOS |
* systems |
*/ |
#define PCIBIOS_PCI_FUNCTION_ID 0xb1XX |
#define PCIBIOS_PCI_BIOS_PRESENT 0xb101 |
#define PCIBIOS_FIND_PCI_DEVICE 0xb102 |
#define PCIBIOS_FIND_PCI_CLASS_CODE 0xb103 |
#define PCIBIOS_GENERATE_SPECIAL_CYCLE 0xb106 |
#define PCIBIOS_READ_CONFIG_BYTE 0xb108 |
#define PCIBIOS_READ_CONFIG_WORD 0xb109 |
#define PCIBIOS_READ_CONFIG_DWORD 0xb10a |
#define PCIBIOS_WRITE_CONFIG_BYTE 0xb10b |
#define PCIBIOS_WRITE_CONFIG_WORD 0xb10c |
#define PCIBIOS_WRITE_CONFIG_DWORD 0xb10d |
#define PCIBIOS_GET_ROUTING_OPTIONS 0xb10e |
#define PCIBIOS_SET_PCI_HW_INT 0xb10f |
/shark/trunk/drivers/pci/setup-bus.c |
---|
0,0 → 1,551 |
/* |
* drivers/pci/setup-bus.c |
* |
* Extruded from code written by |
* Dave Rusling (david.rusling@reo.mts.dec.com) |
* David Mosberger (davidm@cs.arizona.edu) |
* David Miller (davem@redhat.com) |
* |
* Support routines for initializing a PCI subsystem. |
*/ |
/* |
* Nov 2000, Ivan Kokshaysky <ink@jurassic.park.msu.ru> |
* PCI-PCI bridges cleanup, sorted resource allocation. |
* Feb 2002, Ivan Kokshaysky <ink@jurassic.park.msu.ru> |
* Converted to allocation in 3 passes, which gives |
* tighter packing. Prefetchable range support. |
*/ |
#include <linuxcomp.h> |
#include <linux/init.h> |
#include <linux/kernel.h> |
#include <linux/module.h> |
#include <linux/pci.h> |
#include <linux/errno.h> |
#include <linux/ioport.h> |
#include <linux/cache.h> |
#include <linux/slab.h> |
#define DEBUG_CONFIG 0 |
#if DEBUG_CONFIG |
# define DBGC(args) printk args |
#else |
# define DBGC(args) |
#endif |
#define ROUND_UP(x, a) (((x) + (a) - 1) & ~((a) - 1)) |
/* |
* FIXME: IO should be max 256 bytes. However, since we may |
* have a P2P bridge below a cardbus bridge, we need 4K. |
*/ |
#define CARDBUS_IO_SIZE (4096) |
#define CARDBUS_MEM_SIZE (32*1024*1024) |
static int __devinit |
pbus_assign_resources_sorted(struct pci_bus *bus) |
{ |
struct pci_dev *dev; |
struct resource *res; |
struct resource_list head, *list, *tmp; |
int idx, found_vga = 0; |
head.next = NULL; |
list_for_each_entry(dev, &bus->devices, bus_list) { |
u16 class = dev->class >> 8; |
if (class == PCI_CLASS_DISPLAY_VGA |
|| class == PCI_CLASS_NOT_DEFINED_VGA) |
found_vga = 1; |
pdev_sort_resources(dev, &head); |
} |
for (list = head.next; list;) { |
res = list->res; |
idx = res - &list->dev->resource[0]; |
pci_assign_resource(list->dev, idx); |
tmp = list; |
list = list->next; |
kfree(tmp); |
} |
return found_vga; |
} |
static void __devinit |
pci_setup_cardbus(struct pci_bus *bus) |
{ |
struct pci_dev *bridge = bus->self; |
struct pci_bus_region region; |
printk("PCI: Bus %d, cardbus bridge: %s\n", |
bus->number, pci_name(bridge)); |
pcibios_resource_to_bus(bridge, ®ion, bus->resource[0]); |
if (bus->resource[0]->flags & IORESOURCE_IO) { |
/* |
* The IO resource is allocated a range twice as large as it |
* would normally need. This allows us to set both IO regs. |
*/ |
printk(" IO window: %08lx-%08lx\n", |
region.start, region.end); |
pci_write_config_dword(bridge, PCI_CB_IO_BASE_0, |
region.start); |
pci_write_config_dword(bridge, PCI_CB_IO_LIMIT_0, |
region.end); |
} |
pcibios_resource_to_bus(bridge, ®ion, bus->resource[1]); |
if (bus->resource[1]->flags & IORESOURCE_IO) { |
printk(" IO window: %08lx-%08lx\n", |
region.start, region.end); |
pci_write_config_dword(bridge, PCI_CB_IO_BASE_1, |
region.start); |
pci_write_config_dword(bridge, PCI_CB_IO_LIMIT_1, |
region.end); |
} |
pcibios_resource_to_bus(bridge, ®ion, bus->resource[2]); |
if (bus->resource[2]->flags & IORESOURCE_MEM) { |
printk(" PREFETCH window: %08lx-%08lx\n", |
region.start, region.end); |
pci_write_config_dword(bridge, PCI_CB_MEMORY_BASE_0, |
region.start); |
pci_write_config_dword(bridge, PCI_CB_MEMORY_LIMIT_0, |
region.end); |
} |
pcibios_resource_to_bus(bridge, ®ion, bus->resource[3]); |
if (bus->resource[3]->flags & IORESOURCE_MEM) { |
printk(" MEM window: %08lx-%08lx\n", |
region.start, region.end); |
pci_write_config_dword(bridge, PCI_CB_MEMORY_BASE_1, |
region.start); |
pci_write_config_dword(bridge, PCI_CB_MEMORY_LIMIT_1, |
region.end); |
} |
} |
/* Initialize bridges with base/limit values we have collected. |
PCI-to-PCI Bridge Architecture Specification rev. 1.1 (1998) |
requires that if there is no I/O ports or memory behind the |
bridge, corresponding range must be turned off by writing base |
value greater than limit to the bridge's base/limit registers. |
Note: care must be taken when updating I/O base/limit registers |
of bridges which support 32-bit I/O. This update requires two |
config space writes, so it's quite possible that an I/O window of |
the bridge will have some undesirable address (e.g. 0) after the |
first write. Ditto 64-bit prefetchable MMIO. */ |
static void __devinit |
pci_setup_bridge(struct pci_bus *bus) |
{ |
struct pci_dev *bridge = bus->self; |
struct pci_bus_region region; |
u32 l, io_upper16; |
DBGC((KERN_INFO "PCI: Bus %d, bridge: %s\n", |
bus->number, pci_name(bridge))); |
/* Set up the top and bottom of the PCI I/O segment for this bus. */ |
pcibios_resource_to_bus(bridge, ®ion, bus->resource[0]); |
if (bus->resource[0]->flags & IORESOURCE_IO) { |
pci_read_config_dword(bridge, PCI_IO_BASE, &l); |
l &= 0xffff0000; |
l |= (region.start >> 8) & 0x00f0; |
l |= region.end & 0xf000; |
/* Set up upper 16 bits of I/O base/limit. */ |
io_upper16 = (region.end & 0xffff0000) | (region.start >> 16); |
DBGC((KERN_INFO " IO window: %04lx-%04lx\n", |
region.start, region.end)); |
} |
else { |
/* Clear upper 16 bits of I/O base/limit. */ |
io_upper16 = 0; |
l = 0x00f0; |
DBGC((KERN_INFO " IO window: disabled.\n")); |
} |
/* Temporarily disable the I/O range before updating PCI_IO_BASE. */ |
pci_write_config_dword(bridge, PCI_IO_BASE_UPPER16, 0x0000ffff); |
/* Update lower 16 bits of I/O base/limit. */ |
pci_write_config_dword(bridge, PCI_IO_BASE, l); |
/* Update upper 16 bits of I/O base/limit. */ |
pci_write_config_dword(bridge, PCI_IO_BASE_UPPER16, io_upper16); |
/* Set up the top and bottom of the PCI Memory segment |
for this bus. */ |
pcibios_resource_to_bus(bridge, ®ion, bus->resource[1]); |
if (bus->resource[1]->flags & IORESOURCE_MEM) { |
l = (region.start >> 16) & 0xfff0; |
l |= region.end & 0xfff00000; |
DBGC((KERN_INFO " MEM window: %08lx-%08lx\n", |
region.start, region.end)); |
} |
else { |
l = 0x0000fff0; |
DBGC((KERN_INFO " MEM window: disabled.\n")); |
} |
pci_write_config_dword(bridge, PCI_MEMORY_BASE, l); |
/* Clear out the upper 32 bits of PREF limit. |
If PCI_PREF_BASE_UPPER32 was non-zero, this temporarily |
disables PREF range, which is ok. */ |
pci_write_config_dword(bridge, PCI_PREF_LIMIT_UPPER32, 0); |
/* Set up PREF base/limit. */ |
pcibios_resource_to_bus(bridge, ®ion, bus->resource[2]); |
if (bus->resource[2]->flags & IORESOURCE_PREFETCH) { |
l = (region.start >> 16) & 0xfff0; |
l |= region.end & 0xfff00000; |
DBGC((KERN_INFO " PREFETCH window: %08lx-%08lx\n", |
region.start, region.end)); |
} |
else { |
l = 0x0000fff0; |
DBGC((KERN_INFO " PREFETCH window: disabled.\n")); |
} |
pci_write_config_dword(bridge, PCI_PREF_MEMORY_BASE, l); |
/* Clear out the upper 32 bits of PREF base. */ |
pci_write_config_dword(bridge, PCI_PREF_BASE_UPPER32, 0); |
/* Check if we have VGA behind the bridge. |
Enable ISA in either case (FIXME!). */ |
l = (bus->resource[0]->flags & IORESOURCE_BUS_HAS_VGA) ? 0x0c : 0x04; |
pci_write_config_word(bridge, PCI_BRIDGE_CONTROL, l); |
} |
/* Check whether the bridge supports optional I/O and |
prefetchable memory ranges. If not, the respective |
base/limit registers must be read-only and read as 0. */ |
static void __devinit |
pci_bridge_check_ranges(struct pci_bus *bus) |
{ |
u16 io; |
u32 pmem; |
struct pci_dev *bridge = bus->self; |
struct resource *b_res; |
b_res = &bridge->resource[PCI_BRIDGE_RESOURCES]; |
b_res[1].flags |= IORESOURCE_MEM; |
pci_read_config_word(bridge, PCI_IO_BASE, &io); |
if (!io) { |
pci_write_config_word(bridge, PCI_IO_BASE, 0xf0f0); |
pci_read_config_word(bridge, PCI_IO_BASE, &io); |
pci_write_config_word(bridge, PCI_IO_BASE, 0x0); |
} |
if (io) |
b_res[0].flags |= IORESOURCE_IO; |
/* DECchip 21050 pass 2 errata: the bridge may miss an address |
disconnect boundary by one PCI data phase. |
Workaround: do not use prefetching on this device. */ |
if (bridge->vendor == PCI_VENDOR_ID_DEC && bridge->device == 0x0001) |
return; |
pci_read_config_dword(bridge, PCI_PREF_MEMORY_BASE, &pmem); |
if (!pmem) { |
pci_write_config_dword(bridge, PCI_PREF_MEMORY_BASE, |
0xfff0fff0); |
pci_read_config_dword(bridge, PCI_PREF_MEMORY_BASE, &pmem); |
pci_write_config_dword(bridge, PCI_PREF_MEMORY_BASE, 0x0); |
} |
if (pmem) |
b_res[2].flags |= IORESOURCE_MEM | IORESOURCE_PREFETCH; |
} |
/* Helper function for sizing routines: find first available |
bus resource of a given type. Note: we intentionally skip |
the bus resources which have already been assigned (that is, |
have non-NULL parent resource). */ |
static struct resource * __devinit |
find_free_bus_resource(struct pci_bus *bus, unsigned long type) |
{ |
int i; |
struct resource *r; |
unsigned long type_mask = IORESOURCE_IO | IORESOURCE_MEM | |
IORESOURCE_PREFETCH; |
for (i = 0; i < PCI_BUS_NUM_RESOURCES; i++) { |
r = bus->resource[i]; |
if (r && (r->flags & type_mask) == type && !r->parent) |
return r; |
} |
return NULL; |
} |
/* Sizing the IO windows of the PCI-PCI bridge is trivial, |
since these windows have 4K granularity and the IO ranges |
of non-bridge PCI devices are limited to 256 bytes. |
We must be careful with the ISA aliasing though. */ |
static void __devinit |
pbus_size_io(struct pci_bus *bus) |
{ |
struct pci_dev *dev; |
struct resource *b_res = find_free_bus_resource(bus, IORESOURCE_IO); |
unsigned long size = 0, size1 = 0; |
if (!b_res) |
return; |
list_for_each_entry(dev, &bus->devices, bus_list) { |
int i; |
for (i = 0; i < PCI_NUM_RESOURCES; i++) { |
struct resource *r = &dev->resource[i]; |
unsigned long r_size; |
if (r->parent || !(r->flags & IORESOURCE_IO)) |
continue; |
r_size = r->end - r->start + 1; |
if (r_size < 0x400) |
/* Might be re-aligned for ISA */ |
size += r_size; |
else |
size1 += r_size; |
} |
} |
/* To be fixed in 2.5: we should have sort of HAVE_ISA |
flag in the struct pci_bus. */ |
#if defined(CONFIG_ISA) || defined(CONFIG_EISA) |
size = (size & 0xff) + ((size & ~0xffUL) << 2); |
#endif |
size = ROUND_UP(size + size1, 4096); |
if (!size) { |
b_res->flags = 0; |
return; |
} |
/* Alignment of the IO window is always 4K */ |
b_res->start = 4096; |
b_res->end = b_res->start + size - 1; |
} |
/* Calculate the size of the bus and minimal alignment which |
guarantees that all child resources fit in this size. */ |
static int __devinit |
pbus_size_mem(struct pci_bus *bus, unsigned long mask, unsigned long type) |
{ |
struct pci_dev *dev; |
unsigned long min_align, align, size; |
unsigned long aligns[12]; /* Alignments from 1Mb to 2Gb */ |
int order, max_order; |
struct resource *b_res = find_free_bus_resource(bus, type); |
if (!b_res) |
return 0; |
memset(aligns, 0, sizeof(aligns)); |
max_order = 0; |
size = 0; |
list_for_each_entry(dev, &bus->devices, bus_list) { |
int i; |
for (i = 0; i < PCI_NUM_RESOURCES; i++) { |
struct resource *r = &dev->resource[i]; |
unsigned long r_size; |
if (r->parent || (r->flags & mask) != type) |
continue; |
r_size = r->end - r->start + 1; |
/* For bridges size != alignment */ |
align = (i < PCI_BRIDGE_RESOURCES) ? r_size : r->start; |
order = __ffs(align) - 20; |
if (order > 11) { |
printk(KERN_WARNING "PCI: region %s/%d " |
"too large: %lx-%lx\n", |
pci_name(dev), i, r->start, r->end); |
r->flags = 0; |
continue; |
} |
size += r_size; |
if (order < 0) |
order = 0; |
/* Exclude ranges with size > align from |
calculation of the alignment. */ |
if (r_size == align) |
aligns[order] += align; |
if (order > max_order) |
max_order = order; |
} |
} |
align = 0; |
min_align = 0; |
for (order = 0; order <= max_order; order++) { |
unsigned long align1 = 1UL << (order + 20); |
if (!align) |
min_align = align1; |
else if (ROUND_UP(align + min_align, min_align) < align1) |
min_align = align1 >> 1; |
align += aligns[order]; |
} |
size = ROUND_UP(size, min_align); |
if (!size) { |
b_res->flags = 0; |
return 1; |
} |
b_res->start = min_align; |
b_res->end = size + min_align - 1; |
return 1; |
} |
static void __devinit |
pci_bus_size_cardbus(struct pci_bus *bus) |
{ |
struct pci_dev *bridge = bus->self; |
struct resource *b_res = &bridge->resource[PCI_BRIDGE_RESOURCES]; |
u16 ctrl; |
/* |
* Reserve some resources for CardBus. We reserve |
* a fixed amount of bus space for CardBus bridges. |
*/ |
b_res[0].start = CARDBUS_IO_SIZE; |
b_res[0].end = b_res[0].start + CARDBUS_IO_SIZE - 1; |
b_res[0].flags |= IORESOURCE_IO; |
b_res[1].start = CARDBUS_IO_SIZE; |
b_res[1].end = b_res[1].start + CARDBUS_IO_SIZE - 1; |
b_res[1].flags |= IORESOURCE_IO; |
/* |
* Check whether prefetchable memory is supported |
* by this bridge. |
*/ |
pci_read_config_word(bridge, PCI_CB_BRIDGE_CONTROL, &ctrl); |
if (!(ctrl & PCI_CB_BRIDGE_CTL_PREFETCH_MEM0)) { |
ctrl |= PCI_CB_BRIDGE_CTL_PREFETCH_MEM0; |
pci_write_config_word(bridge, PCI_CB_BRIDGE_CONTROL, ctrl); |
pci_read_config_word(bridge, PCI_CB_BRIDGE_CONTROL, &ctrl); |
} |
/* |
* If we have prefetchable memory support, allocate |
* two regions. Otherwise, allocate one region of |
* twice the size. |
*/ |
if (ctrl & PCI_CB_BRIDGE_CTL_PREFETCH_MEM0) { |
b_res[2].start = CARDBUS_MEM_SIZE; |
b_res[2].end = b_res[2].start + CARDBUS_MEM_SIZE - 1; |
b_res[2].flags |= IORESOURCE_MEM | IORESOURCE_PREFETCH; |
b_res[3].start = CARDBUS_MEM_SIZE; |
b_res[3].end = b_res[3].start + CARDBUS_MEM_SIZE - 1; |
b_res[3].flags |= IORESOURCE_MEM; |
} else { |
b_res[3].start = CARDBUS_MEM_SIZE * 2; |
b_res[3].end = b_res[3].start + CARDBUS_MEM_SIZE * 2 - 1; |
b_res[3].flags |= IORESOURCE_MEM; |
} |
} |
void __devinit |
pci_bus_size_bridges(struct pci_bus *bus) |
{ |
struct pci_dev *dev; |
unsigned long mask, prefmask; |
list_for_each_entry(dev, &bus->devices, bus_list) { |
struct pci_bus *b = dev->subordinate; |
if (!b) |
continue; |
switch (dev->class >> 8) { |
case PCI_CLASS_BRIDGE_CARDBUS: |
pci_bus_size_cardbus(b); |
break; |
case PCI_CLASS_BRIDGE_PCI: |
default: |
pci_bus_size_bridges(b); |
break; |
} |
} |
/* The root bus? */ |
if (!bus->self) |
return; |
switch (bus->self->class >> 8) { |
case PCI_CLASS_BRIDGE_CARDBUS: |
/* don't size cardbuses yet. */ |
break; |
case PCI_CLASS_BRIDGE_PCI: |
pci_bridge_check_ranges(bus); |
default: |
pbus_size_io(bus); |
/* If the bridge supports prefetchable range, size it |
separately. If it doesn't, or its prefetchable window |
has already been allocated by arch code, try |
non-prefetchable range for both types of PCI memory |
resources. */ |
mask = IORESOURCE_MEM; |
prefmask = IORESOURCE_MEM | IORESOURCE_PREFETCH; |
if (pbus_size_mem(bus, prefmask, prefmask)) |
mask = prefmask; /* Success, size non-prefetch only. */ |
pbus_size_mem(bus, mask, IORESOURCE_MEM); |
break; |
} |
} |
EXPORT_SYMBOL(pci_bus_size_bridges); |
void __devinit |
pci_bus_assign_resources(struct pci_bus *bus) |
{ |
struct pci_bus *b; |
int found_vga = pbus_assign_resources_sorted(bus); |
struct pci_dev *dev; |
if (found_vga) { |
/* Propagate presence of the VGA to upstream bridges */ |
for (b = bus; b->parent; b = b->parent) { |
b->resource[0]->flags |= IORESOURCE_BUS_HAS_VGA; |
} |
} |
list_for_each_entry(dev, &bus->devices, bus_list) { |
b = dev->subordinate; |
if (!b) |
continue; |
pci_bus_assign_resources(b); |
switch (dev->class >> 8) { |
case PCI_CLASS_BRIDGE_PCI: |
pci_setup_bridge(b); |
break; |
case PCI_CLASS_BRIDGE_CARDBUS: |
pci_setup_cardbus(b); |
break; |
default: |
printk(KERN_INFO "PCI: not setting up bridge %s " |
"for bus %d\n", pci_name(dev), b->number); |
break; |
} |
} |
} |
EXPORT_SYMBOL(pci_bus_assign_resources); |
void __init |
pci_assign_unassigned_resources(void) |
{ |
struct list_head *ln; |
/* Depth first, calculate sizes and alignments of all |
subordinate buses. */ |
for(ln=pci_root_buses.next; ln != &pci_root_buses; ln=ln->next) |
pci_bus_size_bridges(pci_bus_b(ln)); |
/* Depth last, allocate resources and update the hardware. */ |
for(ln=pci_root_buses.next; ln != &pci_root_buses; ln=ln->next) { |
pci_bus_assign_resources(pci_bus_b(ln)); |
pci_enable_bridges(pci_bus_b(ln)); |
} |
} |
/shark/trunk/drivers/pci/setup-res.c |
---|
0,0 → 1,200 |
/* |
* drivers/pci/setup-res.c |
* |
* Extruded from code written by |
* Dave Rusling (david.rusling@reo.mts.dec.com) |
* David Mosberger (davidm@cs.arizona.edu) |
* David Miller (davem@redhat.com) |
* |
* Support routines for initializing a PCI subsystem. |
*/ |
/* fixed for multiple pci buses, 1999 Andrea Arcangeli <andrea@suse.de> */ |
/* |
* Nov 2000, Ivan Kokshaysky <ink@jurassic.park.msu.ru> |
* Resource sorting |
*/ |
#include <linuxcomp.h> |
#include <linux/init.h> |
#include <linux/kernel.h> |
#include <linux/pci.h> |
#include <linux/errno.h> |
#include <linux/ioport.h> |
#include <linux/cache.h> |
#include <linux/slab.h> |
#include "pci.h" |
#define DEBUG_CONFIG 0 |
#if DEBUG_CONFIG |
# define DBGC(args) printk args |
#else |
# define DBGC(args) |
#endif |
static void |
pci_update_resource(struct pci_dev *dev, struct resource *res, int resno) |
{ |
struct pci_bus_region region; |
u32 new, check, mask; |
int reg; |
pcibios_resource_to_bus(dev, ®ion, res); |
DBGC((KERN_ERR " got res [%lx:%lx] bus [%lx:%lx] flags %lx for " |
"BAR %d of %s\n", res->start, res->end, |
region.start, region.end, res->flags, |
resno, pci_name(dev))); |
new = region.start | (res->flags & PCI_REGION_FLAG_MASK); |
if (res->flags & IORESOURCE_IO) |
mask = (u32)PCI_BASE_ADDRESS_IO_MASK; |
else |
mask = (u32)PCI_BASE_ADDRESS_MEM_MASK; |
if (resno < 6) { |
reg = PCI_BASE_ADDRESS_0 + 4 * resno; |
} else if (resno == PCI_ROM_RESOURCE) { |
new |= res->flags & PCI_ROM_ADDRESS_ENABLE; |
reg = dev->rom_base_reg; |
} else { |
/* Hmm, non-standard resource. */ |
BUG(); |
return; /* kill uninitialised var warning */ |
} |
pci_write_config_dword(dev, reg, new); |
pci_read_config_dword(dev, reg, &check); |
if ((new ^ check) & mask) { |
printk(KERN_ERR "PCI: Error while updating region " |
"%s/%d (%08x != %08x)\n", pci_name(dev), resno, |
new, check); |
} |
if ((new & (PCI_BASE_ADDRESS_SPACE|PCI_BASE_ADDRESS_MEM_TYPE_MASK)) == |
(PCI_BASE_ADDRESS_SPACE_MEMORY|PCI_BASE_ADDRESS_MEM_TYPE_64)) { |
new = 0; /* currently everyone zeros the high address */ |
pci_write_config_dword(dev, reg + 4, new); |
pci_read_config_dword(dev, reg + 4, &check); |
if (check != new) { |
printk(KERN_ERR "PCI: Error updating region " |
"%s/%d (high %08x != %08x)\n", |
pci_name(dev), resno, new, check); |
} |
} |
} |
int __init |
pci_claim_resource(struct pci_dev *dev, int resource) |
{ |
struct resource *res = &dev->resource[resource]; |
struct resource *root = pci_find_parent_resource(dev, res); |
char *dtype = resource < PCI_BRIDGE_RESOURCES ? "device" : "bridge"; |
int err; |
err = -EINVAL; |
if (root != NULL) |
err = request_resource(root, res); |
if (err) { |
printk(KERN_ERR "PCI: %s region %d of %s %s [%lx:%lx]\n", |
root ? "Address space collision on" : |
"No parent found for", |
resource, dtype, pci_name(dev), res->start, res->end); |
} |
return err; |
} |
int pci_assign_resource(struct pci_dev *dev, int resno) |
{ |
struct pci_bus *bus = dev->bus; |
struct resource *res = dev->resource + resno; |
unsigned long size, min, align; |
int ret; |
size = res->end - res->start + 1; |
min = (res->flags & IORESOURCE_IO) ? PCIBIOS_MIN_IO : PCIBIOS_MIN_MEM; |
/* The bridge resources are special, as their |
size != alignment. Sizing routines return |
required alignment in the "start" field. */ |
align = (resno < PCI_BRIDGE_RESOURCES) ? size : res->start; |
/* First, try exact prefetching match.. */ |
ret = pci_bus_alloc_resource(bus, res, size, align, min, |
IORESOURCE_PREFETCH, |
pcibios_align_resource, dev); |
if (ret < 0 && (res->flags & IORESOURCE_PREFETCH)) { |
/* |
* That failed. |
* |
* But a prefetching area can handle a non-prefetching |
* window (it will just not perform as well). |
*/ |
ret = pci_bus_alloc_resource(bus, res, size, align, min, 0, |
pcibios_align_resource, dev); |
} |
if (ret) { |
printk(KERN_ERR "PCI: Failed to allocate resource %d(%lx-%lx) for %s\n", |
resno, res->start, res->end, pci_name(dev)); |
} else if (resno < PCI_BRIDGE_RESOURCES) { |
pci_update_resource(dev, res, resno); |
} |
return ret; |
} |
/* Sort resources by alignment */ |
void __devinit |
pdev_sort_resources(struct pci_dev *dev, struct resource_list *head) |
{ |
int i; |
for (i = 0; i < PCI_NUM_RESOURCES; i++) { |
struct resource *r; |
struct resource_list *list, *tmp; |
unsigned long r_align; |
r = &dev->resource[i]; |
r_align = r->end - r->start; |
if (!(r->flags) || r->parent) |
continue; |
if (!r_align) { |
printk(KERN_WARNING "PCI: Ignore bogus resource %d " |
"[%lx:%lx] of %s\n", |
i, r->start, r->end, pci_name(dev)); |
continue; |
} |
r_align = (i < PCI_BRIDGE_RESOURCES) ? r_align + 1 : r->start; |
for (list = head; ; list = list->next) { |
unsigned long align = 0; |
struct resource_list *ln = list->next; |
int idx; |
if (ln) { |
idx = ln->res - &ln->dev->resource[0]; |
align = (idx < PCI_BRIDGE_RESOURCES) ? |
ln->res->end - ln->res->start + 1 : |
ln->res->start; |
} |
if (r_align > align) { |
tmp = kmalloc(sizeof(*tmp), GFP_KERNEL); |
if (!tmp) |
panic("pdev_sort_resources(): " |
"kmalloc() failed!\n"); |
tmp->next = ln; |
tmp->res = r; |
tmp->dev = dev; |
list->next = tmp; |
break; |
} |
} |
} |
} |
/shark/trunk/drivers/pci/pci20to26.c |
---|
0,0 → 1,154 |
/* |
* Project: S.Ha.R.K. |
* |
* Coordinators: |
* Giorgio Buttazzo <giorgio@sssup.it> |
* Paolo Gai <pj@gandalf.sssup.it> |
* |
* Authors : |
* Mauro Marinoni <mauro.marinoni@unipv.it> |
* (see the web pages for full authors list) |
* |
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy) |
* |
* http://www.sssup.it |
* http://retis.sssup.it |
* http://shark.sssup.it |
*/ |
/* |
* This program is free software; you can redistribute it and/or modify |
* it under the terms of the GNU General Public License as published by |
* the Free Software Foundation; either version 2 of the License, or |
* (at your option) any later version. |
* |
* This program is distributed in the hope that it will be useful, |
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
* GNU General Public License for more details. |
* |
* You should have received a copy of the GNU General Public License |
* along with this program; if not, write to the Free Software |
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
*/ |
#include <linuxcomp.h> |
#include <linux/pci.h> |
//#define __DEBUG_20TO26__ |
void linuxpci_init(void) |
{ |
// PCI26_init MUST be called first ( TODO - Check ) |
} |
int pci20to26_find_class(unsigned int class_code, int index, BYTE *bus, BYTE *dev) |
{ |
struct pci_dev *ptmp = NULL; |
int curr = 0; |
ptmp = pci_find_class(class_code, ptmp); |
while (ptmp) { |
#ifdef __DEBUG_20TO26__ |
printk(KERN_DEBUG "pci20to26_find_class %x: found at bus %d, dev %d.\n", ptmp->class, ptmp->bus->number, ptmp->devfn); |
#endif |
if (curr == index) { |
*bus = ptmp->bus->number; |
*dev = ptmp->devfn; |
#ifdef __DEBUG_20TO26__ |
printk(KERN_DEBUG "pci20to26_find_class: found at bus %d, dev %d\n", *bus, *dev); |
#endif |
return PCIBIOS_SUCCESSFUL; |
} |
++curr; |
ptmp = pci_find_class(class_code, ptmp); |
} |
return PCIBIOS_DEVICE_NOT_FOUND; |
} |
int pcibios_present(void) |
{ |
return 1; // PCI26 initialized? ( TODO - Check ) |
} |
int pci20to26_read_config_byte(unsigned int bus, unsigned int dev, int where, u8 *val) |
{ |
struct pci_dev tmp; |
struct pci_dev *ptmp = &tmp; |
ptmp = pci_find_slot(bus, dev); |
pci_read_config_byte(ptmp, where, val); |
#ifdef __DEBUG_20TO26__ |
printk(KERN_DEBUG "pci20to26_read_config_byte: (bus %d, dev %d) -> %d\n", bus, dev, *val); |
#endif |
return 1; |
} |
int pci20to26_read_config_word(unsigned int bus, unsigned int dev, int where, u16 *val) |
{ |
struct pci_dev tmp; |
struct pci_dev *ptmp = &tmp; |
ptmp = pci_find_slot(bus, dev); |
pci_read_config_word(ptmp, where, val); |
#ifdef __DEBUG_20TO26__ |
printk(KERN_DEBUG "pci20to26_read_config_word: (bus %d, dev %d) -> %d\n", bus, dev, *val); |
#endif |
return 1; |
} |
int pci20to26_read_config_dword(unsigned int bus, unsigned int dev, int where, u32 *val) |
{ |
struct pci_dev tmp; |
struct pci_dev *ptmp = &tmp; |
ptmp = pci_find_slot(bus, dev); |
pci_read_config_dword(ptmp, where, val); |
#ifdef __DEBUG_20TO26__ |
printk(KERN_DEBUG "pci20to26_read_config_dword: (bus %d, dev %d) -> %uld\n", bus, dev, *val); |
#endif |
return 1; |
} |
int pci20to26_write_config_byte(unsigned int bus, unsigned int dev, int where, u8 val) |
{ |
struct pci_dev tmp; |
struct pci_dev *ptmp = &tmp; |
ptmp = pci_find_slot(bus, dev); |
pci_write_config_byte(ptmp, where, val); |
return 1; |
} |
int pci20to26_write_config_word(unsigned int bus, unsigned int dev, int where, u16 val) |
{ |
struct pci_dev tmp; |
struct pci_dev *ptmp = &tmp; |
ptmp = pci_find_slot(bus, dev); |
pci_write_config_word(ptmp, where, val); |
return 1; |
} |
int pci20to26_write_config_dword(unsigned int bus, unsigned int dev, int where, u32 val) |
{ |
struct pci_dev tmp; |
struct pci_dev *ptmp = &tmp; |
ptmp = pci_find_slot(bus, dev); |
pci_write_config_dword(ptmp, where, val); |
return 1; |
} |
/shark/trunk/drivers/pci/common.c |
---|
0,0 → 1,238 |
/* |
* Low-Level PCI Support for PC |
* |
* (c) 1999--2000 Martin Mares <mj@ucw.cz> |
*/ |
#include <linuxcomp.h> |
#include <linux/sched.h> |
#include <linux/pci.h> |
#include <linux/ioport.h> |
#include <linux/init.h> |
#include <asm/segment.h> |
#include <asm/io.h> |
#include <asm/smp.h> |
#include "pci2.h" |
#ifdef CONFIG_PCI_BIOS |
extern void pcibios_sort(void); |
#endif |
unsigned int pci_probe = PCI_PROBE_BIOS | PCI_PROBE_CONF1 | PCI_PROBE_CONF2; |
int pcibios_last_bus = -1; |
struct pci_bus *pci_root_bus = NULL; |
struct pci_raw_ops *raw_pci_ops; |
static int pci_read(struct pci_bus *bus, unsigned int devfn, int where, int size, u32 *value) |
{ |
return raw_pci_ops->read(0, bus->number, devfn, where, size, value); |
} |
static int pci_write(struct pci_bus *bus, unsigned int devfn, int where, int size, u32 value) |
{ |
return raw_pci_ops->write(0, bus->number, devfn, where, size, value); |
} |
struct pci_ops pci_root_ops = { |
.read = pci_read, |
.write = pci_write, |
}; |
/* |
* legacy, numa, and acpi all want to call pcibios_scan_root |
* from their initcalls. This flag prevents that. |
*/ |
int pcibios_scanned; |
/* |
* This interrupt-safe spinlock protects all accesses to PCI |
* configuration space. |
*/ |
spinlock_t pci_config_lock = SPIN_LOCK_UNLOCKED; |
/* |
* Several buggy motherboards address only 16 devices and mirror |
* them to next 16 IDs. We try to detect this `feature' on all |
* primary buses (those containing host bridges as they are |
* expected to be unique) and remove the ghost devices. |
*/ |
static void __devinit pcibios_fixup_ghosts(struct pci_bus *b) |
{ |
struct list_head *ln, *mn; |
struct pci_dev *d, *e; |
int mirror = PCI_DEVFN(16,0); |
int seen_host_bridge = 0; |
int i; |
DBG("PCI: Scanning for ghost devices on bus %d\n", b->number); |
for (ln=b->devices.next; ln != &b->devices; ln=ln->next) { |
d = pci_dev_b(ln); |
if ((d->class >> 8) == PCI_CLASS_BRIDGE_HOST) |
seen_host_bridge++; |
for (mn=ln->next; mn != &b->devices; mn=mn->next) { |
e = pci_dev_b(mn); |
if (e->devfn != d->devfn + mirror || |
e->vendor != d->vendor || |
e->device != d->device || |
e->class != d->class) |
continue; |
for(i=0; i<PCI_NUM_RESOURCES; i++) |
if (e->resource[i].start != d->resource[i].start || |
e->resource[i].end != d->resource[i].end || |
e->resource[i].flags != d->resource[i].flags) |
continue; |
break; |
} |
if (mn == &b->devices) |
return; |
} |
if (!seen_host_bridge) |
return; |
printk(KERN_WARNING "PCI: Ignoring ghost devices on bus %02x\n", b->number); |
ln = &b->devices; |
while (ln->next != &b->devices) { |
d = pci_dev_b(ln->next); |
if (d->devfn >= mirror) { |
list_del(&d->global_list); |
list_del(&d->bus_list); |
kfree(d); |
} else |
ln = ln->next; |
} |
} |
/* |
* Called after each bus is probed, but before its children |
* are examined. |
*/ |
void __devinit pcibios_fixup_bus(struct pci_bus *b) |
{ |
pcibios_fixup_ghosts(b); |
pci_read_bridge_bases(b); |
} |
struct pci_bus * __devinit pcibios_scan_root(int busnum) |
{ |
struct pci_bus *bus = NULL; |
while ((bus = pci_find_next_bus(bus)) != NULL) { |
if (bus->number == busnum) { |
/* Already scanned */ |
return bus; |
} |
} |
printk("PCI: Probing PCI hardware (bus %02x)\n", busnum); |
return pci_scan_bus(busnum, &pci_root_ops, NULL); |
} |
extern u8 pci_cache_line_size; |
int __init pcibios_init(void) |
{ |
if (!raw_pci_ops) { |
printk("PCI: System does not support PCI\n"); |
return 0; |
} |
/* |
* Assume PCI cacheline size of 32 bytes for all x86s except K7/K8 |
* and P4. It's also good for 386/486s (which actually have 16) |
* as quite a few PCI devices do not support smaller values. |
*/ |
pci_cache_line_size = 32 >> 2; |
pcibios_resource_survey(); |
#ifdef CONFIG_PCI_BIOS |
if ((pci_probe & PCI_BIOS_SORT) && !(pci_probe & PCI_NO_SORT)) |
pcibios_sort(); |
#endif |
return 0; |
} |
subsys_initcall(pcibios_init); |
char * __devinit pcibios_setup(char *str) |
{ |
if (!strcmp(str, "off")) { |
pci_probe = 0; |
return NULL; |
} |
#ifdef CONFIG_PCI_BIOS |
else if (!strcmp(str, "bios")) { |
pci_probe = PCI_PROBE_BIOS; |
return NULL; |
} else if (!strcmp(str, "nobios")) { |
pci_probe &= ~PCI_PROBE_BIOS; |
return NULL; |
} else if (!strcmp(str, "nosort")) { |
pci_probe |= PCI_NO_SORT; |
return NULL; |
} else if (!strcmp(str, "biosirq")) { |
pci_probe |= PCI_BIOS_IRQ_SCAN; |
return NULL; |
} |
#endif |
#ifdef CONFIG_PCI_DIRECT |
else if (!strcmp(str, "conf1")) { |
pci_probe = PCI_PROBE_CONF1 | PCI_NO_CHECKS; |
return NULL; |
} |
else if (!strcmp(str, "conf2")) { |
pci_probe = PCI_PROBE_CONF2 | PCI_NO_CHECKS; |
return NULL; |
} |
#endif |
#ifdef CONFIG_ACPI_PCI |
else if (!strcmp(str, "noacpi")) { |
pci_probe |= PCI_NO_ACPI_ROUTING; |
return NULL; |
} |
#endif |
#ifndef CONFIG_X86_VISWS |
else if (!strcmp(str, "usepirqmask")) { |
pci_probe |= PCI_USE_PIRQ_MASK; |
return NULL; |
} else if (!strncmp(str, "irqmask=", 8)) { |
pcibios_irq_mask = simple_strtol(str+8, NULL, 0); |
return NULL; |
} else if (!strncmp(str, "lastbus=", 8)) { |
pcibios_last_bus = simple_strtol(str+8, NULL, 0); |
return NULL; |
} |
#endif |
else if (!strcmp(str, "rom")) { |
pci_probe |= PCI_ASSIGN_ROMS; |
return NULL; |
} else if (!strcmp(str, "assign-busses")) { |
pci_probe |= PCI_ASSIGN_ALL_BUSSES; |
return NULL; |
} |
return str; |
} |
unsigned int pcibios_assign_all_busses(void) |
{ |
return (pci_probe & PCI_ASSIGN_ALL_BUSSES) ? 1 : 0; |
} |
int pcibios_enable_device(struct pci_dev *dev, int mask) |
{ |
int err; |
if ((err = pcibios_enable_resources(dev, mask)) < 0) |
return err; |
return pcibios_enable_irq(dev); |
} |
/shark/trunk/drivers/pci/i386.c |
---|
0,0 → 1,301 |
/* |
* Low-Level PCI Access for i386 machines |
* |
* Copyright 1993, 1994 Drew Eckhardt |
* Visionary Computing |
* (Unix and Linux consulting and custom programming) |
* Drew@Colorado.EDU |
* +1 (303) 786-7975 |
* |
* Drew's work was sponsored by: |
* iX Multiuser Multitasking Magazine |
* Hannover, Germany |
* hm@ix.de |
* |
* Copyright 1997--2000 Martin Mares <mj@ucw.cz> |
* |
* For more information, please consult the following manuals (look at |
* http://www.pcisig.com/ for how to get them): |
* |
* PCI BIOS Specification |
* PCI Local Bus Specification |
* PCI to PCI Bridge Specification |
* PCI System Design Guide |
* |
*/ |
#include <linuxcomp.h> |
#include <linux/types.h> |
#include <linux/kernel.h> |
#include <linux/pci.h> |
#include <linux/init.h> |
#include <linux/ioport.h> |
#include <linux/errno.h> |
#include "pci2.h" |
/* |
* We need to avoid collisions with `mirrored' VGA ports |
* and other strange ISA hardware, so we always want the |
* addresses to be allocated in the 0x000-0x0ff region |
* modulo 0x400. |
* |
* Why? Because some silly external IO cards only decode |
* the low 10 bits of the IO address. The 0x00-0xff region |
* is reserved for motherboard devices that decode all 16 |
* bits, so it's ok to allocate at, say, 0x2800-0x28ff, |
* but we want to try to avoid allocating at 0x2900-0x2bff |
* which might have be mirrored at 0x0100-0x03ff.. |
*/ |
void |
pcibios_align_resource(void *data, struct resource *res, |
unsigned long size, unsigned long align) |
{ |
if (res->flags & IORESOURCE_IO) { |
unsigned long start = res->start; |
if (start & 0x300) { |
start = (start + 0x3ff) & ~0x3ff; |
res->start = start; |
} |
} |
} |
/* |
* Handle resources of PCI devices. If the world were perfect, we could |
* just allocate all the resource regions and do nothing more. It isn't. |
* On the other hand, we cannot just re-allocate all devices, as it would |
* require us to know lots of host bridge internals. So we attempt to |
* keep as much of the original configuration as possible, but tweak it |
* when it's found to be wrong. |
* |
* Known BIOS problems we have to work around: |
* - I/O or memory regions not configured |
* - regions configured, but not enabled in the command register |
* - bogus I/O addresses above 64K used |
* - expansion ROMs left enabled (this may sound harmless, but given |
* the fact the PCI specs explicitly allow address decoders to be |
* shared between expansion ROMs and other resource regions, it's |
* at least dangerous) |
* |
* Our solution: |
* (1) Allocate resources for all buses behind PCI-to-PCI bridges. |
* This gives us fixed barriers on where we can allocate. |
* (2) Allocate resources for all enabled devices. If there is |
* a collision, just mark the resource as unallocated. Also |
* disable expansion ROMs during this step. |
* (3) Try to allocate resources for disabled devices. If the |
* resources were assigned correctly, everything goes well, |
* if they weren't, they won't disturb allocation of other |
* resources. |
* (4) Assign new addresses to resources which were either |
* not configured at all or misconfigured. If explicitly |
* requested by the user, configure expansion ROM address |
* as well. |
*/ |
static void __init pcibios_allocate_bus_resources(struct list_head *bus_list) |
{ |
struct list_head *ln; |
struct pci_bus *bus; |
struct pci_dev *dev; |
int idx; |
struct resource *r, *pr; |
/* Depth-First Search on bus tree */ |
for (ln=bus_list->next; ln != bus_list; ln=ln->next) { |
bus = pci_bus_b(ln); |
if ((dev = bus->self)) { |
for (idx = PCI_BRIDGE_RESOURCES; idx < PCI_NUM_RESOURCES; idx++) { |
r = &dev->resource[idx]; |
if (!r->start) |
continue; |
pr = pci_find_parent_resource(dev, r); |
if (!pr || request_resource(pr, r) < 0) |
printk(KERN_ERR "PCI: Cannot allocate resource region %d of bridge %s\n", idx, pci_name(dev)); |
} |
} |
pcibios_allocate_bus_resources(&bus->children); |
} |
} |
static void __init pcibios_allocate_resources(int pass) |
{ |
struct pci_dev *dev = NULL; |
int idx, disabled; |
u16 command; |
struct resource *r, *pr; |
while ((dev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) { |
pci_read_config_word(dev, PCI_COMMAND, &command); |
for(idx = 0; idx < 6; idx++) { |
r = &dev->resource[idx]; |
if (r->parent) /* Already allocated */ |
continue; |
if (!r->start) /* Address not assigned at all */ |
continue; |
if (r->flags & IORESOURCE_IO) |
disabled = !(command & PCI_COMMAND_IO); |
else |
disabled = !(command & PCI_COMMAND_MEMORY); |
if (pass == disabled) { |
DBG("PCI: Resource %08lx-%08lx (f=%lx, d=%d, p=%d)\n", |
r->start, r->end, r->flags, disabled, pass); |
pr = pci_find_parent_resource(dev, r); |
if (!pr || request_resource(pr, r) < 0) { |
printk(KERN_ERR "PCI: Cannot allocate resource region %d of device %s\n", idx, pci_name(dev)); |
/* We'll assign a new address later */ |
r->end -= r->start; |
r->start = 0; |
} |
} |
} |
if (!pass) { |
r = &dev->resource[PCI_ROM_RESOURCE]; |
if (r->flags & PCI_ROM_ADDRESS_ENABLE) { |
/* Turn the ROM off, leave the resource region, but keep it unregistered. */ |
u32 reg; |
DBG("PCI: Switching off ROM of %s\n", pci_name(dev)); |
r->flags &= ~PCI_ROM_ADDRESS_ENABLE; |
pci_read_config_dword(dev, dev->rom_base_reg, ®); |
pci_write_config_dword(dev, dev->rom_base_reg, reg & ~PCI_ROM_ADDRESS_ENABLE); |
} |
} |
} |
} |
static void __init pcibios_assign_resources(void) |
{ |
struct pci_dev *dev = NULL; |
int idx; |
struct resource *r; |
while ((dev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) { |
int class = dev->class >> 8; |
/* Don't touch classless devices and host bridges */ |
if (!class || class == PCI_CLASS_BRIDGE_HOST) |
continue; |
for(idx=0; idx<6; idx++) { |
r = &dev->resource[idx]; |
/* |
* Don't touch IDE controllers and I/O ports of video cards! |
*/ |
if ((class == PCI_CLASS_STORAGE_IDE && idx < 4) || |
(class == PCI_CLASS_DISPLAY_VGA && (r->flags & IORESOURCE_IO))) |
continue; |
/* |
* We shall assign a new address to this resource, either because |
* the BIOS forgot to do so or because we have decided the old |
* address was unusable for some reason. |
*/ |
if (!r->start && r->end) |
pci_assign_resource(dev, idx); |
} |
if (pci_probe & PCI_ASSIGN_ROMS) { |
r = &dev->resource[PCI_ROM_RESOURCE]; |
r->end -= r->start; |
r->start = 0; |
if (r->end) |
pci_assign_resource(dev, PCI_ROM_RESOURCE); |
} |
} |
} |
void __init pcibios_resource_survey(void) |
{ |
DBG("PCI: Allocating resources\n"); |
pcibios_allocate_bus_resources(&pci_root_buses); |
pcibios_allocate_resources(0); |
pcibios_allocate_resources(1); |
pcibios_assign_resources(); |
} |
int pcibios_enable_resources(struct pci_dev *dev, int mask) |
{ |
u16 cmd, old_cmd; |
int idx; |
struct resource *r; |
pci_read_config_word(dev, PCI_COMMAND, &cmd); |
old_cmd = cmd; |
for(idx=0; idx<6; idx++) { |
/* Only set up the requested stuff */ |
if (!(mask & (1<<idx))) |
continue; |
r = &dev->resource[idx]; |
if (!r->start && r->end) { |
printk(KERN_ERR "PCI: Device %s not available because of resource collisions\n", pci_name(dev)); |
return -EINVAL; |
} |
if (r->flags & IORESOURCE_IO) |
cmd |= PCI_COMMAND_IO; |
if (r->flags & IORESOURCE_MEM) |
cmd |= PCI_COMMAND_MEMORY; |
} |
if (dev->resource[PCI_ROM_RESOURCE].start) |
cmd |= PCI_COMMAND_MEMORY; |
if (cmd != old_cmd) { |
printk("PCI: Enabling device %s (%04x -> %04x)\n", pci_name(dev), old_cmd, cmd); |
pci_write_config_word(dev, PCI_COMMAND, cmd); |
} |
return 0; |
} |
/* |
* If we set up a device for bus mastering, we need to check the latency |
* timer as certain crappy BIOSes forget to set it properly. |
*/ |
unsigned int pcibios_max_latency = 255; |
void pcibios_set_master(struct pci_dev *dev) |
{ |
u8 lat; |
pci_read_config_byte(dev, PCI_LATENCY_TIMER, &lat); |
if (lat < 16) |
lat = (64 <= pcibios_max_latency) ? 64 : pcibios_max_latency; |
else if (lat > pcibios_max_latency) |
lat = pcibios_max_latency; |
else |
return; |
printk(KERN_DEBUG "PCI: Setting latency timer of device %s to %d\n", pci_name(dev), lat); |
pci_write_config_byte(dev, PCI_LATENCY_TIMER, lat); |
} |
int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma, |
enum pci_mmap_state mmap_state, int write_combine) |
{ |
unsigned long prot; |
/* I/O space cannot be accessed via normal processor loads and |
* stores on this platform. |
*/ |
if (mmap_state == pci_mmap_io) |
return -EINVAL; |
/* Leave vm_pgoff as-is, the PCI space address is the physical |
* address on this platform. |
*/ |
vma->vm_flags |= (VM_SHM | VM_LOCKED | VM_IO); |
prot = pgprot_val(vma->vm_page_prot); |
prot |= _PAGE_PCD | _PAGE_PWT; |
vma->vm_page_prot = __pgprot(prot); |
/* Write-combine setting is ignored, it is changed via the mtrr |
* interfaces on this platform. |
*/ |
if (remap_page_range(vma, vma->vm_start, vma->vm_pgoff << PAGE_SHIFT, |
vma->vm_end - vma->vm_start, |
vma->vm_page_prot)) |
return -EAGAIN; |
return 0; |
} |
/shark/trunk/drivers/pci/bus.c |
---|
0,0 → 1,141 |
/* |
* drivers/pci/bus.c |
* |
* From setup-res.c, by: |
* Dave Rusling (david.rusling@reo.mts.dec.com) |
* David Mosberger (davidm@cs.arizona.edu) |
* David Miller (davem@redhat.com) |
* Ivan Kokshaysky (ink@jurassic.park.msu.ru) |
*/ |
#include <linuxcomp.h> |
#include <linux/module.h> |
#include <linux/kernel.h> |
#include <linux/pci.h> |
#include <linux/errno.h> |
#include <linux/ioport.h> |
#include <linux/proc_fs.h> |
#include <linux/init.h> |
#include "pci.h" |
/** |
* pci_bus_alloc_resource - allocate a resource from a parent bus |
* @bus: PCI bus |
* @res: resource to allocate |
* @size: size of resource to allocate |
* @align: alignment of resource to allocate |
* @min: minimum /proc/iomem address to allocate |
* @type_mask: IORESOURCE_* type flags |
* @alignf: resource alignment function |
* @alignf_data: data argument for resource alignment function |
* |
* Given the PCI bus a device resides on, the size, minimum address, |
* alignment and type, try to find an acceptable resource allocation |
* for a specific device resource. |
*/ |
int |
pci_bus_alloc_resource(struct pci_bus *bus, struct resource *res, |
unsigned long size, unsigned long align, unsigned long min, |
unsigned int type_mask, |
void (*alignf)(void *, struct resource *, |
unsigned long, unsigned long), |
void *alignf_data) |
{ |
int i, ret = -ENOMEM; |
type_mask |= IORESOURCE_IO | IORESOURCE_MEM; |
for (i = 0; i < PCI_BUS_NUM_RESOURCES; i++) { |
struct resource *r = bus->resource[i]; |
if (!r) |
continue; |
/* type_mask must match */ |
if ((res->flags ^ r->flags) & type_mask) |
continue; |
/* We cannot allocate a non-prefetching resource |
from a pre-fetching area */ |
if ((r->flags & IORESOURCE_PREFETCH) && |
!(res->flags & IORESOURCE_PREFETCH)) |
continue; |
/* Ok, try it out.. */ |
ret = allocate_resource(r, res, size, min, -1, align, |
alignf, alignf_data); |
if (ret == 0) |
break; |
} |
return ret; |
} |
/** |
* pci_bus_add_devices - insert newly discovered PCI devices |
* @bus: bus to check for new devices |
* |
* Add newly discovered PCI devices (which are on the bus->devices |
* list) to the global PCI device list, add the sysfs and procfs |
* entries. Where a bridge is found, add the discovered bus to |
* the parents list of child buses, and recurse (breadth-first |
* to be compatible with 2.4) |
* |
* Call hotplug for each new devices. |
*/ |
void __devinit pci_bus_add_devices(struct pci_bus *bus) |
{ |
struct pci_dev *dev; |
list_for_each_entry(dev, &bus->devices, bus_list) { |
/* |
* Skip already-present devices (which are on the |
* global device list.) |
*/ |
if (!list_empty(&dev->global_list)) |
continue; |
device_add(&dev->dev); |
spin_lock(&pci_bus_lock); |
list_add_tail(&dev->global_list, &pci_devices); |
spin_unlock(&pci_bus_lock); |
pci_proc_attach_device(dev); |
} |
list_for_each_entry(dev, &bus->devices, bus_list) { |
BUG_ON(list_empty(&dev->global_list)); |
/* |
* If there is an unattached subordinate bus, attach |
* it and then scan for unattached PCI devices. |
*/ |
if (dev->subordinate && list_empty(&dev->subordinate->node)) { |
spin_lock(&pci_bus_lock); |
list_add_tail(&dev->subordinate->node, &dev->bus->children); |
spin_unlock(&pci_bus_lock); |
pci_bus_add_devices(dev->subordinate); |
} |
} |
} |
void pci_enable_bridges(struct pci_bus *bus) |
{ |
struct pci_dev *dev; |
list_for_each_entry(dev, &bus->devices, bus_list) { |
if (dev->subordinate) { |
pci_enable_device(dev); |
pci_set_master(dev); |
pci_enable_bridges(dev->subordinate); |
} |
} |
} |
EXPORT_SYMBOL(pci_bus_add_devices); |
EXPORT_SYMBOL(pci_enable_bridges); |
/shark/trunk/drivers/pci/setup-irq.c |
---|
0,0 → 1,72 |
/* |
* drivers/pci/setup-irq.c |
* |
* Extruded from code written by |
* Dave Rusling (david.rusling@reo.mts.dec.com) |
* David Mosberger (davidm@cs.arizona.edu) |
* David Miller (davem@redhat.com) |
* |
* Support routines for initializing a PCI subsystem. |
*/ |
#include <linuxcomp.h> |
#include <linux/init.h> |
#include <linux/kernel.h> |
#include <linux/pci.h> |
#include <linux/errno.h> |
#include <linux/ioport.h> |
#include <linux/cache.h> |
#define DEBUG_CONFIG 0 |
#if DEBUG_CONFIG |
# define DBGC(args) printk args |
#else |
# define DBGC(args) |
#endif |
static void __init |
pdev_fixup_irq(struct pci_dev *dev, |
u8 (*swizzle)(struct pci_dev *, u8 *), |
int (*map_irq)(struct pci_dev *, u8, u8)) |
{ |
u8 pin, slot; |
int irq; |
/* If this device is not on the primary bus, we need to figure out |
which interrupt pin it will come in on. We know which slot it |
will come in on 'cos that slot is where the bridge is. Each |
time the interrupt line passes through a PCI-PCI bridge we must |
apply the swizzle function. */ |
pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &pin); |
/* Cope with 0 and illegal. */ |
if (pin == 0 || pin > 4) |
pin = 1; |
/* Follow the chain of bridges, swizzling as we go. */ |
slot = (*swizzle)(dev, &pin); |
irq = (*map_irq)(dev, slot, pin); |
if (irq == -1) |
irq = 0; |
dev->irq = irq; |
DBGC((KERN_ERR "PCI fixup irq: (%s) got %d\n", dev->dev.name, dev->irq)); |
/* Always tell the device, so the driver knows what is |
the real IRQ to use; the device does not use it. */ |
pcibios_update_irq(dev, irq); |
} |
void __init |
pci_fixup_irqs(u8 (*swizzle)(struct pci_dev *, u8 *), |
int (*map_irq)(struct pci_dev *, u8, u8)) |
{ |
struct pci_dev *dev = NULL; |
while ((dev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) { |
pdev_fixup_irq(dev, swizzle, map_irq); |
} |
} |
/shark/trunk/drivers/pci/irq.c |
---|
0,0 → 1,967 |
/* |
* Low-Level PCI Support for PC -- Routing of Interrupts |
* |
* (c) 1999--2000 Martin Mares <mj@ucw.cz> |
*/ |
#include <linuxcomp.h> |
#include <linux/config.h> |
#include <linux/types.h> |
#include <linux/kernel.h> |
#include <linux/pci.h> |
#include <linux/init.h> |
#include <linux/slab.h> |
#include <linux/interrupt.h> |
#include <linux/irq.h> |
#include <asm/io.h> |
#include <asm/smp.h> |
#include <asm/io_apic.h> |
#include "pci2.h" |
#define PIRQ_SIGNATURE (('$' << 0) + ('P' << 8) + ('I' << 16) + ('R' << 24)) |
#define PIRQ_VERSION 0x0100 |
int broken_hp_bios_irq9; |
static struct irq_routing_table *pirq_table; |
/* |
* Never use: 0, 1, 2 (timer, keyboard, and cascade) |
* Avoid using: 13, 14 and 15 (FP error and IDE). |
* Penalize: 3, 4, 6, 7, 12 (known ISA uses: serial, floppy, parallel and mouse) |
*/ |
unsigned int pcibios_irq_mask = 0xfff8; |
static int pirq_penalty[16] = { |
1000000, 1000000, 1000000, 1000, 1000, 0, 1000, 1000, |
0, 0, 0, 0, 1000, 100000, 100000, 100000 |
}; |
struct irq_router { |
char *name; |
u16 vendor, device; |
int (*get)(struct pci_dev *router, struct pci_dev *dev, int pirq); |
int (*set)(struct pci_dev *router, struct pci_dev *dev, int pirq, int new); |
}; |
struct irq_router_handler { |
u16 vendor; |
int (*probe)(struct irq_router *r, struct pci_dev *router, u16 device); |
}; |
int (*pcibios_enable_irq)(struct pci_dev *dev) = NULL; |
/* |
* Search 0xf0000 -- 0xfffff for the PCI IRQ Routing Table. |
*/ |
static struct irq_routing_table * __init pirq_find_routing_table(void) |
{ |
u8 *addr; |
struct irq_routing_table *rt; |
int i; |
u8 sum; |
for(addr = (u8 *) __va(0xf0000); addr < (u8 *) __va(0x100000); addr += 16) { |
rt = (struct irq_routing_table *) addr; |
if (rt->signature != PIRQ_SIGNATURE || |
rt->version != PIRQ_VERSION || |
rt->size % 16 || |
rt->size < sizeof(struct irq_routing_table)) |
continue; |
sum = 0; |
for(i=0; i<rt->size; i++) |
sum += addr[i]; |
if (!sum) { |
DBG("PCI: Interrupt Routing Table found at 0x%p\n", rt); |
return rt; |
} |
} |
return NULL; |
} |
/* |
* If we have a IRQ routing table, use it to search for peer host |
* bridges. It's a gross hack, but since there are no other known |
* ways how to get a list of buses, we have to go this way. |
*/ |
static void __init pirq_peer_trick(void) |
{ |
struct irq_routing_table *rt = pirq_table; |
u8 busmap[256]; |
int i; |
struct irq_info *e; |
memset(busmap, 0, sizeof(busmap)); |
for(i=0; i < (rt->size - sizeof(struct irq_routing_table)) / sizeof(struct irq_info); i++) { |
e = &rt->slots[i]; |
#ifdef DEBUG |
{ |
int j; |
DBG("%02x:%02x slot=%02x", e->bus, e->devfn/8, e->slot); |
for(j=0; j<4; j++) |
DBG(" %d:%02x/%04x", j, e->irq[j].link, e->irq[j].bitmap); |
DBG("\n"); |
} |
#endif |
busmap[e->bus] = 1; |
} |
for(i = 1; i < 256; i++) { |
if (!busmap[i] || pci_find_bus(0, i)) |
continue; |
if (pci_scan_bus(i, &pci_root_ops, NULL)) |
printk(KERN_INFO "PCI: Discovered primary peer bus %02x [IRQ]\n", i); |
} |
pcibios_last_bus = -1; |
} |
/* |
* Code for querying and setting of IRQ routes on various interrupt routers. |
*/ |
void eisa_set_level_irq(unsigned int irq) |
{ |
unsigned char mask = 1 << (irq & 7); |
unsigned int port = 0x4d0 + (irq >> 3); |
unsigned char val = inb(port); |
if (!(val & mask)) { |
DBG(" -> edge"); |
outb(val | mask, port); |
} |
} |
/* |
* Common IRQ routing practice: nybbles in config space, |
* offset by some magic constant. |
*/ |
static unsigned int read_config_nybble(struct pci_dev *router, unsigned offset, unsigned nr) |
{ |
u8 x; |
unsigned reg = offset + (nr >> 1); |
pci_read_config_byte(router, reg, &x); |
return (nr & 1) ? (x >> 4) : (x & 0xf); |
} |
static void write_config_nybble(struct pci_dev *router, unsigned offset, unsigned nr, unsigned int val) |
{ |
u8 x; |
unsigned reg = offset + (nr >> 1); |
pci_read_config_byte(router, reg, &x); |
x = (nr & 1) ? ((x & 0x0f) | (val << 4)) : ((x & 0xf0) | val); |
pci_write_config_byte(router, reg, x); |
} |
/* |
* ALI pirq entries are damn ugly, and completely undocumented. |
* This has been figured out from pirq tables, and it's not a pretty |
* picture. |
*/ |
static int pirq_ali_get(struct pci_dev *router, struct pci_dev *dev, int pirq) |
{ |
static unsigned char irqmap[16] = { 0, 9, 3, 10, 4, 5, 7, 6, 1, 11, 0, 12, 0, 14, 0, 15 }; |
return irqmap[read_config_nybble(router, 0x48, pirq-1)]; |
} |
static int pirq_ali_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq) |
{ |
static unsigned char irqmap[16] = { 0, 8, 0, 2, 4, 5, 7, 6, 0, 1, 3, 9, 11, 0, 13, 15 }; |
unsigned int val = irqmap[irq]; |
if (val) { |
write_config_nybble(router, 0x48, pirq-1, val); |
return 1; |
} |
return 0; |
} |
/* |
* The Intel PIIX4 pirq rules are fairly simple: "pirq" is |
* just a pointer to the config space. |
*/ |
static int pirq_piix_get(struct pci_dev *router, struct pci_dev *dev, int pirq) |
{ |
u8 x; |
pci_read_config_byte(router, pirq, &x); |
return (x < 16) ? x : 0; |
} |
static int pirq_piix_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq) |
{ |
pci_write_config_byte(router, pirq, irq); |
return 1; |
} |
/* |
* The VIA pirq rules are nibble-based, like ALI, |
* but without the ugly irq number munging. |
* However, PIRQD is in the upper instead of lower 4 bits. |
*/ |
static int pirq_via_get(struct pci_dev *router, struct pci_dev *dev, int pirq) |
{ |
return read_config_nybble(router, 0x55, pirq == 4 ? 5 : pirq); |
} |
static int pirq_via_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq) |
{ |
write_config_nybble(router, 0x55, pirq == 4 ? 5 : pirq, irq); |
return 1; |
} |
/* |
* ITE 8330G pirq rules are nibble-based |
* FIXME: pirqmap may be { 1, 0, 3, 2 }, |
* 2+3 are both mapped to irq 9 on my system |
*/ |
static int pirq_ite_get(struct pci_dev *router, struct pci_dev *dev, int pirq) |
{ |
static unsigned char pirqmap[4] = { 1, 0, 2, 3 }; |
return read_config_nybble(router,0x43, pirqmap[pirq-1]); |
} |
static int pirq_ite_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq) |
{ |
static unsigned char pirqmap[4] = { 1, 0, 2, 3 }; |
write_config_nybble(router, 0x43, pirqmap[pirq-1], irq); |
return 1; |
} |
/* |
* OPTI: high four bits are nibble pointer.. |
* I wonder what the low bits do? |
*/ |
static int pirq_opti_get(struct pci_dev *router, struct pci_dev *dev, int pirq) |
{ |
return read_config_nybble(router, 0xb8, pirq >> 4); |
} |
static int pirq_opti_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq) |
{ |
write_config_nybble(router, 0xb8, pirq >> 4, irq); |
return 1; |
} |
/* |
* Cyrix: nibble offset 0x5C |
* 0x5C bits 7:4 is INTB bits 3:0 is INTA |
* 0x5D bits 7:4 is INTD bits 3:0 is INTC |
*/ |
static int pirq_cyrix_get(struct pci_dev *router, struct pci_dev *dev, int pirq) |
{ |
return read_config_nybble(router, 0x5C, (pirq-1)^1); |
} |
static int pirq_cyrix_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq) |
{ |
write_config_nybble(router, 0x5C, (pirq-1)^1, irq); |
return 1; |
} |
/* |
* PIRQ routing for SiS 85C503 router used in several SiS chipsets. |
* We have to deal with the following issues here: |
* - vendors have different ideas about the meaning of link values |
* - some onboard devices (integrated in the chipset) have special |
* links and are thus routed differently (i.e. not via PCI INTA-INTD) |
* - different revision of the router have a different layout for |
* the routing registers, particularly for the onchip devices |
* |
* For all routing registers the common thing is we have one byte |
* per routeable link which is defined as: |
* bit 7 IRQ mapping enabled (0) or disabled (1) |
* bits [6:4] reserved (sometimes used for onchip devices) |
* bits [3:0] IRQ to map to |
* allowed: 3-7, 9-12, 14-15 |
* reserved: 0, 1, 2, 8, 13 |
* |
* The config-space registers located at 0x41/0x42/0x43/0x44 are |
* always used to route the normal PCI INT A/B/C/D respectively. |
* Apparently there are systems implementing PCI routing table using |
* link values 0x01-0x04 and others using 0x41-0x44 for PCI INTA..D. |
* We try our best to handle both link mappings. |
* |
* Currently (2003-05-21) it appears most SiS chipsets follow the |
* definition of routing registers from the SiS-5595 southbridge. |
* According to the SiS 5595 datasheets the revision id's of the |
* router (ISA-bridge) should be 0x01 or 0xb0. |
* |
* Furthermore we've also seen lspci dumps with revision 0x00 and 0xb1. |
* Looks like these are used in a number of SiS 5xx/6xx/7xx chipsets. |
* They seem to work with the current routing code. However there is |
* some concern because of the two USB-OHCI HCs (original SiS 5595 |
* had only one). YMMV. |
* |
* Onchip routing for router rev-id 0x01/0xb0 and probably 0x00/0xb1: |
* |
* 0x61: IDEIRQ: |
* bits [6:5] must be written 01 |
* bit 4 channel-select primary (0), secondary (1) |
* |
* 0x62: USBIRQ: |
* bit 6 OHCI function disabled (0), enabled (1) |
* |
* 0x6a: ACPI/SCI IRQ: bits 4-6 reserved |
* |
* 0x7e: Data Acq. Module IRQ - bits 4-6 reserved |
* |
* We support USBIRQ (in addition to INTA-INTD) and keep the |
* IDE, ACPI and DAQ routing untouched as set by the BIOS. |
* |
* Currently the only reported exception is the new SiS 65x chipset |
* which includes the SiS 69x southbridge. Here we have the 85C503 |
* router revision 0x04 and there are changes in the register layout |
* mostly related to the different USB HCs with USB 2.0 support. |
* |
* Onchip routing for router rev-id 0x04 (try-and-error observation) |
* |
* 0x60/0x61/0x62/0x63: 1xEHCI and 3xOHCI (companion) USB-HCs |
* bit 6-4 are probably unused, not like 5595 |
*/ |
#define PIRQ_SIS_IRQ_MASK 0x0f |
#define PIRQ_SIS_IRQ_DISABLE 0x80 |
#define PIRQ_SIS_USB_ENABLE 0x40 |
static int pirq_sis_get(struct pci_dev *router, struct pci_dev *dev, int pirq) |
{ |
u8 x; |
int reg; |
reg = pirq; |
if (reg >= 0x01 && reg <= 0x04) |
reg += 0x40; |
pci_read_config_byte(router, reg, &x); |
return (x & PIRQ_SIS_IRQ_DISABLE) ? 0 : (x & PIRQ_SIS_IRQ_MASK); |
} |
static int pirq_sis_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq) |
{ |
u8 x; |
int reg; |
reg = pirq; |
if (reg >= 0x01 && reg <= 0x04) |
reg += 0x40; |
pci_read_config_byte(router, reg, &x); |
x &= ~(PIRQ_SIS_IRQ_MASK | PIRQ_SIS_IRQ_DISABLE); |
x |= irq ? irq: PIRQ_SIS_IRQ_DISABLE; |
pci_write_config_byte(router, reg, x); |
return 1; |
} |
/* |
* VLSI: nibble offset 0x74 - educated guess due to routing table and |
* config space of VLSI 82C534 PCI-bridge/router (1004:0102) |
* Tested on HP OmniBook 800 covering PIRQ 1, 2, 4, 8 for onboard |
* devices, PIRQ 3 for non-pci(!) soundchip and (untested) PIRQ 6 |
* for the busbridge to the docking station. |
*/ |
static int pirq_vlsi_get(struct pci_dev *router, struct pci_dev *dev, int pirq) |
{ |
if (pirq > 8) { |
printk(KERN_INFO "VLSI router pirq escape (%d)\n", pirq); |
return 0; |
} |
return read_config_nybble(router, 0x74, pirq-1); |
} |
static int pirq_vlsi_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq) |
{ |
if (pirq > 8) { |
printk(KERN_INFO "VLSI router pirq escape (%d)\n", pirq); |
return 0; |
} |
write_config_nybble(router, 0x74, pirq-1, irq); |
return 1; |
} |
/* |
* ServerWorks: PCI interrupts mapped to system IRQ lines through Index |
* and Redirect I/O registers (0x0c00 and 0x0c01). The Index register |
* format is (PCIIRQ## | 0x10), e.g.: PCIIRQ10=0x1a. The Redirect |
* register is a straight binary coding of desired PIC IRQ (low nibble). |
* |
* The 'link' value in the PIRQ table is already in the correct format |
* for the Index register. There are some special index values: |
* 0x00 for ACPI (SCI), 0x01 for USB, 0x02 for IDE0, 0x04 for IDE1, |
* and 0x03 for SMBus. |
*/ |
static int pirq_serverworks_get(struct pci_dev *router, struct pci_dev *dev, int pirq) |
{ |
outb_p(pirq, 0xc00); |
return inb(0xc01) & 0xf; |
} |
static int pirq_serverworks_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq) |
{ |
outb_p(pirq, 0xc00); |
outb_p(irq, 0xc01); |
return 1; |
} |
/* Support for AMD756 PCI IRQ Routing |
* Jhon H. Caicedo <jhcaiced@osso.org.co> |
* Jun/21/2001 0.2.0 Release, fixed to use "nybble" functions... (jhcaiced) |
* Jun/19/2001 Alpha Release 0.1.0 (jhcaiced) |
* The AMD756 pirq rules are nibble-based |
* offset 0x56 0-3 PIRQA 4-7 PIRQB |
* offset 0x57 0-3 PIRQC 4-7 PIRQD |
*/ |
static int pirq_amd756_get(struct pci_dev *router, struct pci_dev *dev, int pirq) |
{ |
u8 irq; |
irq = 0; |
if (pirq <= 4) |
{ |
irq = read_config_nybble(router, 0x56, pirq - 1); |
} |
printk(KERN_INFO "AMD756: dev %04x:%04x, router pirq : %d get irq : %2d\n", |
dev->vendor, dev->device, pirq, irq); |
return irq; |
} |
static int pirq_amd756_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq) |
{ |
printk(KERN_INFO "AMD756: dev %04x:%04x, router pirq : %d SET irq : %2d\n", |
dev->vendor, dev->device, pirq, irq); |
if (pirq <= 4) |
{ |
write_config_nybble(router, 0x56, pirq - 1, irq); |
} |
return 1; |
} |
#ifdef CONFIG_PCI_BIOS |
static int pirq_bios_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq) |
{ |
struct pci_dev *bridge; |
int pin = pci_get_interrupt_pin(dev, &bridge); |
return pcibios_set_irq_routing(bridge, pin, irq); |
} |
#endif |
static __init int intel_router_probe(struct irq_router *r, struct pci_dev *router, u16 device) |
{ |
#if 0 /* Let's see what chip this is supposed to be ... */ |
/* We must not touch 440GX even if we have tables. 440GX has |
different IRQ routing weirdness */ |
if (pci_find_device(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82440GX, NULL)) |
return 0; |
#endif |
switch(device) |
{ |
case PCI_DEVICE_ID_INTEL_82371FB_0: |
case PCI_DEVICE_ID_INTEL_82371SB_0: |
case PCI_DEVICE_ID_INTEL_82371AB_0: |
case PCI_DEVICE_ID_INTEL_82371MX: |
case PCI_DEVICE_ID_INTEL_82443MX_0: |
case PCI_DEVICE_ID_INTEL_82801AA_0: |
case PCI_DEVICE_ID_INTEL_82801AB_0: |
case PCI_DEVICE_ID_INTEL_82801BA_0: |
case PCI_DEVICE_ID_INTEL_82801BA_10: |
case PCI_DEVICE_ID_INTEL_82801CA_0: |
case PCI_DEVICE_ID_INTEL_82801CA_12: |
case PCI_DEVICE_ID_INTEL_82801DB_0: |
case PCI_DEVICE_ID_INTEL_82801E_0: |
case PCI_DEVICE_ID_INTEL_82801EB_0: |
case PCI_DEVICE_ID_INTEL_ESB_0: |
r->name = "PIIX/ICH"; |
r->get = pirq_piix_get; |
r->set = pirq_piix_set; |
return 1; |
} |
return 0; |
} |
static __init int via_router_probe(struct irq_router *r, struct pci_dev *router, u16 device) |
{ |
/* FIXME: We should move some of the quirk fixup stuff here */ |
switch(device) |
{ |
case PCI_DEVICE_ID_VIA_82C586_0: |
case PCI_DEVICE_ID_VIA_82C596: |
case PCI_DEVICE_ID_VIA_82C686: |
case PCI_DEVICE_ID_VIA_8231: |
/* FIXME: add new ones for 8233/5 */ |
r->name = "VIA"; |
r->get = pirq_via_get; |
r->set = pirq_via_set; |
return 1; |
} |
return 0; |
} |
static __init int vlsi_router_probe(struct irq_router *r, struct pci_dev *router, u16 device) |
{ |
switch(device) |
{ |
case PCI_DEVICE_ID_VLSI_82C534: |
r->name = "VLSI 82C534"; |
r->get = pirq_vlsi_get; |
r->set = pirq_vlsi_set; |
return 1; |
} |
return 0; |
} |
static __init int serverworks_router_probe(struct irq_router *r, struct pci_dev *router, u16 device) |
{ |
switch(device) |
{ |
case PCI_DEVICE_ID_SERVERWORKS_OSB4: |
case PCI_DEVICE_ID_SERVERWORKS_CSB5: |
r->name = "ServerWorks"; |
r->get = pirq_serverworks_get; |
r->set = pirq_serverworks_set; |
return 1; |
} |
return 0; |
} |
static __init int sis_router_probe(struct irq_router *r, struct pci_dev *router, u16 device) |
{ |
if (device != PCI_DEVICE_ID_SI_503) |
return 0; |
r->name = "SIS"; |
r->get = pirq_sis_get; |
r->set = pirq_sis_set; |
return 1; |
} |
static __init int cyrix_router_probe(struct irq_router *r, struct pci_dev *router, u16 device) |
{ |
switch(device) |
{ |
case PCI_DEVICE_ID_CYRIX_5520: |
r->name = "NatSemi"; |
r->get = pirq_cyrix_get; |
r->set = pirq_cyrix_set; |
return 1; |
} |
return 0; |
} |
static __init int opti_router_probe(struct irq_router *r, struct pci_dev *router, u16 device) |
{ |
switch(device) |
{ |
case PCI_DEVICE_ID_OPTI_82C700: |
r->name = "OPTI"; |
r->get = pirq_opti_get; |
r->set = pirq_opti_set; |
return 1; |
} |
return 0; |
} |
static __init int ite_router_probe(struct irq_router *r, struct pci_dev *router, u16 device) |
{ |
switch(device) |
{ |
case PCI_DEVICE_ID_ITE_IT8330G_0: |
r->name = "ITE"; |
r->get = pirq_ite_get; |
r->set = pirq_ite_set; |
return 1; |
} |
return 0; |
} |
static __init int ali_router_probe(struct irq_router *r, struct pci_dev *router, u16 device) |
{ |
switch(device) |
{ |
case PCI_DEVICE_ID_AL_M1533: |
r->name = "ALI"; |
r->get = pirq_ali_get; |
r->set = pirq_ali_set; |
return 1; |
/* Should add 156x some day */ |
} |
return 0; |
} |
static __init int amd_router_probe(struct irq_router *r, struct pci_dev *router, u16 device) |
{ |
switch(device) |
{ |
case PCI_DEVICE_ID_AMD_VIPER_740B: |
r->name = "AMD756"; |
break; |
case PCI_DEVICE_ID_AMD_VIPER_7413: |
r->name = "AMD766"; |
break; |
case PCI_DEVICE_ID_AMD_VIPER_7443: |
r->name = "AMD768"; |
break; |
default: |
return 0; |
} |
r->get = pirq_amd756_get; |
r->set = pirq_amd756_set; |
return 1; |
} |
static __initdata struct irq_router_handler pirq_routers[] = { |
{ PCI_VENDOR_ID_INTEL, intel_router_probe }, |
{ PCI_VENDOR_ID_AL, ali_router_probe }, |
{ PCI_VENDOR_ID_ITE, ite_router_probe }, |
{ PCI_VENDOR_ID_VIA, via_router_probe }, |
{ PCI_VENDOR_ID_OPTI, opti_router_probe }, |
{ PCI_VENDOR_ID_SI, sis_router_probe }, |
{ PCI_VENDOR_ID_CYRIX, cyrix_router_probe }, |
{ PCI_VENDOR_ID_VLSI, vlsi_router_probe }, |
{ PCI_VENDOR_ID_SERVERWORKS, serverworks_router_probe }, |
{ PCI_VENDOR_ID_AMD, amd_router_probe }, |
/* Someone with docs needs to add the ATI Radeon IGP */ |
{ 0, NULL } |
}; |
static struct irq_router pirq_router; |
static struct pci_dev *pirq_router_dev; |
/* |
* FIXME: should we have an option to say "generic for |
* chipset" ? |
*/ |
static void __init pirq_find_router(struct irq_router *r) |
{ |
struct irq_routing_table *rt = pirq_table; |
struct irq_router_handler *h; |
#ifdef CONFIG_PCI_BIOS |
if (!rt->signature) { |
printk(KERN_INFO "PCI: Using BIOS for IRQ routing\n"); |
r->set = pirq_bios_set; |
r->name = "BIOS"; |
return; |
} |
#endif |
/* Default unless a driver reloads it */ |
r->name = "default"; |
r->get = NULL; |
r->set = NULL; |
DBG("PCI: Attempting to find IRQ router for %04x:%04x\n", |
rt->rtr_vendor, rt->rtr_device); |
pirq_router_dev = pci_find_slot(rt->rtr_bus, rt->rtr_devfn); |
if (!pirq_router_dev) { |
DBG("PCI: Interrupt router not found at %02x:%02x\n", rt->rtr_bus, rt->rtr_devfn); |
return; |
} |
for( h = pirq_routers; h->vendor; h++) { |
/* First look for a router match */ |
if (rt->rtr_vendor == h->vendor && h->probe(r, pirq_router_dev, rt->rtr_device)) |
break; |
/* Fall back to a device match */ |
if (pirq_router_dev->vendor == h->vendor && h->probe(r, pirq_router_dev, pirq_router_dev->device)) |
break; |
} |
printk(KERN_INFO "PCI: Using IRQ router %s [%04x/%04x] at %s\n", |
pirq_router.name, |
pirq_router_dev->vendor, |
pirq_router_dev->device, |
pci_name(pirq_router_dev)); |
} |
static struct irq_info *pirq_get_info(struct pci_dev *dev) |
{ |
struct irq_routing_table *rt = pirq_table; |
int entries = (rt->size - sizeof(struct irq_routing_table)) / sizeof(struct irq_info); |
struct irq_info *info; |
for (info = rt->slots; entries--; info++) |
if (info->bus == dev->bus->number && PCI_SLOT(info->devfn) == PCI_SLOT(dev->devfn)) |
return info; |
return NULL; |
} |
static irqreturn_t pcibios_test_irq_handler(int irq, void *dev_id, struct pt_regs *regs) |
{ |
return IRQ_NONE; |
} |
static int pcibios_lookup_irq(struct pci_dev *dev, int assign) |
{ |
u8 pin; |
struct irq_info *info; |
int i, pirq, newirq; |
int irq = 0; |
u32 mask; |
struct irq_router *r = &pirq_router; |
struct pci_dev *dev2 = NULL; |
char *msg = NULL; |
/* Find IRQ pin */ |
pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &pin); |
if (!pin) { |
DBG(" -> no interrupt pin\n"); |
return 0; |
} |
pin = pin - 1; |
/* Find IRQ routing entry */ |
if (!pirq_table) |
return 0; |
DBG("IRQ for %s:%d", pci_name(dev), pin); |
info = pirq_get_info(dev); |
if (!info) { |
DBG(" -> not found in routing table\n"); |
return 0; |
} |
pirq = info->irq[pin].link; |
mask = info->irq[pin].bitmap; |
if (!pirq) { |
DBG(" -> not routed\n"); |
return 0; |
} |
DBG(" -> PIRQ %02x, mask %04x, excl %04x", pirq, mask, pirq_table->exclusive_irqs); |
mask &= pcibios_irq_mask; |
/* Work around broken HP Pavilion Notebooks which assign USB to |
IRQ 9 even though it is actually wired to IRQ 11 */ |
if (broken_hp_bios_irq9 && pirq == 0x59 && dev->irq == 9) { |
dev->irq = 11; |
pci_write_config_byte(dev, PCI_INTERRUPT_LINE, 11); |
r->set(pirq_router_dev, dev, pirq, 11); |
} |
/* |
* Find the best IRQ to assign: use the one |
* reported by the device if possible. |
*/ |
newirq = dev->irq; |
if (!((1 << newirq) & mask)) { |
if ( pci_probe & PCI_USE_PIRQ_MASK) newirq = 0; |
else printk(KERN_WARNING "PCI: IRQ %i for device %s doesn't match PIRQ mask - try pci=usepirqmask\n", newirq, pci_name(dev)); |
} |
if (!newirq && assign) { |
for (i = 0; i < 16; i++) { |
if (!(mask & (1 << i))) |
continue; |
if (pirq_penalty[i] < pirq_penalty[newirq] && |
!request_irq(i, pcibios_test_irq_handler, SA_SHIRQ, "pci-test", dev)) { |
free_irq(i, dev); |
newirq = i; |
} |
} |
} |
DBG(" -> newirq=%d", newirq); |
/* Check if it is hardcoded */ |
if ((pirq & 0xf0) == 0xf0) { |
irq = pirq & 0xf; |
DBG(" -> hardcoded IRQ %d\n", irq); |
msg = "Hardcoded"; |
} else if ( r->get && (irq = r->get(pirq_router_dev, dev, pirq)) && \ |
((!(pci_probe & PCI_USE_PIRQ_MASK)) || ((1 << irq) & mask)) ) { |
DBG(" -> got IRQ %d\n", irq); |
msg = "Found"; |
} else if (newirq && r->set && (dev->class >> 8) != PCI_CLASS_DISPLAY_VGA) { |
DBG(" -> assigning IRQ %d", newirq); |
if (r->set(pirq_router_dev, dev, pirq, newirq)) { |
eisa_set_level_irq(newirq); |
DBG(" ... OK\n"); |
msg = "Assigned"; |
irq = newirq; |
} |
} |
if (!irq) { |
DBG(" ... failed\n"); |
if (newirq && mask == (1 << newirq)) { |
msg = "Guessed"; |
irq = newirq; |
} else |
return 0; |
} |
printk(KERN_INFO "PCI: %s IRQ %d for device %s\n", msg, irq, pci_name(dev)); |
/* Update IRQ for all devices with the same pirq value */ |
while ((dev2 = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, dev2)) != NULL) { |
pci_read_config_byte(dev2, PCI_INTERRUPT_PIN, &pin); |
if (!pin) |
continue; |
pin--; |
info = pirq_get_info(dev2); |
if (!info) |
continue; |
if (info->irq[pin].link == pirq) { |
/* We refuse to override the dev->irq information. Give a warning! */ |
if ( dev2->irq && dev2->irq != irq && \ |
(!(pci_probe & PCI_USE_PIRQ_MASK) || \ |
((1 << dev2->irq) & mask)) ) { |
printk(KERN_INFO "IRQ routing conflict for %s, have irq %d, want irq %d\n", |
pci_name(dev2), dev2->irq, irq); |
continue; |
} |
dev2->irq = irq; |
pirq_penalty[irq]++; |
if (dev != dev2) |
printk(KERN_INFO "PCI: Sharing IRQ %d with %s\n", irq, pci_name(dev2)); |
} |
} |
return 1; |
} |
static void __init pcibios_fixup_irqs(void) |
{ |
struct pci_dev *dev = NULL; |
u8 pin; |
DBG("PCI: IRQ fixup\n"); |
while ((dev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) { |
/* |
* If the BIOS has set an out of range IRQ number, just ignore it. |
* Also keep track of which IRQ's are already in use. |
*/ |
if (dev->irq >= 16) { |
DBG("%s: ignoring bogus IRQ %d\n", pci_name(dev), dev->irq); |
dev->irq = 0; |
} |
/* If the IRQ is already assigned to a PCI device, ignore its ISA use penalty */ |
if (pirq_penalty[dev->irq] >= 100 && pirq_penalty[dev->irq] < 100000) |
pirq_penalty[dev->irq] = 0; |
pirq_penalty[dev->irq]++; |
} |
dev = NULL; |
while ((dev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) { |
pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &pin); |
#ifdef CONFIG_X86_IO_APIC |
/* |
* Recalculate IRQ numbers if we use the I/O APIC. |
*/ |
if (io_apic_assign_pci_irqs) |
{ |
int irq; |
if (pin) { |
pin--; /* interrupt pins are numbered starting from 1 */ |
irq = IO_APIC_get_PCI_irq_vector(dev->bus->number, PCI_SLOT(dev->devfn), pin); |
/* |
* Busses behind bridges are typically not listed in the MP-table. |
* In this case we have to look up the IRQ based on the parent bus, |
* parent slot, and pin number. The SMP code detects such bridged |
* busses itself so we should get into this branch reliably. |
*/ |
if (irq < 0 && dev->bus->parent) { /* go back to the bridge */ |
struct pci_dev * bridge = dev->bus->self; |
pin = (pin + PCI_SLOT(dev->devfn)) % 4; |
irq = IO_APIC_get_PCI_irq_vector(bridge->bus->number, |
PCI_SLOT(bridge->devfn), pin); |
if (irq >= 0) |
printk(KERN_WARNING "PCI: using PPB(B%d,I%d,P%d) to get irq %d\n", |
bridge->bus->number, PCI_SLOT(bridge->devfn), pin, irq); |
} |
if (irq >= 0) { |
printk(KERN_INFO "PCI->APIC IRQ transform: (B%d,I%d,P%d) -> %d\n", |
dev->bus->number, PCI_SLOT(dev->devfn), pin, irq); |
dev->irq = irq; |
} |
} |
} |
#endif |
/* |
* Still no IRQ? Try to lookup one... |
*/ |
if (pin && !dev->irq) |
pcibios_lookup_irq(dev, 0); |
} |
} |
int __init pcibios_irq_init(void) |
{ |
DBG("PCI: IRQ init\n"); |
if (pcibios_enable_irq) |
return 0; |
pirq_table = pirq_find_routing_table(); |
#ifdef CONFIG_PCI_BIOS |
if (!pirq_table && (pci_probe & PCI_BIOS_IRQ_SCAN)) |
pirq_table = pcibios_get_irq_routing_table(); |
#endif |
if (pirq_table) { |
pirq_peer_trick(); |
pirq_find_router(&pirq_router); |
if (pirq_table->exclusive_irqs) { |
int i; |
for (i=0; i<16; i++) |
if (!(pirq_table->exclusive_irqs & (1 << i))) |
pirq_penalty[i] += 100; |
} |
/* If we're using the I/O APIC, avoid using the PCI IRQ routing table */ |
if (io_apic_assign_pci_irqs) |
pirq_table = NULL; |
} |
pcibios_enable_irq = pirq_enable_irq; |
pcibios_fixup_irqs(); |
return 0; |
} |
subsys_initcall(pcibios_irq_init); |
void pcibios_penalize_isa_irq(int irq) |
{ |
/* |
* If any ISAPnP device reports an IRQ in its list of possible |
* IRQ's, we try to avoid assigning it to PCI devices. |
*/ |
pirq_penalty[irq] += 100; |
} |
int pirq_enable_irq(struct pci_dev *dev) |
{ |
u8 pin; |
extern int interrupt_line_quirk; |
pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &pin); |
if (pin && !pcibios_lookup_irq(dev, 1) && !dev->irq) { |
char *msg; |
if (io_apic_assign_pci_irqs) |
msg = " Probably buggy MP table."; |
else if (pci_probe & PCI_BIOS_IRQ_SCAN) |
msg = ""; |
else |
msg = " Please try using pci=biosirq."; |
/* With IDE legacy devices the IRQ lookup failure is not a problem.. */ |
if (dev->class >> 8 == PCI_CLASS_STORAGE_IDE && !(dev->class & 0x5)) |
return 0; |
printk(KERN_WARNING "PCI: No IRQ known for interrupt pin %c of device %s.%s\n", |
'A' + pin - 1, pci_name(dev), msg); |
} |
/* VIA bridges use interrupt line for apic/pci steering across |
the V-Link */ |
else if (interrupt_line_quirk) |
pci_write_config_byte(dev, PCI_INTERRUPT_LINE, dev->irq); |
return 0; |
} |
/shark/trunk/drivers/pci/fixup.c |
---|
0,0 → 1,211 |
/* |
* Exceptions for specific devices. Usually work-arounds for fatal design flaws. |
*/ |
#include <linuxcomp.h> |
#include <linux/pci.h> |
#include <linux/init.h> |
#include "pci2.h" |
static void __devinit pci_fixup_i450nx(struct pci_dev *d) |
{ |
/* |
* i450NX -- Find and scan all secondary buses on all PXB's. |
*/ |
int pxb, reg; |
u8 busno, suba, subb; |
printk(KERN_WARNING "PCI: Searching for i450NX host bridges on %s\n", pci_name(d)); |
reg = 0xd0; |
for(pxb=0; pxb<2; pxb++) { |
pci_read_config_byte(d, reg++, &busno); |
pci_read_config_byte(d, reg++, &suba); |
pci_read_config_byte(d, reg++, &subb); |
DBG("i450NX PXB %d: %02x/%02x/%02x\n", pxb, busno, suba, subb); |
if (busno) |
pci_scan_bus(busno, &pci_root_ops, NULL); /* Bus A */ |
if (suba < subb) |
pci_scan_bus(suba+1, &pci_root_ops, NULL); /* Bus B */ |
} |
pcibios_last_bus = -1; |
} |
static void __devinit pci_fixup_i450gx(struct pci_dev *d) |
{ |
/* |
* i450GX and i450KX -- Find and scan all secondary buses. |
* (called separately for each PCI bridge found) |
*/ |
u8 busno; |
pci_read_config_byte(d, 0x4a, &busno); |
printk(KERN_INFO "PCI: i440KX/GX host bridge %s: secondary bus %02x\n", pci_name(d), busno); |
pci_scan_bus(busno, &pci_root_ops, NULL); |
pcibios_last_bus = -1; |
} |
static void __devinit pci_fixup_umc_ide(struct pci_dev *d) |
{ |
/* |
* UM8886BF IDE controller sets region type bits incorrectly, |
* therefore they look like memory despite of them being I/O. |
*/ |
int i; |
printk(KERN_WARNING "PCI: Fixing base address flags for device %s\n", pci_name(d)); |
for(i=0; i<4; i++) |
d->resource[i].flags |= PCI_BASE_ADDRESS_SPACE_IO; |
} |
static void __devinit pci_fixup_ncr53c810(struct pci_dev *d) |
{ |
/* |
* NCR 53C810 returns class code 0 (at least on some systems). |
* Fix class to be PCI_CLASS_STORAGE_SCSI |
*/ |
if (!d->class) { |
printk(KERN_WARNING "PCI: fixing NCR 53C810 class code for %s\n", pci_name(d)); |
d->class = PCI_CLASS_STORAGE_SCSI << 8; |
} |
} |
static void __devinit pci_fixup_ide_bases(struct pci_dev *d) |
{ |
int i; |
/* |
* PCI IDE controllers use non-standard I/O port decoding, respect it. |
*/ |
if ((d->class >> 8) != PCI_CLASS_STORAGE_IDE) |
return; |
DBG("PCI: IDE base address fixup for %s\n", pci_name(d)); |
for(i=0; i<4; i++) { |
struct resource *r = &d->resource[i]; |
if ((r->start & ~0x80) == 0x374) { |
r->start |= 2; |
r->end = r->start; |
} |
} |
} |
static void __devinit pci_fixup_ide_trash(struct pci_dev *d) |
{ |
int i; |
/* |
* There exist PCI IDE controllers which have utter garbage |
* in first four base registers. Ignore that. |
*/ |
DBG("PCI: IDE base address trash cleared for %s\n", pci_name(d)); |
for(i=0; i<4; i++) |
d->resource[i].start = d->resource[i].end = d->resource[i].flags = 0; |
} |
static void __devinit pci_fixup_latency(struct pci_dev *d) |
{ |
/* |
* SiS 5597 and 5598 chipsets require latency timer set to |
* at most 32 to avoid lockups. |
*/ |
DBG("PCI: Setting max latency to 32\n"); |
pcibios_max_latency = 32; |
} |
static void __devinit pci_fixup_piix4_acpi(struct pci_dev *d) |
{ |
/* |
* PIIX4 ACPI device: hardwired IRQ9 |
*/ |
d->irq = 9; |
} |
/* |
* Addresses issues with problems in the memory write queue timer in |
* certain VIA Northbridges. This bugfix is per VIA's specifications, |
* except for the KL133/KM133: clearing bit 5 on those Northbridges seems |
* to trigger a bug in its integrated ProSavage video card, which |
* causes screen corruption. We only clear bits 6 and 7 for that chipset, |
* until VIA can provide us with definitive information on why screen |
* corruption occurs, and what exactly those bits do. |
* |
* VIA 8363,8622,8361 Northbridges: |
* - bits 5, 6, 7 at offset 0x55 need to be turned off |
* VIA 8367 (KT266x) Northbridges: |
* - bits 5, 6, 7 at offset 0x95 need to be turned off |
* VIA 8363 rev 0x81/0x84 (KL133/KM133) Northbridges: |
* - bits 6, 7 at offset 0x55 need to be turned off |
*/ |
#define VIA_8363_KL133_REVISION_ID 0x81 |
#define VIA_8363_KM133_REVISION_ID 0x84 |
static void __devinit pci_fixup_via_northbridge_bug(struct pci_dev *d) |
{ |
u8 v; |
u8 revision; |
int where = 0x55; |
int mask = 0x1f; /* clear bits 5, 6, 7 by default */ |
pci_read_config_byte(d, PCI_REVISION_ID, &revision); |
if (d->device == PCI_DEVICE_ID_VIA_8367_0) { |
/* fix pci bus latency issues resulted by NB bios error |
it appears on bug free^Wreduced kt266x's bios forces |
NB latency to zero */ |
pci_write_config_byte(d, PCI_LATENCY_TIMER, 0); |
where = 0x95; /* the memory write queue timer register is |
different for the KT266x's: 0x95 not 0x55 */ |
} else if (d->device == PCI_DEVICE_ID_VIA_8363_0 && |
(revision == VIA_8363_KL133_REVISION_ID || |
revision == VIA_8363_KM133_REVISION_ID)) { |
mask = 0x3f; /* clear only bits 6 and 7; clearing bit 5 |
causes screen corruption on the KL133/KM133 */ |
} |
pci_read_config_byte(d, where, &v); |
if (v & ~mask) { |
printk(KERN_WARNING "Disabling VIA memory write queue (PCI ID %04x, rev %02x): [%02x] %02x & %02x -> %02x\n", \ |
d->device, revision, where, v, mask, v & mask); |
v &= mask; |
pci_write_config_byte(d, where, v); |
} |
} |
/* |
* For some reasons Intel decided that certain parts of their |
* 815, 845 and some other chipsets must look like PCI-to-PCI bridges |
* while they are obviously not. The 82801 family (AA, AB, BAM/CAM, |
* BA/CA/DB and E) PCI bridges are actually HUB-to-PCI ones, according |
* to Intel terminology. These devices do forward all addresses from |
* system to PCI bus no matter what are their window settings, so they are |
* "transparent" (or subtractive decoding) from programmers point of view. |
*/ |
static void __devinit pci_fixup_transparent_bridge(struct pci_dev *dev) |
{ |
if ((dev->class >> 8) == PCI_CLASS_BRIDGE_PCI && |
(dev->device & 0xff00) == 0x2400) |
dev->transparent = 1; |
} |
struct pci_fixup pcibios_fixups[] = { |
{ PCI_FIXUP_HEADER, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82451NX, pci_fixup_i450nx }, |
{ PCI_FIXUP_HEADER, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82454GX, pci_fixup_i450gx }, |
{ PCI_FIXUP_HEADER, PCI_VENDOR_ID_UMC, PCI_DEVICE_ID_UMC_UM8886BF, pci_fixup_umc_ide }, |
{ PCI_FIXUP_HEADER, PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_5513, pci_fixup_ide_trash }, |
{ PCI_FIXUP_HEADER, PCI_ANY_ID, PCI_ANY_ID, pci_fixup_ide_bases }, |
{ PCI_FIXUP_HEADER, PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_5597, pci_fixup_latency }, |
{ PCI_FIXUP_HEADER, PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_5598, pci_fixup_latency }, |
{ PCI_FIXUP_HEADER, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371AB_3, pci_fixup_piix4_acpi }, |
{ PCI_FIXUP_HEADER, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_10, pci_fixup_ide_trash }, |
{ PCI_FIXUP_HEADER, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_11, pci_fixup_ide_trash }, |
{ PCI_FIXUP_HEADER, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_9, pci_fixup_ide_trash }, |
{ PCI_FIXUP_HEADER, PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8363_0, pci_fixup_via_northbridge_bug }, |
{ PCI_FIXUP_HEADER, PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8622, pci_fixup_via_northbridge_bug }, |
{ PCI_FIXUP_HEADER, PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8361, pci_fixup_via_northbridge_bug }, |
{ PCI_FIXUP_HEADER, PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8367_0, pci_fixup_via_northbridge_bug }, |
{ PCI_FIXUP_HEADER, PCI_VENDOR_ID_NCR, PCI_DEVICE_ID_NCR_53C810, pci_fixup_ncr53c810 }, |
{ PCI_FIXUP_HEADER, PCI_VENDOR_ID_INTEL, PCI_ANY_ID, pci_fixup_transparent_bridge }, |
{ 0 } |
}; |
/shark/trunk/drivers/pci/makefile |
---|
0,0 → 1,27 |
# PCI support from linux 2.6.0 |
ifndef BASE |
BASE=../.. |
endif |
include $(BASE)/config/config.mk |
LIBRARY = pci |
OBJS_PATH = $(BASE)/drivers/pci |
OBJS = access.o bus.o names.o pci.o pci-driver.o\ |
pool.o probe.o quirks.o remove.o search.o setup-res.o\ |
setup-irq.o setup-bus.o syscall.o i386.o common.o\ |
fixup.o irq.o legacy.o pcbios.o direct.o shark_pci26.o \ |
pci20to26.o |
OTHERINCL += -I$(BASE)/drivers/linuxc26/include |
C_OPT += -D__KERNEL__ |
include $(BASE)/config/lib.mk |
clean:: |
rm -f $(OBJS) |
/shark/trunk/drivers/pci/remove.c |
---|
0,0 → 1,115 |
#include <linuxcomp.h> |
#include <linux/pci.h> |
#include <linux/module.h> |
#include "pci.h" |
//#define DEBUG |
#ifdef DEBUG |
#define DBG(x...) printk(x) |
#else |
#define DBG(x...) |
#endif |
static void pci_free_resources(struct pci_dev *dev) |
{ |
int i; |
for (i = 0; i < PCI_NUM_RESOURCES; i++) { |
struct resource *res = dev->resource + i; |
if (res->parent) |
release_resource(res); |
} |
} |
static void pci_destroy_dev(struct pci_dev *dev) |
{ |
pci_proc_detach_device(dev); |
device_unregister(&dev->dev); |
/* Remove the device from the device lists, and prevent any further |
* list accesses from this device */ |
spin_lock(&pci_bus_lock); |
list_del(&dev->bus_list); |
list_del(&dev->global_list); |
dev->bus_list.next = dev->bus_list.prev = NULL; |
dev->global_list.next = dev->global_list.prev = NULL; |
spin_unlock(&pci_bus_lock); |
pci_free_resources(dev); |
pci_dev_put(dev); |
} |
/** |
* pci_remove_device_safe - remove an unused hotplug device |
* @dev: the device to remove |
* |
* Delete the device structure from the device lists and |
* notify userspace (/sbin/hotplug), but only if the device |
* in question is not being used by a driver. |
* Returns 0 on success. |
*/ |
int pci_remove_device_safe(struct pci_dev *dev) |
{ |
if (pci_dev_driver(dev)) |
return -EBUSY; |
pci_destroy_dev(dev); |
return 0; |
} |
EXPORT_SYMBOL(pci_remove_device_safe); |
/** |
* pci_remove_bus_device - remove a PCI device and any children |
* @dev: the device to remove |
* |
* Remove a PCI device from the device lists, informing the drivers |
* that the device has been removed. We also remove any subordinate |
* buses and children in a depth-first manner. |
* |
* For each device we remove, delete the device structure from the |
* device lists, remove the /proc entry, and notify userspace |
* (/sbin/hotplug). |
*/ |
void pci_remove_bus_device(struct pci_dev *dev) |
{ |
if (dev->subordinate) { |
struct pci_bus *b = dev->subordinate; |
pci_remove_behind_bridge(dev); |
pci_proc_detach_bus(b); |
spin_lock(&pci_bus_lock); |
list_del(&b->node); |
spin_unlock(&pci_bus_lock); |
kfree(b); |
dev->subordinate = NULL; |
} |
pci_destroy_dev(dev); |
} |
/** |
* pci_remove_behind_bridge - remove all devices behind a PCI bridge |
* @dev: PCI bridge device |
* |
* Remove all devices on the bus, except for the parent bridge. |
* This also removes any child buses, and any devices they may |
* contain in a depth-first manner. |
*/ |
void pci_remove_behind_bridge(struct pci_dev *dev) |
{ |
struct list_head *l, *n; |
if (dev->subordinate) { |
list_for_each_safe(l, n, &dev->subordinate->devices) { |
struct pci_dev *dev = pci_dev_b(l); |
pci_remove_bus_device(dev); |
} |
} |
} |
EXPORT_SYMBOL(pci_remove_bus_device); |
EXPORT_SYMBOL(pci_remove_behind_bridge); |