bk://kernel.bkbits.net/gregkh/linux/pci-2.6 greg@kroah.com|ChangeSet|20040909231004|55087 greg # This is a BitKeeper generated diff -Nru style patch. # # drivers/pci/hotplug/rpaphp_pci.c # 2004/08/26 06:27:10-07:00 johnrose@austin.ibm.com +46 -9 # PCI Hotplug: add host bridges to RPA hotplug subsystem # # drivers/pci/hotplug/rpaphp_slot.c # 2004/08/26 06:27:10-07:00 johnrose@austin.ibm.com +5 -6 # PCI Hotplug: add host bridges to RPA hotplug subsystem # # ChangeSet # 2004/09/12 22:13:25-07:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-pci # # drivers/pci/pci.ids # 2004/09/12 22:13:21-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/09/11 15:00:55-07:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-pci # # drivers/pci/quirks.c # 2004/09/11 15:00:52-07:00 akpm@bix.(none) +0 -0 # Auto merged # # drivers/parisc/superio.c # 2004/09/11 15:00:52-07:00 akpm@bix.(none) +0 -0 # Auto merged # # arch/ppc64/kernel/pSeries_pci.c # 2004/09/11 15:00:51-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/09/10 17:02:46-07:00 akpm@bix.(none) # Merge bk://kernel.bkbits.net/gregkh/linux/pci-2.6 # into bix.(none):/usr/src/bk-pci # # include/asm-generic/vmlinux.lds.h # 2004/09/10 17:02:42-07:00 akpm@bix.(none) +0 -0 # Auto merged # # drivers/pci/quirks.c # 2004/09/10 17:02:42-07:00 akpm@bix.(none) +0 -0 # Auto merged # # drivers/media/video/bttv-cards.c # 2004/09/10 17:02:42-07:00 akpm@bix.(none) +0 -0 # Auto merged # # drivers/char/drm/drm_fops.h # 2004/09/10 17:02:42-07:00 akpm@bix.(none) +0 -0 # Auto merged # # drivers/acpi/processor.c # 2004/09/10 17:02:42-07:00 akpm@bix.(none) +0 -0 # Auto merged # # arch/sparc64/kernel/pci_sabre.c # 2004/09/10 17:02:42-07:00 akpm@bix.(none) +0 -0 # Auto merged # # arch/ppc64/kernel/pSeries_pci.c # 2004/09/10 17:02:41-07:00 akpm@bix.(none) +0 -0 # Auto merged # # arch/ia64/sn/io/machvec/pci_bus_cvlink.c # 2004/09/10 17:02:41-07:00 akpm@bix.(none) +0 -0 # Auto merged # # arch/ia64/pci/pci.c # 2004/09/10 17:02:41-07:00 akpm@bix.(none) +0 -0 # Auto merged # # arch/i386/pci/irq.c # 2004/09/10 17:02:41-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/09/09 14:17:18-07:00 akpm@bix.(none) # Merge bk://kernel.bkbits.net/gregkh/linux/pci-2.6 # into bix.(none):/usr/src/bk-pci # # ChangeSet # 2004/09/09 15:23:09-07:00 greg@kroah.com # PCI: remove pci_find_device() usages from drivers/pci/* # # yeah, I ignored the ppc64 hotplug pci driver, they can fix it up themselves... # # Signed-off-by: Greg Kroah-Hartman # # ChangeSet # 2004/09/09 15:05:16-07:00 greg@kroah.com # Merge kroah.com:/home/greg/linux/BK/bleed-2.6 # into kroah.com:/home/greg/linux/BK/pci-2.6 # # drivers/pci/setup-irq.c # 2004/09/09 15:21:57-07:00 greg@kroah.com +1 -1 # PCI: remove pci_find_device() usages from drivers/pci/* # # yeah, I ignored the ppc64 hotplug pci driver, they can fix it up themselves... # # Signed-off-by: Greg Kroah-Hartman # # drivers/pci/quirks.c # 2004/09/09 15:21:57-07:00 greg@kroah.com +9 -7 # PCI: remove pci_find_device() usages from drivers/pci/* # # yeah, I ignored the ppc64 hotplug pci driver, they can fix it up themselves... # # Signed-off-by: Greg Kroah-Hartman # # drivers/pci/proc.c # 2004/09/09 15:21:57-07:00 greg@kroah.com +1 -1 # PCI: remove pci_find_device() usages from drivers/pci/* # # yeah, I ignored the ppc64 hotplug pci driver, they can fix it up themselves... # # Signed-off-by: Greg Kroah-Hartman # # drivers/pci/pci.c # 2004/09/09 15:21:57-07:00 greg@kroah.com +1 -1 # PCI: remove pci_find_device() usages from drivers/pci/* # # yeah, I ignored the ppc64 hotplug pci driver, they can fix it up themselves... # # Signed-off-by: Greg Kroah-Hartman # # drivers/pci/pci-sysfs.c # 2004/09/09 15:21:57-07:00 greg@kroah.com +1 -1 # PCI: remove pci_find_device() usages from drivers/pci/* # # yeah, I ignored the ppc64 hotplug pci driver, they can fix it up themselves... # # Signed-off-by: Greg Kroah-Hartman # # drivers/pci/hotplug/ibmphp_core.c # 2004/09/09 15:21:57-07:00 greg@kroah.com +1 -1 # PCI: remove pci_find_device() usages from drivers/pci/* # # yeah, I ignored the ppc64 hotplug pci driver, they can fix it up themselves... # # Signed-off-by: Greg Kroah-Hartman # # drivers/pci/hotplug/cpcihp_zt5550.c # 2004/09/09 15:21:57-07:00 greg@kroah.com +2 -1 # PCI: remove pci_find_device() usages from drivers/pci/* # # yeah, I ignored the ppc64 hotplug pci driver, they can fix it up themselves... # # Signed-off-by: Greg Kroah-Hartman # # include/asm-generic/vmlinux.lds.h # 2004/09/09 15:05:09-07:00 greg@kroah.com +0 -0 # Auto merged # # drivers/media/video/bttv-cards.c # 2004/09/09 15:05:09-07:00 greg@kroah.com +0 -0 # Auto merged # # drivers/char/drm/drm_fops.h # 2004/09/09 15:05:09-07:00 greg@kroah.com +0 -0 # Auto merged # # drivers/acpi/processor.c # 2004/09/09 15:05:09-07:00 greg@kroah.com +0 -0 # Auto merged # # arch/sparc64/kernel/pci_sabre.c # 2004/09/09 15:05:09-07:00 greg@kroah.com +0 -4 # Auto merged # # arch/ppc64/kernel/pSeries_pci.c # 2004/09/09 15:05:09-07:00 greg@kroah.com +0 -0 # Auto merged # # arch/ia64/sn/io/machvec/pci_bus_cvlink.c # 2004/09/09 15:05:09-07:00 greg@kroah.com +0 -0 # Auto merged # # arch/ia64/pci/pci.c # 2004/09/09 15:05:08-07:00 greg@kroah.com +0 -0 # Auto merged # # ChangeSet # 2004/09/09 14:42:20-07:00 greg@kroah.com # PCI: get rid of pci_find_device() from arch/i386/* # # Signed-off-by: Greg Kroah-Hartman # # arch/i386/pci/irq.c # 2004/09/09 14:40:57-07:00 greg@kroah.com +13 -7 # PCI: get rid of pci_find_device() from arch/i386/* # # Signed-off-by: Greg Kroah-Hartman # # arch/i386/pci/i386.c # 2004/09/09 14:40:57-07:00 greg@kroah.com +2 -2 # PCI: get rid of pci_find_device() from arch/i386/* # # Signed-off-by: Greg Kroah-Hartman # # arch/i386/pci/acpi.c # 2004/09/09 14:40:57-07:00 greg@kroah.com +1 -1 # PCI: get rid of pci_find_device() from arch/i386/* # # Signed-off-by: Greg Kroah-Hartman # # arch/i386/kernel/cpu/cyrix.c # 2004/09/09 14:40:57-07:00 greg@kroah.com +10 -2 # PCI: get rid of pci_find_device() from arch/i386/* # # Signed-off-by: Greg Kroah-Hartman # # arch/i386/kernel/cpu/cpufreq/gx-suspmod.c # 2004/09/09 14:40:57-07:00 greg@kroah.com +2 -1 # PCI: get rid of pci_find_device() from arch/i386/* # # Signed-off-by: Greg Kroah-Hartman # # include/asm-generic/vmlinux.lds.h # 2004/09/09 14:17:14-07:00 akpm@bix.(none) +0 -0 # Auto merged # # drivers/pci/quirks.c # 2004/09/09 14:17:14-07:00 akpm@bix.(none) +0 -0 # Auto merged # # arch/sparc64/kernel/pci_sabre.c # 2004/09/09 14:17:14-07:00 akpm@bix.(none) +0 -4 # Auto merged # # arch/ppc64/kernel/pSeries_pci.c # 2004/09/09 14:17:14-07:00 akpm@bix.(none) +0 -0 # Auto merged # # arch/ia64/sn/io/machvec/pci_bus_cvlink.c # 2004/09/09 14:17:14-07:00 akpm@bix.(none) +0 -0 # Auto merged # # arch/ia64/pci/pci.c # 2004/09/09 14:17:14-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/09/09 10:28:35-07:00 akpm@osdl.org # [PATCH] add-pci_fixup_enable-pass.patch # # From: Bjorn Helgaas # # Nick Piggin's USB driver stopped working when I removed the unconditional # PCI ACPI IRQ routing stuff. He has verified that the attached patch fixes # it. I sort of hate to add another pass of PCI fixups, so I'm open to # alternate solutions if anybody suggests one. # # Add a "pci_fixup_enable" pass of PCI fixups. These are run at the end of # pci_enable_device() to fix up things like IRQs that are not set up until # then. Some VIA boards require a fixup after the IRQ is set up. Found by # Nick Piggin, initial patch by Bjorn Helgaas, reworked to fit into current # -mm by Nick. # # Signed-off-by: Nick Piggin # Signed-off-by: Bjorn Helgaas # Signed-off-by: Andrew Morton # Signed-off-by: Greg Kroah-Hartman # # include/linux/pci.h # 2004/08/09 22:02:21-07:00 akpm@osdl.org +7 -0 # add-pci_fixup_enable-pass.patch # # include/asm-generic/vmlinux.lds.h # 2004/08/09 22:02:21-07:00 akpm@osdl.org +3 -0 # add-pci_fixup_enable-pass.patch # # drivers/pci/quirks.c # 2004/08/09 22:02:21-07:00 akpm@osdl.org +12 -3 # add-pci_fixup_enable-pass.patch # # drivers/pci/pci.c # 2004/08/09 22:02:21-07:00 akpm@osdl.org +6 -1 # add-pci_fixup_enable-pass.patch # # ChangeSet # 2004/09/08 23:37:24-07:00 janitor@sternwelten.at # [PATCH] PCI pci_dev_b to list_for_each_entry: drivers-pci-setup-bus.c # # list_for_each & pci_(dev|bus)_[bg] replaced by list_for_each_entry. # # # Signed-off-by: Domen Puncer # Signed-off-by: Maximilian Attems # Signed-off-by: Greg Kroah-Hartman # # drivers/pci/setup-bus.c # 2004/09/01 10:38:29-07:00 janitor@sternwelten.at +6 -6 # PCI pci_dev_b to list_for_each_entry: drivers-pci-setup-bus.c # # ChangeSet # 2004/09/08 23:36:38-07:00 janitor@sternwelten.at # [PATCH] PCI list_for_each: arch-ppc64-kernel-pSeries_pci.c # # s/for/list_for_each/ # # Signed-off-by: Domen Puncer # Signed-off-by: Maximilian Attems # Signed-off-by: Greg Kroah-Hartman # # arch/ppc64/kernel/pSeries_pci.c # 2004/09/01 10:38:07-07:00 janitor@sternwelten.at +2 -3 # PCI list_for_each: arch-ppc64-kernel-pSeries_pci.c # # ChangeSet # 2004/09/08 23:36:10-07:00 janitor@sternwelten.at # [PATCH] PCI list_for_each: arch-sparc-kernel-pcic.c # # s/for/list_for_each/ # # Signed-off-by: Domen Puncer # Signed-off-by: Maximilian Attems # Signed-off-by: Greg Kroah-Hartman # # arch/sparc/kernel/pcic.c # 2004/09/01 10:38:15-07:00 janitor@sternwelten.at +2 -4 # PCI list_for_each: arch-sparc-kernel-pcic.c # # ChangeSet # 2004/09/08 23:35:38-07:00 janitor@sternwelten.at # [PATCH] PCI list_for_each: arch-sparc64-kernel-pci_sabre.c # # s/for/list_for_each// # # Signed-off-by: Domen Puncer # Signed-off-by: Maximilian Attems # Signed-off-by: Greg Kroah-Hartman # # arch/sparc64/kernel/pci_sabre.c # 2004/09/01 10:38:15-07:00 janitor@sternwelten.at +4 -8 # PCI list_for_each: arch-sparc64-kernel-pci_sabre.c # # ChangeSet # 2004/09/08 23:35:09-07:00 janitor@sternwelten.at # [PATCH] PCI list_for_each: arch-ppc-kernel-pci.c # # s/for/list_for_each/ # # Signed-off-by: Domen Puncer # Signed-off-by: Maximilian Attems # Signed-off-by: Greg Kroah-Hartman # # arch/ppc/kernel/pci.c # 2004/09/01 10:38:14-07:00 janitor@sternwelten.at +9 -19 # PCI list_for_each: arch-ppc-kernel-pci.c # # ChangeSet # 2004/09/08 23:34:38-07:00 janitor@sternwelten.at # [PATCH] PCI list_for_each: arch-ppc64-kernel-pci_dn.c # # s/for/list_for_each/ # # Signed-off-by: Domen Puncer # Signed-off-by: Maximilian Attems # Signed-off-by: Greg Kroah-Hartman # # arch/ppc64/kernel/pci_dn.c # 2004/09/01 10:38:14-07:00 janitor@sternwelten.at +1 -3 # PCI list_for_each: arch-ppc64-kernel-pci_dn.c # # ChangeSet # 2004/09/08 23:34:08-07:00 janitor@sternwelten.at # [PATCH] PCI list_for_each: arch-ppc64-kernel-pci.c # # s/for/list_for_each/ # # Signed-off-by: Domen Puncer # Signed-off-by: Maximilian Attems # Signed-off-by: Greg Kroah-Hartman # # arch/ppc64/kernel/pci.c # 2004/09/01 10:38:07-07:00 janitor@sternwelten.at +4 -7 # PCI list_for_each: arch-ppc64-kernel-pci.c # # ChangeSet # 2004/09/08 23:33:37-07:00 janitor@sternwelten.at # [PATCH] PCI list_for_each: arch-ia64-sn-io-machvec-pci_bus_cvlink.c # # s/for/list_for_each/ # # Signed-off-by: Domen Puncer # Signed-off-by: Maximilian Attems # Signed-off-by: Greg Kroah-Hartman # # arch/ia64/sn/io/machvec/pci_bus_cvlink.c # 2004/09/01 10:38:06-07:00 janitor@sternwelten.at +1 -3 # PCI list_for_each: arch-ia64-sn-io-machvec-pci_bus_cvlink.c # # ChangeSet # 2004/09/08 23:33:07-07:00 janitor@sternwelten.at # [PATCH] PCI list_for_each: arch-ia64-pci-pci.c # # Change for loops with list_for_each_entry(). # # Signed-off-by: Domen Puncer # Signed-off-by: Maximilian Attems # Signed-off-by: Greg Kroah-Hartman # # arch/ia64/pci/pci.c # 2004/09/01 10:38:06-07:00 janitor@sternwelten.at +3 -3 # PCI list_for_each: arch-ia64-pci-pci.c # # ChangeSet # 2004/09/08 23:32:33-07:00 janitor@sternwelten.at # [PATCH] PCI list_for_each: arch-alpha-kernel-pci.c # # Change for loops with list_for_each(). # # Signed-off-by: Domen Puncer # Signed-off-by: Maximilian Attems # Signed-off-by: Greg Kroah-Hartman # # arch/alpha/kernel/pci.c # 2004/09/01 10:36:10-07:00 janitor@sternwelten.at +5 -11 # PCI list_for_each: arch-alpha-kernel-pci.c # # ChangeSet # 2004/09/08 23:32:03-07:00 janitor@sternwelten.at # [PATCH] PCI list_for_each: arch-i386-pci-i386.c # # Replace for with more readable list_for_each. # Compile tested. # # Signed-off-by: Domen Puncer # Signed-off-by: Maximilian Attems # Signed-off-by: Greg Kroah-Hartman # # arch/i386/pci/i386.c # 2004/09/01 10:38:06-07:00 janitor@sternwelten.at +1 -3 # PCI list_for_each: arch-i386-pci-i386.c # # ChangeSet # 2004/09/08 22:50:05-07:00 shaohua.li@intel.com # [PATCH] PCI: Reorder some initialization code to allow resources to be proper allocated. # # On Tuesday, August 31, 2004, Linus Torvalds wrote: # > That list per se obviously looks ok by me, although I'd worry that some # > other fs_initcall depends on the ACPI stuff having been run (ie while the # > abover ordering is great, I worry that some _other_ part doesn't fit in # > the above ordering). Doing a quick check finds "chr_dev_init()", for # > example, which will do fbmem_init(), which might depend on the ACPI/PnP # > stuff having run already. # > # > So it _might_ be safer to make this ordering more explicit, rather than # # Yes, I agree. The problem is there isn't a straightforward method for # it. It possibly is hard to get it. # # > depending on the different phases of the initcalls. But I'd happily be # > proven wrogn with some simple argument for why this is guaranteed to be # > ok.. For example, maybe ACPI and PnP is linked before chr/mem.c, in which # > case it should all be ok. # # Original PCI assign resources code is the last 'subsys_initcall' # according to the makefile, so move some code of it to 'fs_initcall' # (just below 'subsystem_initcall') should be ok. As you said, ACPI and # PnP is linked before chr/mem.c. The method requires all other # 'fs_initcall' don't touch PCI resources, since # 'pcibios_assign_resources' is a 'fs_initcall' and maybe don't run, but # it looks ok currently. Again, I will be appreciated if we can find a # solution to make the ordering explicit. # # # Signed-off-by: Greg Kroah-Hartman # # drivers/pnp/system.c # 2004/08/30 20:29:35-07:00 shaohua.li@intel.com +5 -1 # PCI: Reorder some initialization code to allow resources to be proper allocated. # # drivers/acpi/motherboard.c # 2004/08/30 20:28:27-07:00 shaohua.li@intel.com +5 -1 # PCI: Reorder some initialization code to allow resources to be proper allocated. # # arch/i386/pci/i386.c # 2004/08/30 20:34:29-07:00 shaohua.li@intel.com +8 -2 # PCI: Reorder some initialization code to allow resources to be proper allocated. # # ChangeSet # 2004/09/08 22:11:47-07:00 johnrose@austin.ibm.com # [PATCH] PCI Hotplug: add host bridges to RPA hotplug subsystem # # The following patch implements the registration of PCI Host Bridges as hotplug # slots. Only host bridges that are dynamically removable will be registered. # The hotplug slots directory goes from looking like this: # # # ls /sys/bus/pci/slots # . 0000:00:02.2 0001:00:02.4 0002:00:02.2 30000000 # .. 0000:00:02.4 0001:00:02.6 0002:00:02.4 control # 0000:00:02.0 0001:00:02.2 0002:00:02.0 0002:00:02.6 # # to this: # # # ls /sys/bus/pci/slots # . 0000:00:02.0 0001:00:00.0 0001:00:02.6 0002:00:02.2 30000000 # .. 0000:00:02.2 0001:00:02.2 0002:00:00.0 0002:00:02.4 control # 0000:00:00.0 0000:00:02.4 0001:00:02.4 0002:00:02.0 0002:00:02.6 # # This work is precursory to the DLPAR module changes that implement # addition/removal of these bridges. Please apply if there are no objections. # # Signed-off-by: John Rose # Signed-off-by: Greg Kroah-Hartman # # drivers/pci/hotplug/rpaphp_core.c # 2004/08/26 06:27:10-07:00 johnrose@austin.ibm.com +13 -7 # PCI Hotplug: add host bridges to RPA hotplug subsystem # # drivers/pci/hotplug/rpaphp.h # 2004/08/26 06:27:10-07:00 johnrose@austin.ibm.com +1 -0 # PCI Hotplug: add host bridges to RPA hotplug subsystem # # ChangeSet # 2004/09/08 16:55:27-07:00 david-b@pacbell.net # [PATCH] PCI: update Documentation/power/pci.txt # # That document was wrong on some things, misleading on others; this # fixes some of the issues I noticed. # # However it probably needs to say that drivers for devices that implement # the PCI PM spec "should" always use pci_set_power_state() to reduce the # power usage. If I get ambitions I might submit a patch to the PCI core # to print a nag message for drivers that don't do that. # # # Updates the PCI PM docs, better matching the specs and code. # # - List both D3 states (D3hot, D3cold) up front. # # - Clarify that suspend() methods should disable I/0 (including DMA) # and IRQs; it's not optional. # # - More accurately describe resume(); there are common cases where # device re-initialization isn't appropriate. The previous text said # re-init was always required; that's false. # # Signed-off-by: David Brownell # Signed-off-by: Greg Kroah-Hartman # # Documentation/power/pci.txt # 2004/09/08 02:41:05-07:00 david-b@pacbell.net +35 -16 # PCI: update Documentation/power/pci.txt # # ChangeSet # 2004/09/08 16:54:00-07:00 hch@lst.de # [PATCH] PCI: mark proc_bus_pci_dir static # # Signed-off-by: Greg Kroah-Hartman # # drivers/pci/proc.c # 2004/09/07 05:57:36-07:00 hch@lst.de +1 -2 # PCI: mark proc_bus_pci_dir static # # ChangeSet # 2004/09/08 16:50:45-07:00 davej@redhat.com # [PATCH] PCI Hotplug: Use before NULL check in shpchp_ctrl # # More fun found with the coverity checker. # # Signed-off-by: Dave Jones # Signed-off-by: Greg Kroah-Hartman # # drivers/pci/hotplug/shpchp_ctrl.c # 2004/09/03 14:09:41-07:00 davej@redhat.com +3 -1 # PCI Hotplug: Use before NULL check in shpchp_ctrl # # ChangeSet # 2004/09/08 16:49:33-07:00 johnpol@2ka.mipt.ru # [PATCH] scx200: pci_find_device() removal. # # Remove pci_find_device() in arch/i386/kernel/scx200.c. # # Signed-off-by: Evgeniy Polyakov # Signed-off-by: Greg Kroah-Hartman # # arch/i386/kernel/scx200.c # 2004/09/01 22:30:04-07:00 johnpol@2ka.mipt.ru +40 -27 # scx200: pci_find_device() removal. # # ChangeSet # 2004/09/08 16:48:14-07:00 jonsmirl@yahoo.com # [PATCH] PCI: add PCI ROMs to sysfs # # Exposes PCI ROMs via sysfs. Four new routines for drivers to use when # accessing ROMs: pci_map_rom, pci_map_rom_copy, pci_unmap_rom, pci_remove_rom. # Handles shadow ROMs for laptops that compress actual ROMs. # # Signed-off-by: "Jon Smirl" # Signed-off-by: Greg Kroah-Hartman # # include/linux/pci.h # 2004/08/28 17:22:21-07:00 jonsmirl@yahoo.com +7 -0 # PCI: add PCI ROMs to sysfs # # include/linux/ioport.h # 2004/08/28 17:22:21-07:00 jonsmirl@yahoo.com +5 -0 # PCI: add PCI ROMs to sysfs # # drivers/pci/setup-res.c # 2004/08/28 17:22:21-07:00 jonsmirl@yahoo.com +1 -1 # PCI: add PCI ROMs to sysfs # # drivers/pci/remove.c # 2004/08/28 17:22:21-07:00 jonsmirl@yahoo.com +2 -0 # PCI: add PCI ROMs to sysfs # # drivers/pci/probe.c # 2004/08/28 17:22:21-07:00 jonsmirl@yahoo.com +1 -1 # PCI: add PCI ROMs to sysfs # # drivers/pci/pci.h # 2004/08/28 17:22:21-07:00 jonsmirl@yahoo.com +3 -1 # PCI: add PCI ROMs to sysfs # # drivers/pci/pci-sysfs.c # 2004/08/28 17:22:21-07:00 jonsmirl@yahoo.com +93 -1 # PCI: add PCI ROMs to sysfs # # drivers/pci/Makefile # 2004/08/28 17:22:21-07:00 jonsmirl@yahoo.com +2 -1 # PCI: add PCI ROMs to sysfs # # arch/i386/pci/fixup.c # 2004/08/28 17:22:21-07:00 jonsmirl@yahoo.com +38 -0 # PCI: add PCI ROMs to sysfs # # drivers/pci/rom.c # 2004/08/28 17:22:21-07:00 jonsmirl@yahoo.com +226 -0 # PCI: add PCI ROMs to sysfs # # drivers/pci/rom.c # 2004/08/28 17:22:21-07:00 jonsmirl@yahoo.com +0 -0 # BitKeeper file /home/greg/linux/BK/pci-2.6/drivers/pci/rom.c # # ChangeSet # 2004/09/08 11:45:24-07:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-pci # # drivers/ide/pci/hpt366.c # 2004/09/08 11:45:20-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/09/06 17:19:56-07:00 akpm@bix.(none) # Merge bk://kernel.bkbits.net/gregkh/linux/pci-2.6 # into bix.(none):/usr/src/bk-pci # # drivers/pci/quirks.c # 2004/09/06 17:19:51-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/09/05 15:44:44-07:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-pci # # drivers/char/drm/drm_fops.h # 2004/09/05 15:44:41-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/09/05 05:41:03+02:00 greg@kroah.com # PCI: fix improper pr_debug() statement # # Thanks to Joe Perches for pointing this out. # # Signed-off-by: Greg Kroah-Hartman # # drivers/pci/quirks.c # 2004/09/05 05:40:39+02:00 greg@kroah.com +1 -1 # PCI: fix improper pr_debug() statement # # Thanks to Joe Perches for pointing this out. # # Signed-off-by: Greg Kroah-Hartman # # ChangeSet # 2004/09/03 14:11:58-07:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-pci # # drivers/media/video/bttv-cards.c # 2004/09/03 14:11:54-07:00 akpm@bix.(none) +0 -0 # Auto merged # # drivers/char/drm/drm_fops.h # 2004/09/03 14:11:54-07:00 akpm@bix.(none) +0 -0 # Auto merged # # arch/ppc64/kernel/pSeries_pci.c # 2004/09/03 14:11:54-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/08/31 22:42:37-07:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-pci # # drivers/acpi/processor.c # 2004/08/31 22:42:32-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/08/28 16:19:47-07:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-pci # # include/linux/pci_ids.h # 2004/08/28 16:19:42-07:00 akpm@bix.(none) +0 -0 # Auto merged # # drivers/pci/pci.ids # 2004/08/28 16:19:42-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/08/27 15:15:17-07:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-pci # # include/linux/pci_ids.h # 2004/08/27 15:15:14-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/08/27 13:57:31-07:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-pci # # include/linux/pci_ids.h # 2004/08/27 13:57:28-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/08/26 15:27:59-07:00 greg@kroah.com # PCI: delete the pci_find_class() function as it's unsafe in hotpluggable systems. # # Signed-off-by: Greg Kroah-Hartman # # include/linux/pci.h # 2004/08/26 15:26:34-07:00 greg@kroah.com +0 -4 # PCI: delete the pci_find_class() function as it's unsafe in hotpluggable systems. # # Signed-off-by: Greg Kroah-Hartman # # drivers/pci/search.c # 2004/08/26 15:26:34-07:00 greg@kroah.com +0 -40 # PCI: delete the pci_find_class() function as it's unsafe in hotpluggable systems. # # Signed-off-by: Greg Kroah-Hartman # # ChangeSet # 2004/08/26 15:26:14-07:00 greg@kroah.com # PCI: remove pci_find_class() usage from all drivers/ files # # Signed-off-by: Greg Kroah-Hartman # # drivers/scsi/eata.c # 2004/08/26 15:23:42-07:00 greg@kroah.com +9 -3 # PCI: remove pci_find_class() usage from all drivers/ files # # Signed-off-by: Greg Kroah-Hartman # # drivers/net/wan/sbni.c # 2004/08/26 15:23:43-07:00 greg@kroah.com +5 -1 # PCI: remove pci_find_class() usage from all drivers/ files # # Signed-off-by: Greg Kroah-Hartman # # drivers/media/video/bttv-cards.c # 2004/08/26 15:23:43-07:00 greg@kroah.com +3 -3 # PCI: remove pci_find_class() usage from all drivers/ files # # Signed-off-by: Greg Kroah-Hartman # # drivers/char/ipmi/ipmi_si_intf.c # 2004/08/26 15:23:43-07:00 greg@kroah.com +10 -4 # PCI: remove pci_find_class() usage from all drivers/ files # # Signed-off-by: Greg Kroah-Hartman # # drivers/char/drm/drm_fops.h # 2004/08/26 15:23:43-07:00 greg@kroah.com +5 -2 # PCI: remove pci_find_class() usage from all drivers/ files # # Signed-off-by: Greg Kroah-Hartman # # drivers/char/applicom.c # 2004/08/26 15:23:43-07:00 greg@kroah.com +1 -1 # PCI: remove pci_find_class() usage from all drivers/ files # # Signed-off-by: Greg Kroah-Hartman # # ChangeSet # 2004/08/26 15:21:14-07:00 greg@kroah.com # PCI: remove pci_find_class() usage from arch specific files. # # Signed-off-by: Greg Kroah-Hartman # # arch/ppc64/kernel/pci.c # 2004/08/26 15:18:07-07:00 greg@kroah.com +1 -1 # PCI: remove pci_find_class() usage from arch specific files. # # Signed-off-by: Greg Kroah-Hartman # # arch/i386/kernel/cpu/mtrr/main.c # 2004/08/26 15:18:07-07:00 greg@kroah.com +5 -3 # PCI: remove pci_find_class() usage from arch specific files. # # Signed-off-by: Greg Kroah-Hartman # # arch/alpha/kernel/console.c # 2004/08/26 15:18:07-07:00 greg@kroah.com +1 -1 # PCI: remove pci_find_class() usage from arch specific files. # # Signed-off-by: Greg Kroah-Hartman # # ChangeSet # 2004/08/26 14:12:40-07:00 greg@kroah.com # PCI: clean up the comments in search.c to be correct. # # Signed-off-by: Greg Kroah-Hartman # # drivers/pci/search.c # 2004/08/26 14:11:30-07:00 greg@kroah.com +8 -10 # PCI: clean up the comments in search.c to be correct. # # Signed-off-by: Greg Kroah-Hartman # # ChangeSet # 2004/08/26 14:09:38-07:00 greg@kroah.com # PCI: add pci_get_class() to make a safe pci_find_class() like call. # # Signed-off-by: Greg Kroah-Hartman # # include/linux/pci.h # 2004/08/26 14:08:25-07:00 greg@kroah.com +4 -0 # PCI: add pci_get_class() to make a safe pci_find_class() like call. # # Signed-off-by: Greg Kroah-Hartman # # drivers/pci/search.c # 2004/08/26 14:08:26-07:00 greg@kroah.com +38 -0 # PCI: add pci_get_class() to make a safe pci_find_class() like call. # # Signed-off-by: Greg Kroah-Hartman # # Documentation/pci.txt # 2004/08/26 14:08:25-07:00 greg@kroah.com +3 -2 # PCI: add pci_get_class() to make a safe pci_find_class() like call. # # Signed-off-by: Greg Kroah-Hartman # # ChangeSet # 2004/08/26 14:06:36-07:00 greg@kroah.com # PCI: make pci_find_class() warn if in interrupt like all other find/get functions do. # # Signed-off-by: Greg Kroah-Hartman # # drivers/pci/search.c # 2004/08/26 14:04:59-07:00 greg@kroah.com +1 -0 # PCI: make pci_find_class() warn if in interrupt like all other find/get functions do. # # Signed-off-by: Greg Kroah-Hartman # # ChangeSet # 2004/08/26 11:14:09-07:00 greg@kroah.com # PCI: update the pci.txt documentation about pci_find_device and pci_find_subsys going away # # Signed-off-by: Greg Kroah-Hartman # # Documentation/pci.txt # 2004/08/26 11:13:38-07:00 greg@kroah.com +4 -4 # PCI: update the pci.txt documentation about pci_find_device and pci_find_subsys going away # # Signed-off-by: Greg Kroah-Hartman # # ChangeSet # 2004/08/26 11:10:23-07:00 greg@kroah.com # PCI: make pci_find_subsys() static, as it should not be used anymore # # Use pci_get_subsys() if you want this functionality. # # Signed-off-by: Greg Kroah-Hartman # # include/linux/pci.h # 2004/08/26 11:09:53-07:00 greg@kroah.com +0 -7 # PCI: make pci_find_subsys() static, as it should not be used anymore # # Use pci_get_subsys() if you want this functionality. # # Signed-off-by: Greg Kroah-Hartman # # drivers/pci/search.c # 2004/08/26 11:09:53-07:00 greg@kroah.com +5 -5 # PCI: make pci_find_subsys() static, as it should not be used anymore # # Use pci_get_subsys() if you want this functionality. # # Signed-off-by: Greg Kroah-Hartman # # ChangeSet # 2004/08/26 11:09:24-07:00 greg@kroah.com # PCI: remove pci_find_subsys() calls from acpi code. # # Signed-off-by: Greg Kroah-Hartman # # drivers/acpi/processor.c # 2004/08/26 11:08:27-07:00 greg@kroah.com +10 -5 # PCI: remove pci_find_subsys() calls from acpi code. # # Signed-off-by: Greg Kroah-Hartman # # ChangeSet # 2004/08/26 11:04:58-07:00 greg@kroah.com # PCI: remove pci_find_subsys() calls from cpufreq code. # # Signed-off-by: Greg Kroah-Hartman # # arch/i386/kernel/cpu/cpufreq/speedstep-ich.c # 2004/08/26 11:01:25-07:00 greg@kroah.com +10 -5 # PCI: remove pci_find_subsys() calls from cpufreq code. # # Signed-off-by: Greg Kroah-Hartman # # ChangeSet # 2004/08/24 17:36:23-07:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-pci # # drivers/parisc/superio.c # 2004/08/24 17:36:18-07:00 akpm@bix.(none) +0 -0 # Auto merged # # arch/ppc64/kernel/pSeries_pci.c # 2004/08/24 17:36:18-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/08/23 16:44:54-07:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-pci # # kernel/params.c # 2004/08/23 16:44:47-07:00 akpm@bix.(none) +0 -0 # Auto merged # # include/linux/pci_ids.h # 2004/08/23 16:44:47-07:00 akpm@bix.(none) +0 -0 # Auto merged # # include/linux/moduleparam.h # 2004/08/23 16:44:47-07:00 akpm@bix.(none) +0 -0 # Auto merged # # drivers/ide/pci/hpt366.c # 2004/08/23 16:44:47-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/08/23 14:36:00-07:00 akpm@bix.(none) # Merge bk://kernel.bkbits.net/gregkh/linux/pci-2.6 # into bix.(none):/usr/src/bk-pci # # include/linux/pci_ids.h # 2004/08/23 14:35:56-07:00 akpm@bix.(none) +0 -0 # Auto merged # # drivers/pci/quirks.c # 2004/08/23 14:35:56-07:00 akpm@bix.(none) +0 -0 # Auto merged # # drivers/parisc/superio.c # 2004/08/23 14:35:56-07:00 akpm@bix.(none) +0 -0 # Auto merged # # drivers/ide/pci/hpt366.c # 2004/08/23 14:35:56-07:00 akpm@bix.(none) +0 -0 # Auto merged # # arch/ppc64/kernel/pSeries_pci.c # 2004/08/23 14:35:56-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/08/23 14:33:35-07:00 akpm@bix.(none) # Merge # # kernel/params.c # 2004/08/23 14:33:31-07:00 akpm@bix.(none) +0 -0 # SCCS merged # # include/linux/pci_ids.h # 2004/08/23 14:32:23-07:00 akpm@bix.(none) +0 -0 # Auto merged # # include/linux/moduleparam.h # 2004/08/23 14:32:23-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/08/22 21:34:38-07:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-pci # # include/linux/pci_ids.h # 2004/08/22 21:34:35-07:00 akpm@bix.(none) +0 -0 # Auto merged # # drivers/pci/quirks.c # 2004/08/22 21:34:35-07:00 akpm@bix.(none) +0 -0 # Auto merged # # drivers/ide/pci/hpt366.c # 2004/08/22 21:34:34-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/08/15 01:20:07-07:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-pci # # drivers/parisc/superio.c # 2004/08/15 01:20:04-07:00 akpm@bix.(none) +0 -0 # Auto merged # # arch/i386/kernel/dmi_scan.c # 2004/08/15 01:20:04-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/08/07 19:08:19-07:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-pci # # arch/ppc64/kernel/pSeries_pci.c # 2004/08/07 19:08:15-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/08/04 17:55:19-07:00 akpm@bix.(none) # Merge bk://kernel.bkbits.net/gregkh/linux/pci-2.6 # into bix.(none):/usr/src/bk-pci # # include/linux/pci_ids.h # 2004/08/04 17:55:15-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/08/04 02:57:45-07:00 akpm@bix.(none) # Merge bk://kernel.bkbits.net/gregkh/linux/pci-2.6 # into bix.(none):/usr/src/bk-pci # # drivers/pci/pci.ids # 2004/08/04 02:57:42-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/08/02 13:30:07-07:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-pci # # arch/i386/pci/irq.c # 2004/08/02 13:30:03-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/08/01 00:12:39-07:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-pci # # include/linux/pci_ids.h # 2004/08/01 00:12:36-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/07/30 22:35:06-07:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-pci # # include/linux/pci_ids.h # 2004/07/30 22:35:02-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/07/16 18:41:52-07:00 akpm@bix.(none) # Merge bk://kernel.bkbits.net/gregkh/linux/pci-2.6 # into bix.(none):/usr/src/bk-pci # # include/linux/pci_ids.h # 2004/07/16 18:41:48-07:00 akpm@bix.(none) +0 -0 # Auto merged # # drivers/pci/pci.ids # 2004/07/16 18:41:48-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/07/16 18:40:58-07:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-pci # # include/linux/pci_ids.h # 2004/07/16 18:40:54-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/07/11 13:41:14-07:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-pci # # arch/i386/kernel/dmi_scan.c # 2004/07/11 13:41:11-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/07/05 13:06:46-07:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-pci # # arch/i386/kernel/dmi_scan.c # 2004/07/05 13:06:42-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/07/02 15:26:07-07:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-pci # # include/linux/pci_ids.h # 2004/07/02 15:26:03-07:00 akpm@bix.(none) +0 -0 # Auto merged # # drivers/pci/pci.ids # 2004/07/02 15:26:03-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/07/01 01:43:28-07:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-pci # # include/linux/pci_ids.h # 2004/07/01 01:43:24-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/06/28 00:32:35-07:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-pci # # arch/i386/pci/irq.c # 2004/06/28 00:32:31-07:00 akpm@bix.(none) +0 -0 # Auto merged # # arch/i386/kernel/dmi_scan.c # 2004/06/28 00:32:31-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/06/24 18:25:30-07:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-pci # # include/linux/pci_ids.h # 2004/06/24 18:25:26-07:00 akpm@bix.(none) +0 -0 # Auto merged # # arch/i386/pci/irq.c # 2004/06/24 18:25:26-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/06/24 12:53:53-07:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-pci # # include/linux/pci_ids.h # 2004/06/24 12:53:49-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/06/23 20:35:25-07:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-pci # # arch/i386/pci/irq.c # 2004/06/23 20:35:21-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/06/23 02:01:10-07:00 akpm@bix.(none) # Merge bk://kernel.bkbits.net/gregkh/linux/pci-2.6 # into bix.(none):/usr/src/bk-pci # # include/linux/pci_ids.h # 2004/06/23 02:01:06-07:00 akpm@bix.(none) +0 -0 # Auto merged # # arch/i386/pci/irq.c # 2004/06/23 02:01:06-07:00 akpm@bix.(none) +0 -0 # Auto merged # # arch/i386/kernel/dmi_scan.c # 2004/06/23 02:01:06-07:00 akpm@bix.(none) +0 -7 # Auto merged # # ChangeSet # 2004/06/20 23:49:50-07:00 akpm@bix.(none) # Merge # # arch/i386/pci/irq.c # 2004/06/20 23:49:47-07:00 akpm@bix.(none) +0 -0 # SCCS merged # # arch/i386/kernel/dmi_scan.c # 2004/06/20 23:49:26-07:00 akpm@bix.(none) +7 -0 # SCCS merged # # ChangeSet # 2004/06/18 12:23:56-07:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-pci # # include/linux/pci_ids.h # 2004/06/18 12:23:53-07:00 akpm@bix.(none) +0 -0 # Auto merged # # arch/i386/kernel/dmi_scan.c # 2004/06/18 12:23:53-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/06/15 21:56:51-07:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-pci # # include/linux/pci_ids.h # 2004/06/15 21:56:48-07:00 akpm@bix.(none) +0 -0 # Auto merged # # drivers/pci/pci.ids # 2004/06/15 21:56:48-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/06/08 21:55:31-07:00 akpm@bix.(none) # Merge bk://kernel.bkbits.net/gregkh/linux/pci-2.6 # into bix.(none):/usr/src/bk-pci # # arch/i386/kernel/dmi_scan.c # 2004/06/08 21:55:27-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/06/03 10:37:43-07:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-pci # # include/linux/pci_ids.h # 2004/06/03 10:37:40-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/06/02 13:31:47-07:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-pci # # include/linux/pci_ids.h # 2004/06/02 13:31:44-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/05/28 14:10:25-07:00 akpm@bix.(none) # Merge bk://kernel.bkbits.net/gregkh/linux/pci-2.6 # into bix.(none):/usr/src/bk-pci # # include/linux/pci_ids.h # 2004/05/28 14:10:22-07:00 akpm@bix.(none) +0 -0 # Auto merged # # drivers/pci/pci.ids # 2004/05/28 14:10:22-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/05/28 14:09:37-07:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-pci # # include/linux/pci_ids.h # 2004/05/28 14:09:34-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/05/24 11:42:00-07:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-pci # # include/linux/pci_ids.h # 2004/05/24 11:41:57-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/05/22 23:42:26-07:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-pci # # include/linux/pci_ids.h # 2004/05/22 23:42:23-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/05/19 14:16:27-07:00 akpm@bix.(none) # Merge bk://kernel.bkbits.net/gregkh/linux/pci-2.6 # into bix.(none):/usr/src/bk-pci # # drivers/pci/pci.ids # 2004/05/19 14:16:24-07:00 akpm@bix.(none) +0 -0 # Auto merged # diff -Nru a/Documentation/pci.txt b/Documentation/pci.txt --- a/Documentation/pci.txt 2004-09-12 22:14:37 -07:00 +++ b/Documentation/pci.txt 2004-09-12 22:14:37 -07:00 @@ -141,16 +141,16 @@ Searching by vendor and device ID: struct pci_dev *dev = NULL; - while (dev = pci_find_device(VENDOR_ID, DEVICE_ID, dev)) + while (dev = pci_get_device(VENDOR_ID, DEVICE_ID, dev)) configure_device(dev); Searching by class ID (iterate in a similar way): - pci_find_class(CLASS_ID, dev) + pci_get_class(CLASS_ID, dev) Searching by both vendor/device and subsystem vendor/device ID: - pci_find_subsys(VENDOR_ID, DEVICE_ID, SUBSYS_VENDOR_ID, SUBSYS_DEVICE_ID, dev). + pci_get_subsys(VENDOR_ID, DEVICE_ID, SUBSYS_VENDOR_ID, SUBSYS_DEVICE_ID, dev). You can use the constant PCI_ANY_ID as a wildcard replacement for VENDOR_ID or DEVICE_ID. This allows searching for any device from a @@ -275,11 +275,12 @@ devices just return NULL. pcibios_(read|write)_* Superseded by their pci_(read|write)_* counterparts. -pcibios_find_* Superseded by their pci_find_* counterparts. -pci_for_each_dev() Superseded by pci_find_device() +pcibios_find_* Superseded by their pci_get_* counterparts. +pci_for_each_dev() Superseded by pci_get_device() pci_for_each_dev_reverse() Superseded by pci_find_device_reverse() pci_for_each_bus() Superseded by pci_find_next_bus() pci_find_device() Superseded by pci_get_device() pci_find_subsys() Superseded by pci_get_subsys() -pcibios_find_class() Superseded by pci_find_class() +pcibios_find_class() Superseded by pci_get_class() +pci_find_class() Superseded by pci_get_class() pci_(read|write)_*_nodev() Superseded by pci_bus_(read|write)_*() diff -Nru a/Documentation/power/pci.txt b/Documentation/power/pci.txt --- a/Documentation/power/pci.txt 2004-09-12 22:14:37 -07:00 +++ b/Documentation/power/pci.txt 2004-09-12 22:14:37 -07:00 @@ -5,6 +5,7 @@ An overview of the concepts and the related functions in the Linux kernel Patrick Mochel +(and others) --------------------------------------------------------------------------- @@ -31,10 +32,15 @@ the higher the number, the longer the latency is for the device to return to an operational state (D0). +There are actually two D3 states. When someone talks about D3, they usually +mean D3hot, which corresponds to an ACPI D2 state (power is reduced, the +device may lose some context). But they may also mean D3cold, which is an +ACPI D3 state (power is fully off, all state was discarded); or both. + Bus power management is not covered in this version of this document. -Note that all PCI devices support D0 and D3 by default, regardless of whether or -not they implement any of the PCI PM spec. +Note that all PCI devices support D0 and D3cold by default, regardless of +whether or not they implement any of the PCI PM spec. The possible state transitions that a device can undergo are: @@ -204,15 +210,16 @@ dev->driver->suspend(dev,state); A driver uses this function to actually transition the device into a low power -state. This may include disabling I/O, memory and bus-mastering, as well as -physically transitioning the device to a lower power state. +state. This should include disabling I/O, IRQs, and bus-mastering, as well as +physically transitioning the device to a lower power state; it may also include +calls to pci_enable_wake(). Bus mastering may be disabled by doing: pci_disable_device(dev); For devices that support the PCI PM Spec, this may be used to set the device's -power state: +power state to match the suspend() parameter: pci_set_power_state(dev,state); @@ -223,7 +230,7 @@ obviate the need for some operations. The driver should update the current_state field in its pci_dev structure in -this function. +this function, except for PM-capable devices when pci_set_power_state is used. resume ------ @@ -237,16 +244,28 @@ transition the device to the D0 state. The driver is responsible for reenabling any features of the device that had -been disabled during previous suspend calls and restoring all state that was -saved in previous save_state calls. +been disabled during previous suspend calls, such as IRQs and bus mastering, +as well as calling pci_restore_state(). + +If the device is currently in D3, it may need to be reinitialized in resume(). -If the device is currently in D3, it must be completely reinitialized, as it -must be assumed that the device has lost all of its context (even that of its -PCI config space). For almost all current drivers, this means that the -initialization code that the driver does at boot must be separated out and -called again from the resume callback. Note that some values for the device may -not have to be probed for this time around if they are saved before entering the -low power state. + * Some types of devices, like bus controllers, will preserve context in D3hot + (using Vcc power). Their drivers will often want to avoid re-initializing + them after re-entering D0 (perhaps to avoid resetting downstream devices). + + * Other kinds of devices in D3hot will discard device context as part of a + soft reset when re-entering the D0 state. + + * Devices resuming from D3cold always go through a power-on reset. Some + device context can also be preserved using Vaux power. + + * Some systems hide D3cold resume paths from drivers. For example, on PCs + the resume path for suspend-to-disk often runs BIOS powerup code, which + will sometimes re-initialize the device. + +To handle resets during D3 to D0 transitions, it may be convenient to share +device initialization code between probe() and resume(). Device parameters +can also be saved before the driver suspends into D3, avoiding re-probe. If the device supports the PCI PM Spec, it can use this to physically transition the device to D0: @@ -263,7 +282,7 @@ ensure correct (and speedy) operation. The driver should update the current_state field in its pci_dev structure in -this function. +this function, except for PM-capable devices when pci_set_power_state is used. enable_wake diff -Nru a/arch/alpha/kernel/console.c b/arch/alpha/kernel/console.c --- a/arch/alpha/kernel/console.c 2004-09-12 22:14:37 -07:00 +++ b/arch/alpha/kernel/console.c 2004-09-12 22:14:37 -07:00 @@ -47,7 +47,7 @@ if (!sel_func) sel_func = (void *)default_vga_hose_select; - for(dev=NULL; (dev=pci_find_class(PCI_CLASS_DISPLAY_VGA << 8, dev));) { + for(dev=NULL; (dev=pci_get_class(PCI_CLASS_DISPLAY_VGA << 8, dev));) { if (!hose) hose = dev->sysdata; else hose = sel_func(hose, dev->sysdata); } diff -Nru a/arch/alpha/kernel/pci.c b/arch/alpha/kernel/pci.c --- a/arch/alpha/kernel/pci.c 2004-09-12 22:14:37 -07:00 +++ b/arch/alpha/kernel/pci.c 2004-09-12 22:14:37 -07:00 @@ -280,7 +280,6 @@ /* Propagate hose info into the subordinate devices. */ struct pci_controller *hose = bus->sysdata; - struct list_head *ln; struct pci_dev *dev = bus->self; if (!dev) { @@ -304,9 +303,7 @@ pcibios_fixup_device_resources(dev, bus); } - for (ln = bus->devices.next; ln != &bus->devices; ln = ln->next) { - struct pci_dev *dev = pci_dev_b(ln); - + list_for_each_entry(dev, &bus->devices, bus_list) { pdev_save_srm_config(dev); if ((dev->class >> 8) != PCI_CLASS_BRIDGE_PCI) pcibios_fixup_device_resources(dev, bus); @@ -403,11 +400,10 @@ static void __init pcibios_claim_one_bus(struct pci_bus *b) { - struct list_head *ld; + struct pci_dev *dev; struct pci_bus *child_bus; - for (ld = b->devices.next; ld != &b->devices; ld = ld->next) { - struct pci_dev *dev = pci_dev_b(ld); + list_for_each_entry(dev, &b->devices, bus_list) { int i; for (i = 0; i < PCI_NUM_RESOURCES; i++) { @@ -426,12 +422,10 @@ static void __init pcibios_claim_console_setup(void) { - struct list_head *lb; + struct pci_bus *b; - for(lb = pci_root_buses.next; lb != &pci_root_buses; lb = lb->next) { - struct pci_bus *b = pci_bus_b(lb); + list_for_each_entry(b, &pci_root_buses, node) pcibios_claim_one_bus(b); - } } void __init diff -Nru a/arch/i386/kernel/cpu/cpufreq/gx-suspmod.c b/arch/i386/kernel/cpu/cpufreq/gx-suspmod.c --- a/arch/i386/kernel/cpu/cpufreq/gx-suspmod.c 2004-09-12 22:14:37 -07:00 +++ b/arch/i386/kernel/cpu/cpufreq/gx-suspmod.c 2004-09-12 22:14:37 -07:00 @@ -199,7 +199,7 @@ } /* detect which companion chip is used */ - while ((gx_pci = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, gx_pci)) != NULL) { + while ((gx_pci = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, gx_pci)) != NULL) { if ((pci_match_device (gx_chipset_tbl, gx_pci)) != NULL) { return gx_pci; } @@ -499,6 +499,7 @@ static void __exit cpufreq_gx_exit(void) { cpufreq_unregister_driver(&gx_suspmod_driver); + pci_dev_put(gx_params->cs55x0); kfree(gx_params); } diff -Nru a/arch/i386/kernel/cpu/cpufreq/speedstep-ich.c b/arch/i386/kernel/cpu/cpufreq/speedstep-ich.c --- a/arch/i386/kernel/cpu/cpufreq/speedstep-ich.c 2004-09-12 22:14:37 -07:00 +++ b/arch/i386/kernel/cpu/cpufreq/speedstep-ich.c 2004-09-12 22:14:37 -07:00 @@ -171,7 +171,7 @@ */ static unsigned int speedstep_detect_chipset (void) { - speedstep_chipset_dev = pci_find_subsys(PCI_VENDOR_ID_INTEL, + speedstep_chipset_dev = pci_get_subsys(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_12, PCI_ANY_ID, PCI_ANY_ID, @@ -179,7 +179,7 @@ if (speedstep_chipset_dev) return 4; /* 4-M */ - speedstep_chipset_dev = pci_find_subsys(PCI_VENDOR_ID_INTEL, + speedstep_chipset_dev = pci_get_subsys(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_12, PCI_ANY_ID, PCI_ANY_ID, @@ -188,7 +188,7 @@ return 3; /* 3-M */ - speedstep_chipset_dev = pci_find_subsys(PCI_VENDOR_ID_INTEL, + speedstep_chipset_dev = pci_get_subsys(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801BA_10, PCI_ANY_ID, PCI_ANY_ID, @@ -201,7 +201,7 @@ static struct pci_dev *hostbridge; u8 rev = 0; - hostbridge = pci_find_subsys(PCI_VENDOR_ID_INTEL, + hostbridge = pci_get_subsys(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82815_MC, PCI_ANY_ID, PCI_ANY_ID, @@ -214,9 +214,11 @@ if (rev < 5) { dprintk(KERN_INFO "cpufreq: hostbridge does not support speedstep\n"); speedstep_chipset_dev = NULL; + pci_dev_put(hostbridge); return 0; } + pci_dev_put(hostbridge); return 2; /* 2-M */ } @@ -411,8 +413,10 @@ } /* activate speedstep support */ - if (speedstep_activate()) + if (speedstep_activate()) { + pci_dev_put(speedstep_chipset_dev); return -EINVAL; + } return cpufreq_register_driver(&speedstep_driver); } @@ -425,6 +429,7 @@ */ static void __exit speedstep_exit(void) { + pci_dev_put(speedstep_chipset_dev); cpufreq_unregister_driver(&speedstep_driver); } diff -Nru a/arch/i386/kernel/cpu/cyrix.c b/arch/i386/kernel/cpu/cyrix.c --- a/arch/i386/kernel/cpu/cyrix.c 2004-09-12 22:14:37 -07:00 +++ b/arch/i386/kernel/cpu/cyrix.c 2004-09-12 22:14:37 -07:00 @@ -192,6 +192,7 @@ unsigned char dir0, dir0_msn, dir0_lsn, dir1 = 0; char *buf = c->x86_model_id; const char *p = NULL; + struct pci_dev *dev; /* Bit 31 in normal CPUID used for nonstandard 3DNow ID; 3DNow is IDd by bit 31 in extended CPUID (1*32+31) anyway */ @@ -274,9 +275,16 @@ /* * The 5510/5520 companion chips have a funky PIT. */ - if (pci_find_device(PCI_VENDOR_ID_CYRIX, PCI_DEVICE_ID_CYRIX_5510, NULL) || - pci_find_device(PCI_VENDOR_ID_CYRIX, PCI_DEVICE_ID_CYRIX_5520, NULL)) + dev = pci_get_device(PCI_VENDOR_ID_CYRIX, PCI_DEVICE_ID_CYRIX_5510, NULL); + if (dev) { + pci_dev_put(dev); pit_latch_buggy = 1; + } + dev = pci_find_device(PCI_VENDOR_ID_CYRIX, PCI_DEVICE_ID_CYRIX_5520, NULL); + if (dev) { + pci_dev_put(dev); + pit_latch_buggy = 1; + } /* GXm supports extended cpuid levels 'ala' AMD */ if (c->cpuid_level == 2) { diff -Nru a/arch/i386/kernel/cpu/mtrr/main.c b/arch/i386/kernel/cpu/mtrr/main.c --- a/arch/i386/kernel/cpu/mtrr/main.c 2004-09-12 22:14:37 -07:00 +++ b/arch/i386/kernel/cpu/mtrr/main.c 2004-09-12 22:14:37 -07:00 @@ -77,22 +77,24 @@ { struct pci_dev *dev; - if ((dev = pci_find_class(PCI_CLASS_BRIDGE_HOST << 8, NULL)) != NULL) { + if ((dev = pci_get_class(PCI_CLASS_BRIDGE_HOST << 8, NULL)) != NULL) { /* ServerWorks LE chipsets have problems with write-combining Don't allow it and leave room for other chipsets to be tagged */ if (dev->vendor == PCI_VENDOR_ID_SERVERWORKS && dev->device == PCI_DEVICE_ID_SERVERWORKS_LE) { printk(KERN_INFO "mtrr: Serverworks LE detected. Write-combining disabled.\n"); + pci_dev_put(dev); return 0; } /* Intel 450NX errata # 23. Non ascending cachline evictions to write combining memory may resulting in data corruption */ if (dev->vendor == PCI_VENDOR_ID_INTEL && - dev->device == PCI_DEVICE_ID_INTEL_82451NX) - { + dev->device == PCI_DEVICE_ID_INTEL_82451NX) { printk(KERN_INFO "mtrr: Intel 450NX MMC detected. Write-combining disabled.\n"); + pci_dev_put(dev); return 0; } + pci_dev_put(dev); } return (mtrr_if->have_wrcomb ? mtrr_if->have_wrcomb() : 0); } diff -Nru a/arch/i386/kernel/scx200.c b/arch/i386/kernel/scx200.c --- a/arch/i386/kernel/scx200.c 2004-09-12 22:14:37 -07:00 +++ b/arch/i386/kernel/scx200.c 2004-09-12 22:14:37 -07:00 @@ -22,9 +22,47 @@ unsigned scx200_gpio_base = 0; long scx200_gpio_shadow[2]; +static struct pci_device_id scx200_tbl[] = { + { PCI_DEVICE(PCI_VENDOR_ID_NS, PCI_DEVICE_ID_NS_SCx200_BRIDGE) }, + { PCI_DEVICE(PCI_VENDOR_ID_NS, PCI_DEVICE_ID_NS_SC1100_BRIDGE) }, + { }, +}; +MODULE_DEVICE_TABLE(pci,scx200_tbl); + +static int __devinit scx200_probe(struct pci_dev *, const struct pci_device_id *); + +static struct pci_driver scx200_pci_driver = { + .name = "scx200", + .id_table = scx200_tbl, + .probe = scx200_probe, +}; + spinlock_t scx200_gpio_lock = SPIN_LOCK_UNLOCKED; static spinlock_t scx200_gpio_config_lock = SPIN_LOCK_UNLOCKED; +static int __devinit scx200_probe(struct pci_dev *pdev, const struct pci_device_id *ent) +{ + int bank; + unsigned base; + + base = pci_resource_start(pdev, 0); + printk(KERN_INFO NAME ": GPIO base 0x%x\n", base); + + if (request_region(base, SCx200_GPIO_SIZE, "NatSemi SCx200 GPIO") == 0) { + printk(KERN_ERR NAME ": can't allocate I/O for GPIOs\n"); + return -EBUSY; + } + + scx200_gpio_base = base; + + /* read the current values driven on the GPIO signals */ + for (bank = 0; bank < 2; ++bank) + scx200_gpio_shadow[bank] = inl(scx200_gpio_base + 0x10 * bank); + + return 0; + +} + u32 scx200_gpio_configure(int index, u32 mask, u32 bits) { u32 config, new_config; @@ -77,39 +115,14 @@ int __init scx200_init(void) { - struct pci_dev *bridge; - int bank; - unsigned base; - printk(KERN_INFO NAME ": NatSemi SCx200 Driver\n"); - if ((bridge = pci_find_device(PCI_VENDOR_ID_NS, - PCI_DEVICE_ID_NS_SCx200_BRIDGE, - NULL)) == NULL - && (bridge = pci_find_device(PCI_VENDOR_ID_NS, - PCI_DEVICE_ID_NS_SC1100_BRIDGE, - NULL)) == NULL) - return -ENODEV; - - base = pci_resource_start(bridge, 0); - printk(KERN_INFO NAME ": GPIO base 0x%x\n", base); - - if (request_region(base, SCx200_GPIO_SIZE, "NatSemi SCx200 GPIO") == 0) { - printk(KERN_ERR NAME ": can't allocate I/O for GPIOs\n"); - return -EBUSY; - } - - scx200_gpio_base = base; - - /* read the current values driven on the GPIO signals */ - for (bank = 0; bank < 2; ++bank) - scx200_gpio_shadow[bank] = inl(scx200_gpio_base + 0x10 * bank); - - return 0; + return pci_module_init(&scx200_pci_driver); } void __exit scx200_cleanup(void) { + pci_unregister_driver(&scx200_pci_driver); release_region(scx200_gpio_base, SCx200_GPIO_SIZE); } diff -Nru a/arch/i386/pci/acpi.c b/arch/i386/pci/acpi.c --- a/arch/i386/pci/acpi.c 2004-09-12 22:14:37 -07:00 +++ b/arch/i386/pci/acpi.c 2004-09-12 22:14:37 -07:00 @@ -35,7 +35,7 @@ * also do it here in case there are still broken drivers that * don't use pci_enable_device(). */ - while ((dev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) + while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) acpi_pci_irq_enable(dev); #ifdef CONFIG_X86_IO_APIC diff -Nru a/arch/i386/pci/fixup.c b/arch/i386/pci/fixup.c --- a/arch/i386/pci/fixup.c 2004-09-12 22:14:37 -07:00 +++ b/arch/i386/pci/fixup.c 2004-09-12 22:14:37 -07:00 @@ -255,3 +255,41 @@ } DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE2, pci_fixup_nforce2); +/* + * Fixup to mark boot BIOS video selected by BIOS before it changes + * + * From information provided by "Jon Smirl" + * + * The standard boot ROM sequence for an x86 machine uses the BIOS + * to select an initial video card for boot display. This boot video + * card will have it's BIOS copied to C0000 in system RAM. + * IORESOURCE_ROM_SHADOW is used to associate the boot video + * card with this copy. On laptops this copy has to be used since + * the main ROM may be compressed or combined with another image. + * See pci_map_rom() for use of this flag. IORESOURCE_ROM_SHADOW + * is marked here since the boot video device will be the only enabled + * video device at this point. + * + */static void __devinit pci_fixup_video(struct pci_dev *pdev) +{ + struct pci_dev *bridge; + struct pci_bus *bus; + u16 l; + + if ((pdev->class >> 8) != PCI_CLASS_DISPLAY_VGA) + return; + + /* Is VGA routed to us? */ + bus = pdev->bus; + while (bus) { + bridge = bus->self; + if (bridge) { + pci_read_config_word(bridge, PCI_BRIDGE_CONTROL, &l); + if (!(l & PCI_BRIDGE_CTL_VGA)) + return; + } + bus = bus->parent; + } + pdev->resource[PCI_ROM_RESOURCE].flags |= IORESOURCE_ROM_SHADOW; +} +DECLARE_PCI_FIXUP_HEADER(PCI_ANY_ID, PCI_ANY_ID, pci_fixup_video); diff -Nru a/arch/i386/pci/i386.c b/arch/i386/pci/i386.c --- a/arch/i386/pci/i386.c 2004-09-12 22:14:37 -07:00 +++ b/arch/i386/pci/i386.c 2004-09-12 22:14:37 -07:00 @@ -96,15 +96,13 @@ 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); + list_for_each_entry(bus, bus_list, node) { if ((dev = bus->self)) { for (idx = PCI_BRIDGE_RESOURCES; idx < PCI_NUM_RESOURCES; idx++) { r = &dev->resource[idx]; @@ -126,7 +124,7 @@ u16 command; struct resource *r, *pr; - while ((dev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) { + while ((dev = pci_get_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]; @@ -164,13 +162,13 @@ } } -static void __init pcibios_assign_resources(void) +static int __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) { + while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) { int class = dev->class >> 8; /* Don't touch classless devices and host bridges */ @@ -204,6 +202,7 @@ pci_assign_resource(dev, PCI_ROM_RESOURCE); } } + return 0; } void __init pcibios_resource_survey(void) @@ -212,8 +211,13 @@ pcibios_allocate_bus_resources(&pci_root_buses); pcibios_allocate_resources(0); pcibios_allocate_resources(1); - pcibios_assign_resources(); } + +/** + * called in fs_initcall (one below subsys_initcall), + * give a chance for motherboard reserve resources + */ +fs_initcall(pcibios_assign_resources); int pcibios_enable_resources(struct pci_dev *dev, int mask) { diff -Nru a/arch/i386/pci/irq.c b/arch/i386/pci/irq.c --- a/arch/i386/pci/irq.c 2004-09-12 22:14:37 -07:00 +++ b/arch/i386/pci/irq.c 2004-09-12 22:14:37 -07:00 @@ -455,12 +455,18 @@ static __init int intel_router_probe(struct irq_router *r, struct pci_dev *router, u16 device) { + struct pci_dev *dev1, *dev2; + /* 440GX has a proprietary PIRQ router -- don't use it */ - if ( pci_find_device(PCI_VENDOR_ID_INTEL, - PCI_DEVICE_ID_INTEL_82443GX_0, NULL) || - pci_find_device(PCI_VENDOR_ID_INTEL, - PCI_DEVICE_ID_INTEL_82443GX_2, NULL)) + dev1 = pci_get_device(PCI_VENDOR_ID_INTEL, + PCI_DEVICE_ID_INTEL_82443GX_0, NULL); + dev2 = pci_get_device(PCI_VENDOR_ID_INTEL, + PCI_DEVICE_ID_INTEL_82443GX_2, NULL); + if ((dev1 != NULL) || (dev2 != NULL)) { + pci_dev_put(dev1); + pci_dev_put(dev2); return 0; + } switch(device) { @@ -804,7 +810,7 @@ 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) { + while ((dev2 = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev2)) != NULL) { pci_read_config_byte(dev2, PCI_INTERRUPT_PIN, &pin); if (!pin) continue; @@ -838,7 +844,7 @@ u8 pin; DBG("PCI: IRQ fixup\n"); - while ((dev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) { + while ((dev = pci_get_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. @@ -854,7 +860,7 @@ } dev = NULL; - while ((dev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) { + while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) { pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &pin); #ifdef CONFIG_X86_IO_APIC /* diff -Nru a/arch/ia64/pci/pci.c b/arch/ia64/pci/pci.c --- a/arch/ia64/pci/pci.c 2004-09-12 22:14:37 -07:00 +++ b/arch/ia64/pci/pci.c 2004-09-12 22:14:37 -07:00 @@ -360,10 +360,10 @@ void __devinit pcibios_fixup_bus (struct pci_bus *b) { - struct list_head *ln; + struct pci_dev *dev; - for (ln = b->devices.next; ln != &b->devices; ln = ln->next) - pcibios_fixup_device_resources(pci_dev_b(ln), b); + list_for_each_entry(dev, &b->devices, bus_list) + pcibios_fixup_device_resources(dev, b); return; } diff -Nru a/arch/ia64/sn/io/machvec/pci_bus_cvlink.c b/arch/ia64/sn/io/machvec/pci_bus_cvlink.c --- a/arch/ia64/sn/io/machvec/pci_bus_cvlink.c 2004-09-12 22:14:37 -07:00 +++ b/arch/ia64/sn/io/machvec/pci_bus_cvlink.c 2004-09-12 22:14:37 -07:00 @@ -819,7 +819,6 @@ { int i = 0; struct pci_controller *controller; - struct list_head *ln; struct pci_bus *pci_bus = NULL; struct pci_dev *pci_dev = NULL; int ret; @@ -866,8 +865,7 @@ /* * Initialize the pci bus vertex in the pci_bus struct. */ - for( ln = pci_root_buses.next; ln != &pci_root_buses; ln = ln->next) { - pci_bus = pci_bus_b(ln); + list_for_each_entry(pci_bus, &pci_root_buses, node) { ret = sn_pci_fixup_bus(pci_bus); if ( ret ) { printk(KERN_WARNING diff -Nru a/arch/ppc/kernel/pci.c b/arch/ppc/kernel/pci.c --- a/arch/ppc/kernel/pci.c 2004-09-12 22:14:37 -07:00 +++ b/arch/ppc/kernel/pci.c 2004-09-12 22:14:37 -07:00 @@ -230,14 +230,12 @@ static void __init pcibios_allocate_bus_resources(struct list_head *bus_list) { - struct list_head *ln; struct pci_bus *bus; int i; struct resource *res, *pr; /* Depth-First Search on bus tree */ - for (ln = bus_list->next; ln != bus_list; ln=ln->next) { - bus = pci_bus_b(ln); + list_for_each_entry(bus, bus_list, node) { for (i = 0; i < 4; ++i) { if ((res = bus->resource[i]) == NULL || !res->flags || res->start > res->end) @@ -380,7 +378,6 @@ struct pci_bus *bus; struct pci_dev *dev; struct resource *r; - struct list_head *ln; int i; for (r = pr->child; r != NULL; r = r->sibling) { @@ -389,9 +386,7 @@ return 1; } } - for (ln = parent->children.next; ln != &parent->children; - ln = ln->next) { - bus = pci_bus_b(ln); + list_for_each_entry(bus, &parent->children, node) { for (i = 0; i < 4; ++i) { if ((r = bus->resource[i]) == NULL) continue; @@ -405,8 +400,7 @@ } } } - for (ln = parent->devices.next; ln != &parent->devices; ln=ln->next) { - dev = pci_dev_b(ln); + list_for_each_entry(dev, &parent->devices, bus_list) { for (i = 0; i < 6; ++i) { r = &dev->resource[i]; if (!r->flags || (r->flags & IORESOURCE_UNSET)) @@ -1101,7 +1095,7 @@ static int __init check_for_io_childs(struct pci_bus *bus, struct resource* res, int *found_vga) { - struct list_head *ln; + struct pci_dev *dev; int i; int rc = 0; @@ -1109,8 +1103,7 @@ res->end = ((res->end + __sz) / (__sz + 1)) * (__sz + 1) + __sz; \ } while (0) - for (ln=bus->devices.next; ln != &bus->devices; ln=ln->next) { - struct pci_dev *dev = pci_dev_b(ln); + list_for_each_entry(dev, &bus->devices, bus_list) { u16 class = dev->class >> 8; if (class == PCI_CLASS_DISPLAY_VGA || @@ -1151,7 +1144,7 @@ static void __init do_fixup_p2p_level(struct pci_bus *bus) { - struct list_head *ln; + struct pci_bus *b; int i, parent_io; int has_vga = 0; @@ -1162,8 +1155,7 @@ if (parent_io >= 4) return; - for (ln=bus->children.next; ln != &bus->children; ln=ln->next) { - struct pci_bus *b = pci_bus_b(ln); + list_for_each_entry(b, &bus->children, node) { struct pci_dev *d = b->self; struct pci_controller* hose = (struct pci_controller *)d->sysdata; struct resource *res = b->resource[0]; @@ -1236,12 +1228,10 @@ static void pcibios_fixup_p2p_bridges(void) { - struct list_head *ln; + struct pci_bus *b; - for(ln=pci_root_buses.next; ln != &pci_root_buses; ln=ln->next) { - struct pci_bus *b = pci_bus_b(ln); + list_for_each_entry(b, &pci_root_buses, node) do_fixup_p2p_level(b); - } } #endif /* CONFIG_PPC_PMAC */ diff -Nru a/arch/ppc64/kernel/pSeries_pci.c b/arch/ppc64/kernel/pSeries_pci.c --- a/arch/ppc64/kernel/pSeries_pci.c 2004-09-12 22:14:37 -07:00 +++ b/arch/ppc64/kernel/pSeries_pci.c 2004-09-12 22:14:37 -07:00 @@ -601,7 +601,7 @@ void __devinit pcibios_fixup_bus(struct pci_bus *bus) { struct pci_controller *hose = PCI_GET_PHB_PTR(bus); - struct list_head *ln; + struct pci_dev *dev; /* XXX or bus->parent? */ struct pci_dev *dev = bus->self; @@ -643,8 +643,7 @@ if (!pci_probe_only) return; - for (ln = bus->devices.next; ln != &bus->devices; ln = ln->next) { - struct pci_dev *dev = pci_dev_b(ln); + list_for_each_entry(dev, &bus->devices, bus_list) { if ((dev->class >> 8) != PCI_CLASS_BRIDGE_PCI) pcibios_fixup_device_resources(dev, bus); } diff -Nru a/arch/ppc64/kernel/pci.c b/arch/ppc64/kernel/pci.c --- a/arch/ppc64/kernel/pci.c 2004-09-12 22:14:37 -07:00 +++ b/arch/ppc64/kernel/pci.c 2004-09-12 22:14:37 -07:00 @@ -229,11 +229,10 @@ static void __init pcibios_claim_one_bus(struct pci_bus *b) { - struct list_head *ld; + struct pci_dev *dev; struct pci_bus *child_bus; - for (ld = b->devices.next; ld != &b->devices; ld = ld->next) { - struct pci_dev *dev = pci_dev_b(ld); + list_for_each_entry(dev, &b->devices, bus_list) { int i; for (i = 0; i < PCI_NUM_RESOURCES; i++) { @@ -252,12 +251,10 @@ #ifndef CONFIG_PPC_ISERIES static void __init pcibios_claim_of_setup(void) { - struct list_head *lb; + struct pci_bus *b; - for (lb = pci_root_buses.next; lb != &pci_root_buses; lb = lb->next) { - struct pci_bus *b = pci_bus_b(lb); + list_for_each_entry(b, &pci_root_buses, node) pcibios_claim_one_bus(b); - } } #endif @@ -297,7 +294,7 @@ ppc_md.pcibios_fixup(); /* Cache the location of the ISA bridge (if we have one) */ - ppc64_isabridge_dev = pci_find_class(PCI_CLASS_BRIDGE_ISA << 8, NULL); + ppc64_isabridge_dev = pci_get_class(PCI_CLASS_BRIDGE_ISA << 8, NULL); if (ppc64_isabridge_dev != NULL) printk("ISA bridge at %s\n", pci_name(ppc64_isabridge_dev)); diff -Nru a/arch/ppc64/kernel/pci_dn.c b/arch/ppc64/kernel/pci_dn.c --- a/arch/ppc64/kernel/pci_dn.c 2004-09-12 22:14:37 -07:00 +++ b/arch/ppc64/kernel/pci_dn.c 2004-09-12 22:14:37 -07:00 @@ -196,11 +196,9 @@ static void __init pci_fixup_bus_sysdata_list(struct list_head *bus_list) { - struct list_head *ln; struct pci_bus *bus; - for (ln = bus_list->next; ln != bus_list; ln = ln->next) { - bus = pci_bus_b(ln); + list_for_each_entry(bus, bus_list, node) { if (bus->self) bus->sysdata = bus->self->sysdata; pci_fixup_bus_sysdata_list(&bus->children); diff -Nru a/arch/sparc/kernel/pcic.c b/arch/sparc/kernel/pcic.c --- a/arch/sparc/kernel/pcic.c 2004-09-12 22:14:37 -07:00 +++ b/arch/sparc/kernel/pcic.c 2004-09-12 22:14:37 -07:00 @@ -603,7 +603,7 @@ */ void __init pcibios_fixup_bus(struct pci_bus *bus) { - struct list_head *walk; + struct pci_dev *dev; int i, has_io, has_mem; unsigned int cmd; struct linux_pcic *pcic; @@ -625,9 +625,7 @@ return; } - walk = &bus->devices; - for (walk = walk->next; walk != &bus->devices; walk = walk->next) { - struct pci_dev *dev = pci_dev_b(walk); + list_for_each_entry(dev, &bus->devices, bus_list) { /* * Comment from i386 branch: diff -Nru a/drivers/acpi/motherboard.c b/drivers/acpi/motherboard.c --- a/drivers/acpi/motherboard.c 2004-09-12 22:14:37 -07:00 +++ b/drivers/acpi/motherboard.c 2004-09-12 22:14:37 -07:00 @@ -170,4 +170,8 @@ return 0; } -subsys_initcall(acpi_motherboard_init); +/** + * Reserve motherboard resources after PCI claim BARs, + * but before PCI assign resources for uninitialized PCI devices + */ +fs_initcall(acpi_motherboard_init); diff -Nru a/drivers/acpi/processor.c b/drivers/acpi/processor.c --- a/drivers/acpi/processor.c 2004-09-12 22:14:37 -07:00 +++ b/drivers/acpi/processor.c 2004-09-12 22:14:37 -07:00 @@ -213,11 +213,13 @@ * each IDE controller's DMA status to make sure we catch all * DMA activity. */ - dev = pci_find_subsys(PCI_VENDOR_ID_INTEL, + dev = pci_get_subsys(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371AB, PCI_ANY_ID, PCI_ANY_ID, NULL); - if (dev) + if (dev) { errata.piix4.bmisx = pci_resource_start(dev, 4); + pci_dev_put(dev); + } /* * Type-F DMA @@ -228,7 +230,7 @@ * disable C3 support if this is enabled, as some legacy * devices won't operate well if fast DMA is disabled. */ - dev = pci_find_subsys(PCI_VENDOR_ID_INTEL, + dev = pci_get_subsys(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371AB_0, PCI_ANY_ID, PCI_ANY_ID, NULL); if (dev) { @@ -236,6 +238,7 @@ pci_read_config_byte(dev, 0x77, &value2); if ((value1 & 0x80) || (value2 & 0x80)) errata.piix4.fdma = 1; + pci_dev_put(dev); } break; @@ -267,10 +270,12 @@ /* * PIIX4 */ - dev = pci_find_subsys(PCI_VENDOR_ID_INTEL, + dev = pci_get_subsys(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371AB_3, PCI_ANY_ID, PCI_ANY_ID, NULL); - if (dev) + if (dev) { result = acpi_processor_errata_piix4(dev); + pci_dev_put(dev); + } return_VALUE(result); } diff -Nru a/drivers/char/applicom.c b/drivers/char/applicom.c --- a/drivers/char/applicom.c 2004-09-12 22:14:37 -07:00 +++ b/drivers/char/applicom.c 2004-09-12 22:14:37 -07:00 @@ -200,7 +200,7 @@ /* No mem and irq given - check for a PCI card */ - while ( (dev = pci_find_class(PCI_CLASS_OTHERS << 16, dev))) { + while ( (dev = pci_get_class(PCI_CLASS_OTHERS << 16, dev))) { if (dev->vendor != PCI_VENDOR_ID_APPLICOM) continue; diff -Nru a/drivers/char/drm/drm_fops.h b/drivers/char/drm/drm_fops.h --- a/drivers/char/drm/drm_fops.h 2004-09-12 22:14:37 -07:00 +++ b/drivers/char/drm/drm_fops.h 2004-09-12 22:14:37 -07:00 @@ -99,8 +99,11 @@ */ if (!dev->hose) { struct pci_dev *pci_dev; - pci_dev = pci_find_class(PCI_CLASS_DISPLAY_VGA << 8, NULL); - if (pci_dev) dev->hose = pci_dev->sysdata; + pci_dev = pci_get_class(PCI_CLASS_DISPLAY_VGA << 8, NULL); + if (pci_dev) { + dev->hose = pci_dev->sysdata; + pci_dev_put(pci_dev); + } if (!dev->hose) { struct pci_bus *b = pci_bus_b(pci_root_buses.next); if (b) dev->hose = b->sysdata; diff -Nru a/drivers/char/ipmi/ipmi_si_intf.c b/drivers/char/ipmi/ipmi_si_intf.c --- a/drivers/char/ipmi/ipmi_si_intf.c 2004-09-12 22:14:37 -07:00 +++ b/drivers/char/ipmi/ipmi_si_intf.c 2004-09-12 22:14:37 -07:00 @@ -1777,10 +1777,10 @@ pci_smic_checked = 1; - if ((pci_dev = pci_find_device(PCI_HP_VENDOR_ID, PCI_MMC_DEVICE_ID, + if ((pci_dev = pci_get_device(PCI_HP_VENDOR_ID, PCI_MMC_DEVICE_ID, NULL))) ; - else if ((pci_dev = pci_find_class(PCI_ERMC_CLASSCODE, NULL)) && + else if ((pci_dev = pci_get_class(PCI_ERMC_CLASSCODE, NULL)) && pci_dev->subsystem_vendor == PCI_HP_VENDOR_ID) fe_rmc = 1; else @@ -1789,6 +1789,7 @@ error = pci_read_config_word(pci_dev, PCI_MMC_ADDR_CW, &base_addr); if (error) { + pci_dev_put(pci_dev); printk(KERN_ERR "ipmi_si: pci_read_config_word() failed (%d).\n", error); @@ -1798,6 +1799,7 @@ /* Bit 0: 1 specifies programmed I/O, 0 specifies memory mapped I/O */ if (!(base_addr & 0x0001)) { + pci_dev_put(pci_dev); printk(KERN_ERR "ipmi_si: memory mapped I/O not supported for PCI" " smic.\n"); @@ -1809,11 +1811,14 @@ /* Data register starts at base address + 1 in eRMC */ ++base_addr; - if (!is_new_interface(-1, IPMI_IO_ADDR_SPACE, base_addr)) - return -ENODEV; + if (!is_new_interface(-1, IPMI_IO_ADDR_SPACE, base_addr)) { + pci_dev_put(pci_dev); + return -ENODEV; + } info = kmalloc(sizeof(*info), GFP_KERNEL); if (!info) { + pci_dev_put(pci_dev); printk(KERN_ERR "ipmi_si: Could not allocate SI data (5)\n"); return -ENOMEM; } @@ -1836,6 +1841,7 @@ printk("ipmi_si: Found PCI SMIC at I/O address 0x%lx\n", (long unsigned int) base_addr); + pci_dev_put(pci_dev); return 0; } #endif /* CONFIG_PCI */ diff -Nru a/drivers/media/video/bttv-cards.c b/drivers/media/video/bttv-cards.c --- a/drivers/media/video/bttv-cards.c 2004-09-12 22:14:37 -07:00 +++ b/drivers/media/video/bttv-cards.c 2004-09-12 22:14:37 -07:00 @@ -4045,7 +4045,7 @@ #if 0 /* print which chipset we have */ - while ((dev = pci_find_class(PCI_CLASS_BRIDGE_HOST << 8,dev))) + while ((dev = pci_get_class(PCI_CLASS_BRIDGE_HOST << 8,dev))) printk(KERN_INFO "bttv: Host bridge is %s\n",pci_name(dev)); #endif @@ -4064,8 +4064,8 @@ if (UNSET != latency) printk(KERN_INFO "bttv: pci latency fixup [%d]\n",latency); - while ((dev = pci_find_device(PCI_VENDOR_ID_INTEL, - PCI_DEVICE_ID_INTEL_82441, dev))) { + while ((dev = pci_get_device(PCI_VENDOR_ID_INTEL, + PCI_DEVICE_ID_INTEL_82441, dev))) { unsigned char b; pci_read_config_byte(dev, 0x53, &b); if (bttv_debug) diff -Nru a/drivers/net/wan/sbni.c b/drivers/net/wan/sbni.c --- a/drivers/net/wan/sbni.c 2004-09-12 22:14:37 -07:00 +++ b/drivers/net/wan/sbni.c 2004-09-12 22:14:37 -07:00 @@ -294,7 +294,7 @@ { struct pci_dev *pdev = NULL; - while( (pdev = pci_find_class( PCI_CLASS_NETWORK_OTHER << 8, pdev )) + while( (pdev = pci_get_class( PCI_CLASS_NETWORK_OTHER << 8, pdev )) != NULL ) { int pci_irq_line; unsigned long pci_ioaddr; @@ -331,10 +331,14 @@ /* avoiding re-enable dual adapters */ if( (pci_ioaddr & 7) == 0 && pci_enable_device( pdev ) ) { release_region( pci_ioaddr, SBNI_IO_EXTENT ); + pci_dev_put( pdev ); return -EIO; } if( sbni_probe1( dev, pci_ioaddr, pci_irq_line ) ) { SET_NETDEV_DEV(dev, &pdev->dev); + /* not the best thing to do, but this is all messed up + for hotplug systems anyway... */ + pci_dev_put( pdev ); return 0; } } diff -Nru a/drivers/pci/Makefile b/drivers/pci/Makefile --- a/drivers/pci/Makefile 2004-09-12 22:14:37 -07:00 +++ b/drivers/pci/Makefile 2004-09-12 22:14:37 -07:00 @@ -3,7 +3,8 @@ # obj-y += access.o bus.o probe.o remove.o pci.o quirks.o \ - names.o pci-driver.o search.o pci-sysfs.o + names.o pci-driver.o search.o pci-sysfs.o \ + rom.o obj-$(CONFIG_PROC_FS) += proc.o ifndef CONFIG_SPARC64 diff -Nru a/drivers/pci/hotplug/cpcihp_zt5550.c b/drivers/pci/hotplug/cpcihp_zt5550.c --- a/drivers/pci/hotplug/cpcihp_zt5550.c 2004-09-12 22:14:37 -07:00 +++ b/drivers/pci/hotplug/cpcihp_zt5550.c 2004-09-12 22:14:37 -07:00 @@ -219,12 +219,13 @@ dbg("registered controller"); /* Look for first device matching cPCI bus's bridge vendor and device IDs */ - if(!(bus0_dev = pci_find_device(PCI_VENDOR_ID_DEC, + if(!(bus0_dev = pci_get_device(PCI_VENDOR_ID_DEC, PCI_DEVICE_ID_DEC_21154, NULL))) { status = -ENODEV; goto init_register_error; } bus0 = bus0_dev->subordinate; + pci_dev_put(bus0_dev); status = cpci_hp_register_bus(bus0, 0x0a, 0x0f); if(status != 0) { diff -Nru a/drivers/pci/hotplug/ibmphp_core.c b/drivers/pci/hotplug/ibmphp_core.c --- a/drivers/pci/hotplug/ibmphp_core.c 2004-09-12 22:14:37 -07:00 +++ b/drivers/pci/hotplug/ibmphp_core.c 2004-09-12 22:14:37 -07:00 @@ -886,7 +886,7 @@ break; case BUS_SPEED_133: /* This is to take care of the bug in CIOBX chip */ - while ((dev = pci_find_device(PCI_VENDOR_ID_SERVERWORKS, + while ((dev = pci_get_device(PCI_VENDOR_ID_SERVERWORKS, 0x0101, dev)) != NULL) ibmphp_hpc_writeslot (slot_cur, HPC_BUS_100PCIXMODE); cmd = HPC_BUS_133PCIXMODE; diff -Nru a/drivers/pci/hotplug/rpaphp.h b/drivers/pci/hotplug/rpaphp.h --- a/drivers/pci/hotplug/rpaphp.h 2004-09-12 22:14:37 -07:00 +++ b/drivers/pci/hotplug/rpaphp.h 2004-09-12 22:14:37 -07:00 @@ -30,6 +30,7 @@ #include #include "pci_hotplug.h" +#define PHB 2 #define HOTPLUG 1 #define EMBEDDED 0 diff -Nru a/drivers/pci/hotplug/rpaphp_core.c b/drivers/pci/hotplug/rpaphp_core.c --- a/drivers/pci/hotplug/rpaphp_core.c 2004-09-12 22:14:37 -07:00 +++ b/drivers/pci/hotplug/rpaphp_core.c 2004-09-12 22:14:37 -07:00 @@ -245,9 +245,6 @@ static int is_dr_dn(struct device_node *dn, int **indexes, int **names, int **types, int **power_domains, int **my_drc_index) { - if (!is_hotplug_capable(dn)) - return (0); - *my_drc_index = (int *) get_property(dn, "ibm,my-drc-index", NULL); if(!*my_drc_index) return (0); @@ -293,6 +290,12 @@ return ptr; } +static int is_dlpar_drc_type(const char *type_str) +{ + /* Only register DLPAR-capable nodes of drc-type PHB or SLOT */ + return (!strcmp(type_str, "PHB") || !strcmp(type_str, "SLOT")); +} + /**************************************************************** * rpaphp not only registers PCI hotplug slots(HOTPLUG), * but also logical DR slots(EMBEDDED). @@ -329,15 +332,18 @@ for (i = 0; i < indexes[0]; i++, name += (strlen(name) + 1), type += (strlen(type) + 1)) { - if ( slot_type == HOTPLUG || - (slot_type == EMBEDDED && indexes[i + 1] == my_drc_index[0])) { - + if (slot_type == HOTPLUG || + (slot_type == EMBEDDED && + indexes[i + 1] == my_drc_index[0] && + is_dlpar_drc_type(type))) { if (!(slot = alloc_slot_struct(dn, indexes[i + 1], name, power_domains[i + 1]))) { retval = -ENOMEM; goto exit; } - if (slot_type == EMBEDDED) + if (!strcmp(type, "PHB")) + slot->type = PHB; + else if (slot_type == EMBEDDED) slot->type = EMBEDDED; else slot->type = simple_strtoul(type, NULL, 10); diff -Nru a/drivers/pci/hotplug/rpaphp_pci.c b/drivers/pci/hotplug/rpaphp_pci.c --- a/drivers/pci/hotplug/rpaphp_pci.c 2004-09-12 22:14:37 -07:00 +++ b/drivers/pci/hotplug/rpaphp_pci.c 2004-09-12 22:14:37 -07:00 @@ -408,15 +408,52 @@ return 0; } +static int set_phb_slot_name(struct slot *slot) +{ + struct device_node *dn; + struct pci_controller *phb; + struct pci_bus *bus; + + dn = slot->dn; + if (!dn) { + return 1; + } + phb = dn->phb; + if (!phb) { + return 1; + } + bus = phb->bus; + if (!bus) { + return 1; + } + + sprintf(slot->name, "%04x:%02x:%02x.%x", pci_domain_nr(bus), + bus->number, 0, 0); + return 0; +} + static int setup_pci_slot(struct slot *slot) { - slot->bridge = rpaphp_find_bridge_pdev(slot); - if (!slot->bridge) { /* slot being added doesn't have pci_dev yet */ - err("%s: no pci_dev for bridge dn %s\n", __FUNCTION__, slot->name); - goto exit_rc; + int rc; + + if (slot->type == PHB) { + rc = set_phb_slot_name(slot); + if (rc) { + err("%s: failed to set phb slot name\n", __FUNCTION__); + goto exit_rc; + } + } else { + slot->bridge = rpaphp_find_bridge_pdev(slot); + if (!slot->bridge) { + /* slot being added doesn't have pci_dev yet */ + err("%s: no pci_dev for bridge dn %s\n", + __FUNCTION__, slot->name); + goto exit_rc; + } + dbg("%s set slot->name to %s\n", __FUNCTION__, + pci_name(slot->bridge)); + strcpy(slot->name, pci_name(slot->bridge)); } - dbg("%s set slot->name to %s\n", __FUNCTION__, pci_name(slot->bridge)); - strcpy(slot->name, pci_name(slot->bridge)); /* find slot's pci_dev if it's not empty */ if (slot->hotplug_slot->info->adapter_status == EMPTY) { @@ -470,10 +507,10 @@ int rc = 1; slot->dev_type = PCI_DEV; - if (slot->type == EMBEDDED) - slot->removable = EMBEDDED; + if ((slot->type == EMBEDDED) || (slot->type == PHB)) + slot->removable = 0; else - slot->removable = HOTPLUG; + slot->removable = 1; INIT_LIST_HEAD(&slot->dev.pci_funcs); if (setup_pci_hotplug_slot_info(slot)) goto exit_rc; diff -Nru a/drivers/pci/hotplug/rpaphp_slot.c b/drivers/pci/hotplug/rpaphp_slot.c --- a/drivers/pci/hotplug/rpaphp_slot.c 2004-09-12 22:14:37 -07:00 +++ b/drivers/pci/hotplug/rpaphp_slot.c 2004-09-12 22:14:37 -07:00 @@ -246,12 +246,7 @@ { int rc = 0, level; - if (slot->type == EMBEDDED) { - dbg("%s set to POWER_ON for EMBEDDED slot %s\n", - __FUNCTION__, slot->location); - *value = POWER_ON; - } - else { + if (slot->type == HOTPLUG) { rc = rtas_get_power_level(slot->power_domain, &level); if (!rc) { dbg("%s the power level of slot %s(pwd-domain:0x%x) is %d\n", @@ -260,6 +255,10 @@ } else err("failed to get power-level for slot(%s), rc=0x%x\n", slot->location, rc); + } else { + dbg("%s report POWER_ON for EMBEDDED or PHB slot %s\n", + __FUNCTION__, slot->location); + *value = (u8) POWER_ON; } return rc; diff -Nru a/drivers/pci/hotplug/shpchp_ctrl.c b/drivers/pci/hotplug/shpchp_ctrl.c --- a/drivers/pci/hotplug/shpchp_ctrl.c 2004-09-12 22:14:37 -07:00 +++ b/drivers/pci/hotplug/shpchp_ctrl.c 2004-09-12 22:14:37 -07:00 @@ -2163,11 +2163,13 @@ u32 rc = 0; int ret = 0; unsigned int devfn; - struct pci_bus *pci_bus = p_slot->ctrl->pci_dev->subordinate; + struct pci_bus *pci_bus; struct pci_func *func; if (!p_slot->ctrl) return 1; + + pci_bus = p_slot->ctrl->pci_dev->subordinate; /* Check to see if (latch closed, card present, power on) */ down(&p_slot->ctrl->crit_sect); diff -Nru a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c --- a/drivers/pci/pci-sysfs.c 2004-09-12 22:14:37 -07:00 +++ b/drivers/pci/pci-sysfs.c 2004-09-12 22:14:37 -07:00 @@ -5,6 +5,8 @@ * (C) Copyright 2002-2004 IBM Corp. * (C) Copyright 2003 Matthew Wilcox * (C) Copyright 2003 Hewlett-Packard + * (C) Copyright 2004 Jon Smirl + * (C) Copyright 2004 Silicon Graphics, Inc. Jesse Barnes * * File attributes for PCI devices * @@ -20,6 +22,8 @@ #include "pci.h" +static int sysfs_initialized; /* = 0 */ + /* show configuration fields */ #define pci_config_attr(field, format_string) \ static ssize_t \ @@ -164,6 +168,40 @@ return count; } +/** + * pci_read_rom - read a PCI ROM + * @kobj: kernel object handle + * @buf: where to put the data we read from the ROM + * @off: file offset + * @count: number of bytes to read + * + * Put @count bytes starting at @off into @buf from the ROM in the PCI + * device corresponding to @kobj. + */ +static ssize_t +pci_read_rom(struct kobject *kobj, char *buf, loff_t off, size_t count) +{ + struct pci_dev *pdev = to_pci_dev(container_of(kobj, struct device, kobj)); + unsigned char *rom; + size_t size; + + rom = pci_map_rom(pdev, &size); /* size starts out as PCI window size */ + if (!rom) + return 0; + + if (off >= size) + count = 0; + else { + if (off + count > size) + count = size - off; + + memcpy_fromio(buf, rom + off, count); + } + pci_unmap_rom(pdev, rom); + + return count; +} + static struct bin_attribute pci_config_attr = { .attr = { .name = "config", @@ -186,13 +224,67 @@ .write = pci_write_config, }; -void pci_create_sysfs_dev_files (struct pci_dev *pdev) +int pci_create_sysfs_dev_files (struct pci_dev *pdev) { + if (!sysfs_initialized) + return -EACCES; + if (pdev->cfg_size < 4096) sysfs_create_bin_file(&pdev->dev.kobj, &pci_config_attr); else sysfs_create_bin_file(&pdev->dev.kobj, &pcie_config_attr); + /* If the device has a ROM, try to expose it in sysfs. */ + if (pci_resource_len(pdev, PCI_ROM_RESOURCE)) { + struct bin_attribute *rom_attr; + + rom_attr = kmalloc(sizeof(*rom_attr), GFP_ATOMIC); + if (rom_attr) { + pdev->rom_attr = rom_attr; + rom_attr->size = pci_resource_len(pdev, PCI_ROM_RESOURCE); + rom_attr->attr.name = "rom"; + rom_attr->attr.mode = S_IRUSR; + rom_attr->attr.owner = THIS_MODULE; + rom_attr->read = pci_read_rom; + sysfs_create_bin_file(&pdev->dev.kobj, rom_attr); + } + } /* add platform-specific attributes */ pcibios_add_platform_entries(pdev); + + return 0; +} + +/** + * pci_remove_sysfs_dev_files - cleanup PCI specific sysfs files + * @pdev: device whose entries we should free + * + * Cleanup when @pdev is removed from sysfs. + */ +void pci_remove_sysfs_dev_files(struct pci_dev *pdev) +{ + if (pdev->cfg_size < 4096) + sysfs_remove_bin_file(&pdev->dev.kobj, &pci_config_attr); + else + sysfs_remove_bin_file(&pdev->dev.kobj, &pcie_config_attr); + + if (pci_resource_len(pdev, PCI_ROM_RESOURCE)) { + if (pdev->rom_attr) { + sysfs_remove_bin_file(&pdev->dev.kobj, pdev->rom_attr); + kfree(pdev->rom_attr); + } + } +} + +static int __init pci_sysfs_init(void) +{ + struct pci_dev *pdev = NULL; + + sysfs_initialized = 1; + while ((pdev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, pdev)) != NULL) + pci_create_sysfs_dev_files(pdev); + + return 0; } + +__initcall(pci_sysfs_init); diff -Nru a/drivers/pci/pci.c b/drivers/pci/pci.c --- a/drivers/pci/pci.c 2004-09-12 22:14:37 -07:00 +++ b/drivers/pci/pci.c 2004-09-12 22:14:37 -07:00 @@ -382,8 +382,13 @@ int pci_enable_device(struct pci_dev *dev) { + int err; + dev->is_enabled = 1; - return pci_enable_device_bars(dev, (1 << PCI_NUM_RESOURCES) - 1); + if ((err = pci_enable_device_bars(dev, (1 << PCI_NUM_RESOURCES) - 1))) + return err; + pci_fixup_device(pci_fixup_enable, dev); + return 0; } /** @@ -744,7 +749,7 @@ { struct pci_dev *dev = NULL; - while ((dev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) { + while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) { pci_fixup_device(pci_fixup_final, dev); } return 0; diff -Nru a/drivers/pci/pci.h b/drivers/pci/pci.h --- a/drivers/pci/pci.h 2004-09-12 22:14:37 -07:00 +++ b/drivers/pci/pci.h 2004-09-12 22:14:37 -07:00 @@ -2,7 +2,9 @@ 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_create_sysfs_dev_files(struct pci_dev *pdev); +extern void pci_remove_sysfs_dev_files(struct pci_dev *pdev); +extern void pci_cleanup_rom(struct pci_dev *dev); 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, diff -Nru a/drivers/pci/probe.c b/drivers/pci/probe.c --- a/drivers/pci/probe.c 2004-09-12 22:14:37 -07:00 +++ b/drivers/pci/probe.c 2004-09-12 22:14:37 -07:00 @@ -170,7 +170,7 @@ if (sz && sz != 0xffffffff) { sz = pci_size(l, sz, PCI_ROM_ADDRESS_MASK); if (sz) { - res->flags = (l & PCI_ROM_ADDRESS_ENABLE) | + res->flags = (l & IORESOURCE_ROM_ENABLE) | IORESOURCE_MEM | IORESOURCE_PREFETCH | IORESOURCE_READONLY | IORESOURCE_CACHEABLE; res->start = l & PCI_ROM_ADDRESS_MASK; diff -Nru a/drivers/pci/proc.c b/drivers/pci/proc.c --- a/drivers/pci/proc.c 2004-09-12 22:14:37 -07:00 +++ b/drivers/pci/proc.c 2004-09-12 22:14:37 -07:00 @@ -379,7 +379,7 @@ .show = show_device }; -struct proc_dir_entry *proc_bus_pci_dir; +static struct proc_dir_entry *proc_bus_pci_dir; int pci_proc_attach_device(struct pci_dev *dev) { @@ -599,7 +599,7 @@ if (entry) entry->proc_fops = &proc_bus_pci_dev_operations; proc_initialized = 1; - while ((dev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) { + while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) { pci_proc_attach_device(dev); } legacy_proc_init(); @@ -612,6 +612,5 @@ EXPORT_SYMBOL(pci_proc_attach_device); EXPORT_SYMBOL(pci_proc_attach_bus); EXPORT_SYMBOL(pci_proc_detach_bus); -EXPORT_SYMBOL(proc_bus_pci_dir); #endif diff -Nru a/drivers/pci/quirks.c b/drivers/pci/quirks.c --- a/drivers/pci/quirks.c 2004-09-12 22:14:37 -07:00 +++ b/drivers/pci/quirks.c 2004-09-12 22:14:37 -07:00 @@ -30,7 +30,7 @@ /* 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))) { + while ((d = pci_get_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)); @@ -116,21 +116,21 @@ /* 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); + p = pci_get_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; + if (rev < 0x40 || rev > 0x42) + goto exit; } else { - p = pci_find_device(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8231, NULL); + p = pci_get_device(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8231, NULL); if (p==NULL) /* No problem parts */ - return; + goto exit; pci_read_config_byte(p, PCI_CLASS_REVISION, &rev); /* Check for buggy part revisions */ if (rev < 0x10 || rev > 0x12) - return; + goto exit; } /* @@ -153,6 +153,8 @@ busarb |= (1<<4); pci_write_config_byte(dev, 0x76, busarb); printk(KERN_INFO "Applying VIA southbridge workaround.\n"); +exit: + pci_dev_put(p); } DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8363_0, quirk_vialatency ); DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8371_1, quirk_vialatency ); @@ -491,9 +493,9 @@ pci_write_config_byte(dev, PCI_INTERRUPT_LINE, new_irq); } } -DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_2, quirk_via_irqpic ); -DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C686_5, quirk_via_irqpic ); -DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C686_6, quirk_via_irqpic ); +DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_2, quirk_via_irqpic ); +DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C686_5, quirk_via_irqpic ); +DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C686_6, quirk_via_irqpic ); /* @@ -992,7 +994,7 @@ while (f < end) { if ((f->vendor == dev->vendor || f->vendor == (u16) PCI_ANY_ID) && (f->device == dev->device || f->device == (u16) PCI_ANY_ID)) { - pr_debug(KERN_INFO "PCI: Calling quirk %p for %s\n", f->hook, pci_name(dev)); + pr_debug("PCI: Calling quirk %p for %s\n", f->hook, pci_name(dev)); f->hook(dev); } f++; @@ -1003,6 +1005,9 @@ extern struct pci_fixup __end_pci_fixups_header[]; extern struct pci_fixup __start_pci_fixups_final[]; extern struct pci_fixup __end_pci_fixups_final[]; +extern struct pci_fixup __start_pci_fixups_enable[]; +extern struct pci_fixup __end_pci_fixups_enable[]; + void pci_fixup_device(enum pci_fixup_pass pass, struct pci_dev *dev) { @@ -1018,6 +1023,12 @@ start = __start_pci_fixups_final; end = __end_pci_fixups_final; break; + + case pci_fixup_enable: + start = __start_pci_fixups_enable; + end = __end_pci_fixups_enable; + break; + default: /* stupid compiler warning, you would think with an enum... */ return; diff -Nru a/drivers/pci/remove.c b/drivers/pci/remove.c --- a/drivers/pci/remove.c 2004-09-12 22:14:37 -07:00 +++ b/drivers/pci/remove.c 2004-09-12 22:14:37 -07:00 @@ -16,6 +16,7 @@ msi_remove_pci_irq_vectors(dev); + pci_cleanup_rom(dev); for (i = 0; i < PCI_NUM_RESOURCES; i++) { struct resource *res = dev->resource + i; if (res->parent) @@ -26,6 +27,7 @@ static void pci_destroy_dev(struct pci_dev *dev) { pci_proc_detach_device(dev); + pci_remove_sysfs_dev_files(dev); device_unregister(&dev->dev); /* Remove the device from the device lists, and prevent any further diff -Nru a/drivers/pci/rom.c b/drivers/pci/rom.c --- /dev/null Wed Dec 31 16:00:00 196900 +++ b/drivers/pci/rom.c 2004-09-12 22:14:37 -07:00 @@ -0,0 +1,226 @@ +/* + * drivers/pci/rom.c + * + * (C) Copyright 2004 Jon Smirl + * (C) Copyright 2004 Silicon Graphics, Inc. Jesse Barnes + * + * PCI ROM access routines + * + */ + + +#include +#include +#include + +#include "pci.h" + +/** + * pci_enable_rom - enable ROM decoding for a PCI device + * @dev: PCI device to enable + * + * Enable ROM decoding on @dev. This involves simply turning on the last + * bit of the PCI ROM BAR. Note that some cards may share address decoders + * between the ROM and other resources, so enabling it may disable access + * to MMIO registers or other card memory. + */ +static void +pci_enable_rom(struct pci_dev *pdev) +{ + u32 rom_addr; + + pci_read_config_dword(pdev, pdev->rom_base_reg, &rom_addr); + rom_addr |= PCI_ROM_ADDRESS_ENABLE; + pci_write_config_dword(pdev, pdev->rom_base_reg, rom_addr); +} + +/** + * pci_disable_rom - disable ROM decoding for a PCI device + * @dev: PCI device to disable + * + * Disable ROM decoding on a PCI device by turning off the last bit in the + * ROM BAR. + */ +static void +pci_disable_rom(struct pci_dev *pdev) +{ + u32 rom_addr; + pci_read_config_dword(pdev, pdev->rom_base_reg, &rom_addr); + rom_addr &= ~PCI_ROM_ADDRESS_ENABLE; + pci_write_config_dword(pdev, pdev->rom_base_reg, rom_addr); +} + +/** + * pci_map_rom - map a PCI ROM to kernel space + * @dev: pointer to pci device struct + * @size: pointer to receive size of pci window over ROM + * @return: kernel virtual pointer to image of ROM + * + * Map a PCI ROM into kernel space. If ROM is boot video ROM, + * the shadow BIOS copy will be returned instead of the + * actual ROM. + */ +unsigned char * +pci_map_rom(struct pci_dev *pdev, size_t *size) +{ + struct resource *res = &pdev->resource[PCI_ROM_RESOURCE]; + loff_t start; + unsigned char *rom, *image; + int last_image; + + if (res->flags & IORESOURCE_ROM_SHADOW) { /* IORESOURCE_ROM_SHADOW only set on x86 */ + start = (loff_t)0xC0000; /* primary video rom always starts here */ + *size = 0x20000; /* cover C000:0 through E000:0 */ + } else { + if (res->flags & IORESOURCE_ROM_COPY) { + *size = pci_resource_len(pdev, PCI_ROM_RESOURCE); + return (unsigned char *)pci_resource_start(pdev, PCI_ROM_RESOURCE); + } else { + /* assign the ROM an address if it doesn't have one */ + if (res->parent == NULL) + pci_assign_resource(pdev, PCI_ROM_RESOURCE); + + start = pci_resource_start(pdev, PCI_ROM_RESOURCE); + *size = pci_resource_len(pdev, PCI_ROM_RESOURCE); + if (*size == 0) + return NULL; + + /* Enable ROM space decodes */ + pci_enable_rom(pdev); + } + } + + rom = ioremap(start, *size); + if (!rom) { + /* restore enable if ioremap fails */ + if (!(res->flags & (IORESOURCE_ROM_ENABLE | IORESOURCE_ROM_SHADOW | IORESOURCE_ROM_COPY))) + pci_disable_rom(pdev); + return NULL; + } + + /* Try to find the true size of the ROM since sometimes the PCI window */ + /* size is much larger than the actual size of the ROM. */ + /* True size is important if the ROM is going to be copied. */ + image = rom; + do { + char *pds; + /* Standard PCI ROMs start out with these bytes 55 AA */ + if (readb(image) != 0x55) + break; + if (readb(image + 1) != 0xAA) + break; + /* get the PCI data structure and check its signature */ + pds = image + readw(image + 24); + if (readb(pds) != 'P') + break; + if (readb(pds + 1) != 'C') + break; + if (readb(pds + 2) != 'I') + break; + if (readb(pds + 3) != 'R') + break; + last_image = readb(pds + 21) & 0x80; + /* this length is reliable */ + image += readw(pds + 16) * 512; + } while (!last_image); + + *size = image - rom; + + return rom; +} + +/** + * pci_map_rom_copy - map a PCI ROM to kernel space, create a copy + * @dev: pointer to pci device struct + * @size: pointer to receive size of pci window over ROM + * @return: kernel virtual pointer to image of ROM + * + * Map a PCI ROM into kernel space. If ROM is boot video ROM, + * the shadow BIOS copy will be returned instead of the + * actual ROM. + */ +unsigned char * +pci_map_rom_copy(struct pci_dev *pdev, size_t *size) +{ + struct resource *res = &pdev->resource[PCI_ROM_RESOURCE]; + unsigned char *rom; + + rom = pci_map_rom(pdev, size); + if (!rom) + return NULL; + + if (res->flags & (IORESOURCE_ROM_COPY | IORESOURCE_ROM_SHADOW)) + return rom; + + res->start = (unsigned long)kmalloc(*size, GFP_KERNEL); + if (!res->start) + return rom; + + res->end = res->start + *size; + memcpy((void*)res->start, rom, *size); + pci_unmap_rom(pdev, rom); + res->flags |= IORESOURCE_ROM_COPY; + + return (unsigned char *)res->start; +} + +/** + * pci_unmap_rom - unmap the ROM from kernel space + * @dev: pointer to pci device struct + * @rom: virtual address of the previous mapping + * + * Remove a mapping of a previously mapped ROM + */ +void +pci_unmap_rom(struct pci_dev *pdev, unsigned char *rom) +{ + struct resource *res = &pdev->resource[PCI_ROM_RESOURCE]; + + if (res->flags & IORESOURCE_ROM_COPY) + return; + + iounmap(rom); + + /* Disable again before continuing, leave enabled if pci=rom */ + if (!(res->flags & (IORESOURCE_ROM_ENABLE | IORESOURCE_ROM_SHADOW))) + pci_disable_rom(pdev); +} + +/** + * pci_remove_rom - disable the ROM and remove its sysfs attribute + * @dev: pointer to pci device struct + * + */ +void +pci_remove_rom(struct pci_dev *pdev) +{ + struct resource *res = &pdev->resource[PCI_ROM_RESOURCE]; + + if (pci_resource_len(pdev, PCI_ROM_RESOURCE)) + sysfs_remove_bin_file(&pdev->dev.kobj, pdev->rom_attr); + if (!(res->flags & (IORESOURCE_ROM_ENABLE | IORESOURCE_ROM_SHADOW | IORESOURCE_ROM_COPY))) + pci_disable_rom(pdev); +} + +/** + * pci_cleanup_rom - internal routine for freeing the ROM copy created + * by pci_map_rom_copy called from remove.c + * @dev: pointer to pci device struct + * + */ +void +pci_cleanup_rom(struct pci_dev *pdev) +{ + struct resource *res = &pdev->resource[PCI_ROM_RESOURCE]; + if (res->flags & IORESOURCE_ROM_COPY) { + kfree((void*)res->start); + res->flags &= ~IORESOURCE_ROM_COPY; + res->start = 0; + res->end = 0; + } +} + +EXPORT_SYMBOL(pci_map_rom); +EXPORT_SYMBOL(pci_map_rom_copy); +EXPORT_SYMBOL(pci_unmap_rom); +EXPORT_SYMBOL(pci_remove_rom); diff -Nru a/drivers/pci/search.c b/drivers/pci/search.c --- a/drivers/pci/search.c 2004-09-12 22:14:37 -07:00 +++ b/drivers/pci/search.c 2004-09-12 22:14:37 -07:00 @@ -1,10 +1,10 @@ /* * PCI searching functions. * - * Copyright 1993 -- 1997 Drew Eckhardt, Frederic Potter, - * David Mosberger-Tang - * Copyright 1997 -- 2000 Martin Mares - * Copyright 2003 -- Greg Kroah-Hartman + * Copyright (C) 1993 -- 1997 Drew Eckhardt, Frederic Potter, + * David Mosberger-Tang + * Copyright (C) 1997 -- 2000 Martin Mares + * Copyright (C) 2003 -- 2004 Greg Kroah-Hartman */ #include @@ -156,10 +156,11 @@ * 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) +static 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; @@ -257,12 +258,6 @@ * @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 @@ -312,25 +307,26 @@ return dev; } - /** - * pci_find_class - begin or continue searching for a PCI device by class + * pci_get_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. + * found with a matching @class, 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. + * on the global list. The reference count for @from is always decremented + * if it is not %NULL. */ -struct pci_dev * -pci_find_class(unsigned int class, const struct pci_dev *from) +struct pci_dev *pci_get_class(unsigned int class, 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; @@ -342,16 +338,17 @@ } dev = NULL; exit: + pci_dev_put(from); + dev = pci_dev_get(dev); 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); EXPORT_SYMBOL(pci_get_slot); +EXPORT_SYMBOL(pci_get_class); diff -Nru a/drivers/pci/setup-bus.c b/drivers/pci/setup-bus.c --- a/drivers/pci/setup-bus.c 2004-09-12 22:14:37 -07:00 +++ b/drivers/pci/setup-bus.c 2004-09-12 22:14:37 -07:00 @@ -533,16 +533,16 @@ void __init pci_assign_unassigned_resources(void) { - struct list_head *ln; + struct pci_bus *bus; /* Depth first, calculate sizes and alignments of all subordinate buses. */ - list_for_each(ln, &pci_root_buses) { - pci_bus_size_bridges(pci_bus_b(ln)); + list_for_each_entry(bus, &pci_root_buses, node) { + pci_bus_size_bridges(bus); } /* Depth last, allocate resources and update the hardware. */ - list_for_each(ln, &pci_root_buses) { - pci_bus_assign_resources(pci_bus_b(ln)); - pci_enable_bridges(pci_bus_b(ln)); + list_for_each_entry(bus, &pci_root_buses, node) { + pci_bus_assign_resources(bus); + pci_enable_bridges(bus); } } diff -Nru a/drivers/pci/setup-irq.c b/drivers/pci/setup-irq.c --- a/drivers/pci/setup-irq.c 2004-09-12 22:14:37 -07:00 +++ b/drivers/pci/setup-irq.c 2004-09-12 22:14:37 -07:00 @@ -65,7 +65,7 @@ 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) { + while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) { pdev_fixup_irq(dev, swizzle, map_irq); } } diff -Nru a/drivers/pci/setup-res.c b/drivers/pci/setup-res.c --- a/drivers/pci/setup-res.c 2004-09-12 22:14:37 -07:00 +++ b/drivers/pci/setup-res.c 2004-09-12 22:14:37 -07:00 @@ -56,7 +56,7 @@ if (resno < 6) { reg = PCI_BASE_ADDRESS_0 + 4 * resno; } else if (resno == PCI_ROM_RESOURCE) { - new |= res->flags & PCI_ROM_ADDRESS_ENABLE; + new |= res->flags & IORESOURCE_ROM_ENABLE; reg = dev->rom_base_reg; } else { /* Hmm, non-standard resource. */ diff -Nru a/drivers/pnp/system.c b/drivers/pnp/system.c --- a/drivers/pnp/system.c 2004-09-12 22:14:37 -07:00 +++ b/drivers/pnp/system.c 2004-09-12 22:14:37 -07:00 @@ -104,4 +104,8 @@ return pnp_register_driver(&system_pnp_driver); } -subsys_initcall(pnp_system_init); +/** + * Reserve motherboard resources after PCI claim BARs, + * but before PCI assign resources for uninitialized PCI devices + */ +fs_initcall(pnp_system_init); diff -Nru a/drivers/scsi/eata.c b/drivers/scsi/eata.c --- a/drivers/scsi/eata.c 2004-09-12 22:14:37 -07:00 +++ b/drivers/scsi/eata.c 2004-09-12 22:14:37 -07:00 @@ -1005,7 +1005,7 @@ unsigned int addr; struct pci_dev *dev = NULL; - while((dev = pci_find_class(PCI_CLASS_STORAGE_SCSI << 8, dev))) { + while((dev = pci_get_class(PCI_CLASS_STORAGE_SCSI << 8, dev))) { addr = pci_resource_start (dev, 0); #if defined(DEBUG_PCI_DETECT) @@ -1013,6 +1013,11 @@ driver_name, dev->bus->number, dev->devfn, addr); #endif + /* we are in so much trouble for a pci hotplug system with this driver + * anyway, so doing this at least lets people unload the driver and not + * cause memory problems, but in general this is a bad thing to do (this + * driver needs to be converted to the proper PCI api someday... */ + pci_dev_put(dev); if (addr + PCI_BASE_ADDRESS_0 == port_base) return dev; } @@ -1027,7 +1032,7 @@ struct pci_dev *dev = NULL; - while((dev = pci_find_class(PCI_CLASS_STORAGE_SCSI << 8, dev))) { + while((dev = pci_get_class(PCI_CLASS_STORAGE_SCSI << 8, dev))) { #if defined(DEBUG_PCI_DETECT) printk("%s: enable_pci_ports, bus %d, devfn 0x%x.\n", @@ -1454,7 +1459,7 @@ for (k = 0; k < MAX_PCI; k++) { - if (!(dev = pci_find_class(PCI_CLASS_STORAGE_SCSI << 8, dev))) break; + if (!(dev = pci_get_class(PCI_CLASS_STORAGE_SCSI << 8, dev))) break; if (pci_enable_device (dev)) { @@ -1478,6 +1483,7 @@ addr + PCI_BASE_ADDRESS_0; } + pci_dev_put(dev); #endif /* end CONFIG_PCI */ return; diff -Nru a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h --- a/include/asm-generic/vmlinux.lds.h 2004-09-12 22:14:37 -07:00 +++ b/include/asm-generic/vmlinux.lds.h 2004-09-12 22:14:37 -07:00 @@ -24,6 +24,9 @@ VMLINUX_SYMBOL(__start_pci_fixups_final) = .; \ *(.pci_fixup_final) \ VMLINUX_SYMBOL(__end_pci_fixups_final) = .; \ + VMLINUX_SYMBOL(__start_pci_fixups_enable) = .; \ + *(.pci_fixup_enable) \ + VMLINUX_SYMBOL(__end_pci_fixups_enable) = .; \ } \ \ /* Kernel symbol table: Normal symbols */ \ diff -Nru a/include/linux/ioport.h b/include/linux/ioport.h --- a/include/linux/ioport.h 2004-09-12 22:14:37 -07:00 +++ b/include/linux/ioport.h 2004-09-12 22:14:37 -07:00 @@ -82,6 +82,11 @@ #define IORESOURCE_MEM_SHADOWABLE (1<<5) /* dup: IORESOURCE_SHADOWABLE */ #define IORESOURCE_MEM_EXPANSIONROM (1<<6) +/* PCI ROM control bits (IORESOURCE_BITS) */ +#define IORESOURCE_ROM_ENABLE (1<<0) /* ROM is enabled, same as PCI_ROM_ADDRESS_ENABLE */ +#define IORESOURCE_ROM_SHADOW (1<<1) /* ROM is copy at C000:0 */ +#define IORESOURCE_ROM_COPY (1<<2) /* ROM is alloc'd copy, resource field overlaid */ + /* PC/ISA/whatever - the normal PC address spaces: IO and memory */ extern struct resource ioport_resource; extern struct resource iomem_resource; diff -Nru a/include/linux/pci.h b/include/linux/pci.h --- a/include/linux/pci.h 2004-09-12 22:14:37 -07:00 +++ b/include/linux/pci.h 2004-09-12 22:14:37 -07:00 @@ -537,6 +537,7 @@ unsigned int is_busmaster:1; /* device is busmaster */ u32 saved_config_space[16]; /* config space saved at suspend time */ + struct bin_attribute *rom_attr; /* attribute descriptor for sysfs ROM entry */ #ifdef CONFIG_PCI_NAMES #define PCI_NAME_SIZE 96 #define PCI_NAME_HALF __stringify(43) /* less than half to handle slop */ @@ -719,10 +720,6 @@ struct pci_dev *pci_find_device (unsigned int vendor, unsigned int device, const struct pci_dev *from); struct pci_dev *pci_find_device_reverse (unsigned int vendor, unsigned int device, const struct pci_dev *from); -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 pci_dev *pci_find_class (unsigned int class, const struct pci_dev *from); struct pci_dev *pci_find_slot (unsigned int bus, unsigned int devfn); int pci_find_capability (struct pci_dev *dev, int cap); int pci_find_ext_capability (struct pci_dev *dev, int cap); @@ -733,6 +730,7 @@ unsigned int ss_vendor, unsigned int ss_device, struct pci_dev *from); struct pci_dev *pci_get_slot (struct pci_bus *bus, unsigned int devfn); +struct pci_dev *pci_get_class (unsigned int class, 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); @@ -778,6 +776,12 @@ int pci_set_consistent_dma_mask(struct pci_dev *dev, u64 mask); int pci_assign_resource(struct pci_dev *dev, int i); +/* ROM control related routines */ +unsigned char *pci_map_rom(struct pci_dev *pdev, size_t *size); +unsigned char *pci_map_rom_copy(struct pci_dev *pdev, size_t *size); +void pci_unmap_rom(struct pci_dev *pdev, unsigned char *rom); +void pci_remove_rom(struct pci_dev *pdev); + /* Power management related routines */ int pci_save_state(struct pci_dev *dev, u32 *buffer); int pci_restore_state(struct pci_dev *dev, u32 *buffer); @@ -882,16 +886,9 @@ static inline struct pci_dev *pci_find_device(unsigned int vendor, unsigned int device, const struct pci_dev *from) { return NULL; } -static inline struct pci_dev *pci_find_class(unsigned int class, const struct pci_dev *from) -{ return NULL; } - static inline struct pci_dev *pci_find_slot(unsigned int bus, unsigned int devfn) { return NULL; } -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; } @@ -899,6 +896,9 @@ unsigned int ss_vendor, unsigned int ss_device, struct pci_dev *from) { return NULL; } +static inline struct pci_dev *pci_get_class(unsigned int class, struct pci_dev *from) +{ return NULL; } + static inline void pci_set_master(struct pci_dev *dev) { } static inline int pci_enable_device(struct pci_dev *dev) { return -EIO; } static inline void pci_disable_device(struct pci_dev *dev) { } @@ -1008,6 +1008,7 @@ enum pci_fixup_pass { pci_fixup_header, /* Called immediately after reading configuration header */ pci_fixup_final, /* Final phase of device fixups */ + pci_fixup_enable, /* pci_enable_device() time */ }; /* Anonymous variables would be nice... */ @@ -1020,6 +1021,12 @@ static struct pci_fixup __pci_fixup_##vendor##device##hook __attribute_used__ \ __attribute__((__section__(".pci_fixup_final"))) = { \ vendor, device, hook }; + +#define DECLARE_PCI_FIXUP_ENABLE(vendor, device, hook) \ + static struct pci_fixup __pci_fixup_##vendor##device##hook __attribute_used__ \ + __attribute__((__section__(".pci_fixup_enable"))) = { \ + vendor, device, hook }; + void pci_fixup_device(enum pci_fixup_pass pass, struct pci_dev *dev);