diff -urN hotplug/pci_hotplug_util.c hotplug_all_1030/pci_hotplug_util.c --- hotplug/pci_hotplug_util.c Wed Oct 30 16:43:07 2002 +++ hotplug_all_1030/pci_hotplug_util.c Fri Nov 1 18:56:34 2002 @@ -153,6 +153,124 @@ return result; } +#define BARE_PCI_ACCESS +#ifdef BARE_PCI_ACCESS +static struct pci_bus *root_pci_bus; +static struct pci_bus *get_temporary_pci_bus(int busnum) +{ + static int first = 1; + struct pci_bus *pbus; + struct list_head *lh; + + if (first) { + list_for_each (lh, &pci_root_buses) { + pbus = (struct pci_bus *) pci_bus_b(lh); + if (pbus) + if (pbus->number == 0) { + root_pci_bus = pbus; + first = 0; + } + } + } + if (!root_pci_bus) + return NULL; + + pbus = kmalloc(sizeof(struct pci_bus), GFP_KERNEL); + if (pbus) { + memset(pbus, 0, sizeof(struct pci_bus)); + pbus->number = busnum; + pbus->ops = root_pci_bus->ops; + } + + return pbus; +} + +static int get_pci_bus ( + int segnum, int busnum, int devnum, int funcnum, struct pci_bus **pbus) +{ + struct pci_dev *pdev = pci_find_slot(busnum, PCI_DEVFN(devnum, funcnum)); + int is_temp = 0; + + if (pdev && pdev->bus) + *pbus = pdev->bus; + else { + *pbus = get_temporary_pci_bus(busnum); + is_temp++; + } + return is_temp; +} + +int pci_config_bare_read (int segnum, int busnum, int devnum, int funcnum, + int loc, int size, u32 *value) +{ + struct pci_bus *pbus; + int retval, is_temp = get_pci_bus(segnum, busnum, devnum, funcnum, &pbus); + + if (!pbus) + return -ENODEV; + + *value = 0x00; + + switch (size) { + case 1: + retval = pci_bus_read_config_byte + (pbus, PCI_DEVFN(devnum, funcnum), loc, (u8 *)value); + break; + case 2: + retval = pci_bus_read_config_word + (pbus, PCI_DEVFN(devnum, funcnum), loc, (u16 *)value); + break; + case 4: + retval = pci_bus_read_config_dword + (pbus, PCI_DEVFN(devnum, funcnum), loc, value); + break; + default: + retval = -ENODEV; + break; + } + + if (is_temp) + kfree(pbus); + + return retval; +} + +int pci_config_bare_write (int segnum, int busnum, int devnum, int funcnum, + int loc, int size, u32 value) +{ + struct pci_bus *pbus; + int retval, is_temp = get_pci_bus(segnum, busnum, devnum, funcnum, &pbus); + + if (!pbus) + return -ENODEV; + + switch (size) { + case 1: + retval = pci_bus_write_config_byte + (pbus, PCI_DEVFN(devnum, funcnum), loc, (u8)value); + break; + case 2: + retval = pci_bus_write_config_word + (pbus, PCI_DEVFN(devnum, funcnum), loc, (u16)value); + break; + case 4: + retval = pci_bus_write_config_dword + (pbus, PCI_DEVFN(devnum, funcnum), loc, value); + break; + default: + retval = -ENODEV; + break; + } + + if (is_temp) + kfree(pbus); + + return retval; +} + +EXPORT_SYMBOL(pci_config_bare_read); +EXPORT_SYMBOL(pci_config_bare_write); +#endif EXPORT_SYMBOL(pci_visit_dev);