* [BK PATCH] PCI changes and fixes for 2.5.72 @ 2003-06-19 23:37 Greg KH 2003-06-19 23:39 ` [PATCH] " Greg KH 0 siblings, 1 reply; 9+ messages in thread From: Greg KH @ 2003-06-19 23:37 UTC (permalink / raw) To: torvalds; +Cc: linux-kernel Hi, Here's some PCI changes that are against the latest 2.5.72 bk tree. They contain a number of different pci core changes, all listed below. Included in these patches is the pci list locking patch that has been reviewed a bunch on lkml. Please pull from: bk://kernel.bkbits.net/gregkh/linux/pci-2.5 thanks, greg k-h p.s. I'll send these as patches in response to this email to lkml for those who want to see them. MAINTAINERS | 6 - arch/i386/pci/common.c | 23 ++++++ arch/i386/pci/direct.c | 82 +++++++----------------- arch/i386/pci/fixup.c | 6 - arch/i386/pci/irq.c | 2 arch/i386/pci/legacy.c | 6 - arch/i386/pci/numa.c | 26 ++----- arch/i386/pci/pcbios.c | 22 +----- arch/i386/pci/pci.h | 2 arch/ia64/pci/pci.c | 33 +++++----- drivers/acpi/osl.c | 41 +++--------- drivers/acpi/pci_root.c | 2 drivers/pci/bus.c | 6 + drivers/pci/hotplug.c | 36 +++++++--- drivers/pci/pci-driver.c | 20 +++--- drivers/pci/pci-sysfs.c | 24 +++---- drivers/pci/pci.h | 3 drivers/pci/probe.c | 2 drivers/pci/proc.c | 53 +++++++++------- drivers/pci/search.c | 155 +++++++++++++++++++++++++++++++++++++++++------ include/linux/pci.h | 41 ++++++++---- 21 files changed, 351 insertions(+), 240 deletions(-) ----- David Mosberger: o PCI: move pci_domain_nr() inside "#ifdef CONFIG_PCI" bracket Greg Kroah-Hartman: o PCI: rename pci_get_dev() and pci_put_dev() to pci_dev_get() and pci_dev_put() o PCI: well, everyone is treating me like the maintainer o PCI: merge bits missed from the pci locking patch o PCI: add locking to the pci device lists Matthew Wilcox: o PCI: pci_raw_ops patch to fix acpi on ia64 o PCI: Unconfuse /proc o PCI: Tidy up sysfs a bit ^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH] PCI changes and fixes for 2.5.72 2003-06-19 23:37 [BK PATCH] PCI changes and fixes for 2.5.72 Greg KH @ 2003-06-19 23:39 ` Greg KH 2003-06-19 23:39 ` Greg KH 0 siblings, 1 reply; 9+ messages in thread From: Greg KH @ 2003-06-19 23:39 UTC (permalink / raw) To: linux-kernel ChangeSet 1.1327.5.1, 2003/06/16 16:43:45-07:00, willy@debian.org [PATCH] PCI: Tidy up sysfs a bit This patch contains a set of uncontroversial changes to PCI sysfs. - Always output 64-bit resources so userspace doesn't need ifdefs and 32-bit userspace works on 64-bit architectures. Separate them with spaces rather than tabs. - Prefix hex quantities with "0x" - Always show 7 resources for non-bridge devices, and all resources for bridges rather than stopping on the first empty resource. drivers/pci/pci-sysfs.c | 24 +++++++++++------------- 1 files changed, 11 insertions(+), 13 deletions(-) diff -Nru a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c --- a/drivers/pci/pci-sysfs.c Thu Jun 19 16:32:26 2003 +++ b/drivers/pci/pci-sysfs.c Thu Jun 19 16:32:26 2003 @@ -18,12 +18,6 @@ #include "pci.h" -#if BITS_PER_LONG == 32 -#define LONG_FORMAT "\t%08lx" -#else -#define LONG_FORMAT "\t%16lx" -#endif - /* show configuration fields */ #define pci_config_attr(field, format_string) \ static ssize_t \ @@ -36,11 +30,11 @@ } \ static DEVICE_ATTR(field, S_IRUGO, show_##field, NULL); -pci_config_attr(vendor, "%04x\n"); -pci_config_attr(device, "%04x\n"); -pci_config_attr(subsystem_vendor, "%04x\n"); -pci_config_attr(subsystem_device, "%04x\n"); -pci_config_attr(class, "%06x\n"); +pci_config_attr(vendor, "0x%04x\n"); +pci_config_attr(device, "0x%04x\n"); +pci_config_attr(subsystem_vendor, "0x%04x\n"); +pci_config_attr(subsystem_device, "0x%04x\n"); +pci_config_attr(class, "0x%06x\n"); pci_config_attr(irq, "%u\n"); /* show resources */ @@ -50,9 +44,13 @@ struct pci_dev * pci_dev = to_pci_dev(dev); char * str = buf; int i; + int max = 7; + + if (pci_dev->subordinate) + max = DEVICE_COUNT_RESOURCE; - for (i = 0; i < DEVICE_COUNT_RESOURCE && pci_resource_start(pci_dev,i); i++) { - str += sprintf(str,LONG_FORMAT LONG_FORMAT LONG_FORMAT "\n", + for (i = 0; i < max; i++) { + str += sprintf(str,"0x%016lx 0x%016lx 0x%016lx\n", pci_resource_start(pci_dev,i), pci_resource_end(pci_dev,i), pci_resource_flags(pci_dev,i)); ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] PCI changes and fixes for 2.5.72 2003-06-19 23:39 ` [PATCH] " Greg KH @ 2003-06-19 23:39 ` Greg KH 2003-06-19 23:39 ` Greg KH 0 siblings, 1 reply; 9+ messages in thread From: Greg KH @ 2003-06-19 23:39 UTC (permalink / raw) To: linux-kernel ChangeSet 1.1327.5.2, 2003/06/16 16:44:06-07:00, willy@debian.org [PATCH] PCI: Unconfuse /proc If we are to cope with multiple domains with clashing PCI bus numbers, we must refrain from creating two directories of the same name in /proc/bus/pci. This is one solution to the problem; busses with a non-zero domain number get it prepended. Alternative solutions include cowardly refusing to create non-domain-zero bus directories, refusing to create directories with clashing names, and sticking our heads in the sand and pretending the problem doesn't exist. drivers/pci/proc.c | 6 +++++- 1 files changed, 5 insertions(+), 1 deletion(-) diff -Nru a/drivers/pci/proc.c b/drivers/pci/proc.c --- a/drivers/pci/proc.c Thu Jun 19 16:32:21 2003 +++ b/drivers/pci/proc.c Thu Jun 19 16:32:21 2003 @@ -383,7 +383,11 @@ return -EACCES; if (!(de = bus->procdir)) { - sprintf(name, "%02x", bus->number); + if (pci_domain_nr(bus) == 0) { + sprintf(name, "%02x", bus->number); + } else { + sprintf(name, "%04x:%02x", pci_domain_nr(bus), bus->number); + } de = bus->procdir = proc_mkdir(name, proc_bus_pci_dir); if (!de) return -ENOMEM; ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] PCI changes and fixes for 2.5.72 2003-06-19 23:39 ` Greg KH @ 2003-06-19 23:39 ` Greg KH 2003-06-19 23:39 ` Greg KH 0 siblings, 1 reply; 9+ messages in thread From: Greg KH @ 2003-06-19 23:39 UTC (permalink / raw) To: linux-kernel ChangeSet 1.1327.5.3, 2003/06/18 14:56:52-07:00, davidm@napali.hpl.hp.com [PATCH] PCI: move pci_domain_nr() inside "#ifdef CONFIG_PCI" bracket Trivial build fix: pci_domain_nr() cannot be declared unless CONFIG_PCI is defined (otherwise, struct pci_bus hasn't been defined). include/linux/pci.h | 19 +++++++++---------- 1 files changed, 9 insertions(+), 10 deletions(-) diff -Nru a/include/linux/pci.h b/include/linux/pci.h --- a/include/linux/pci.h Thu Jun 19 16:32:17 2003 +++ b/include/linux/pci.h Thu Jun 19 16:32:17 2003 @@ -743,6 +743,15 @@ return rc; } +/* + * PCI domain support. Sometimes called PCI segment (eg by ACPI), + * a PCI domain is defined to be a set of PCI busses which share + * configuration space. + */ +#ifndef CONFIG_PCI_DOMAINS +static inline int pci_domain_nr(struct pci_bus *bus) { return 0; } +#endif + #endif /* !CONFIG_PCI */ /* these helpers provide future and backwards compatibility @@ -799,16 +808,6 @@ #define PCIPCI_VIAETBF 8 #define PCIPCI_VSFX 16 #define PCIPCI_ALIMAGIK 32 - -/* - * PCI domain support. Sometimes called PCI segment (eg by ACPI), - * a PCI domain is defined to be a set of PCI busses which share - * configuration space. - */ - -#ifndef CONFIG_PCI_DOMAINS -static inline int pci_domain_nr(struct pci_bus *bus) { return 0; } -#endif #endif /* __KERNEL__ */ #endif /* LINUX_PCI_H */ ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] PCI changes and fixes for 2.5.72 2003-06-19 23:39 ` Greg KH @ 2003-06-19 23:39 ` Greg KH 2003-06-19 23:39 ` Greg KH 0 siblings, 1 reply; 9+ messages in thread From: Greg KH @ 2003-06-19 23:39 UTC (permalink / raw) To: linux-kernel ChangeSet 1.1327.5.4, 2003/06/19 15:03:04-07:00, greg@kroah.com PCI: add locking to the pci device lists. This also creates two new functions, pci_get_device() and pci_get_subsys() which should be used from now on instead of pci_find_device() and pci_find_subsys(). Thanks to Chris Wright and Andrew Morton for help in reviewing these changes. drivers/pci/hotplug.c | 34 +++++++---- drivers/pci/pci.h | 3 drivers/pci/proc.c | 43 +++++++------- drivers/pci/search.c | 151 ++++++++++++++++++++++++++++++++++++++++++++------ include/linux/pci.h | 11 +++ 5 files changed, 196 insertions(+), 46 deletions(-) diff -Nru a/drivers/pci/hotplug.c b/drivers/pci/hotplug.c --- a/drivers/pci/hotplug.c Thu Jun 19 16:32:12 2003 +++ b/drivers/pci/hotplug.c Thu Jun 19 16:32:12 2003 @@ -173,6 +173,24 @@ } EXPORT_SYMBOL(pci_visit_dev); +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_put_dev(dev); +} + /** * pci_remove_device_safe - remove an unused hotplug device * @dev: the device to remove @@ -186,11 +204,7 @@ { if (pci_dev_driver(dev)) return -EBUSY; - device_unregister(&dev->dev); - list_del(&dev->bus_list); - list_del(&dev->global_list); - pci_free_resources(dev); - pci_proc_detach_device(dev); + pci_destroy_dev(dev); return 0; } EXPORT_SYMBOL(pci_remove_device_safe); @@ -237,17 +251,15 @@ 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; } - device_unregister(&dev->dev); - list_del(&dev->bus_list); - list_del(&dev->global_list); - pci_free_resources(dev); - pci_proc_detach_device(dev); - pci_put_dev(dev); + pci_destroy_dev(dev); } /** diff -Nru a/drivers/pci/pci.h b/drivers/pci/pci.h --- a/drivers/pci/pci.h Thu Jun 19 16:32:12 2003 +++ b/drivers/pci/pci.h Thu Jun 19 16:32:12 2003 @@ -58,3 +58,6 @@ 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; diff -Nru a/drivers/pci/proc.c b/drivers/pci/proc.c --- a/drivers/pci/proc.c Thu Jun 19 16:32:12 2003 +++ b/drivers/pci/proc.c Thu Jun 19 16:32:12 2003 @@ -308,39 +308,45 @@ /* iterator */ static void *pci_seq_start(struct seq_file *m, loff_t *pos) { - struct list_head *p = &pci_devices; + struct pci_dev *dev = NULL; loff_t n = *pos; - /* XXX: surely we need some locking for traversing the list? */ + dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev); while (n--) { - p = p->next; - if (p == &pci_devices) - return NULL; + dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev); + if (dev == NULL) + goto exit; } - return p; +exit: + return dev; } + static void *pci_seq_next(struct seq_file *m, void *v, loff_t *pos) { - struct list_head *p = v; + struct pci_dev *dev = v; + (*pos)++; - return p->next != &pci_devices ? (void *)p->next : NULL; + dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev); + return dev; } + static void pci_seq_stop(struct seq_file *m, void *v) { - /* release whatever locks we need */ + if (v) { + struct pci_dev *dev = v; + pci_put_dev(dev); + } } static int show_device(struct seq_file *m, void *v) { - struct list_head *p = v; - const struct pci_dev *dev; + const struct pci_dev *dev = v; const struct pci_driver *drv; int i; - if (p == &pci_devices) + if (dev == NULL) return 0; - dev = pci_dev_g(p); drv = pci_dev_driver(dev); seq_printf(m, "%02x%02x\t%04x%04x\t%x", dev->bus->number, @@ -455,19 +461,18 @@ */ static int show_dev_config(struct seq_file *m, void *v) { - struct list_head *p = v; - struct pci_dev *dev; + struct pci_dev *dev = v; + struct pci_dev *first_dev; struct pci_driver *drv; u32 class_rev; unsigned char latency, min_gnt, max_lat, *class; int reg; - if (p == &pci_devices) { + first_dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, NULL); + if (dev == first_dev) seq_puts(m, "PCI devices found:\n"); - return 0; - } + pci_put_dev(first_dev); - dev = pci_dev_g(p); drv = pci_dev_driver(dev); pci_read_config_dword(dev, PCI_CLASS_REVISION, &class_rev); diff -Nru a/drivers/pci/search.c b/drivers/pci/search.c --- a/drivers/pci/search.c Thu Jun 19 16:32:12 2003 +++ b/drivers/pci/search.c Thu Jun 19 16:32:12 2003 @@ -1,6 +1,17 @@ +/* + * 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 <linux/pci.h> #include <linux/module.h> +spinlock_t pci_bus_lock = SPIN_LOCK_UNLOCKED; + static struct pci_bus * pci_do_find_bus(struct pci_bus* bus, unsigned char busnr) { @@ -52,11 +63,15 @@ struct pci_bus * pci_find_next_bus(const struct pci_bus *from) { - struct list_head *n = from ? from->node.next : pci_root_buses.next; + struct list_head *n; struct pci_bus *b = NULL; + WARN_ON(irqs_disabled()); + 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; } @@ -97,24 +112,36 @@ * 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 = from ? from->global_list.next : pci_devices.next; + struct list_head *n; + struct pci_dev *dev; + + WARN_ON(irqs_disabled()); + spin_lock(&pci_bus_lock); + n = from ? from->global_list.next : pci_devices.next; - while (n != &pci_devices) { - struct pci_dev *dev = pci_dev_g(n); + 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)) - return dev; + goto exit; n = n->next; } - return NULL; + dev = NULL; +exit: + spin_unlock(&pci_bus_lock); + return dev; } /** @@ -128,6 +155,10 @@ * 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) @@ -135,6 +166,77 @@ 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(irqs_disabled()); + 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_put_dev(from); + dev = pci_get_dev(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 @@ -151,16 +253,24 @@ struct pci_dev * pci_find_device_reverse(unsigned int vendor, unsigned int device, const struct pci_dev *from) { - struct list_head *n = from ? from->global_list.prev : pci_devices.prev; + struct list_head *n; + struct pci_dev *dev; - while (n != &pci_devices) { - struct pci_dev *dev = pci_dev_g(n); + WARN_ON(irqs_disabled()); + 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)) - return dev; + goto exit; n = n->prev; } - return NULL; + dev = NULL; +exit: + spin_unlock(&pci_bus_lock); + return dev; } @@ -179,15 +289,22 @@ struct pci_dev * pci_find_class(unsigned int class, const struct pci_dev *from) { - struct list_head *n = from ? from->global_list.next : pci_devices.next; + struct list_head *n; + struct pci_dev *dev; - while (n != &pci_devices) { - struct pci_dev *dev = pci_dev_g(n); + 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) - return dev; + goto exit; n = n->next; } - return NULL; + dev = NULL; +exit: + spin_unlock(&pci_bus_lock); + return dev; } EXPORT_SYMBOL(pci_find_bus); @@ -196,3 +313,5 @@ 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); diff -Nru a/include/linux/pci.h b/include/linux/pci.h --- a/include/linux/pci.h Thu Jun 19 16:32:12 2003 +++ b/include/linux/pci.h Thu Jun 19 16:32:12 2003 @@ -566,6 +566,10 @@ int pci_find_capability (struct pci_dev *dev, int cap); struct pci_bus * pci_find_next_bus(const struct pci_bus *from); +struct pci_dev *pci_get_device (unsigned int vendor, unsigned int device, struct pci_dev *from); +struct pci_dev *pci_get_subsys (unsigned int vendor, unsigned int device, + unsigned int ss_vendor, unsigned int ss_device, + struct pci_dev *from); int pci_bus_read_config_byte (struct pci_bus *bus, unsigned int devfn, int where, u8 *val); int pci_bus_read_config_word (struct pci_bus *bus, unsigned int devfn, int where, u16 *val); int pci_bus_read_config_dword (struct pci_bus *bus, unsigned int devfn, int where, u32 *val); @@ -686,6 +690,13 @@ static inline 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) +{ return NULL; } + +static inline struct pci_dev *pci_get_device (unsigned int vendor, unsigned int device, struct pci_dev *from) +{ return NULL; } + +static inline struct pci_dev *pci_get_subsys (unsigned int vendor, unsigned int device, +unsigned int ss_vendor, unsigned int ss_device, struct pci_dev *from) { return NULL; } static inline void pci_set_master(struct pci_dev *dev) { } ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] PCI changes and fixes for 2.5.72 2003-06-19 23:39 ` Greg KH @ 2003-06-19 23:39 ` Greg KH 2003-06-19 23:39 ` Greg KH 0 siblings, 1 reply; 9+ messages in thread From: Greg KH @ 2003-06-19 23:39 UTC (permalink / raw) To: linux-kernel ChangeSet 1.1360, 2003/06/19 16:02:39-07:00, willy@debian.org [PATCH] PCI: pci_raw_ops patch to fix acpi on ia64 arch/i386/pci/common.c | 23 +++++++++++-- arch/i386/pci/direct.c | 82 ++++++++++++++---------------------------------- arch/i386/pci/fixup.c | 6 +-- arch/i386/pci/irq.c | 2 - arch/i386/pci/legacy.c | 6 +-- arch/i386/pci/numa.c | 26 ++++----------- arch/i386/pci/pcbios.c | 22 ++---------- arch/i386/pci/pci.h | 2 - arch/ia64/pci/pci.c | 33 +++++++++++-------- drivers/acpi/osl.c | 41 +++++++----------------- drivers/acpi/pci_root.c | 2 - include/linux/pci.h | 7 ++++ 12 files changed, 103 insertions(+), 149 deletions(-) diff -Nru a/arch/i386/pci/common.c b/arch/i386/pci/common.c --- a/arch/i386/pci/common.c Thu Jun 19 16:32:08 2003 +++ b/arch/i386/pci/common.c Thu Jun 19 16:32:08 2003 @@ -23,7 +23,24 @@ int pcibios_last_bus = -1; struct pci_bus *pci_root_bus = NULL; -struct pci_ops *pci_root_ops = 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, PCI_SLOT(devfn), + PCI_FUNC(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, PCI_SLOT(devfn), + PCI_FUNC(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 @@ -115,7 +132,7 @@ printk("PCI: Probing PCI hardware (bus %02x)\n", busnum); - return pci_scan_bus(busnum, pci_root_ops, NULL); + return pci_scan_bus(busnum, &pci_root_ops, NULL); } extern u8 pci_cache_line_size; @@ -124,7 +141,7 @@ { struct cpuinfo_x86 *c = &boot_cpu_data; - if (!pci_root_ops) { + if (!raw_pci_ops) { printk("PCI: System does not support PCI\n"); return 0; } diff -Nru a/arch/i386/pci/direct.c b/arch/i386/pci/direct.c --- a/arch/i386/pci/direct.c Thu Jun 19 16:32:08 2003 +++ b/arch/i386/pci/direct.c Thu Jun 19 16:32:08 2003 @@ -13,7 +13,7 @@ #define PCI_CONF1_ADDRESS(bus, dev, fn, reg) \ (0x80000000 | (bus << 16) | (dev << 11) | (fn << 8) | (reg & ~3)) -static int __pci_conf1_read (int seg, int bus, int dev, int fn, int reg, int len, u32 *value) +static int pci_conf1_read (int seg, int bus, int dev, int fn, int reg, int len, u32 *value) { unsigned long flags; @@ -41,7 +41,7 @@ return 0; } -static int __pci_conf1_write (int seg, int bus, int dev, int fn, int reg, int len, u32 value) +static int pci_conf1_write (int seg, int bus, int dev, int fn, int reg, int len, u32 value) { unsigned long flags; @@ -71,19 +71,7 @@ #undef PCI_CONF1_ADDRESS -static int pci_conf1_read(struct pci_bus *bus, unsigned int devfn, int where, int size, u32 *value) -{ - return __pci_conf1_read(0, bus->number, PCI_SLOT(devfn), - PCI_FUNC(devfn), where, size, value); -} - -static int pci_conf1_write(struct pci_bus *bus, unsigned int devfn, int where, int size, u32 value) -{ - return __pci_conf1_write(0, bus->number, PCI_SLOT(devfn), - PCI_FUNC(devfn), where, size, value); -} - -struct pci_ops pci_direct_conf1 = { +struct pci_raw_ops pci_direct_conf1 = { .read = pci_conf1_read, .write = pci_conf1_write, }; @@ -95,7 +83,7 @@ #define PCI_CONF2_ADDRESS(dev, reg) (u16)(0xC000 | (dev << 8) | reg) -static int __pci_conf2_read (int seg, int bus, int dev, int fn, int reg, int len, u32 *value) +static int pci_conf2_read (int seg, int bus, int dev, int fn, int reg, int len, u32 *value) { unsigned long flags; @@ -129,7 +117,7 @@ return 0; } -static int __pci_conf2_write (int seg, int bus, int dev, int fn, int reg, int len, u32 value) +static int pci_conf2_write (int seg, int bus, int dev, int fn, int reg, int len, u32 value) { unsigned long flags; @@ -165,19 +153,7 @@ #undef PCI_CONF2_ADDRESS -static int pci_conf2_read(struct pci_bus *bus, unsigned int devfn, int where, int size, u32 *value) -{ - return __pci_conf2_read(0, bus->number, PCI_SLOT(devfn), - PCI_FUNC(devfn), where, size, value); -} - -static int pci_conf2_write(struct pci_bus *bus, unsigned int devfn, int where, int size, u32 value) -{ - return __pci_conf2_write(0, bus->number, PCI_SLOT(devfn), - PCI_FUNC(devfn), where, size, value); -} - -static struct pci_ops pci_direct_conf2 = { +static struct pci_raw_ops pci_direct_conf2 = { .read = pci_conf2_read, .write = pci_conf2_write, }; @@ -193,38 +169,30 @@ * 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 __devinit pci_sanity_check(struct pci_ops *o) +static int __devinit pci_sanity_check(struct pci_raw_ops *o) { u32 x = 0; - int retval = 0; - struct pci_bus *bus; /* Fake bus and device */ - struct pci_dev *dev; + int devfn; if (pci_probe & PCI_NO_CHECKS) return 1; - bus = kmalloc(sizeof(*bus), GFP_ATOMIC); - dev = kmalloc(sizeof(*dev), GFP_ATOMIC); - if (!bus || !dev) { - printk(KERN_ERR "Out of memory in %s\n", __FUNCTION__); - goto exit; + for (devfn = 0; devfn < 0x100; devfn++) { + if (o->read(0, 0, PCI_SLOT(devfn), PCI_FUNC(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, PCI_SLOT(devfn), PCI_FUNC(devfn), + PCI_VENDOR_ID, 2, &x)) + continue; + if (x == PCI_VENDOR_ID_INTEL || x == PCI_VENDOR_ID_COMPAQ) + return 1; } - bus->number = 0; - dev->bus = bus; - for(dev->devfn=0; dev->devfn < 0x100; dev->devfn++) - if ((!o->read(bus, dev->devfn, PCI_CLASS_DEVICE, 2, &x) && - (x == PCI_CLASS_BRIDGE_HOST || x == PCI_CLASS_DISPLAY_VGA)) || - (!o->read(bus, dev->devfn, PCI_VENDOR_ID, 2, &x) && - (x == PCI_VENDOR_ID_INTEL || x == PCI_VENDOR_ID_COMPAQ))) { - retval = 1; - goto exit; - } DBG("PCI: Sanity check failed\n"); -exit: - kfree(dev); - kfree(bus); - return retval; + return 0; } static int __init pci_direct_init(void) @@ -247,9 +215,9 @@ local_irq_restore(flags); printk(KERN_INFO "PCI: Using configuration type 1\n"); if (!request_region(0xCF8, 8, "PCI conf1")) - pci_root_ops = NULL; + raw_pci_ops = NULL; else - pci_root_ops = &pci_direct_conf1; + raw_pci_ops = &pci_direct_conf1; return 0; } outl (tmp, 0xCF8); @@ -267,9 +235,9 @@ local_irq_restore(flags); printk(KERN_INFO "PCI: Using configuration type 2\n"); if (!request_region(0xCF8, 4, "PCI conf2")) - pci_root_ops = NULL; + raw_pci_ops = NULL; else - pci_root_ops = &pci_direct_conf2; + raw_pci_ops = &pci_direct_conf2; return 0; } } diff -Nru a/arch/i386/pci/fixup.c b/arch/i386/pci/fixup.c --- a/arch/i386/pci/fixup.c Thu Jun 19 16:32:08 2003 +++ b/arch/i386/pci/fixup.c Thu Jun 19 16:32:08 2003 @@ -23,9 +23,9 @@ 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 */ + pci_scan_bus(busno, &pci_root_ops, NULL); /* Bus A */ if (suba < subb) - pci_scan_bus(suba+1, pci_root_ops, NULL); /* Bus B */ + pci_scan_bus(suba+1, &pci_root_ops, NULL); /* Bus B */ } pcibios_last_bus = -1; } @@ -39,7 +39,7 @@ u8 busno; pci_read_config_byte(d, 0x4a, &busno); printk(KERN_INFO "PCI: i440KX/GX host bridge %s: secondary bus %02x\n", d->slot_name, busno); - pci_scan_bus(busno, pci_root_ops, NULL); + pci_scan_bus(busno, &pci_root_ops, NULL); pcibios_last_bus = -1; } diff -Nru a/arch/i386/pci/irq.c b/arch/i386/pci/irq.c --- a/arch/i386/pci/irq.c Thu Jun 19 16:32:08 2003 +++ b/arch/i386/pci/irq.c Thu Jun 19 16:32:08 2003 @@ -107,7 +107,7 @@ * It might be a secondary bus, but in this case its parent is already * known (ascending bus order) and therefore pci_scan_bus returns immediately. */ - if (busmap[i] && pci_scan_bus(i, pci_root_bus->ops, NULL)) + if (busmap[i] && pci_scan_bus(i, &pci_root_ops, NULL)) printk(KERN_INFO "PCI: Discovered primary peer bus %02x [IRQ]\n", i); pcibios_last_bus = -1; } diff -Nru a/arch/i386/pci/legacy.c b/arch/i386/pci/legacy.c --- a/arch/i386/pci/legacy.c Thu Jun 19 16:32:08 2003 +++ b/arch/i386/pci/legacy.c Thu Jun 19 16:32:08 2003 @@ -31,14 +31,14 @@ if (pci_bus_exists(&pci_root_buses, n)) continue; bus->number = n; - bus->ops = pci_root_ops; + bus->ops = &pci_root_ops; dev->bus = bus; for (dev->devfn=0; dev->devfn<256; dev->devfn += 8) if (!pci_read_config_word(dev, PCI_VENDOR_ID, &l) && l != 0x0000 && l != 0xffff) { DBG("Found device at %02x:%02x [%04x]\n", n, dev->devfn, l); printk(KERN_INFO "PCI: Discovered peer bus %02x\n", n); - pci_scan_bus(n, pci_root_ops, NULL); + pci_scan_bus(n, &pci_root_ops, NULL); break; } } @@ -49,7 +49,7 @@ static int __init pci_legacy_init(void) { - if (!pci_root_ops) { + if (!raw_pci_ops) { printk("PCI: System does not support PCI\n"); return 0; } diff -Nru a/arch/i386/pci/numa.c b/arch/i386/pci/numa.c --- a/arch/i386/pci/numa.c Thu Jun 19 16:32:08 2003 +++ b/arch/i386/pci/numa.c Thu Jun 19 16:32:08 2003 @@ -13,7 +13,7 @@ #define PCI_CONF1_MQ_ADDRESS(bus, dev, fn, reg) \ (0x80000000 | (BUS2LOCAL(bus) << 16) | (dev << 11) | (fn << 8) | (reg & ~3)) -static int __pci_conf1_mq_read (int seg, int bus, int dev, int fn, int reg, int len, u32 *value) +static int pci_conf1_mq_read (int seg, int bus, int dev, int fn, int reg, int len, u32 *value) { unsigned long flags; @@ -41,7 +41,7 @@ return 0; } -static int __pci_conf1_mq_write (int seg, int bus, int dev, int fn, int reg, int len, u32 value) +static int pci_conf1_mq_write (int seg, int bus, int dev, int fn, int reg, int len, u32 value) { unsigned long flags; @@ -71,19 +71,7 @@ #undef PCI_CONF1_MQ_ADDRESS -static int pci_conf1_mq_read(struct pci_bus *bus, unsigned int devfn, int where, int size, u32 *value) -{ - return __pci_conf1_mq_read(0, bus->number, PCI_SLOT(devfn), - PCI_FUNC(devfn), where, size, value); -} - -static int pci_conf1_mq_write(struct pci_bus *bus, unsigned int devfn, int where, int size, u32 value) -{ - return __pci_conf1_mq_write(0, bus->number, PCI_SLOT(devfn), - PCI_FUNC(devfn), where, size, value); -} - -static struct pci_ops pci_direct_conf1_mq = { +static struct pci_raw_ops pci_direct_conf1_mq = { .read = pci_conf1_mq_read, .write = pci_conf1_mq_write }; @@ -106,9 +94,9 @@ 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 */ + 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 */ + pci_scan_bus(QUADLOCAL2BUS(quad,suba+1), &pci_root_ops, NULL); /* Bus B */ } pcibios_last_bus = -1; } @@ -121,7 +109,7 @@ { int quad; - pci_root_ops = &pci_direct_conf1_mq; + raw_pci_ops = &pci_direct_conf1_mq; if (pcibios_scanned++) return 0; @@ -132,7 +120,7 @@ printk("Scanning PCI bus %d for quad %d\n", QUADLOCAL2BUS(quad,0), quad); pci_scan_bus(QUADLOCAL2BUS(quad,0), - pci_root_ops, NULL); + &pci_root_ops, NULL); } } return 0; diff -Nru a/arch/i386/pci/pcbios.c b/arch/i386/pci/pcbios.c --- a/arch/i386/pci/pcbios.c Thu Jun 19 16:32:08 2003 +++ b/arch/i386/pci/pcbios.c Thu Jun 19 16:32:08 2003 @@ -172,7 +172,7 @@ return (int) (ret & 0xff00) >> 8; } -static int __pci_bios_read (int seg, int bus, int dev, int fn, int reg, int len, u32 *value) +static int pci_bios_read (int seg, int bus, int dev, int fn, int reg, int len, u32 *value) { unsigned long result = 0; unsigned long flags; @@ -227,7 +227,7 @@ return (int)((result & 0xff00) >> 8); } -static int __pci_bios_write (int seg, int bus, int dev, int fn, int reg, int len, u32 value) +static int pci_bios_write (int seg, int bus, int dev, int fn, int reg, int len, u32 value) { unsigned long result = 0; unsigned long flags; @@ -282,24 +282,12 @@ return (int)((result & 0xff00) >> 8); } -static int pci_bios_read(struct pci_bus *bus, unsigned int devfn, int where, int size, u32 *value) -{ - return __pci_bios_read(0, bus->number, PCI_SLOT(devfn), - PCI_FUNC(devfn), where, size, value); -} - -static int pci_bios_write(struct pci_bus *bus, unsigned int devfn, int where, int size, u32 value) -{ - return __pci_bios_write(0, bus->number, PCI_SLOT(devfn), - PCI_FUNC(devfn), where, size, value); -} - /* * Function table for BIOS32 access */ -static struct pci_ops pci_bios_access = { +static struct pci_raw_ops pci_bios_access = { .read = pci_bios_read, .write = pci_bios_write }; @@ -308,7 +296,7 @@ * Try to find PCI BIOS. */ -static struct pci_ops * __devinit pci_find_bios(void) +static struct pci_raw_ops * __devinit pci_find_bios(void) { union bios32 *check; unsigned char sum; @@ -484,7 +472,7 @@ static int __init pci_pcbios_init(void) { if ((pci_probe & PCI_PROBE_BIOS) - && ((pci_root_ops = pci_find_bios()))) { + && ((raw_pci_ops = pci_find_bios()))) { pci_probe |= PCI_BIOS_SORT; pci_bios_present = 1; } diff -Nru a/arch/i386/pci/pci.h b/arch/i386/pci/pci.h --- a/arch/i386/pci/pci.h Thu Jun 19 16:32:08 2003 +++ b/arch/i386/pci/pci.h Thu Jun 19 16:32:08 2003 @@ -37,7 +37,7 @@ extern int pcibios_last_bus; extern struct pci_bus *pci_root_bus; -extern struct pci_ops *pci_root_ops; +extern struct pci_ops pci_root_ops; /* pci-irq.c */ diff -Nru a/arch/ia64/pci/pci.c b/arch/ia64/pci/pci.c --- a/arch/ia64/pci/pci.c Thu Jun 19 16:32:08 2003 +++ b/arch/ia64/pci/pci.c Thu Jun 19 16:32:08 2003 @@ -59,7 +59,7 @@ static int -__pci_sal_read (int seg, int bus, int dev, int fn, int reg, int len, u32 *value) +pci_sal_read (int seg, int bus, int dev, int fn, int reg, int len, u32 *value) { int result = 0; u64 data = 0; @@ -75,7 +75,7 @@ } static int -__pci_sal_write (int seg, int bus, int dev, int fn, int reg, int len, u32 value) +pci_sal_write (int seg, int bus, int dev, int fn, int reg, int len, u32 value) { if ((seg > 255) || (bus > 255) || (dev > 31) || (fn > 7) || (reg > 255)) return -EINVAL; @@ -83,28 +83,33 @@ return ia64_sal_pci_config_write(PCI_SAL_ADDRESS(seg, bus, dev, fn, reg), len, value); } +struct pci_raw_ops pci_sal_ops = { + .read = pci_sal_read, + .write = pci_sal_write +}; + +struct pci_raw_ops *raw_pci_ops = &pci_sal_ops; /* default to SAL */ + static int -pci_sal_read (struct pci_bus *bus, unsigned int devfn, int where, int size, u32 *value) +pci_read (struct pci_bus *bus, unsigned int devfn, int where, int size, u32 *value) { - return __pci_sal_read(pci_domain_nr(bus), bus->number, PCI_SLOT(devfn), PCI_FUNC(devfn), - where, size, value); + return raw_pci_ops->read(pci_domain_nr(bus), bus->number, + PCI_SLOT(devfn), PCI_FUNC(devfn), where, size, value); } static int -pci_sal_write (struct pci_bus *bus, unsigned int devfn, int where, int size, u32 value) +pci_write (struct pci_bus *bus, unsigned int devfn, int where, int size, u32 value) { - return __pci_sal_write(pci_domain_nr(bus), bus->number, PCI_SLOT(devfn), PCI_FUNC(devfn), - where, size, value); + return raw_pci_ops->write(pci_domain_nr(bus), bus->number, + PCI_SLOT(devfn), PCI_FUNC(devfn), where, size, value); } -struct pci_ops pci_sal_ops = { - .read = pci_sal_read, - .write = pci_sal_write +static struct pci_ops pci_root_ops = { + .read = pci_read, + .write = pci_write, }; -struct pci_ops *pci_root_ops = &pci_sal_ops; /* default to SAL */ - static int __init pci_acpi_init (void) { @@ -307,7 +312,7 @@ info.name = name; acpi_walk_resources(handle, METHOD_NAME__CRS, add_window, &info); - return scan_root_bus(bus, pci_root_ops, controller); + return scan_root_bus(bus, &pci_root_ops, controller); out3: kfree(controller->window); diff -Nru a/drivers/acpi/osl.c b/drivers/acpi/osl.c --- a/drivers/acpi/osl.c Thu Jun 19 16:32:08 2003 +++ b/drivers/acpi/osl.c Thu Jun 19 16:32:08 2003 @@ -69,8 +69,6 @@ static OSD_HANDLER acpi_irq_handler = NULL; static void *acpi_irq_context = NULL; -extern struct pci_ops *pci_root_ops; - acpi_status acpi_os_initialize(void) { @@ -79,7 +77,7 @@ * it while walking the namespace (bus 0 and root bridges w/ _BBNs). */ #ifdef CONFIG_ACPI_PCI - if (!pci_root_ops) { + if (!raw_pci_ops) { printk(KERN_ERR PREFIX "Access to PCI configuration space unavailable\n"); return AE_NULL_ENTRY; } @@ -446,15 +444,9 @@ #ifdef CONFIG_ACPI_PCI acpi_status -acpi_os_read_pci_configuration ( - struct acpi_pci_id *pci_id, - u32 reg, - void *value, - u32 width) +acpi_os_read_pci_configuration (struct acpi_pci_id *pci_id, u32 reg, void *value, u32 width) { - int result = 0; - int size = 0; - struct pci_bus bus; + int result, size; if (!value) return AE_BAD_PARAMETER; @@ -470,27 +462,19 @@ size = 4; break; default: - BUG(); + return AE_ERROR; } - bus.number = pci_id->bus; - result = pci_root_ops->read(&bus, PCI_DEVFN(pci_id->device, - pci_id->function), - reg, size, value); + result = raw_pci_ops->read(pci_id->segment, pci_id->bus, + pci_id->device, pci_id->function, reg, size, value); return (result ? AE_ERROR : AE_OK); } acpi_status -acpi_os_write_pci_configuration ( - struct acpi_pci_id *pci_id, - u32 reg, - acpi_integer value, - u32 width) +acpi_os_write_pci_configuration (struct acpi_pci_id *pci_id, u32 reg, acpi_integer value, u32 width) { - int result = 0; - int size = 0; - struct pci_bus bus; + int result, size; switch (width) { case 8: @@ -503,13 +487,12 @@ size = 4; break; default: - BUG(); + return AE_ERROR; } - bus.number = pci_id->bus; - result = pci_root_ops->write(&bus, PCI_DEVFN(pci_id->device, - pci_id->function), - reg, size, value); + result = raw_pci_ops->write(pci_id->segment, pci_id->bus, + pci_id->device, pci_id->function, reg, size, value); + return (result ? AE_ERROR : AE_OK); } diff -Nru a/drivers/acpi/pci_root.c b/drivers/acpi/pci_root.c --- a/drivers/acpi/pci_root.c Thu Jun 19 16:32:08 2003 +++ b/drivers/acpi/pci_root.c Thu Jun 19 16:32:08 2003 @@ -44,8 +44,6 @@ #define ACPI_PCI_ROOT_DRIVER_NAME "ACPI PCI Root Bridge Driver" #define ACPI_PCI_ROOT_DEVICE_NAME "PCI Root Bridge" -extern struct pci_ops *pci_root_ops; - static int acpi_pci_root_add (struct acpi_device *device); static int acpi_pci_root_remove (struct acpi_device *device, int type); diff -Nru a/include/linux/pci.h b/include/linux/pci.h --- a/include/linux/pci.h Thu Jun 19 16:32:08 2003 +++ b/include/linux/pci.h Thu Jun 19 16:32:08 2003 @@ -486,6 +486,13 @@ int (*write)(struct pci_bus *bus, unsigned int devfn, int where, int size, u32 val); }; +struct pci_raw_ops { + int (*read)(int dom, int bus, int dev, int func, int reg, int len, u32 *val); + int (*write)(int dom, int bus, int dev, int func, int reg, int len, u32 val); +}; + +extern struct pci_raw_ops *raw_pci_ops; + struct pci_bus_region { unsigned long start; unsigned long end; ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] PCI changes and fixes for 2.5.72 2003-06-19 23:39 ` Greg KH @ 2003-06-19 23:39 ` Greg KH 2003-06-19 23:39 ` Greg KH 0 siblings, 1 reply; 9+ messages in thread From: Greg KH @ 2003-06-19 23:39 UTC (permalink / raw) To: linux-kernel ChangeSet 1.1361, 2003/06/19 16:10:44-07:00, greg@kroah.com PCI: merge bits missed from the pci locking patch. drivers/pci/bus.c | 6 ++++++ 1 files changed, 6 insertions(+) diff -Nru a/drivers/pci/bus.c b/drivers/pci/bus.c --- a/drivers/pci/bus.c Thu Jun 19 16:32:03 2003 +++ b/drivers/pci/bus.c Thu Jun 19 16:32:03 2003 @@ -93,7 +93,11 @@ 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); pci_create_sysfs_dev_files(dev); @@ -108,7 +112,9 @@ * 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); } } ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] PCI changes and fixes for 2.5.72 2003-06-19 23:39 ` Greg KH @ 2003-06-19 23:39 ` Greg KH 2003-06-19 23:39 ` Greg KH 0 siblings, 1 reply; 9+ messages in thread From: Greg KH @ 2003-06-19 23:39 UTC (permalink / raw) To: linux-kernel ChangeSet 1.1362, 2003/06/19 16:12:34-07:00, greg@kroah.com PCI: well, everyone is treating me like the maintainer... And Martin has said he doesn't want to do it for 2.5/2.6 MAINTAINERS | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) diff -Nru a/MAINTAINERS b/MAINTAINERS --- a/MAINTAINERS Thu Jun 19 16:31:59 2003 +++ b/MAINTAINERS Thu Jun 19 16:31:59 2003 @@ -1429,10 +1429,10 @@ S: Maintained PCI SUBSYSTEM -P: Martin Mares -M: mj@ucw.cz +P: Greg Kroah-Hartman +M: greg@kroah.com L: linux-kernel@vger.kernel.org -S: Odd Fixes +S: Supported PCI HOTPLUG CORE P: Greg Kroah-Hartman ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] PCI changes and fixes for 2.5.72 2003-06-19 23:39 ` Greg KH @ 2003-06-19 23:39 ` Greg KH 0 siblings, 0 replies; 9+ messages in thread From: Greg KH @ 2003-06-19 23:39 UTC (permalink / raw) To: linux-kernel ChangeSet 1.1363, 2003/06/19 16:14:18-07:00, greg@kroah.com [PATCH] PCI: rename pci_get_dev() and pci_put_dev() to pci_dev_get() and pci_dev_put() This makes things more consistant with the other get and put functions in the driver code. drivers/pci/hotplug.c | 2 +- drivers/pci/pci-driver.c | 20 ++++++++++---------- drivers/pci/probe.c | 2 +- drivers/pci/proc.c | 4 ++-- drivers/pci/search.c | 4 ++-- include/linux/pci.h | 4 ++-- 6 files changed, 18 insertions(+), 18 deletions(-) diff -Nru a/drivers/pci/hotplug.c b/drivers/pci/hotplug.c --- a/drivers/pci/hotplug.c Thu Jun 19 16:31:54 2003 +++ b/drivers/pci/hotplug.c Thu Jun 19 16:31:54 2003 @@ -188,7 +188,7 @@ spin_unlock(&pci_bus_lock); pci_free_resources(dev); - pci_put_dev(dev); + pci_dev_put(dev); } /** diff -Nru a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c --- a/drivers/pci/pci-driver.c Thu Jun 19 16:31:54 2003 +++ b/drivers/pci/pci-driver.c Thu Jun 19 16:31:54 2003 @@ -138,10 +138,10 @@ drv = to_pci_driver(dev->driver); pci_dev = to_pci_dev(dev); - pci_get_dev(pci_dev); + pci_dev_get(pci_dev); error = __pci_device_probe(drv, pci_dev); if (error) - pci_put_dev(pci_dev); + pci_dev_put(pci_dev); return error; } @@ -156,7 +156,7 @@ drv->remove(pci_dev); pci_dev->driver = NULL; } - pci_put_dev(pci_dev); + pci_dev_put(pci_dev); return 0; } @@ -448,18 +448,18 @@ } /** - * pci_get_dev - increments the reference count of the pci device structure + * 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_put_dev(), in their disconnect() methods. + * 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_get_dev (struct pci_dev *dev) +struct pci_dev *pci_dev_get(struct pci_dev *dev) { struct device *tmp; @@ -474,13 +474,13 @@ } /** - * pci_put_dev - release a use of the pci device structure + * 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_put_dev(struct pci_dev *dev) +void pci_dev_put(struct pci_dev *dev) { if (dev) put_device(&dev->dev); @@ -504,5 +504,5 @@ EXPORT_SYMBOL(pci_unregister_driver); EXPORT_SYMBOL(pci_dev_driver); EXPORT_SYMBOL(pci_bus_type); -EXPORT_SYMBOL(pci_get_dev); -EXPORT_SYMBOL(pci_put_dev); +EXPORT_SYMBOL(pci_dev_get); +EXPORT_SYMBOL(pci_dev_put); diff -Nru a/drivers/pci/probe.c b/drivers/pci/probe.c --- a/drivers/pci/probe.c Thu Jun 19 16:31:54 2003 +++ b/drivers/pci/probe.c Thu Jun 19 16:31:54 2003 @@ -524,7 +524,7 @@ } device_initialize(&dev->dev); dev->dev.release = pci_release_dev; - pci_get_dev(dev); + pci_dev_get(dev); pci_name_device(dev); diff -Nru a/drivers/pci/proc.c b/drivers/pci/proc.c --- a/drivers/pci/proc.c Thu Jun 19 16:31:54 2003 +++ b/drivers/pci/proc.c Thu Jun 19 16:31:54 2003 @@ -334,7 +334,7 @@ { if (v) { struct pci_dev *dev = v; - pci_put_dev(dev); + pci_dev_put(dev); } } @@ -471,7 +471,7 @@ first_dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, NULL); if (dev == first_dev) seq_puts(m, "PCI devices found:\n"); - pci_put_dev(first_dev); + pci_dev_put(first_dev); drv = pci_dev_driver(dev); diff -Nru a/drivers/pci/search.c b/drivers/pci/search.c --- a/drivers/pci/search.c Thu Jun 19 16:31:54 2003 +++ b/drivers/pci/search.c Thu Jun 19 16:31:54 2003 @@ -205,8 +205,8 @@ } dev = NULL; exit: - pci_put_dev(from); - dev = pci_get_dev(dev); + pci_dev_put(from); + dev = pci_dev_get(dev); spin_unlock(&pci_bus_lock); return dev; } diff -Nru a/include/linux/pci.h b/include/linux/pci.h --- a/include/linux/pci.h Thu Jun 19 16:31:54 2003 +++ b/include/linux/pci.h Thu Jun 19 16:31:54 2003 @@ -556,8 +556,8 @@ void pci_read_bridge_bases(struct pci_bus *child); struct resource *pci_find_parent_resource(const struct pci_dev *dev, struct resource *res); int pci_get_interrupt_pin(struct pci_dev *dev, struct pci_dev **bridge); -extern struct pci_dev *pci_get_dev(struct pci_dev *dev); -extern void pci_put_dev(struct pci_dev *dev); +extern struct pci_dev *pci_dev_get(struct pci_dev *dev); +extern void pci_dev_put(struct pci_dev *dev); extern void pci_remove_bus_device(struct pci_dev *dev); ^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2003-06-19 23:32 UTC | newest] Thread overview: 9+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2003-06-19 23:37 [BK PATCH] PCI changes and fixes for 2.5.72 Greg KH 2003-06-19 23:39 ` [PATCH] " Greg KH 2003-06-19 23:39 ` Greg KH 2003-06-19 23:39 ` Greg KH 2003-06-19 23:39 ` Greg KH 2003-06-19 23:39 ` Greg KH 2003-06-19 23:39 ` Greg KH 2003-06-19 23:39 ` Greg KH 2003-06-19 23:39 ` Greg KH
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox