--- linux-2.4.3-orig/include/linux/pci.h Wed Apr 4 19:46:49 2001 +++ linux/include/linux/pci.h Sat Apr 7 20:01:51 2001 @@ -454,6 +454,9 @@ void (*remove)(struct pci_dev *dev); /* Device removed (NULL if not a hot-plug capable driver) */ void (*suspend)(struct pci_dev *dev); /* Device suspended */ void (*resume)(struct pci_dev *dev); /* Device woken up */ + int multifunction_quirks; /* Quirks for PCI serial+parport cards, + here multiple drivers are allowed to register + for the same pci id match */ }; --- linux-2.4.3-orig/drivers/pci/pci.c Wed Apr 4 19:46:46 2001 +++ linux/drivers/pci/pci.c Sat Apr 7 19:59:47 2001 @@ -453,7 +453,7 @@ list_add_tail(&drv->node, &pci_drivers); pci_for_each_dev(dev) { - if (!pci_dev_driver(dev)) + if (!pci_dev_driver(dev) || drv->multifunction_quirks) count += pci_announce_device(drv, dev); } return count; --- linux-2.4.3-orig/drivers/parport/parport_pc.c Wed Apr 4 19:46:46 2001 +++ linux/drivers/parport/parport_pc.c Sat Apr 7 20:18:37 2001 @@ -2539,6 +2539,7 @@ name: "parport_pc", id_table: parport_pc_pci_tbl, probe: parport_pc_pci_probe, + multifunction_quirks: 1, }; static int __init parport_pc_init_superio (void) --- linux-2.4.3-orig/drivers/char/serial.c Wed Apr 4 19:46:43 2001 +++ linux/drivers/char/serial.c Sat Apr 7 20:00:00 2001 @@ -4178,7 +4178,7 @@ for (i=0; timedia_data[i].num; i++) { ids = timedia_data[i].ids; for (j=0; ids[j]; j++) { - if (pci_get_subvendor(dev) == ids[j]) { + if (pci_get_subdevice(dev) == ids[j]) { board->num_ports = timedia_data[i].num; return 0; } @@ -4718,6 +4718,7 @@ probe: serial_init_one, remove: serial_remove_one, id_table: serial_pci_tbl, + multifunction_quirks: 1, };