Commit cac3337b authored by Linus Torvalds's avatar Linus Torvalds

Merge bk://kernel.bkbits.net/gregkh/linux/pci-2.6

into home.osdl.org:/home/torvalds/v2.5/linux
parents 9ccf0731 0a23a9c0
...@@ -20,6 +20,10 @@ Part I - pci_ and dma_ Equivalent API ...@@ -20,6 +20,10 @@ Part I - pci_ and dma_ Equivalent API
To get the pci_ API, you must #include <linux/pci.h> To get the pci_ API, you must #include <linux/pci.h>
To get the dma_ API, you must #include <linux/dma-mapping.h> To get the dma_ API, you must #include <linux/dma-mapping.h>
Part Ia - Using large dma-coherent buffers
------------------------------------------
void * void *
dma_alloc_coherent(struct device *dev, size_t size, dma_alloc_coherent(struct device *dev, size_t size,
dma_addr_t *dma_handle, int flag) dma_addr_t *dma_handle, int flag)
...@@ -42,6 +46,7 @@ address space) or NULL if the allocation failed. ...@@ -42,6 +46,7 @@ address space) or NULL if the allocation failed.
Note: consistent memory can be expensive on some platforms, and the Note: consistent memory can be expensive on some platforms, and the
minimum allocation length may be as big as a page, so you should minimum allocation length may be as big as a page, so you should
consolidate your requests for consistent memory as much as possible. consolidate your requests for consistent memory as much as possible.
The simplest way to do that is to use the dma_pool calls (see below).
The flag parameter (dma_alloc_coherent only) allows the caller to The flag parameter (dma_alloc_coherent only) allows the caller to
specify the GFP_ flags (see kmalloc) for the allocation (the specify the GFP_ flags (see kmalloc) for the allocation (the
...@@ -61,6 +66,77 @@ size and dma_handle must all be the same as those passed into the ...@@ -61,6 +66,77 @@ size and dma_handle must all be the same as those passed into the
consistent allocate. cpu_addr must be the virtual address returned by consistent allocate. cpu_addr must be the virtual address returned by
the consistent allocate the consistent allocate
Part Ib - Using small dma-coherent buffers
------------------------------------------
To get this part of the dma_ API, you must #include <linux/dmapool.h>
Many drivers need lots of small dma-coherent memory regions for DMA
descriptors or I/O buffers. Rather than allocating in units of a page
or more using dma_alloc_coherent(), you can use DMA pools. These work
much like a kmem_cache_t, except that they use the dma-coherent allocator
not __get_free_pages(). Also, they understand common hardware constraints
for alignment, like queue heads needing to be aligned on N byte boundaries.
struct dma_pool *
dma_pool_create(const char *name, struct device *dev,
size_t size, size_t align, size_t alloc);
struct pci_pool *
pci_pool_create(const char *name, struct pci_device *dev,
size_t size, size_t align, size_t alloc);
The pool create() routines initialize a pool of dma-coherent buffers
for use with a given device. It must be called in a context which
can sleep.
The "name" is for diagnostics (like a kmem_cache_t name); dev and size
are like what you'd pass to dma_alloc_coherent(). The device's hardware
alignment requirement for this type of data is "align" (which is expressed
in bytes, and must be a power of two). If your device has no boundary
crossing restrictions, pass 0 for alloc; passing 4096 says memory allocated
from this pool must not cross 4KByte boundaries.
void *dma_pool_alloc(struct dma_pool *pool, int gfp_flags,
dma_addr_t *dma_handle);
void *pci_pool_alloc(struct pci_pool *pool, int gfp_flags,
dma_addr_t *dma_handle);
This allocates memory from the pool; the returned memory will meet the size
and alignment requirements specified at creation time. Pass GFP_ATOMIC to
prevent blocking, or if it's permitted (not in_interrupt, not holding SMP locks)
pass GFP_KERNEL to allow blocking. Like dma_alloc_coherent(), this returns
two values: an address usable by the cpu, and the dma address usable by the
pool's device.
void dma_pool_free(struct dma_pool *pool, void *vaddr,
dma_addr_t addr);
void pci_pool_free(struct pci_pool *pool, void *vaddr,
dma_addr_t addr);
This puts memory back into the pool. The pool is what was passed to
the the pool allocation routine; the cpu and dma addresses are what
were returned when that routine allocated the memory being freed.
void dma_pool_destroy(struct dma_pool *pool);
void pci_pool_destroy(struct pci_pool *pool);
The pool destroy() routines free the resources of the pool. They must be
called in a context which can sleep. Make sure you've freed all allocated
memory back to the pool before you destroy it.
Part Ic - DMA addressing limitations
------------------------------------
int int
dma_supported(struct device *dev, u64 mask) dma_supported(struct device *dev, u64 mask)
int int
...@@ -86,6 +162,10 @@ parameters if it is. ...@@ -86,6 +162,10 @@ parameters if it is.
Returns: 1 if successful and 0 if not Returns: 1 if successful and 0 if not
Part Id - Streaming DMA mappings
--------------------------------
dma_addr_t dma_addr_t
dma_map_single(struct device *dev, void *cpu_addr, size_t size, dma_map_single(struct device *dev, void *cpu_addr, size_t size,
enum dma_data_direction direction) enum dma_data_direction direction)
...@@ -254,6 +334,7 @@ Notes: You must do this: ...@@ -254,6 +334,7 @@ Notes: You must do this:
See also dma_map_single(). See also dma_map_single().
Part II - Advanced dma_ usage Part II - Advanced dma_ usage
----------------------------- -----------------------------
......
...@@ -943,12 +943,50 @@ int pirq_enable_irq(struct pci_dev *dev) ...@@ -943,12 +943,50 @@ int pirq_enable_irq(struct pci_dev *dev)
{ {
u8 pin; u8 pin;
extern int interrupt_line_quirk; extern int interrupt_line_quirk;
struct pci_dev *temp_dev;
pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &pin); pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &pin);
if (pin && !pcibios_lookup_irq(dev, 1) && !dev->irq) { if (pin && !pcibios_lookup_irq(dev, 1) && !dev->irq) {
char *msg; char *msg;
if (io_apic_assign_pci_irqs) msg = "";
msg = " Probably buggy MP table."; if (io_apic_assign_pci_irqs) {
else if (pci_probe & PCI_BIOS_IRQ_SCAN) int irq;
if (pin) {
pin--; /* interrupt pins are numbered starting from 1 */
irq = IO_APIC_get_PCI_irq_vector(dev->bus->number, PCI_SLOT(dev->devfn), pin);
/*
* Busses behind bridges are typically not listed in the MP-table.
* In this case we have to look up the IRQ based on the parent bus,
* parent slot, and pin number. The SMP code detects such bridged
* busses itself so we should get into this branch reliably.
*/
temp_dev = dev;
while (irq < 0 && dev->bus->parent) { /* go back to the bridge */
struct pci_dev * bridge = dev->bus->self;
pin = (pin + PCI_SLOT(dev->devfn)) % 4;
irq = IO_APIC_get_PCI_irq_vector(bridge->bus->number,
PCI_SLOT(bridge->devfn), pin);
if (irq >= 0)
printk(KERN_WARNING "PCI: using PPB(B%d,I%d,P%d) to get irq %d\n",
bridge->bus->number, PCI_SLOT(bridge->devfn), pin, irq);
dev = bridge;
}
dev = temp_dev;
if (irq >= 0) {
#ifdef CONFIG_PCI_USE_VECTOR
if (!platform_legacy_irq(irq))
irq = IO_APIC_VECTOR(irq);
#endif
printk(KERN_INFO "PCI->APIC IRQ transform: (B%d,I%d,P%d) -> %d\n",
dev->bus->number, PCI_SLOT(dev->devfn), pin, irq);
dev->irq = irq;
return 0;
} else
msg = " Probably buggy MP table.";
}
} else if (pci_probe & PCI_BIOS_IRQ_SCAN)
msg = ""; msg = "";
else else
msg = " Please try using pci=biosirq."; msg = " Please try using pci=biosirq.";
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
obj-y := core.o sys.o interface.o bus.o \ obj-y := core.o sys.o interface.o bus.o \
driver.o class.o class_simple.o platform.o \ driver.o class.o class_simple.o platform.o \
cpu.o firmware.o init.o map.o cpu.o firmware.o init.o map.o dmapool.o
obj-y += power/ obj-y += power/
obj-$(CONFIG_FW_LOADER) += firmware_class.o obj-$(CONFIG_FW_LOADER) += firmware_class.o
obj-$(CONFIG_NUMA) += node.o obj-$(CONFIG_NUMA) += node.o
...@@ -194,6 +194,7 @@ void device_initialize(struct device *dev) ...@@ -194,6 +194,7 @@ void device_initialize(struct device *dev)
INIT_LIST_HEAD(&dev->children); INIT_LIST_HEAD(&dev->children);
INIT_LIST_HEAD(&dev->driver_list); INIT_LIST_HEAD(&dev->driver_list);
INIT_LIST_HEAD(&dev->bus_list); INIT_LIST_HEAD(&dev->bus_list);
INIT_LIST_HEAD(&dev->dma_pools);
} }
/** /**
......
#include <linux/pci.h>
#include <linux/device.h>
#include <linux/mm.h>
#include <asm/io.h> /* Needed for i386 to build */
#include <asm/scatterlist.h> /* Needed for i386 to build */
#include <linux/dma-mapping.h>
#include <linux/dmapool.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/module.h> #include <linux/module.h>
/* /*
* Pool allocator ... wraps the pci_alloc_consistent page allocator, so * Pool allocator ... wraps the dma_alloc_coherent page allocator, so
* small blocks are easily used by drivers for bus mastering controllers. * small blocks are easily used by drivers for bus mastering controllers.
* This should probably be sharing the guts of the slab allocator. * This should probably be sharing the guts of the slab allocator.
*/ */
struct pci_pool { /* the pool */ struct dma_pool { /* the pool */
struct list_head page_list; struct list_head page_list;
spinlock_t lock; spinlock_t lock;
size_t blocks_per_page; size_t blocks_per_page;
size_t size; size_t size;
struct pci_dev *dev; struct device *dev;
size_t allocation; size_t allocation;
char name [32]; char name [32];
wait_queue_head_t waitq; wait_queue_head_t waitq;
struct list_head pools; struct list_head pools;
}; };
struct pci_page { /* cacheable header for 'allocation' bytes */ struct dma_page { /* cacheable header for 'allocation' bytes */
struct list_head page_list; struct list_head page_list;
void *vaddr; void *vaddr;
dma_addr_t dma; dma_addr_t dma;
...@@ -37,12 +43,12 @@ static DECLARE_MUTEX (pools_lock); ...@@ -37,12 +43,12 @@ static DECLARE_MUTEX (pools_lock);
static ssize_t static ssize_t
show_pools (struct device *dev, char *buf) show_pools (struct device *dev, char *buf)
{ {
struct pci_dev *pdev; unsigned temp;
unsigned temp, size; unsigned size;
char *next; char *next;
struct list_head *i, *j; struct dma_page *page;
struct dma_pool *pool;
pdev = container_of (dev, struct pci_dev, dev);
next = buf; next = buf;
size = PAGE_SIZE; size = PAGE_SIZE;
...@@ -51,16 +57,11 @@ show_pools (struct device *dev, char *buf) ...@@ -51,16 +57,11 @@ show_pools (struct device *dev, char *buf)
next += temp; next += temp;
down (&pools_lock); down (&pools_lock);
list_for_each (i, &pdev->pools) { list_for_each_entry(pool, &dev->dma_pools, pools) {
struct pci_pool *pool; unsigned pages = 0;
unsigned pages = 0, blocks = 0; unsigned blocks = 0;
pool = list_entry (i, struct pci_pool, pools);
list_for_each (j, &pool->page_list) {
struct pci_page *page;
page = list_entry (j, struct pci_page, page_list); list_for_each_entry(page, &pool->page_list, page_list) {
pages++; pages++;
blocks += page->in_use; blocks += page->in_use;
} }
...@@ -80,31 +81,31 @@ show_pools (struct device *dev, char *buf) ...@@ -80,31 +81,31 @@ show_pools (struct device *dev, char *buf)
static DEVICE_ATTR (pools, S_IRUGO, show_pools, NULL); static DEVICE_ATTR (pools, S_IRUGO, show_pools, NULL);
/** /**
* pci_pool_create - Creates a pool of pci consistent memory blocks, for dma. * dma_pool_create - Creates a pool of consistent memory blocks, for dma.
* @name: name of pool, for diagnostics * @name: name of pool, for diagnostics
* @pdev: pci device that will be doing the DMA * @dev: device that will be doing the DMA
* @size: size of the blocks in this pool. * @size: size of the blocks in this pool.
* @align: alignment requirement for blocks; must be a power of two * @align: alignment requirement for blocks; must be a power of two
* @allocation: returned blocks won't cross this boundary (or zero) * @allocation: returned blocks won't cross this boundary (or zero)
* Context: !in_interrupt() * Context: !in_interrupt()
* *
* Returns a pci allocation pool with the requested characteristics, or * Returns a dma allocation pool with the requested characteristics, or
* null if one can't be created. Given one of these pools, pci_pool_alloc() * null if one can't be created. Given one of these pools, dma_pool_alloc()
* may be used to allocate memory. Such memory will all have "consistent" * may be used to allocate memory. Such memory will all have "consistent"
* DMA mappings, accessible by the device and its driver without using * DMA mappings, accessible by the device and its driver without using
* cache flushing primitives. The actual size of blocks allocated may be * cache flushing primitives. The actual size of blocks allocated may be
* larger than requested because of alignment. * larger than requested because of alignment.
* *
* If allocation is nonzero, objects returned from pci_pool_alloc() won't * If allocation is nonzero, objects returned from dma_pool_alloc() won't
* cross that size boundary. This is useful for devices which have * cross that size boundary. This is useful for devices which have
* addressing restrictions on individual DMA transfers, such as not crossing * addressing restrictions on individual DMA transfers, such as not crossing
* boundaries of 4KBytes. * boundaries of 4KBytes.
*/ */
struct pci_pool * struct dma_pool *
pci_pool_create (const char *name, struct pci_dev *pdev, dma_pool_create (const char *name, struct device *dev,
size_t size, size_t align, size_t allocation) size_t size, size_t align, size_t allocation)
{ {
struct pci_pool *retval; struct dma_pool *retval;
if (align == 0) if (align == 0)
align = 1; align = 1;
...@@ -131,7 +132,7 @@ pci_pool_create (const char *name, struct pci_dev *pdev, ...@@ -131,7 +132,7 @@ pci_pool_create (const char *name, struct pci_dev *pdev,
strlcpy (retval->name, name, sizeof retval->name); strlcpy (retval->name, name, sizeof retval->name);
retval->dev = pdev; retval->dev = dev;
INIT_LIST_HEAD (&retval->page_list); INIT_LIST_HEAD (&retval->page_list);
spin_lock_init (&retval->lock); spin_lock_init (&retval->lock);
...@@ -140,12 +141,12 @@ pci_pool_create (const char *name, struct pci_dev *pdev, ...@@ -140,12 +141,12 @@ pci_pool_create (const char *name, struct pci_dev *pdev,
retval->blocks_per_page = allocation / size; retval->blocks_per_page = allocation / size;
init_waitqueue_head (&retval->waitq); init_waitqueue_head (&retval->waitq);
if (pdev) { if (dev) {
down (&pools_lock); down (&pools_lock);
if (list_empty (&pdev->pools)) if (list_empty (&dev->dma_pools))
device_create_file (&pdev->dev, &dev_attr_pools); device_create_file (dev, &dev_attr_pools);
/* note: not currently insisting "name" be unique */ /* note: not currently insisting "name" be unique */
list_add (&retval->pools, &pdev->pools); list_add (&retval->pools, &dev->dma_pools);
up (&pools_lock); up (&pools_lock);
} else } else
INIT_LIST_HEAD (&retval->pools); INIT_LIST_HEAD (&retval->pools);
...@@ -154,22 +155,23 @@ pci_pool_create (const char *name, struct pci_dev *pdev, ...@@ -154,22 +155,23 @@ pci_pool_create (const char *name, struct pci_dev *pdev,
} }
static struct pci_page * static struct dma_page *
pool_alloc_page (struct pci_pool *pool, int mem_flags) pool_alloc_page (struct dma_pool *pool, int mem_flags)
{ {
struct pci_page *page; struct dma_page *page;
int mapsize; int mapsize;
mapsize = pool->blocks_per_page; mapsize = pool->blocks_per_page;
mapsize = (mapsize + BITS_PER_LONG - 1) / BITS_PER_LONG; mapsize = (mapsize + BITS_PER_LONG - 1) / BITS_PER_LONG;
mapsize *= sizeof (long); mapsize *= sizeof (long);
page = (struct pci_page *) kmalloc (mapsize + sizeof *page, mem_flags); page = (struct dma_page *) kmalloc (mapsize + sizeof *page, mem_flags);
if (!page) if (!page)
return 0; return 0;
page->vaddr = pci_alloc_consistent (pool->dev, page->vaddr = dma_alloc_coherent (pool->dev,
pool->allocation, pool->allocation,
&page->dma); &page->dma,
mem_flags);
if (page->vaddr) { if (page->vaddr) {
memset (page->bitmap, 0xff, mapsize); // bit set == free memset (page->bitmap, 0xff, mapsize); // bit set == free
#ifdef CONFIG_DEBUG_SLAB #ifdef CONFIG_DEBUG_SLAB
...@@ -197,44 +199,47 @@ is_page_busy (int blocks, unsigned long *bitmap) ...@@ -197,44 +199,47 @@ is_page_busy (int blocks, unsigned long *bitmap)
} }
static void static void
pool_free_page (struct pci_pool *pool, struct pci_page *page) pool_free_page (struct dma_pool *pool, struct dma_page *page)
{ {
dma_addr_t dma = page->dma; dma_addr_t dma = page->dma;
#ifdef CONFIG_DEBUG_SLAB #ifdef CONFIG_DEBUG_SLAB
memset (page->vaddr, POOL_POISON_FREED, pool->allocation); memset (page->vaddr, POOL_POISON_FREED, pool->allocation);
#endif #endif
pci_free_consistent (pool->dev, pool->allocation, page->vaddr, dma); dma_free_coherent (pool->dev, pool->allocation, page->vaddr, dma);
list_del (&page->page_list); list_del (&page->page_list);
kfree (page); kfree (page);
} }
/** /**
* pci_pool_destroy - destroys a pool of pci memory blocks. * dma_pool_destroy - destroys a pool of dma memory blocks.
* @pool: pci pool that will be destroyed * @pool: dma pool that will be destroyed
* Context: !in_interrupt() * Context: !in_interrupt()
* *
* Caller guarantees that no more memory from the pool is in use, * Caller guarantees that no more memory from the pool is in use,
* and that nothing will try to use the pool after this call. * and that nothing will try to use the pool after this call.
*/ */
void void
pci_pool_destroy (struct pci_pool *pool) dma_pool_destroy (struct dma_pool *pool)
{ {
down (&pools_lock); down (&pools_lock);
list_del (&pool->pools); list_del (&pool->pools);
if (pool->dev && list_empty (&pool->dev->pools)) if (pool->dev && list_empty (&pool->dev->dma_pools))
device_remove_file (&pool->dev->dev, &dev_attr_pools); device_remove_file (pool->dev, &dev_attr_pools);
up (&pools_lock); up (&pools_lock);
while (!list_empty (&pool->page_list)) { while (!list_empty (&pool->page_list)) {
struct pci_page *page; struct dma_page *page;
page = list_entry (pool->page_list.next, page = list_entry (pool->page_list.next,
struct pci_page, page_list); struct dma_page, page_list);
if (is_page_busy (pool->blocks_per_page, page->bitmap)) { if (is_page_busy (pool->blocks_per_page, page->bitmap)) {
printk (KERN_ERR "pci_pool_destroy %s/%s, %p busy\n", if (pool->dev)
pool->dev ? pci_name(pool->dev) : NULL, dev_err(pool->dev, "dma_pool_destroy %s, %p busy\n",
pool->name, page->vaddr); pool->name, page->vaddr);
else
printk (KERN_ERR "dma_pool_destroy %s, %p busy\n",
pool->name, page->vaddr);
/* leak the still-in-use consistent memory */ /* leak the still-in-use consistent memory */
list_del (&page->page_list); list_del (&page->page_list);
kfree (page); kfree (page);
...@@ -247,9 +252,9 @@ pci_pool_destroy (struct pci_pool *pool) ...@@ -247,9 +252,9 @@ pci_pool_destroy (struct pci_pool *pool)
/** /**
* pci_pool_alloc - get a block of consistent memory * dma_pool_alloc - get a block of consistent memory
* @pool: pci pool that will produce the block * @pool: dma pool that will produce the block
* @mem_flags: SLAB_KERNEL or SLAB_ATOMIC * @mem_flags: GFP_* bitmask
* @handle: pointer to dma address of block * @handle: pointer to dma address of block
* *
* This returns the kernel virtual address of a currently unused block, * This returns the kernel virtual address of a currently unused block,
...@@ -257,20 +262,18 @@ pci_pool_destroy (struct pci_pool *pool) ...@@ -257,20 +262,18 @@ pci_pool_destroy (struct pci_pool *pool)
* If such a memory block can't be allocated, null is returned. * If such a memory block can't be allocated, null is returned.
*/ */
void * void *
pci_pool_alloc (struct pci_pool *pool, int mem_flags, dma_addr_t *handle) dma_pool_alloc (struct dma_pool *pool, int mem_flags, dma_addr_t *handle)
{ {
unsigned long flags; unsigned long flags;
struct list_head *entry; struct dma_page *page;
struct pci_page *page;
int map, block; int map, block;
size_t offset; size_t offset;
void *retval; void *retval;
restart: restart:
spin_lock_irqsave (&pool->lock, flags); spin_lock_irqsave (&pool->lock, flags);
list_for_each (entry, &pool->page_list) { list_for_each_entry(page, &pool->page_list, page_list) {
int i; int i;
page = list_entry (entry, struct pci_page, page_list);
/* only cachable accesses here ... */ /* only cachable accesses here ... */
for (map = 0, i = 0; for (map = 0, i = 0;
i < pool->blocks_per_page; i < pool->blocks_per_page;
...@@ -287,7 +290,7 @@ pci_pool_alloc (struct pci_pool *pool, int mem_flags, dma_addr_t *handle) ...@@ -287,7 +290,7 @@ pci_pool_alloc (struct pci_pool *pool, int mem_flags, dma_addr_t *handle)
} }
} }
if (!(page = pool_alloc_page (pool, SLAB_ATOMIC))) { if (!(page = pool_alloc_page (pool, SLAB_ATOMIC))) {
if (mem_flags == SLAB_KERNEL) { if (mem_flags & __GFP_WAIT) {
DECLARE_WAITQUEUE (wait, current); DECLARE_WAITQUEUE (wait, current);
current->state = TASK_INTERRUPTIBLE; current->state = TASK_INTERRUPTIBLE;
...@@ -318,16 +321,14 @@ pci_pool_alloc (struct pci_pool *pool, int mem_flags, dma_addr_t *handle) ...@@ -318,16 +321,14 @@ pci_pool_alloc (struct pci_pool *pool, int mem_flags, dma_addr_t *handle)
} }
static struct pci_page * static struct dma_page *
pool_find_page (struct pci_pool *pool, dma_addr_t dma) pool_find_page (struct dma_pool *pool, dma_addr_t dma)
{ {
unsigned long flags; unsigned long flags;
struct list_head *entry; struct dma_page *page;
struct pci_page *page;
spin_lock_irqsave (&pool->lock, flags); spin_lock_irqsave (&pool->lock, flags);
list_for_each (entry, &pool->page_list) { list_for_each_entry(page, &pool->page_list, page_list) {
page = list_entry (entry, struct pci_page, page_list);
if (dma < page->dma) if (dma < page->dma)
continue; continue;
if (dma < (page->dma + pool->allocation)) if (dma < (page->dma + pool->allocation))
...@@ -341,8 +342,8 @@ pool_find_page (struct pci_pool *pool, dma_addr_t dma) ...@@ -341,8 +342,8 @@ pool_find_page (struct pci_pool *pool, dma_addr_t dma)
/** /**
* pci_pool_free - put block back into pci pool * dma_pool_free - put block back into dma pool
* @pool: the pci pool holding the block * @pool: the dma pool holding the block
* @vaddr: virtual address of block * @vaddr: virtual address of block
* @dma: dma address of block * @dma: dma address of block
* *
...@@ -350,16 +351,19 @@ pool_find_page (struct pci_pool *pool, dma_addr_t dma) ...@@ -350,16 +351,19 @@ pool_find_page (struct pci_pool *pool, dma_addr_t dma)
* unless it is first re-allocated. * unless it is first re-allocated.
*/ */
void void
pci_pool_free (struct pci_pool *pool, void *vaddr, dma_addr_t dma) dma_pool_free (struct dma_pool *pool, void *vaddr, dma_addr_t dma)
{ {
struct pci_page *page; struct dma_page *page;
unsigned long flags; unsigned long flags;
int map, block; int map, block;
if ((page = pool_find_page (pool, dma)) == 0) { if ((page = pool_find_page (pool, dma)) == 0) {
printk (KERN_ERR "pci_pool_free %s/%s, %p/%lx (bad dma)\n", if (pool->dev)
pool->dev ? pci_name(pool->dev) : NULL, dev_err(pool->dev, "dma_pool_free %s, %p/%lx (bad dma)\n",
pool->name, vaddr, (unsigned long) dma); pool->name, vaddr, (unsigned long) dma);
else
printk (KERN_ERR "dma_pool_free %s, %p/%lx (bad dma)\n",
pool->name, vaddr, (unsigned long) dma);
return; return;
} }
...@@ -370,15 +374,21 @@ pci_pool_free (struct pci_pool *pool, void *vaddr, dma_addr_t dma) ...@@ -370,15 +374,21 @@ pci_pool_free (struct pci_pool *pool, void *vaddr, dma_addr_t dma)
#ifdef CONFIG_DEBUG_SLAB #ifdef CONFIG_DEBUG_SLAB
if (((dma - page->dma) + (void *)page->vaddr) != vaddr) { if (((dma - page->dma) + (void *)page->vaddr) != vaddr) {
printk (KERN_ERR "pci_pool_free %s/%s, %p (bad vaddr)/%Lx\n", if (pool->dev)
pool->dev ? pci_name(pool->dev) : NULL, dev_err(pool->dev, "dma_pool_free %s, %p (bad vaddr)/%Lx\n",
pool->name, vaddr, (unsigned long long) dma); pool->name, vaddr, (unsigned long long) dma);
else
printk (KERN_ERR "dma_pool_free %s, %p (bad vaddr)/%Lx\n",
pool->name, vaddr, (unsigned long long) dma);
return; return;
} }
if (page->bitmap [map] & (1UL << block)) { if (page->bitmap [map] & (1UL << block)) {
printk (KERN_ERR "pci_pool_free %s/%s, dma %Lx already free\n", if (pool->dev)
pool->dev ? pci_name(pool->dev) : NULL, dev_err(pool->dev, "dma_pool_free %s, dma %Lx already free\n",
pool->name, (unsigned long long)dma); pool->name, (unsigned long long)dma);
else
printk (KERN_ERR "dma_pool_free %s, dma %Lx already free\n",
pool->name, (unsigned long long)dma);
return; return;
} }
memset (vaddr, POOL_POISON_FREED, pool->size); memset (vaddr, POOL_POISON_FREED, pool->size);
...@@ -392,13 +402,13 @@ pci_pool_free (struct pci_pool *pool, void *vaddr, dma_addr_t dma) ...@@ -392,13 +402,13 @@ pci_pool_free (struct pci_pool *pool, void *vaddr, dma_addr_t dma)
/* /*
* Resist a temptation to do * Resist a temptation to do
* if (!is_page_busy(bpp, page->bitmap)) pool_free_page(pool, page); * if (!is_page_busy(bpp, page->bitmap)) pool_free_page(pool, page);
* it is not interrupt safe. Better have empty pages hang around. * Better have a few empty pages hang around.
*/ */
spin_unlock_irqrestore (&pool->lock, flags); spin_unlock_irqrestore (&pool->lock, flags);
} }
EXPORT_SYMBOL (pci_pool_create); EXPORT_SYMBOL (dma_pool_create);
EXPORT_SYMBOL (pci_pool_destroy); EXPORT_SYMBOL (dma_pool_destroy);
EXPORT_SYMBOL (pci_pool_alloc); EXPORT_SYMBOL (dma_pool_alloc);
EXPORT_SYMBOL (pci_pool_free); EXPORT_SYMBOL (dma_pool_free);
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
# Makefile for the PCI bus specific drivers. # Makefile for the PCI bus specific drivers.
# #
obj-y += access.o bus.o probe.o remove.o pci.o pool.o quirks.o \ 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
obj-$(CONFIG_PROC_FS) += proc.o obj-$(CONFIG_PROC_FS) += proc.o
......
...@@ -116,7 +116,7 @@ static int pci_visit_bridge (struct pci_visit * fn, ...@@ -116,7 +116,7 @@ static int pci_visit_bridge (struct pci_visit * fn,
} }
bus = wrapped_dev->dev->subordinate; bus = wrapped_dev->dev->subordinate;
if(bus) { if (bus) {
memset(&wrapped_bus, 0, sizeof(struct pci_bus_wrapped)); memset(&wrapped_bus, 0, sizeof(struct pci_bus_wrapped));
wrapped_bus.bus = bus; wrapped_bus.bus = bus;
...@@ -130,8 +130,8 @@ static int pci_visit_bridge (struct pci_visit * fn, ...@@ -130,8 +130,8 @@ static int pci_visit_bridge (struct pci_visit * fn,
* Every bus and every function is presented to a custom * Every bus and every function is presented to a custom
* function that can act upon it. * function that can act upon it.
*/ */
int pci_visit_dev (struct pci_visit *fn, struct pci_dev_wrapped *wrapped_dev, int pci_visit_dev(struct pci_visit *fn, struct pci_dev_wrapped *wrapped_dev,
struct pci_bus_wrapped *wrapped_parent) struct pci_bus_wrapped *wrapped_parent)
{ {
struct pci_dev* dev = wrapped_dev ? wrapped_dev->dev : NULL; struct pci_dev* dev = wrapped_dev ? wrapped_dev->dev : NULL;
int result = 0; int result = 0;
......
...@@ -374,7 +374,7 @@ static int get_cur_bus_speed (struct hotplug_slot *hotplug_slot, enum pci_bus_sp ...@@ -374,7 +374,7 @@ static int get_cur_bus_speed (struct hotplug_slot *hotplug_slot, enum pci_bus_sp
} }
static int init_acpi (void) static int __init init_acpi (void)
{ {
int retval; int retval;
...@@ -426,7 +426,7 @@ static void release_slot(struct hotplug_slot *hotplug_slot) ...@@ -426,7 +426,7 @@ static void release_slot(struct hotplug_slot *hotplug_slot)
* init_slots - initialize 'struct slot' structures for each slot * init_slots - initialize 'struct slot' structures for each slot
* *
*/ */
static int init_slots (void) static int __init init_slots (void)
{ {
struct slot *slot; struct slot *slot;
int retval = 0; int retval = 0;
...@@ -492,7 +492,7 @@ static int init_slots (void) ...@@ -492,7 +492,7 @@ static int init_slots (void)
} }
static void cleanup_slots (void) static void __exit cleanup_slots (void)
{ {
struct list_head *tmp, *n; struct list_head *tmp, *n;
struct slot *slot; struct slot *slot;
......
...@@ -87,7 +87,7 @@ static int is_ejectable (acpi_handle handle) ...@@ -87,7 +87,7 @@ static int is_ejectable (acpi_handle handle)
/* callback routine to check the existence of ejectable slots */ /* callback routine to check the existence of ejectable slots */
static acpi_status static acpi_status
is_ejectable_slot (acpi_handle handle, u32 lvl, void *context, void **rv) is_ejectable_slot(acpi_handle handle, u32 lvl, void *context, void **rv)
{ {
int *count = (int *)context; int *count = (int *)context;
...@@ -103,7 +103,7 @@ is_ejectable_slot (acpi_handle handle, u32 lvl, void *context, void **rv) ...@@ -103,7 +103,7 @@ is_ejectable_slot (acpi_handle handle, u32 lvl, void *context, void **rv)
/* callback routine to register each ACPI PCI slot object */ /* callback routine to register each ACPI PCI slot object */
static acpi_status static acpi_status
register_slot (acpi_handle handle, u32 lvl, void *context, void **rv) register_slot(acpi_handle handle, u32 lvl, void *context, void **rv)
{ {
struct acpiphp_bridge *bridge = (struct acpiphp_bridge *)context; struct acpiphp_bridge *bridge = (struct acpiphp_bridge *)context;
struct acpiphp_slot *slot; struct acpiphp_slot *slot;
...@@ -212,7 +212,7 @@ register_slot (acpi_handle handle, u32 lvl, void *context, void **rv) ...@@ -212,7 +212,7 @@ register_slot (acpi_handle handle, u32 lvl, void *context, void **rv)
/* see if it's worth looking at this bridge */ /* see if it's worth looking at this bridge */
static int detect_ejectable_slots (acpi_handle *bridge_handle) static int detect_ejectable_slots(acpi_handle *bridge_handle)
{ {
acpi_status status; acpi_status status;
int count; int count;
...@@ -231,7 +231,7 @@ static int detect_ejectable_slots (acpi_handle *bridge_handle) ...@@ -231,7 +231,7 @@ static int detect_ejectable_slots (acpi_handle *bridge_handle)
* TBD: _TRA, etc. * TBD: _TRA, etc.
*/ */
static acpi_status static acpi_status
decode_acpi_resource (struct acpi_resource *resource, void *context) decode_acpi_resource(struct acpi_resource *resource, void *context)
{ {
struct acpiphp_bridge *bridge = (struct acpiphp_bridge *) context; struct acpiphp_bridge *bridge = (struct acpiphp_bridge *) context;
struct acpi_resource_address64 address; struct acpi_resource_address64 address;
...@@ -339,7 +339,7 @@ static void decode_hpp(struct acpiphp_bridge *bridge) ...@@ -339,7 +339,7 @@ static void decode_hpp(struct acpiphp_bridge *bridge)
/* initialize miscellaneous stuff for both root and PCI-to-PCI bridge */ /* initialize miscellaneous stuff for both root and PCI-to-PCI bridge */
static void init_bridge_misc (struct acpiphp_bridge *bridge) static void init_bridge_misc(struct acpiphp_bridge *bridge)
{ {
acpi_status status; acpi_status status;
...@@ -371,7 +371,7 @@ static void init_bridge_misc (struct acpiphp_bridge *bridge) ...@@ -371,7 +371,7 @@ static void init_bridge_misc (struct acpiphp_bridge *bridge)
/* allocate and initialize host bridge data structure */ /* allocate and initialize host bridge data structure */
static void add_host_bridge (acpi_handle *handle, int seg, int bus) static void add_host_bridge(acpi_handle *handle, int seg, int bus)
{ {
acpi_status status; acpi_status status;
struct acpiphp_bridge *bridge; struct acpiphp_bridge *bridge;
...@@ -423,7 +423,7 @@ static void add_host_bridge (acpi_handle *handle, int seg, int bus) ...@@ -423,7 +423,7 @@ static void add_host_bridge (acpi_handle *handle, int seg, int bus)
/* allocate and initialize PCI-to-PCI bridge data structure */ /* allocate and initialize PCI-to-PCI bridge data structure */
static void add_p2p_bridge (acpi_handle *handle, int seg, int bus, int dev, int fn) static void add_p2p_bridge(acpi_handle *handle, int seg, int bus, int dev, int fn)
{ {
struct acpiphp_bridge *bridge; struct acpiphp_bridge *bridge;
u8 tmp8; u8 tmp8;
...@@ -573,7 +573,7 @@ static void add_p2p_bridge (acpi_handle *handle, int seg, int bus, int dev, int ...@@ -573,7 +573,7 @@ static void add_p2p_bridge (acpi_handle *handle, int seg, int bus, int dev, int
/* callback routine to find P2P bridges */ /* callback routine to find P2P bridges */
static acpi_status static acpi_status
find_p2p_bridge (acpi_handle handle, u32 lvl, void *context, void **rv) find_p2p_bridge(acpi_handle handle, u32 lvl, void *context, void **rv)
{ {
acpi_status status; acpi_status status;
acpi_handle dummy_handle; acpi_handle dummy_handle;
...@@ -673,13 +673,13 @@ static int add_bridge(acpi_handle handle) ...@@ -673,13 +673,13 @@ static int add_bridge(acpi_handle handle)
} }
static void remove_bridge (acpi_handle handle) static void remove_bridge(acpi_handle handle)
{ {
/* No-op for now .. */ /* No-op for now .. */
} }
static int power_on_slot (struct acpiphp_slot *slot) static int power_on_slot(struct acpiphp_slot *slot)
{ {
acpi_status status; acpi_status status;
struct acpiphp_func *func; struct acpiphp_func *func;
...@@ -714,7 +714,7 @@ static int power_on_slot (struct acpiphp_slot *slot) ...@@ -714,7 +714,7 @@ static int power_on_slot (struct acpiphp_slot *slot)
} }
static int power_off_slot (struct acpiphp_slot *slot) static int power_off_slot(struct acpiphp_slot *slot)
{ {
acpi_status status; acpi_status status;
struct acpiphp_func *func; struct acpiphp_func *func;
...@@ -778,7 +778,7 @@ static int power_off_slot (struct acpiphp_slot *slot) ...@@ -778,7 +778,7 @@ static int power_off_slot (struct acpiphp_slot *slot)
* not per each slot object in ACPI namespace. * not per each slot object in ACPI namespace.
* *
*/ */
static int enable_device (struct acpiphp_slot *slot) static int enable_device(struct acpiphp_slot *slot)
{ {
u8 bus; u8 bus;
struct pci_dev *dev; struct pci_dev *dev;
...@@ -852,7 +852,7 @@ static int enable_device (struct acpiphp_slot *slot) ...@@ -852,7 +852,7 @@ static int enable_device (struct acpiphp_slot *slot)
/** /**
* disable_device - disable a slot * disable_device - disable a slot
*/ */
static int disable_device (struct acpiphp_slot *slot) static int disable_device(struct acpiphp_slot *slot)
{ {
int retval = 0; int retval = 0;
struct acpiphp_func *func; struct acpiphp_func *func;
...@@ -894,7 +894,7 @@ static int disable_device (struct acpiphp_slot *slot) ...@@ -894,7 +894,7 @@ static int disable_device (struct acpiphp_slot *slot)
* *
* otherwise return 0 * otherwise return 0
*/ */
static unsigned int get_slot_status (struct acpiphp_slot *slot) static unsigned int get_slot_status(struct acpiphp_slot *slot)
{ {
acpi_status status; acpi_status status;
unsigned long sta = 0; unsigned long sta = 0;
...@@ -939,7 +939,7 @@ static unsigned int get_slot_status (struct acpiphp_slot *slot) ...@@ -939,7 +939,7 @@ static unsigned int get_slot_status (struct acpiphp_slot *slot)
* handles ACPI event notification on {host,p2p} bridges * handles ACPI event notification on {host,p2p} bridges
* *
*/ */
static void handle_hotplug_event_bridge (acpi_handle handle, u32 type, void *context) static void handle_hotplug_event_bridge(acpi_handle handle, u32 type, void *context)
{ {
struct acpiphp_bridge *bridge; struct acpiphp_bridge *bridge;
char objname[64]; char objname[64];
...@@ -1005,7 +1005,7 @@ static void handle_hotplug_event_bridge (acpi_handle handle, u32 type, void *con ...@@ -1005,7 +1005,7 @@ static void handle_hotplug_event_bridge (acpi_handle handle, u32 type, void *con
* handles ACPI event notification on slots * handles ACPI event notification on slots
* *
*/ */
static void handle_hotplug_event_func (acpi_handle handle, u32 type, void *context) static void handle_hotplug_event_func(acpi_handle handle, u32 type, void *context)
{ {
struct acpiphp_func *func; struct acpiphp_func *func;
char objname[64]; char objname[64];
...@@ -1056,7 +1056,7 @@ static struct acpi_pci_driver acpi_pci_hp_driver = { ...@@ -1056,7 +1056,7 @@ static struct acpi_pci_driver acpi_pci_hp_driver = {
* acpiphp_glue_init - initializes all PCI hotplug - ACPI glue data structures * acpiphp_glue_init - initializes all PCI hotplug - ACPI glue data structures
* *
*/ */
int acpiphp_glue_init (void) int __init acpiphp_glue_init(void)
{ {
int num; int num;
...@@ -1077,7 +1077,7 @@ int acpiphp_glue_init (void) ...@@ -1077,7 +1077,7 @@ int acpiphp_glue_init (void)
* *
* This function frees all data allocated in acpiphp_glue_init() * This function frees all data allocated in acpiphp_glue_init()
*/ */
void acpiphp_glue_exit (void) void __exit acpiphp_glue_exit(void)
{ {
struct list_head *l1, *l2, *n1, *n2; struct list_head *l1, *l2, *n1, *n2;
struct acpiphp_bridge *bridge; struct acpiphp_bridge *bridge;
...@@ -1124,7 +1124,7 @@ void acpiphp_glue_exit (void) ...@@ -1124,7 +1124,7 @@ void acpiphp_glue_exit (void)
/** /**
* acpiphp_get_num_slots - count number of slots in a system * acpiphp_get_num_slots - count number of slots in a system
*/ */
int acpiphp_get_num_slots (void) int __init acpiphp_get_num_slots(void)
{ {
struct list_head *node; struct list_head *node;
struct acpiphp_bridge *bridge; struct acpiphp_bridge *bridge;
...@@ -1171,7 +1171,7 @@ int acpiphp_for_each_slot(acpiphp_callback fn, void *data) ...@@ -1171,7 +1171,7 @@ int acpiphp_for_each_slot(acpiphp_callback fn, void *data)
/* search matching slot from id */ /* search matching slot from id */
struct acpiphp_slot *get_slot_from_id (int id) struct acpiphp_slot *get_slot_from_id(int id)
{ {
struct list_head *node; struct list_head *node;
struct acpiphp_bridge *bridge; struct acpiphp_bridge *bridge;
...@@ -1193,7 +1193,7 @@ struct acpiphp_slot *get_slot_from_id (int id) ...@@ -1193,7 +1193,7 @@ struct acpiphp_slot *get_slot_from_id (int id)
/** /**
* acpiphp_enable_slot - power on slot * acpiphp_enable_slot - power on slot
*/ */
int acpiphp_enable_slot (struct acpiphp_slot *slot) int acpiphp_enable_slot(struct acpiphp_slot *slot)
{ {
int retval; int retval;
...@@ -1217,7 +1217,7 @@ int acpiphp_enable_slot (struct acpiphp_slot *slot) ...@@ -1217,7 +1217,7 @@ int acpiphp_enable_slot (struct acpiphp_slot *slot)
/** /**
* acpiphp_disable_slot - power off slot * acpiphp_disable_slot - power off slot
*/ */
int acpiphp_disable_slot (struct acpiphp_slot *slot) int acpiphp_disable_slot(struct acpiphp_slot *slot)
{ {
int retval = 0; int retval = 0;
...@@ -1249,7 +1249,7 @@ int acpiphp_disable_slot (struct acpiphp_slot *slot) ...@@ -1249,7 +1249,7 @@ int acpiphp_disable_slot (struct acpiphp_slot *slot)
/** /**
* acpiphp_check_bridge - re-enumerate devices * acpiphp_check_bridge - re-enumerate devices
*/ */
int acpiphp_check_bridge (struct acpiphp_bridge *bridge) int acpiphp_check_bridge(struct acpiphp_bridge *bridge)
{ {
struct acpiphp_slot *slot; struct acpiphp_slot *slot;
unsigned int sta; unsigned int sta;
...@@ -1296,7 +1296,7 @@ int acpiphp_check_bridge (struct acpiphp_bridge *bridge) ...@@ -1296,7 +1296,7 @@ int acpiphp_check_bridge (struct acpiphp_bridge *bridge)
* slot enabled: 1 * slot enabled: 1
* slot disabled: 0 * slot disabled: 0
*/ */
u8 acpiphp_get_power_status (struct acpiphp_slot *slot) u8 acpiphp_get_power_status(struct acpiphp_slot *slot)
{ {
unsigned int sta; unsigned int sta;
...@@ -1314,7 +1314,7 @@ u8 acpiphp_get_power_status (struct acpiphp_slot *slot) ...@@ -1314,7 +1314,7 @@ u8 acpiphp_get_power_status (struct acpiphp_slot *slot)
* no direct attention led status information via ACPI * no direct attention led status information via ACPI
* *
*/ */
u8 acpiphp_get_attention_status (struct acpiphp_slot *slot) u8 acpiphp_get_attention_status(struct acpiphp_slot *slot)
{ {
return 0; return 0;
} }
...@@ -1324,7 +1324,7 @@ u8 acpiphp_get_attention_status (struct acpiphp_slot *slot) ...@@ -1324,7 +1324,7 @@ u8 acpiphp_get_attention_status (struct acpiphp_slot *slot)
* latch closed: 1 * latch closed: 1
* latch open: 0 * latch open: 0
*/ */
u8 acpiphp_get_latch_status (struct acpiphp_slot *slot) u8 acpiphp_get_latch_status(struct acpiphp_slot *slot)
{ {
unsigned int sta; unsigned int sta;
...@@ -1338,7 +1338,7 @@ u8 acpiphp_get_latch_status (struct acpiphp_slot *slot) ...@@ -1338,7 +1338,7 @@ u8 acpiphp_get_latch_status (struct acpiphp_slot *slot)
* adapter presence : 1 * adapter presence : 1
* absence : 0 * absence : 0
*/ */
u8 acpiphp_get_adapter_status (struct acpiphp_slot *slot) u8 acpiphp_get_adapter_status(struct acpiphp_slot *slot)
{ {
unsigned int sta; unsigned int sta;
...@@ -1351,7 +1351,7 @@ u8 acpiphp_get_adapter_status (struct acpiphp_slot *slot) ...@@ -1351,7 +1351,7 @@ u8 acpiphp_get_adapter_status (struct acpiphp_slot *slot)
/* /*
* pci address (seg/bus/dev) * pci address (seg/bus/dev)
*/ */
u32 acpiphp_get_address (struct acpiphp_slot *slot) u32 acpiphp_get_address(struct acpiphp_slot *slot)
{ {
u32 address; u32 address;
......
...@@ -2446,7 +2446,7 @@ static int configure_new_function (struct controller * ctrl, struct pci_func * f ...@@ -2446,7 +2446,7 @@ static int configure_new_function (struct controller * ctrl, struct pci_func * f
u8 behind_bridge, struct resource_lists * resources) u8 behind_bridge, struct resource_lists * resources)
{ {
int cloop; int cloop;
u8 IRQ; u8 IRQ = 0;
u8 temp_byte; u8 temp_byte;
u8 device; u8 device;
u8 class_code; u8 class_code;
...@@ -3021,6 +3021,7 @@ static int configure_new_function (struct controller * ctrl, struct pci_func * f ...@@ -3021,6 +3021,7 @@ static int configure_new_function (struct controller * ctrl, struct pci_func * f
} }
} // End of base register loop } // End of base register loop
#if !defined(CONFIG_X86_IO_APIC)
// Figure out which interrupt pin this function uses // Figure out which interrupt pin this function uses
rc = pci_bus_read_config_byte (pci_bus, devfn, PCI_INTERRUPT_PIN, &temp_byte); rc = pci_bus_read_config_byte (pci_bus, devfn, PCI_INTERRUPT_PIN, &temp_byte);
...@@ -3045,6 +3046,7 @@ static int configure_new_function (struct controller * ctrl, struct pci_func * f ...@@ -3045,6 +3046,7 @@ static int configure_new_function (struct controller * ctrl, struct pci_func * f
// IRQ Line // IRQ Line
rc = pci_bus_write_config_byte (pci_bus, devfn, PCI_INTERRUPT_LINE, IRQ); rc = pci_bus_write_config_byte (pci_bus, devfn, PCI_INTERRUPT_LINE, IRQ);
#endif
if (!behind_bridge) { if (!behind_bridge) {
rc = cpqhp_set_irq(func->bus, func->device, temp_byte + 0x09, IRQ); rc = cpqhp_set_irq(func->bus, func->device, temp_byte + 0x09, IRQ);
......
...@@ -123,7 +123,7 @@ int cpqhp_unconfigure_device(struct pci_func* func) ...@@ -123,7 +123,7 @@ int cpqhp_unconfigure_device(struct pci_func* func)
dbg("%s: bus/dev/func = %x/%x/%x\n", __FUNCTION__, func->bus, func->device, func->function); dbg("%s: bus/dev/func = %x/%x/%x\n", __FUNCTION__, func->bus, func->device, func->function);
for (j=0; j<8 ; j++) { for (j=0; j<8 ; j++) {
struct pci_dev* temp = pci_find_slot(func->bus, (func->device << 3) | j); struct pci_dev* temp = pci_find_slot(func->bus, PCI_DEVFN(func->device, j));
if (temp) if (temp)
pci_remove_bus_device(temp); pci_remove_bus_device(temp);
} }
...@@ -151,6 +151,7 @@ static int PCI_RefinedAccessConfig(struct pci_bus *bus, unsigned int devfn, u8 o ...@@ -151,6 +151,7 @@ static int PCI_RefinedAccessConfig(struct pci_bus *bus, unsigned int devfn, u8 o
*/ */
int cpqhp_set_irq (u8 bus_num, u8 dev_num, u8 int_pin, u8 irq_num) int cpqhp_set_irq (u8 bus_num, u8 dev_num, u8 int_pin, u8 irq_num)
{ {
#if !defined(CONFIG_X86_IO_APIC)
int rc; int rc;
u16 temp_word; u16 temp_word;
struct pci_dev fakedev; struct pci_dev fakedev;
...@@ -175,6 +176,7 @@ int cpqhp_set_irq (u8 bus_num, u8 dev_num, u8 int_pin, u8 irq_num) ...@@ -175,6 +176,7 @@ int cpqhp_set_irq (u8 bus_num, u8 dev_num, u8 int_pin, u8 irq_num)
// This should only be for x86 as it sets the Edge Level Control Register // This should only be for x86 as it sets the Edge Level Control Register
outb((u8) (temp_word & 0xFF), 0x4d0); outb((u8) (temp_word & 0xFF), 0x4d0);
outb((u8) ((temp_word & 0xFF00) >> 8), 0x4d1); outb((u8) ((temp_word & 0xFF00) >> 8), 0x4d1);
#endif
return 0; return 0;
} }
...@@ -545,10 +547,10 @@ int cpqhp_save_slot_config (struct controller *ctrl, struct pci_func * new_slot) ...@@ -545,10 +547,10 @@ int cpqhp_save_slot_config (struct controller *ctrl, struct pci_func * new_slot)
} while (function < max_functions); } while (function < max_functions);
} // End of IF (device in slot?) } // End of IF (device in slot?)
else { else {
return(2); return 2;
} }
return(0); return 0;
} }
...@@ -594,9 +596,8 @@ int cpqhp_save_base_addr_length(struct controller *ctrl, struct pci_func * func) ...@@ -594,9 +596,8 @@ int cpqhp_save_base_addr_length(struct controller *ctrl, struct pci_func * func)
while (next != NULL) { while (next != NULL) {
rc = cpqhp_save_base_addr_length(ctrl, next); rc = cpqhp_save_base_addr_length(ctrl, next);
if (rc) if (rc)
return(rc); return rc;
next = next->next; next = next->next;
} }
...@@ -979,7 +980,6 @@ int cpqhp_configure_board(struct controller *ctrl, struct pci_func * func) ...@@ -979,7 +980,6 @@ int cpqhp_configure_board(struct controller *ctrl, struct pci_func * func)
while (next != NULL) { while (next != NULL) {
rc = cpqhp_configure_board(ctrl, next); rc = cpqhp_configure_board(ctrl, next);
if (rc) if (rc)
return rc; return rc;
...@@ -1076,9 +1076,8 @@ int cpqhp_valid_replace(struct controller *ctrl, struct pci_func * func) ...@@ -1076,9 +1076,8 @@ int cpqhp_valid_replace(struct controller *ctrl, struct pci_func * func)
while (next != NULL) { while (next != NULL) {
rc = cpqhp_valid_replace(ctrl, next); rc = cpqhp_valid_replace(ctrl, next);
if (rc) if (rc)
return(rc); return rc;
next = next->next; next = next->next;
} }
...@@ -1144,7 +1143,7 @@ int cpqhp_valid_replace(struct controller *ctrl, struct pci_func * func) ...@@ -1144,7 +1143,7 @@ int cpqhp_valid_replace(struct controller *ctrl, struct pci_func * func)
} }
return(0); return 0;
} }
...@@ -1229,9 +1228,8 @@ int cpqhp_find_available_resources (struct controller *ctrl, void *rom_start) ...@@ -1229,9 +1228,8 @@ int cpqhp_find_available_resources (struct controller *ctrl, void *rom_start)
i = readb(rom_resource_table + NUMBER_OF_ENTRIES); i = readb(rom_resource_table + NUMBER_OF_ENTRIES);
dbg("number_of_entries = %d\n", i); dbg("number_of_entries = %d\n", i);
if (!readb(one_slot + SECONDARY_BUS)) { if (!readb(one_slot + SECONDARY_BUS))
return(1); return 1;
}
dbg("dev|IO base|length|Mem base|length|Pre base|length|PB SB MB\n"); dbg("dev|IO base|length|Mem base|length|Pre base|length|PB SB MB\n");
...@@ -1391,7 +1389,7 @@ int cpqhp_find_available_resources (struct controller *ctrl, void *rom_start) ...@@ -1391,7 +1389,7 @@ int cpqhp_find_available_resources (struct controller *ctrl, void *rom_start)
rc &= cpqhp_resource_sort_and_combine(&(ctrl->io_head)); rc &= cpqhp_resource_sort_and_combine(&(ctrl->io_head));
rc &= cpqhp_resource_sort_and_combine(&(ctrl->bus_head)); rc &= cpqhp_resource_sort_and_combine(&(ctrl->bus_head));
return(rc); return rc;
} }
...@@ -1411,7 +1409,7 @@ int cpqhp_return_board_resources(struct pci_func * func, struct resource_lists * ...@@ -1411,7 +1409,7 @@ int cpqhp_return_board_resources(struct pci_func * func, struct resource_lists *
dbg("%s\n", __FUNCTION__); dbg("%s\n", __FUNCTION__);
if (!func) if (!func)
return(1); return 1;
node = func->io_head; node = func->io_head;
func->io_head = NULL; func->io_head = NULL;
...@@ -1450,7 +1448,7 @@ int cpqhp_return_board_resources(struct pci_func * func, struct resource_lists * ...@@ -1450,7 +1448,7 @@ int cpqhp_return_board_resources(struct pci_func * func, struct resource_lists *
rc |= cpqhp_resource_sort_and_combine(&(resources->io_head)); rc |= cpqhp_resource_sort_and_combine(&(resources->io_head));
rc |= cpqhp_resource_sort_and_combine(&(resources->bus_head)); rc |= cpqhp_resource_sort_and_combine(&(resources->bus_head));
return(rc); return rc;
} }
......
...@@ -104,7 +104,7 @@ static inline int slot_update (struct slot **sl) ...@@ -104,7 +104,7 @@ static inline int slot_update (struct slot **sl)
if (rc) if (rc)
return rc; return rc;
if (!init_flag) if (!init_flag)
return get_cur_bus_info (sl); rc = get_cur_bus_info(sl);
return rc; return rc;
} }
...@@ -116,7 +116,7 @@ static int __init get_max_slots (void) ...@@ -116,7 +116,7 @@ static int __init get_max_slots (void)
list_for_each (tmp, &ibmphp_slot_head) { list_for_each (tmp, &ibmphp_slot_head) {
slot_cur = list_entry (tmp, struct slot, ibm_slot_list); slot_cur = list_entry (tmp, struct slot, ibm_slot_list);
/* sometimes the hot-pluggable slots start with 4 (not always from 1 */ /* sometimes the hot-pluggable slots start with 4 (not always from 1) */
slot_count = max (slot_count, slot_cur->number); slot_count = max (slot_count, slot_cur->number);
} }
return slot_count; return slot_count;
...@@ -187,7 +187,7 @@ static inline int power_on (struct slot *slot_cur) ...@@ -187,7 +187,7 @@ static inline int power_on (struct slot *slot_cur)
return retval; return retval;
} }
if (CTLR_RESULT (slot_cur->ctrl->status)) { if (CTLR_RESULT (slot_cur->ctrl->status)) {
err ("command not completed successfully in power_on \n"); err ("command not completed successfully in power_on\n");
return -EIO; return -EIO;
} }
long_delay (3 * HZ); /* For ServeRAID cards, and some 66 PCI */ long_delay (3 * HZ); /* For ServeRAID cards, and some 66 PCI */
...@@ -201,14 +201,14 @@ static inline int power_off (struct slot *slot_cur) ...@@ -201,14 +201,14 @@ static inline int power_off (struct slot *slot_cur)
retval = ibmphp_hpc_writeslot (slot_cur, cmd); retval = ibmphp_hpc_writeslot (slot_cur, cmd);
if (retval) { if (retval) {
err ("power off failed \n"); err ("power off failed\n");
return retval; return retval;
} }
if (CTLR_RESULT (slot_cur->ctrl->status)) { if (CTLR_RESULT (slot_cur->ctrl->status)) {
err ("command not completed successfully in power_off \n"); err ("command not completed successfully in power_off\n");
return -EIO; retval = -EIO;
} }
return 0; return retval;
} }
static int set_attention_status (struct hotplug_slot *hotplug_slot, u8 value) static int set_attention_status (struct hotplug_slot *hotplug_slot, u8 value)
...@@ -216,7 +216,6 @@ static int set_attention_status (struct hotplug_slot *hotplug_slot, u8 value) ...@@ -216,7 +216,6 @@ static int set_attention_status (struct hotplug_slot *hotplug_slot, u8 value)
int rc = 0; int rc = 0;
struct slot *pslot; struct slot *pslot;
u8 cmd; u8 cmd;
int hpcrc = 0;
debug ("set_attention_status - Entry hotplug_slot[%lx] value[%x]\n", (ulong) hotplug_slot, value); debug ("set_attention_status - Entry hotplug_slot[%lx] value[%x]\n", (ulong) hotplug_slot, value);
ibmphp_lock_operations (); ibmphp_lock_operations ();
...@@ -241,16 +240,13 @@ static int set_attention_status (struct hotplug_slot *hotplug_slot, u8 value) ...@@ -241,16 +240,13 @@ static int set_attention_status (struct hotplug_slot *hotplug_slot, u8 value)
if (rc == 0) { if (rc == 0) {
pslot = (struct slot *) hotplug_slot->private; pslot = (struct slot *) hotplug_slot->private;
if (pslot) if (pslot)
hpcrc = ibmphp_hpc_writeslot (pslot, cmd); rc = ibmphp_hpc_writeslot(pslot, cmd);
else else
rc = -ENODEV; rc = -ENODEV;
} }
} else } else
rc = -ENODEV; rc = -ENODEV;
if (hpcrc)
rc = hpcrc;
ibmphp_unlock_operations (); ibmphp_unlock_operations ();
debug ("set_attention_status - Exit rc[%d]\n", rc); debug ("set_attention_status - Exit rc[%d]\n", rc);
...@@ -261,7 +257,6 @@ static int get_attention_status (struct hotplug_slot *hotplug_slot, u8 * value) ...@@ -261,7 +257,6 @@ static int get_attention_status (struct hotplug_slot *hotplug_slot, u8 * value)
{ {
int rc = -ENODEV; int rc = -ENODEV;
struct slot *pslot; struct slot *pslot;
int hpcrc = 0;
struct slot myslot; struct slot myslot;
debug ("get_attention_status - Entry hotplug_slot[%lx] pvalue[%lx]\n", (ulong) hotplug_slot, (ulong) value); debug ("get_attention_status - Entry hotplug_slot[%lx] pvalue[%lx]\n", (ulong) hotplug_slot, (ulong) value);
...@@ -271,22 +266,16 @@ static int get_attention_status (struct hotplug_slot *hotplug_slot, u8 * value) ...@@ -271,22 +266,16 @@ static int get_attention_status (struct hotplug_slot *hotplug_slot, u8 * value)
pslot = (struct slot *) hotplug_slot->private; pslot = (struct slot *) hotplug_slot->private;
if (pslot) { if (pslot) {
memcpy ((void *) &myslot, (void *) pslot, sizeof (struct slot)); memcpy ((void *) &myslot, (void *) pslot, sizeof (struct slot));
hpcrc = ibmphp_hpc_readslot (pslot, READ_SLOTSTATUS, &(myslot.status)); rc = ibmphp_hpc_readslot(pslot, READ_SLOTSTATUS, &(myslot.status));
if (!hpcrc) if (!rc)
hpcrc = ibmphp_hpc_readslot (pslot, READ_EXTSLOTSTATUS, &(myslot.ext_status)); rc = ibmphp_hpc_readslot(pslot, READ_EXTSLOTSTATUS, &(myslot.ext_status));
if (!hpcrc) { if (!rc)
*value = SLOT_ATTN (myslot.status, myslot.ext_status); *value = SLOT_ATTN (myslot.status, myslot.ext_status);
rc = 0;
}
} }
} else }
rc = -ENODEV;
if (hpcrc)
rc = hpcrc;
ibmphp_unlock_operations (); ibmphp_unlock_operations ();
debug ("get_attention_status - Exit rc[%d] hpcrc[%x] value[%x]\n", rc, hpcrc, *value); debug("get_attention_status - Exit rc[%d] value[%x]\n", rc, *value);
return rc; return rc;
} }
...@@ -294,7 +283,6 @@ static int get_latch_status (struct hotplug_slot *hotplug_slot, u8 * value) ...@@ -294,7 +283,6 @@ static int get_latch_status (struct hotplug_slot *hotplug_slot, u8 * value)
{ {
int rc = -ENODEV; int rc = -ENODEV;
struct slot *pslot; struct slot *pslot;
int hpcrc = 0;
struct slot myslot; struct slot myslot;
debug ("get_latch_status - Entry hotplug_slot[%lx] pvalue[%lx]\n", (ulong) hotplug_slot, (ulong) value); debug ("get_latch_status - Entry hotplug_slot[%lx] pvalue[%lx]\n", (ulong) hotplug_slot, (ulong) value);
...@@ -303,20 +291,14 @@ static int get_latch_status (struct hotplug_slot *hotplug_slot, u8 * value) ...@@ -303,20 +291,14 @@ static int get_latch_status (struct hotplug_slot *hotplug_slot, u8 * value)
pslot = (struct slot *) hotplug_slot->private; pslot = (struct slot *) hotplug_slot->private;
if (pslot) { if (pslot) {
memcpy ((void *) &myslot, (void *) pslot, sizeof (struct slot)); memcpy ((void *) &myslot, (void *) pslot, sizeof (struct slot));
hpcrc = ibmphp_hpc_readslot (pslot, READ_SLOTSTATUS, &(myslot.status)); rc = ibmphp_hpc_readslot(pslot, READ_SLOTSTATUS, &(myslot.status));
if (!hpcrc) { if (!rc)
*value = SLOT_LATCH (myslot.status); *value = SLOT_LATCH (myslot.status);
rc = 0;
}
} }
} else }
rc = -ENODEV;
if (hpcrc)
rc = hpcrc;
ibmphp_unlock_operations (); ibmphp_unlock_operations ();
debug ("get_latch_status - Exit rc[%d] hpcrc[%x] value[%x]\n", rc, hpcrc, *value); debug("get_latch_status - Exit rc[%d] rc[%x] value[%x]\n", rc, rc, *value);
return rc; return rc;
} }
...@@ -325,7 +307,6 @@ static int get_power_status (struct hotplug_slot *hotplug_slot, u8 * value) ...@@ -325,7 +307,6 @@ static int get_power_status (struct hotplug_slot *hotplug_slot, u8 * value)
{ {
int rc = -ENODEV; int rc = -ENODEV;
struct slot *pslot; struct slot *pslot;
int hpcrc = 0;
struct slot myslot; struct slot myslot;
debug ("get_power_status - Entry hotplug_slot[%lx] pvalue[%lx]\n", (ulong) hotplug_slot, (ulong) value); debug ("get_power_status - Entry hotplug_slot[%lx] pvalue[%lx]\n", (ulong) hotplug_slot, (ulong) value);
...@@ -334,20 +315,14 @@ static int get_power_status (struct hotplug_slot *hotplug_slot, u8 * value) ...@@ -334,20 +315,14 @@ static int get_power_status (struct hotplug_slot *hotplug_slot, u8 * value)
pslot = (struct slot *) hotplug_slot->private; pslot = (struct slot *) hotplug_slot->private;
if (pslot) { if (pslot) {
memcpy ((void *) &myslot, (void *) pslot, sizeof (struct slot)); memcpy ((void *) &myslot, (void *) pslot, sizeof (struct slot));
hpcrc = ibmphp_hpc_readslot (pslot, READ_SLOTSTATUS, &(myslot.status)); rc = ibmphp_hpc_readslot(pslot, READ_SLOTSTATUS, &(myslot.status));
if (!hpcrc) { if (!rc)
*value = SLOT_PWRGD (myslot.status); *value = SLOT_PWRGD (myslot.status);
rc = 0;
}
} }
} else }
rc = -ENODEV;
if (hpcrc)
rc = hpcrc;
ibmphp_unlock_operations (); ibmphp_unlock_operations ();
debug ("get_power_status - Exit rc[%d] hpcrc[%x] value[%x]\n", rc, hpcrc, *value); debug("get_power_status - Exit rc[%d] rc[%x] value[%x]\n", rc, rc, *value);
return rc; return rc;
} }
...@@ -356,7 +331,6 @@ static int get_adapter_present (struct hotplug_slot *hotplug_slot, u8 * value) ...@@ -356,7 +331,6 @@ static int get_adapter_present (struct hotplug_slot *hotplug_slot, u8 * value)
int rc = -ENODEV; int rc = -ENODEV;
struct slot *pslot; struct slot *pslot;
u8 present; u8 present;
int hpcrc = 0;
struct slot myslot; struct slot myslot;
debug ("get_adapter_status - Entry hotplug_slot[%lx] pvalue[%lx]\n", (ulong) hotplug_slot, (ulong) value); debug ("get_adapter_status - Entry hotplug_slot[%lx] pvalue[%lx]\n", (ulong) hotplug_slot, (ulong) value);
...@@ -365,23 +339,19 @@ static int get_adapter_present (struct hotplug_slot *hotplug_slot, u8 * value) ...@@ -365,23 +339,19 @@ static int get_adapter_present (struct hotplug_slot *hotplug_slot, u8 * value)
pslot = (struct slot *) hotplug_slot->private; pslot = (struct slot *) hotplug_slot->private;
if (pslot) { if (pslot) {
memcpy ((void *) &myslot, (void *) pslot, sizeof (struct slot)); memcpy ((void *) &myslot, (void *) pslot, sizeof (struct slot));
hpcrc = ibmphp_hpc_readslot (pslot, READ_SLOTSTATUS, &(myslot.status)); rc = ibmphp_hpc_readslot(pslot, READ_SLOTSTATUS, &(myslot.status));
if (!hpcrc) { if (!rc) {
present = SLOT_PRESENT (myslot.status); present = SLOT_PRESENT (myslot.status);
if (present == HPC_SLOT_EMPTY) if (present == HPC_SLOT_EMPTY)
*value = 0; *value = 0;
else else
*value = 1; *value = 1;
rc = 0;
} }
} }
} else }
rc = -ENODEV;
if (hpcrc)
rc = hpcrc;
ibmphp_unlock_operations (); ibmphp_unlock_operations ();
debug ("get_adapter_present - Exit rc[%d] hpcrc[%x] value[%x]\n", rc, hpcrc, *value); debug("get_adapter_present - Exit rc[%d] value[%x]\n", rc, *value);
return rc; return rc;
} }
...@@ -418,8 +388,7 @@ static int get_max_bus_speed (struct hotplug_slot *hotplug_slot, enum pci_bus_sp ...@@ -418,8 +388,7 @@ static int get_max_bus_speed (struct hotplug_slot *hotplug_slot, enum pci_bus_sp
rc = -ENODEV; rc = -ENODEV;
} }
} }
} else }
rc = -ENODEV;
ibmphp_unlock_operations (); ibmphp_unlock_operations ();
debug ("%s - Exit rc[%d] value[%x]\n", __FUNCTION__, rc, *value); debug ("%s - Exit rc[%d] value[%x]\n", __FUNCTION__, rc, *value);
...@@ -465,8 +434,7 @@ static int get_cur_bus_speed (struct hotplug_slot *hotplug_slot, enum pci_bus_sp ...@@ -465,8 +434,7 @@ static int get_cur_bus_speed (struct hotplug_slot *hotplug_slot, enum pci_bus_sp
} }
} }
} }
} else }
rc = -ENODEV;
ibmphp_unlock_operations (); ibmphp_unlock_operations ();
debug ("%s - Exit rc[%d] value[%x]\n", __FUNCTION__, rc, *value); debug ("%s - Exit rc[%d] value[%x]\n", __FUNCTION__, rc, *value);
...@@ -477,7 +445,6 @@ static int get_max_adapter_speed_1 (struct hotplug_slot *hotplug_slot, u8 * valu ...@@ -477,7 +445,6 @@ static int get_max_adapter_speed_1 (struct hotplug_slot *hotplug_slot, u8 * valu
{ {
int rc = -ENODEV; int rc = -ENODEV;
struct slot *pslot; struct slot *pslot;
int hpcrc = 0;
struct slot myslot; struct slot myslot;
debug ("get_max_adapter_speed_1 - Entry hotplug_slot[%lx] pvalue[%lx]\n", (ulong)hotplug_slot, (ulong) value); debug ("get_max_adapter_speed_1 - Entry hotplug_slot[%lx] pvalue[%lx]\n", (ulong)hotplug_slot, (ulong) value);
...@@ -489,29 +456,21 @@ static int get_max_adapter_speed_1 (struct hotplug_slot *hotplug_slot, u8 * valu ...@@ -489,29 +456,21 @@ static int get_max_adapter_speed_1 (struct hotplug_slot *hotplug_slot, u8 * valu
pslot = (struct slot *) hotplug_slot->private; pslot = (struct slot *) hotplug_slot->private;
if (pslot) { if (pslot) {
memcpy ((void *) &myslot, (void *) pslot, sizeof (struct slot)); memcpy ((void *) &myslot, (void *) pslot, sizeof (struct slot));
hpcrc = ibmphp_hpc_readslot (pslot, READ_SLOTSTATUS, &(myslot.status)); rc = ibmphp_hpc_readslot(pslot, READ_SLOTSTATUS, &(myslot.status));
if (!(SLOT_LATCH (myslot.status)) && (SLOT_PRESENT (myslot.status))) { if (!(SLOT_LATCH (myslot.status)) && (SLOT_PRESENT (myslot.status))) {
hpcrc = ibmphp_hpc_readslot (pslot, READ_EXTSLOTSTATUS, &(myslot.ext_status)); rc = ibmphp_hpc_readslot(pslot, READ_EXTSLOTSTATUS, &(myslot.ext_status));
if (!hpcrc) { if (!rc)
*value = SLOT_SPEED (myslot.ext_status); *value = SLOT_SPEED (myslot.ext_status);
rc = 0; } else
}
} else {
*value = MAX_ADAPTER_NONE; *value = MAX_ADAPTER_NONE;
rc = 0;
}
} }
} else }
rc = -ENODEV;
if (hpcrc)
rc = hpcrc;
if (flag) if (flag)
ibmphp_unlock_operations (); ibmphp_unlock_operations ();
debug ("get_max_adapter_speed_1 - Exit rc[%d] hpcrc[%x] value[%x]\n", rc, hpcrc, *value); debug("get_max_adapter_speed_1 - Exit rc[%d] value[%x]\n", rc, *value);
return rc; return rc;
} }
...@@ -520,7 +479,7 @@ static int get_bus_name (struct hotplug_slot *hotplug_slot, char * value) ...@@ -520,7 +479,7 @@ static int get_bus_name (struct hotplug_slot *hotplug_slot, char * value)
int rc = -ENODEV; int rc = -ENODEV;
struct slot *pslot = NULL; struct slot *pslot = NULL;
debug ("get_bus_name - Entry hotplug_slot[%lx] \n", (ulong)hotplug_slot); debug ("get_bus_name - Entry hotplug_slot[%lx]\n", (ulong)hotplug_slot);
ibmphp_lock_operations (); ibmphp_lock_operations ();
...@@ -654,7 +613,7 @@ int ibmphp_update_slot_info (struct slot *slot_cur) ...@@ -654,7 +613,7 @@ int ibmphp_update_slot_info (struct slot *slot_cur)
info = kmalloc (sizeof (struct hotplug_slot_info), GFP_KERNEL); info = kmalloc (sizeof (struct hotplug_slot_info), GFP_KERNEL);
if (!info) { if (!info) {
err ("out of system memory \n"); err ("out of system memory\n");
return -ENOMEM; return -ENOMEM;
} }
...@@ -745,21 +704,20 @@ static void free_slots (void) ...@@ -745,21 +704,20 @@ static void free_slots (void)
debug ("%s -- exit\n", __FUNCTION__); debug ("%s -- exit\n", __FUNCTION__);
} }
static int ibm_unconfigure_device (struct pci_func *func) static void ibm_unconfigure_device(struct pci_func *func)
{ {
struct pci_dev *temp; struct pci_dev *temp;
u8 j; u8 j;
debug ("inside %s\n", __FUNCTION__); debug("inside %s\n", __FUNCTION__);
debug ("func->device = %x, func->function = %x\n", func->device, func->function); debug("func->device = %x, func->function = %x\n", func->device, func->function);
debug ("func->device << 3 | 0x0 = %x\n", func->device << 3 | 0x0); debug("func->device << 3 | 0x0 = %x\n", func->device << 3 | 0x0);
for (j = 0; j < 0x08; j++) { for (j = 0; j < 0x08; j++) {
temp = pci_find_slot (func->busno, (func->device << 3) | j); temp = pci_find_slot(func->busno, (func->device << 3) | j);
if (temp) if (temp)
pci_remove_bus_device(temp); pci_remove_bus_device(temp);
} }
return 0;
} }
/* /*
...@@ -794,7 +752,7 @@ static u8 bus_structure_fixup (u8 busno) ...@@ -794,7 +752,7 @@ static u8 bus_structure_fixup (u8 busno)
dev->bus = bus; dev->bus = bus;
for (dev->devfn = 0; dev->devfn < 256; dev->devfn += 8) { for (dev->devfn = 0; dev->devfn < 256; dev->devfn += 8) {
if (!pci_read_config_word (dev, PCI_VENDOR_ID, &l) && l != 0x0000 && l != 0xffff) { if (!pci_read_config_word (dev, PCI_VENDOR_ID, &l) && l != 0x0000 && l != 0xffff) {
debug ("%s - Inside bus_struture_fixup() \n", __FUNCTION__); debug ("%s - Inside bus_struture_fixup()\n", __FUNCTION__);
pci_scan_bus (busno, ibmphp_pci_bus->ops, NULL); pci_scan_bus (busno, ibmphp_pci_bus->ops, NULL);
break; break;
} }
...@@ -829,7 +787,7 @@ static int ibm_configure_device (struct pci_func *func) ...@@ -829,7 +787,7 @@ static int ibm_configure_device (struct pci_func *func)
func->dev = pci_find_slot(func->busno, PCI_DEVFN(func->device, func->function)); func->dev = pci_find_slot(func->busno, PCI_DEVFN(func->device, func->function));
if (func->dev == NULL) { if (func->dev == NULL) {
err ("ERROR... : pci_dev still NULL \n"); err ("ERROR... : pci_dev still NULL\n");
return 0; return 0;
} }
} }
...@@ -883,7 +841,7 @@ static int set_bus (struct slot * slot_cur) ...@@ -883,7 +841,7 @@ static int set_bus (struct slot * slot_cur)
struct pci_dev *dev = NULL; struct pci_dev *dev = NULL;
int retval; int retval;
debug ("%s - entry slot # %d \n", __FUNCTION__, slot_cur->number); debug ("%s - entry slot # %d\n", __FUNCTION__, slot_cur->number);
if (SET_BUS_STATUS (slot_cur->ctrl) && is_bus_empty (slot_cur)) { if (SET_BUS_STATUS (slot_cur->ctrl) && is_bus_empty (slot_cur)) {
rc = slot_update (&slot_cur); rc = slot_update (&slot_cur);
if (rc) if (rc)
...@@ -934,12 +892,12 @@ static int set_bus (struct slot * slot_cur) ...@@ -934,12 +892,12 @@ static int set_bus (struct slot * slot_cur)
cmd = HPC_BUS_133PCIXMODE; cmd = HPC_BUS_133PCIXMODE;
break; break;
default: default:
err ("Wrong bus speed \n"); err ("Wrong bus speed\n");
return -ENODEV; return -ENODEV;
} }
break; break;
default: default:
err ("wrong slot speed \n"); err ("wrong slot speed\n");
return -ENODEV; return -ENODEV;
} }
debug ("setting bus speed for slot %d, cmd %x\n", slot_cur->number, cmd); debug ("setting bus speed for slot %d, cmd %x\n", slot_cur->number, cmd);
...@@ -949,14 +907,14 @@ static int set_bus (struct slot * slot_cur) ...@@ -949,14 +907,14 @@ static int set_bus (struct slot * slot_cur)
return retval; return retval;
} }
if (CTLR_RESULT (slot_cur->ctrl->status)) { if (CTLR_RESULT (slot_cur->ctrl->status)) {
err ("command not completed successfully in set_bus \n"); err ("command not completed successfully in set_bus\n");
return -EIO; return -EIO;
} }
} }
/* This is for x440, once Brandon fixes the firmware, /* This is for x440, once Brandon fixes the firmware,
will not need this delay */ will not need this delay */
long_delay (1 * HZ); long_delay (1 * HZ);
debug ("%s -Exit \n", __FUNCTION__); debug ("%s -Exit\n", __FUNCTION__);
return 0; return 0;
} }
...@@ -1009,13 +967,13 @@ static inline void print_card_capability (struct slot *slot_cur) ...@@ -1009,13 +967,13 @@ static inline void print_card_capability (struct slot *slot_cur)
{ {
info ("capability of the card is "); info ("capability of the card is ");
if ((slot_cur->ext_status & CARD_INFO) == PCIX133) if ((slot_cur->ext_status & CARD_INFO) == PCIX133)
info (" 133 MHz PCI-X \n"); info (" 133 MHz PCI-X\n");
else if ((slot_cur->ext_status & CARD_INFO) == PCIX66) else if ((slot_cur->ext_status & CARD_INFO) == PCIX66)
info (" 66 MHz PCI-X \n"); info (" 66 MHz PCI-X\n");
else if ((slot_cur->ext_status & CARD_INFO) == PCI66) else if ((slot_cur->ext_status & CARD_INFO) == PCI66)
info (" 66 MHz PCI \n"); info (" 66 MHz PCI\n");
else else
info (" 33 MHz PCI \n"); info (" 33 MHz PCI\n");
} }
...@@ -1033,11 +991,11 @@ static int enable_slot (struct hotplug_slot *hs) ...@@ -1033,11 +991,11 @@ static int enable_slot (struct hotplug_slot *hs)
ibmphp_lock_operations (); ibmphp_lock_operations ();
debug ("ENABLING SLOT........ \n"); debug ("ENABLING SLOT........\n");
slot_cur = (struct slot *) hs->private; slot_cur = (struct slot *) hs->private;
if ((rc = validate (slot_cur, ENABLE))) { if ((rc = validate (slot_cur, ENABLE))) {
err ("validate function failed \n"); err ("validate function failed\n");
goto error_nopower; goto error_nopower;
} }
...@@ -1045,13 +1003,13 @@ static int enable_slot (struct hotplug_slot *hs) ...@@ -1045,13 +1003,13 @@ static int enable_slot (struct hotplug_slot *hs)
rc = set_bus (slot_cur); rc = set_bus (slot_cur);
if (rc) { if (rc) {
err ("was not able to set the bus \n"); err ("was not able to set the bus\n");
goto error_nopower; goto error_nopower;
} }
/*-----------------debugging------------------------------*/ /*-----------------debugging------------------------------*/
get_cur_bus_info (&slot_cur); get_cur_bus_info (&slot_cur);
debug ("the current bus speed right after set_bus = %x \n", slot_cur->bus_on->current_speed); debug ("the current bus speed right after set_bus = %x\n", slot_cur->bus_on->current_speed);
/*----------------------------------------------------------*/ /*----------------------------------------------------------*/
rc = check_limitations (slot_cur); rc = check_limitations (slot_cur);
...@@ -1059,7 +1017,7 @@ static int enable_slot (struct hotplug_slot *hs) ...@@ -1059,7 +1017,7 @@ static int enable_slot (struct hotplug_slot *hs)
err ("Adding this card exceeds the limitations of this bus.\n"); err ("Adding this card exceeds the limitations of this bus.\n");
err ("(i.e., >1 133MHz cards running on same bus, or " err ("(i.e., >1 133MHz cards running on same bus, or "
">2 66 PCI cards running on same bus\n."); ">2 66 PCI cards running on same bus\n.");
err ("Try hot-adding into another bus \n"); err ("Try hot-adding into another bus\n");
rc = -EINVAL; rc = -EINVAL;
goto error_nopower; goto error_nopower;
} }
...@@ -1079,12 +1037,12 @@ static int enable_slot (struct hotplug_slot *hs) ...@@ -1079,12 +1037,12 @@ static int enable_slot (struct hotplug_slot *hs)
} }
/* Check to see the error of why it failed */ /* Check to see the error of why it failed */
if ((SLOT_POWER (slot_cur->status)) && !(SLOT_PWRGD (slot_cur->status))) if ((SLOT_POWER (slot_cur->status)) && !(SLOT_PWRGD (slot_cur->status)))
err ("power fault occurred trying to power up \n"); err ("power fault occurred trying to power up\n");
else if (SLOT_BUS_SPEED (slot_cur->status)) { else if (SLOT_BUS_SPEED (slot_cur->status)) {
err ("bus speed mismatch occurred. please check current bus speed and card capability \n"); err ("bus speed mismatch occurred. please check current bus speed and card capability\n");
print_card_capability (slot_cur); print_card_capability (slot_cur);
} else if (SLOT_BUS_MODE (slot_cur->ext_status)) { } else if (SLOT_BUS_MODE (slot_cur->ext_status)) {
err ("bus mode mismatch occurred. please check current bus mode and card capability \n"); err ("bus mode mismatch occurred. please check current bus mode and card capability\n");
print_card_capability (slot_cur); print_card_capability (slot_cur);
} }
ibmphp_update_slot_info (slot_cur); ibmphp_update_slot_info (slot_cur);
...@@ -1093,7 +1051,7 @@ static int enable_slot (struct hotplug_slot *hs) ...@@ -1093,7 +1051,7 @@ static int enable_slot (struct hotplug_slot *hs)
debug ("after power_on\n"); debug ("after power_on\n");
/*-----------------------debugging---------------------------*/ /*-----------------------debugging---------------------------*/
get_cur_bus_info (&slot_cur); get_cur_bus_info (&slot_cur);
debug ("the current bus speed right after power_on = %x \n", slot_cur->bus_on->current_speed); debug ("the current bus speed right after power_on = %x\n", slot_cur->bus_on->current_speed);
/*----------------------------------------------------------*/ /*----------------------------------------------------------*/
rc = slot_update (&slot_cur); rc = slot_update (&slot_cur);
...@@ -1102,17 +1060,17 @@ static int enable_slot (struct hotplug_slot *hs) ...@@ -1102,17 +1060,17 @@ static int enable_slot (struct hotplug_slot *hs)
rc = -EINVAL; rc = -EINVAL;
if (SLOT_POWER (slot_cur->status) && !(SLOT_PWRGD (slot_cur->status))) { if (SLOT_POWER (slot_cur->status) && !(SLOT_PWRGD (slot_cur->status))) {
err ("power fault occurred trying to power up... \n"); err ("power fault occurred trying to power up...\n");
goto error_power; goto error_power;
} }
if (SLOT_POWER (slot_cur->status) && (SLOT_BUS_SPEED (slot_cur->status))) { if (SLOT_POWER (slot_cur->status) && (SLOT_BUS_SPEED (slot_cur->status))) {
err ("bus speed mismatch occurred. please check current bus speed and card capability \n"); err ("bus speed mismatch occurred. please check current bus speed and card capability\n");
print_card_capability (slot_cur); print_card_capability (slot_cur);
goto error_power; goto error_power;
} }
/* Don't think this case will happen after above checks... but just in case, for paranoia sake */ /* Don't think this case will happen after above checks... but just in case, for paranoia sake */
if (!(SLOT_POWER (slot_cur->status))) { if (!(SLOT_POWER (slot_cur->status))) {
err ("power on failed... \n"); err ("power on failed...\n");
goto error_power; goto error_power;
} }
...@@ -1120,7 +1078,7 @@ static int enable_slot (struct hotplug_slot *hs) ...@@ -1120,7 +1078,7 @@ static int enable_slot (struct hotplug_slot *hs)
if (!slot_cur->func) { if (!slot_cur->func) {
/* We cannot do update_slot_info here, since no memory for /* We cannot do update_slot_info here, since no memory for
* kmalloc n.e.ways, and update_slot_info allocates some */ * kmalloc n.e.ways, and update_slot_info allocates some */
err ("out of system memory \n"); err ("out of system memory\n");
rc = -ENOMEM; rc = -ENOMEM;
goto error_power; goto error_power;
} }
...@@ -1133,7 +1091,7 @@ static int enable_slot (struct hotplug_slot *hs) ...@@ -1133,7 +1091,7 @@ static int enable_slot (struct hotplug_slot *hs)
debug ("b4 configure_card, slot_cur->bus = %x, slot_cur->device = %x\n", slot_cur->bus, slot_cur->device); debug ("b4 configure_card, slot_cur->bus = %x, slot_cur->device = %x\n", slot_cur->bus, slot_cur->device);
if (ibmphp_configure_card (slot_cur->func, slot_cur->number)) { if (ibmphp_configure_card (slot_cur->func, slot_cur->number)) {
err ("configure_card was unsuccessful... \n"); err ("configure_card was unsuccessful...\n");
ibmphp_unconfigure_card (&slot_cur, 1); /* true because don't need to actually deallocate resources, just remove references */ ibmphp_unconfigure_card (&slot_cur, 1); /* true because don't need to actually deallocate resources, just remove references */
debug ("after unconfigure_card\n"); debug ("after unconfigure_card\n");
slot_cur->func = NULL; slot_cur->func = NULL;
...@@ -1204,7 +1162,7 @@ int ibmphp_do_disable_slot (struct slot *slot_cur) ...@@ -1204,7 +1162,7 @@ int ibmphp_do_disable_slot (struct slot *slot_cur)
int rc; int rc;
u8 flag; u8 flag;
debug ("DISABLING SLOT... \n"); debug ("DISABLING SLOT...\n");
if ((slot_cur == NULL) || (slot_cur->ctrl == NULL)) { if ((slot_cur == NULL) || (slot_cur->ctrl == NULL)) {
return -ENODEV; return -ENODEV;
...@@ -1224,7 +1182,7 @@ int ibmphp_do_disable_slot (struct slot *slot_cur) ...@@ -1224,7 +1182,7 @@ int ibmphp_do_disable_slot (struct slot *slot_cur)
/* We need this for fncs's that were there on bootup */ /* We need this for fncs's that were there on bootup */
slot_cur->func = (struct pci_func *) kmalloc (sizeof (struct pci_func), GFP_KERNEL); slot_cur->func = (struct pci_func *) kmalloc (sizeof (struct pci_func), GFP_KERNEL);
if (!slot_cur->func) { if (!slot_cur->func) {
err ("out of system memory \n"); err ("out of system memory\n");
rc = -ENOMEM; rc = -ENOMEM;
goto error; goto error;
} }
...@@ -1233,12 +1191,7 @@ int ibmphp_do_disable_slot (struct slot *slot_cur) ...@@ -1233,12 +1191,7 @@ int ibmphp_do_disable_slot (struct slot *slot_cur)
slot_cur->func->device = slot_cur->device; slot_cur->func->device = slot_cur->device;
} }
if ((rc = ibm_unconfigure_device (slot_cur->func))) { ibm_unconfigure_device(slot_cur->func);
err ("removing from kernel failed... \n");
err ("Please check to see if it was statically linked or is "
"in use otherwise. (perhaps the driver is not 'hot-removable')\n");
goto error;
}
/* If we got here from latch suddenly opening on operating card or /* If we got here from latch suddenly opening on operating card or
a power fault, there's no power to the card, so cannot a power fault, there's no power to the card, so cannot
...@@ -1306,15 +1259,15 @@ struct hotplug_slot_ops ibmphp_hotplug_slot_ops = { ...@@ -1306,15 +1259,15 @@ struct hotplug_slot_ops ibmphp_hotplug_slot_ops = {
static void ibmphp_unload (void) static void ibmphp_unload (void)
{ {
free_slots (); free_slots ();
debug ("after slots \n"); debug ("after slots\n");
ibmphp_free_resources (); ibmphp_free_resources ();
debug ("after resources \n"); debug ("after resources\n");
ibmphp_free_bus_info_queue (); ibmphp_free_bus_info_queue ();
debug ("after bus info \n"); debug ("after bus info\n");
ibmphp_free_ebda_hpc_queue (); ibmphp_free_ebda_hpc_queue ();
debug ("after ebda hpc \n"); debug ("after ebda hpc\n");
ibmphp_free_ebda_pci_rsrc_queue (); ibmphp_free_ebda_pci_rsrc_queue ();
debug ("after ebda pci rsrc \n"); debug ("after ebda pci rsrc\n");
kfree (ibmphp_pci_bus); kfree (ibmphp_pci_bus);
} }
......
...@@ -89,36 +89,34 @@ static struct controller *alloc_ebda_hpc (u32 slot_count, u32 bus_count) ...@@ -89,36 +89,34 @@ static struct controller *alloc_ebda_hpc (u32 slot_count, u32 bus_count)
controller = kmalloc (sizeof (struct controller), GFP_KERNEL); controller = kmalloc (sizeof (struct controller), GFP_KERNEL);
if (!controller) if (!controller)
return NULL; goto error;
memset (controller, 0, sizeof (*controller)); memset (controller, 0, sizeof (*controller));
slots = kmalloc (sizeof (struct ebda_hpc_slot) * slot_count, GFP_KERNEL); slots = kmalloc (sizeof (struct ebda_hpc_slot) * slot_count, GFP_KERNEL);
if (!slots) { if (!slots)
kfree (controller); goto error_contr;
return NULL;
}
memset (slots, 0, sizeof (*slots) * slot_count); memset (slots, 0, sizeof (*slots) * slot_count);
controller->slots = slots; controller->slots = slots;
buses = kmalloc (sizeof (struct ebda_hpc_bus) * bus_count, GFP_KERNEL); buses = kmalloc (sizeof (struct ebda_hpc_bus) * bus_count, GFP_KERNEL);
if (!buses) { if (!buses)
kfree (controller->slots); goto error_slots;
kfree (controller);
return NULL;
}
memset (buses, 0, sizeof (*buses) * bus_count); memset (buses, 0, sizeof (*buses) * bus_count);
controller->buses = buses; controller->buses = buses;
return controller; return controller;
error_slots:
kfree(controller->slots);
error_contr:
kfree(controller);
error:
return NULL;
} }
static void free_ebda_hpc (struct controller *controller) static void free_ebda_hpc (struct controller *controller)
{ {
kfree (controller->slots); kfree (controller->slots);
controller->slots = NULL;
kfree (controller->buses); kfree (controller->buses);
controller->buses = NULL;
controller->ctrl_dev = NULL;
kfree (controller); kfree (controller);
} }
...@@ -171,7 +169,7 @@ static void print_lo_info (void) ...@@ -171,7 +169,7 @@ static void print_lo_info (void)
{ {
struct rio_detail *ptr; struct rio_detail *ptr;
struct list_head *ptr1; struct list_head *ptr1;
debug ("print_lo_info ---- \n"); debug ("print_lo_info ----\n");
list_for_each (ptr1, &rio_lo_head) { list_for_each (ptr1, &rio_lo_head) {
ptr = list_entry (ptr1, struct rio_detail, rio_detail_list); ptr = list_entry (ptr1, struct rio_detail, rio_detail_list);
debug ("%s - rio_node_id = %x\n", __FUNCTION__, ptr->rio_node_id); debug ("%s - rio_node_id = %x\n", __FUNCTION__, ptr->rio_node_id);
...@@ -188,7 +186,7 @@ static void print_vg_info (void) ...@@ -188,7 +186,7 @@ static void print_vg_info (void)
{ {
struct rio_detail *ptr; struct rio_detail *ptr;
struct list_head *ptr1; struct list_head *ptr1;
debug ("%s --- \n", __FUNCTION__); debug ("%s ---\n", __FUNCTION__);
list_for_each (ptr1, &rio_vg_head) { list_for_each (ptr1, &rio_vg_head) {
ptr = list_entry (ptr1, struct rio_detail, rio_detail_list); ptr = list_entry (ptr1, struct rio_detail, rio_detail_list);
debug ("%s - rio_node_id = %x\n", __FUNCTION__, ptr->rio_node_id); debug ("%s - rio_node_id = %x\n", __FUNCTION__, ptr->rio_node_id);
...@@ -220,7 +218,7 @@ static void __init print_ibm_slot (void) ...@@ -220,7 +218,7 @@ static void __init print_ibm_slot (void)
list_for_each (ptr1, &ibmphp_slot_head) { list_for_each (ptr1, &ibmphp_slot_head) {
ptr = list_entry (ptr1, struct slot, ibm_slot_list); ptr = list_entry (ptr1, struct slot, ibm_slot_list);
debug ("%s - slot_number: %x \n", __FUNCTION__, ptr->number); debug ("%s - slot_number: %x\n", __FUNCTION__, ptr->number);
} }
} }
...@@ -228,13 +226,13 @@ static void __init print_opt_vg (void) ...@@ -228,13 +226,13 @@ static void __init print_opt_vg (void)
{ {
struct opt_rio *ptr; struct opt_rio *ptr;
struct list_head *ptr1; struct list_head *ptr1;
debug ("%s --- \n", __FUNCTION__); debug ("%s ---\n", __FUNCTION__);
list_for_each (ptr1, &opt_vg_head) { list_for_each (ptr1, &opt_vg_head) {
ptr = list_entry (ptr1, struct opt_rio, opt_rio_list); ptr = list_entry (ptr1, struct opt_rio, opt_rio_list);
debug ("%s - rio_type %x \n", __FUNCTION__, ptr->rio_type); debug ("%s - rio_type %x\n", __FUNCTION__, ptr->rio_type);
debug ("%s - chassis_num: %x \n", __FUNCTION__, ptr->chassis_num); debug ("%s - chassis_num: %x\n", __FUNCTION__, ptr->chassis_num);
debug ("%s - first_slot_num: %x \n", __FUNCTION__, ptr->first_slot_num); debug ("%s - first_slot_num: %x\n", __FUNCTION__, ptr->first_slot_num);
debug ("%s - middle_num: %x \n", __FUNCTION__, ptr->middle_num); debug ("%s - middle_num: %x\n", __FUNCTION__, ptr->middle_num);
} }
} }
...@@ -286,7 +284,8 @@ static void __init print_ebda_hpc (void) ...@@ -286,7 +284,8 @@ static void __init print_ebda_hpc (void)
int __init ibmphp_access_ebda (void) int __init ibmphp_access_ebda (void)
{ {
u8 format, num_ctlrs, rio_complete, hs_complete; u8 format, num_ctlrs, rio_complete, hs_complete;
u16 ebda_seg, num_entries, next_offset, offset, blk_id, sub_addr, rc, re, rc_id, re_id, base; u16 ebda_seg, num_entries, next_offset, offset, blk_id, sub_addr, re, rc_id, re_id, base;
int rc = 0;
rio_complete = 0; rio_complete = 0;
...@@ -324,10 +323,8 @@ int __init ibmphp_access_ebda (void) ...@@ -324,10 +323,8 @@ int __init ibmphp_access_ebda (void)
format = readb (io_mem + offset); format = readb (io_mem + offset);
offset += 1; offset += 1;
if (format != 4) { if (format != 4)
iounmap (io_mem); goto error_nodev;
return -ENODEV;
}
debug ("hot blk format: %x\n", format); debug ("hot blk format: %x\n", format);
/* hot swap sub blk */ /* hot swap sub blk */
base = offset; base = offset;
...@@ -339,18 +336,16 @@ int __init ibmphp_access_ebda (void) ...@@ -339,18 +336,16 @@ int __init ibmphp_access_ebda (void)
rc_id = readw (io_mem + sub_addr); /* sub blk id */ rc_id = readw (io_mem + sub_addr); /* sub blk id */
sub_addr += 2; sub_addr += 2;
if (rc_id != 0x5243) { if (rc_id != 0x5243)
iounmap (io_mem); goto error_nodev;
return -ENODEV;
}
/* rc sub blk signature */ /* rc sub blk signature */
num_ctlrs = readb (io_mem + sub_addr); num_ctlrs = readb (io_mem + sub_addr);
sub_addr += 1; sub_addr += 1;
hpc_list_ptr = alloc_ebda_hpc_list (); hpc_list_ptr = alloc_ebda_hpc_list ();
if (!hpc_list_ptr) { if (!hpc_list_ptr) {
iounmap (io_mem); rc = -ENOMEM;
return -ENOMEM; goto out;
} }
hpc_list_ptr->format = format; hpc_list_ptr->format = format;
hpc_list_ptr->num_ctlrs = num_ctlrs; hpc_list_ptr->num_ctlrs = num_ctlrs;
...@@ -361,16 +356,15 @@ int __init ibmphp_access_ebda (void) ...@@ -361,16 +356,15 @@ int __init ibmphp_access_ebda (void)
debug ("offset of hpc data structure enteries: %x\n ", sub_addr); debug ("offset of hpc data structure enteries: %x\n ", sub_addr);
sub_addr = base + re; /* re sub blk */ sub_addr = base + re; /* re sub blk */
/* FIXME: rc is never used/checked */
rc = readw (io_mem + sub_addr); /* next sub blk */ rc = readw (io_mem + sub_addr); /* next sub blk */
sub_addr += 2; sub_addr += 2;
re_id = readw (io_mem + sub_addr); /* sub blk id */ re_id = readw (io_mem + sub_addr); /* sub blk id */
sub_addr += 2; sub_addr += 2;
if (re_id != 0x5245) { if (re_id != 0x5245)
iounmap (io_mem); goto error_nodev;
return -ENODEV;
}
/* signature of re */ /* signature of re */
num_entries = readw (io_mem + sub_addr); num_entries = readw (io_mem + sub_addr);
...@@ -378,8 +372,8 @@ int __init ibmphp_access_ebda (void) ...@@ -378,8 +372,8 @@ int __init ibmphp_access_ebda (void)
sub_addr += 2; /* offset of RSRC_ENTRIES blk */ sub_addr += 2; /* offset of RSRC_ENTRIES blk */
rsrc_list_ptr = alloc_ebda_rsrc_list (); rsrc_list_ptr = alloc_ebda_rsrc_list ();
if (!rsrc_list_ptr ) { if (!rsrc_list_ptr ) {
iounmap (io_mem); rc = -ENOMEM;
return -ENOMEM; goto out;
} }
rsrc_list_ptr->format = format; rsrc_list_ptr->format = format;
rsrc_list_ptr->num_entries = num_entries; rsrc_list_ptr->num_entries = num_entries;
...@@ -391,9 +385,8 @@ int __init ibmphp_access_ebda (void) ...@@ -391,9 +385,8 @@ int __init ibmphp_access_ebda (void)
debug ("offset of rsrc data structure enteries: %x\n ", sub_addr); debug ("offset of rsrc data structure enteries: %x\n ", sub_addr);
hs_complete = 1; hs_complete = 1;
} } else {
/* found rio table */ /* found rio table, blk_id == 0x4752 */
else if (blk_id == 0x4752) {
debug ("now enter io table ---\n"); debug ("now enter io table ---\n");
debug ("rio blk id: %x\n", blk_id); debug ("rio blk id: %x\n", blk_id);
...@@ -406,41 +399,36 @@ int __init ibmphp_access_ebda (void) ...@@ -406,41 +399,36 @@ int __init ibmphp_access_ebda (void)
rio_table_ptr->riodev_count = readb (io_mem + offset + 2); rio_table_ptr->riodev_count = readb (io_mem + offset + 2);
rio_table_ptr->offset = offset +3 ; rio_table_ptr->offset = offset +3 ;
debug ("info about rio table hdr ---\n"); debug("info about rio table hdr ---\n");
debug ("ver_num: %x\nscal_count: %x\nriodev_count: %x\noffset of rio table: %x\n ", rio_table_ptr->ver_num, rio_table_ptr->scal_count, rio_table_ptr->riodev_count, rio_table_ptr->offset); debug("ver_num: %x\nscal_count: %x\nriodev_count: %x\noffset of rio table: %x\n ",
rio_table_ptr->ver_num, rio_table_ptr->scal_count,
rio_table_ptr->riodev_count, rio_table_ptr->offset);
rio_complete = 1; rio_complete = 1;
} }
} }
if (!hs_complete && !rio_complete) { if (!hs_complete && !rio_complete)
iounmap (io_mem); goto error_nodev;
return -ENODEV;
}
if (rio_table_ptr) { if (rio_table_ptr) {
if (rio_complete == 1 && rio_table_ptr->ver_num == 3) { if (rio_complete && rio_table_ptr->ver_num == 3) {
rc = ebda_rio_table (); rc = ebda_rio_table ();
if (rc) { if (rc)
iounmap (io_mem); goto out;
return rc;
}
} }
} }
rc = ebda_rsrc_controller (); rc = ebda_rsrc_controller ();
if (rc) { if (rc)
iounmap (io_mem); goto out;
return rc;
}
rc = ebda_rsrc_rsrc (); rc = ebda_rsrc_rsrc ();
if (rc) { goto out;
iounmap (io_mem); error_nodev:
return rc; rc = -ENODEV;
} out:
iounmap (io_mem); iounmap (io_mem);
return 0; return rc;
} }
/* /*
...@@ -670,7 +658,7 @@ static char *create_file_name (struct slot * slot_cur) ...@@ -670,7 +658,7 @@ static char *create_file_name (struct slot * slot_cur)
u8 flag = 0; u8 flag = 0;
if (!slot_cur) { if (!slot_cur) {
err ("Structure passed is empty \n"); err ("Structure passed is empty\n");
return NULL; return NULL;
} }
...@@ -1269,14 +1257,14 @@ static int ibmphp_probe (struct pci_dev * dev, const struct pci_device_id *ids) ...@@ -1269,14 +1257,14 @@ static int ibmphp_probe (struct pci_dev * dev, const struct pci_device_id *ids)
struct controller *ctrl; struct controller *ctrl;
struct list_head *tmp; struct list_head *tmp;
debug ("inside ibmphp_probe \n"); debug ("inside ibmphp_probe\n");
list_for_each (tmp, &ebda_hpc_head) { list_for_each (tmp, &ebda_hpc_head) {
ctrl = list_entry (tmp, struct controller, ebda_hpc_list); ctrl = list_entry (tmp, struct controller, ebda_hpc_list);
if (ctrl->ctlr_type == 1) { if (ctrl->ctlr_type == 1) {
if ((dev->devfn == ctrl->u.pci_ctlr.dev_fun) && (dev->bus->number == ctrl->u.pci_ctlr.bus)) { if ((dev->devfn == ctrl->u.pci_ctlr.dev_fun) && (dev->bus->number == ctrl->u.pci_ctlr.bus)) {
ctrl->ctrl_dev = dev; ctrl->ctrl_dev = dev;
debug ("found device!!! \n"); debug ("found device!!!\n");
debug ("dev->device = %x, dev->subsystem_device = %x\n", dev->device, dev->subsystem_device); debug ("dev->device = %x, dev->subsystem_device = %x\n", dev->device, dev->subsystem_device);
return 0; return 0;
} }
......
...@@ -49,7 +49,7 @@ static u8 find_sec_number (u8 primary_busno, u8 slotno); ...@@ -49,7 +49,7 @@ static u8 find_sec_number (u8 primary_busno, u8 slotno);
*/ */
static void assign_alt_irq (struct pci_func * cur_func, u8 class_code) static void assign_alt_irq (struct pci_func * cur_func, u8 class_code)
{ {
int j = 0; int j;
for (j = 0; j < 4; j++) { for (j = 0; j < 4; j++) {
if (cur_func->irq[j] == 0xff) { if (cur_func->irq[j] == 0xff) {
switch (class_code) { switch (class_code) {
...@@ -92,7 +92,7 @@ int ibmphp_configure_card (struct pci_func *func, u8 slotno) ...@@ -92,7 +92,7 @@ int ibmphp_configure_card (struct pci_func *func, u8 slotno)
u8 flag; u8 flag;
u8 valid_device = 0x00; /* to see if we are able to read from card any device info at all */ u8 valid_device = 0x00; /* to see if we are able to read from card any device info at all */
debug ("inside configure_card, func->busno = %x \n", func->busno); debug ("inside configure_card, func->busno = %x\n", func->busno);
device = func->device; device = func->device;
cur_func = func; cur_func = func;
...@@ -130,7 +130,7 @@ int ibmphp_configure_card (struct pci_func *func, u8 slotno) ...@@ -130,7 +130,7 @@ int ibmphp_configure_card (struct pci_func *func, u8 slotno)
pci_bus_read_config_dword (ibmphp_pci_bus, devfn, PCI_CLASS_REVISION, &class); pci_bus_read_config_dword (ibmphp_pci_bus, devfn, PCI_CLASS_REVISION, &class);
class_code = class >> 24; class_code = class >> 24;
debug ("hrd_type = %x, class = %x, class_code %x \n", hdr_type, class, class_code); debug ("hrd_type = %x, class = %x, class_code %x\n", hdr_type, class, class_code);
class >>= 8; /* to take revision out, class = class.subclass.prog i/f */ class >>= 8; /* to take revision out, class = class.subclass.prog i/f */
if (class == PCI_CLASS_NOT_DEFINED_VGA) { if (class == PCI_CLASS_NOT_DEFINED_VGA) {
err ("The device %x is VGA compatible and as is not supported for hot plugging. " err ("The device %x is VGA compatible and as is not supported for hot plugging. "
...@@ -147,7 +147,7 @@ int ibmphp_configure_card (struct pci_func *func, u8 slotno) ...@@ -147,7 +147,7 @@ int ibmphp_configure_card (struct pci_func *func, u8 slotno)
assign_alt_irq (cur_func, class_code); assign_alt_irq (cur_func, class_code);
if ((rc = configure_device (cur_func)) < 0) { if ((rc = configure_device (cur_func)) < 0) {
/* We need to do this in case some other BARs were properly inserted */ /* We need to do this in case some other BARs were properly inserted */
err ("was not able to configure devfunc %x on bus %x. \n", err ("was not able to configure devfunc %x on bus %x.\n",
cur_func->device, cur_func->busno); cur_func->device, cur_func->busno);
cleanup_count = 6; cleanup_count = 6;
goto error; goto error;
...@@ -166,7 +166,7 @@ int ibmphp_configure_card (struct pci_func *func, u8 slotno) ...@@ -166,7 +166,7 @@ int ibmphp_configure_card (struct pci_func *func, u8 slotno)
} }
newfunc = (struct pci_func *) kmalloc (sizeof (struct pci_func), GFP_KERNEL); newfunc = (struct pci_func *) kmalloc (sizeof (struct pci_func), GFP_KERNEL);
if (!newfunc) { if (!newfunc) {
err ("out of system memory \n"); err ("out of system memory\n");
return -ENOMEM; return -ENOMEM;
} }
memset (newfunc, 0, sizeof (struct pci_func)); memset (newfunc, 0, sizeof (struct pci_func));
...@@ -188,7 +188,7 @@ int ibmphp_configure_card (struct pci_func *func, u8 slotno) ...@@ -188,7 +188,7 @@ int ibmphp_configure_card (struct pci_func *func, u8 slotno)
rc = configure_bridge (&cur_func, slotno); rc = configure_bridge (&cur_func, slotno);
if (rc == -ENODEV) { if (rc == -ENODEV) {
err ("You chose to insert Single Bridge, or nested bridges, this is not supported...\n"); err ("You chose to insert Single Bridge, or nested bridges, this is not supported...\n");
err ("Bus %x, devfunc %x \n", cur_func->busno, cur_func->device); err ("Bus %x, devfunc %x\n", cur_func->busno, cur_func->device);
return rc; return rc;
} }
if (rc) { if (rc) {
...@@ -205,7 +205,7 @@ int ibmphp_configure_card (struct pci_func *func, u8 slotno) ...@@ -205,7 +205,7 @@ int ibmphp_configure_card (struct pci_func *func, u8 slotno)
if (func->devices[i]) { if (func->devices[i]) {
newfunc = (struct pci_func *) kmalloc (sizeof (struct pci_func), GFP_KERNEL); newfunc = (struct pci_func *) kmalloc (sizeof (struct pci_func), GFP_KERNEL);
if (!newfunc) { if (!newfunc) {
err ("out of system memory \n"); err ("out of system memory\n");
return -ENOMEM; return -ENOMEM;
} }
memset (newfunc, 0, sizeof (struct pci_func)); memset (newfunc, 0, sizeof (struct pci_func));
...@@ -234,7 +234,7 @@ int ibmphp_configure_card (struct pci_func *func, u8 slotno) ...@@ -234,7 +234,7 @@ int ibmphp_configure_card (struct pci_func *func, u8 slotno)
newfunc = (struct pci_func *) kmalloc (sizeof (struct pci_func), GFP_KERNEL); newfunc = (struct pci_func *) kmalloc (sizeof (struct pci_func), GFP_KERNEL);
if (!newfunc) { if (!newfunc) {
err ("out of system memory \n"); err ("out of system memory\n");
return -ENOMEM; return -ENOMEM;
} }
memset (newfunc, 0, sizeof (struct pci_func)); memset (newfunc, 0, sizeof (struct pci_func));
...@@ -261,7 +261,7 @@ int ibmphp_configure_card (struct pci_func *func, u8 slotno) ...@@ -261,7 +261,7 @@ int ibmphp_configure_card (struct pci_func *func, u8 slotno)
rc = configure_bridge (&cur_func, slotno); rc = configure_bridge (&cur_func, slotno);
if (rc == -ENODEV) { if (rc == -ENODEV) {
err ("You chose to insert Single Bridge, or nested bridges, this is not supported...\n"); err ("You chose to insert Single Bridge, or nested bridges, this is not supported...\n");
err ("Bus %x, devfunc %x \n", cur_func->busno, cur_func->device); err ("Bus %x, devfunc %x\n", cur_func->busno, cur_func->device);
return rc; return rc;
} }
if (rc) { if (rc) {
...@@ -281,7 +281,7 @@ int ibmphp_configure_card (struct pci_func *func, u8 slotno) ...@@ -281,7 +281,7 @@ int ibmphp_configure_card (struct pci_func *func, u8 slotno)
debug ("inside for loop, device is %x\n", i); debug ("inside for loop, device is %x\n", i);
newfunc = (struct pci_func *) kmalloc (sizeof (struct pci_func), GFP_KERNEL); newfunc = (struct pci_func *) kmalloc (sizeof (struct pci_func), GFP_KERNEL);
if (!newfunc) { if (!newfunc) {
err (" out of system memory \n"); err (" out of system memory\n");
return -ENOMEM; return -ENOMEM;
} }
memset (newfunc, 0, sizeof (struct pci_func)); memset (newfunc, 0, sizeof (struct pci_func));
...@@ -408,7 +408,7 @@ static int configure_device (struct pci_func *func) ...@@ -408,7 +408,7 @@ static int configure_device (struct pci_func *func)
io[count] = kmalloc (sizeof (struct resource_node), GFP_KERNEL); io[count] = kmalloc (sizeof (struct resource_node), GFP_KERNEL);
if (!io[count]) { if (!io[count]) {
err ("out of system memory \n"); err ("out of system memory\n");
return -ENOMEM; return -ENOMEM;
} }
memset (io[count], 0, sizeof (struct resource_node)); memset (io[count], 0, sizeof (struct resource_node));
...@@ -446,7 +446,7 @@ static int configure_device (struct pci_func *func) ...@@ -446,7 +446,7 @@ static int configure_device (struct pci_func *func)
pfmem[count] = kmalloc (sizeof (struct resource_node), GFP_KERNEL); pfmem[count] = kmalloc (sizeof (struct resource_node), GFP_KERNEL);
if (!pfmem[count]) { if (!pfmem[count]) {
err ("out of system memory \n"); err ("out of system memory\n");
return -ENOMEM; return -ENOMEM;
} }
memset (pfmem[count], 0, sizeof (struct resource_node)); memset (pfmem[count], 0, sizeof (struct resource_node));
...@@ -461,7 +461,7 @@ static int configure_device (struct pci_func *func) ...@@ -461,7 +461,7 @@ static int configure_device (struct pci_func *func)
} else { } else {
mem_tmp = kmalloc (sizeof (struct resource_node), GFP_KERNEL); mem_tmp = kmalloc (sizeof (struct resource_node), GFP_KERNEL);
if (!mem_tmp) { if (!mem_tmp) {
err ("out of system memory \n"); err ("out of system memory\n");
kfree (pfmem[count]); kfree (pfmem[count]);
return -ENOMEM; return -ENOMEM;
} }
...@@ -513,7 +513,7 @@ static int configure_device (struct pci_func *func) ...@@ -513,7 +513,7 @@ static int configure_device (struct pci_func *func)
mem[count] = kmalloc (sizeof (struct resource_node), GFP_KERNEL); mem[count] = kmalloc (sizeof (struct resource_node), GFP_KERNEL);
if (!mem[count]) { if (!mem[count]) {
err ("out of system memory \n"); err ("out of system memory\n");
return -ENOMEM; return -ENOMEM;
} }
memset (mem[count], 0, sizeof (struct resource_node)); memset (mem[count], 0, sizeof (struct resource_node));
...@@ -620,7 +620,7 @@ static int configure_bridge (struct pci_func **func_passed, u8 slotno) ...@@ -620,7 +620,7 @@ static int configure_bridge (struct pci_func **func_passed, u8 slotno)
/* in EBDA, only get allocated 1 additional bus # per slot */ /* in EBDA, only get allocated 1 additional bus # per slot */
sec_number = find_sec_number (func->busno, slotno); sec_number = find_sec_number (func->busno, slotno);
if (sec_number == 0xff) { if (sec_number == 0xff) {
err ("cannot allocate secondary bus number for the bridged device \n"); err ("cannot allocate secondary bus number for the bridged device\n");
return -EINVAL; return -EINVAL;
} }
...@@ -678,7 +678,7 @@ static int configure_bridge (struct pci_func **func_passed, u8 slotno) ...@@ -678,7 +678,7 @@ static int configure_bridge (struct pci_func **func_passed, u8 slotno)
bus_io[count] = kmalloc (sizeof (struct resource_node), GFP_KERNEL); bus_io[count] = kmalloc (sizeof (struct resource_node), GFP_KERNEL);
if (!bus_io[count]) { if (!bus_io[count]) {
err ("out of system memory \n"); err ("out of system memory\n");
retval = -ENOMEM; retval = -ENOMEM;
goto error; goto error;
} }
...@@ -710,7 +710,7 @@ static int configure_bridge (struct pci_func **func_passed, u8 slotno) ...@@ -710,7 +710,7 @@ static int configure_bridge (struct pci_func **func_passed, u8 slotno)
bus_pfmem[count] = kmalloc (sizeof (struct resource_node), GFP_KERNEL); bus_pfmem[count] = kmalloc (sizeof (struct resource_node), GFP_KERNEL);
if (!bus_pfmem[count]) { if (!bus_pfmem[count]) {
err ("out of system memory \n"); err ("out of system memory\n");
retval = -ENOMEM; retval = -ENOMEM;
goto error; goto error;
} }
...@@ -726,7 +726,7 @@ static int configure_bridge (struct pci_func **func_passed, u8 slotno) ...@@ -726,7 +726,7 @@ static int configure_bridge (struct pci_func **func_passed, u8 slotno)
} else { } else {
mem_tmp = kmalloc (sizeof (struct resource_node), GFP_KERNEL); mem_tmp = kmalloc (sizeof (struct resource_node), GFP_KERNEL);
if (!mem_tmp) { if (!mem_tmp) {
err ("out of system memory \n"); err ("out of system memory\n");
retval = -ENOMEM; retval = -ENOMEM;
goto error; goto error;
} }
...@@ -768,7 +768,7 @@ static int configure_bridge (struct pci_func **func_passed, u8 slotno) ...@@ -768,7 +768,7 @@ static int configure_bridge (struct pci_func **func_passed, u8 slotno)
bus_mem[count] = kmalloc (sizeof (struct resource_node), GFP_KERNEL); bus_mem[count] = kmalloc (sizeof (struct resource_node), GFP_KERNEL);
if (!bus_mem[count]) { if (!bus_mem[count]) {
err ("out of system memory \n"); err ("out of system memory\n");
retval = -ENOMEM; retval = -ENOMEM;
goto error; goto error;
} }
...@@ -813,7 +813,7 @@ static int configure_bridge (struct pci_func **func_passed, u8 slotno) ...@@ -813,7 +813,7 @@ static int configure_bridge (struct pci_func **func_passed, u8 slotno)
debug ("amount_needed->pfmem = %x\n", amount_needed->pfmem); debug ("amount_needed->pfmem = %x\n", amount_needed->pfmem);
if (amount_needed->not_correct) { if (amount_needed->not_correct) {
debug ("amount_needed is not correct \n"); debug ("amount_needed is not correct\n");
for (count = 0; address[count]; count++) { for (count = 0; address[count]; count++) {
/* for 2 BARs */ /* for 2 BARs */
if (bus_io[count]) { if (bus_io[count]) {
...@@ -835,11 +835,11 @@ static int configure_bridge (struct pci_func **func_passed, u8 slotno) ...@@ -835,11 +835,11 @@ static int configure_bridge (struct pci_func **func_passed, u8 slotno)
debug ("it doesn't want IO?\n"); debug ("it doesn't want IO?\n");
flag_io = TRUE; flag_io = TRUE;
} else { } else {
debug ("it wants %x IO behind the bridge \n", amount_needed->io); debug ("it wants %x IO behind the bridge\n", amount_needed->io);
io = kmalloc (sizeof (struct resource_node), GFP_KERNEL); io = kmalloc (sizeof (struct resource_node), GFP_KERNEL);
if (!io) { if (!io) {
err ("out of system memory \n"); err ("out of system memory\n");
retval = -ENOMEM; retval = -ENOMEM;
goto error; goto error;
} }
...@@ -862,7 +862,7 @@ static int configure_bridge (struct pci_func **func_passed, u8 slotno) ...@@ -862,7 +862,7 @@ static int configure_bridge (struct pci_func **func_passed, u8 slotno)
debug ("it wants %x memory behind the bridge\n", amount_needed->mem); debug ("it wants %x memory behind the bridge\n", amount_needed->mem);
mem = kmalloc (sizeof (struct resource_node), GFP_KERNEL); mem = kmalloc (sizeof (struct resource_node), GFP_KERNEL);
if (!mem) { if (!mem) {
err ("out of system memory \n"); err ("out of system memory\n");
retval = -ENOMEM; retval = -ENOMEM;
goto error; goto error;
} }
...@@ -885,7 +885,7 @@ static int configure_bridge (struct pci_func **func_passed, u8 slotno) ...@@ -885,7 +885,7 @@ static int configure_bridge (struct pci_func **func_passed, u8 slotno)
debug ("it wants %x pfmemory behind the bridge\n", amount_needed->pfmem); debug ("it wants %x pfmemory behind the bridge\n", amount_needed->pfmem);
pfmem = kmalloc (sizeof (struct resource_node), GFP_KERNEL); pfmem = kmalloc (sizeof (struct resource_node), GFP_KERNEL);
if (!pfmem) { if (!pfmem) {
err ("out of system memory \n"); err ("out of system memory\n");
retval = -ENOMEM; retval = -ENOMEM;
goto error; goto error;
} }
...@@ -901,7 +901,7 @@ static int configure_bridge (struct pci_func **func_passed, u8 slotno) ...@@ -901,7 +901,7 @@ static int configure_bridge (struct pci_func **func_passed, u8 slotno)
} else { } else {
mem_tmp = kmalloc (sizeof (struct resource_node), GFP_KERNEL); mem_tmp = kmalloc (sizeof (struct resource_node), GFP_KERNEL);
if (!mem_tmp) { if (!mem_tmp) {
err ("out of system memory \n"); err ("out of system memory\n");
retval = -ENOMEM; retval = -ENOMEM;
goto error; goto error;
} }
...@@ -933,7 +933,7 @@ static int configure_bridge (struct pci_func **func_passed, u8 slotno) ...@@ -933,7 +933,7 @@ static int configure_bridge (struct pci_func **func_passed, u8 slotno)
if (!bus) { if (!bus) {
bus = kmalloc (sizeof (struct bus_node), GFP_KERNEL); bus = kmalloc (sizeof (struct bus_node), GFP_KERNEL);
if (!bus) { if (!bus) {
err ("out of system memory \n"); err ("out of system memory\n");
retval = -ENOMEM; retval = -ENOMEM;
goto error; goto error;
} }
...@@ -944,7 +944,7 @@ static int configure_bridge (struct pci_func **func_passed, u8 slotno) ...@@ -944,7 +944,7 @@ static int configure_bridge (struct pci_func **func_passed, u8 slotno)
} else if (!(bus->rangeIO) && !(bus->rangeMem) && !(bus->rangePFMem)) } else if (!(bus->rangeIO) && !(bus->rangeMem) && !(bus->rangePFMem))
rc = add_new_bus (bus, io, mem, pfmem, 0xFF); rc = add_new_bus (bus, io, mem, pfmem, 0xFF);
else { else {
err ("expected bus structure not empty? \n"); err ("expected bus structure not empty?\n");
retval = -EIO; retval = -EIO;
goto error; goto error;
} }
...@@ -1050,7 +1050,7 @@ static int configure_bridge (struct pci_func **func_passed, u8 slotno) ...@@ -1050,7 +1050,7 @@ static int configure_bridge (struct pci_func **func_passed, u8 slotno)
kfree (amount_needed); kfree (amount_needed);
return 0; return 0;
} else { } else {
err ("Configuring bridge was unsuccessful... \n"); err ("Configuring bridge was unsuccessful...\n");
mem_tmp = NULL; mem_tmp = NULL;
retval = -EIO; retval = -EIO;
goto error; goto error;
...@@ -1171,7 +1171,7 @@ static struct res_needed *scan_behind_bridge (struct pci_func * func, u8 busno) ...@@ -1171,7 +1171,7 @@ static struct res_needed *scan_behind_bridge (struct pci_func * func, u8 busno)
//tmp_bar = bar[count]; //tmp_bar = bar[count];
debug ("count %d device %x function %x wants %x resources \n", count, device, function, bar[count]); debug ("count %d device %x function %x wants %x resources\n", count, device, function, bar[count]);
if (bar[count] & PCI_BASE_ADDRESS_SPACE_IO) { if (bar[count] & PCI_BASE_ADDRESS_SPACE_IO) {
/* This is IO */ /* This is IO */
...@@ -1522,7 +1522,7 @@ static int unconfigure_boot_card (struct slot *slot_cur) ...@@ -1522,7 +1522,7 @@ static int unconfigure_boot_card (struct slot *slot_cur)
case PCI_HEADER_TYPE_NORMAL: case PCI_HEADER_TYPE_NORMAL:
rc = unconfigure_boot_device (busno, device, function); rc = unconfigure_boot_device (busno, device, function);
if (rc) { if (rc) {
err ("was not able to unconfigure device %x func %x on bus %x. bailing out... \n", err ("was not able to unconfigure device %x func %x on bus %x. bailing out...\n",
device, function, busno); device, function, busno);
return rc; return rc;
} }
...@@ -1531,7 +1531,7 @@ static int unconfigure_boot_card (struct slot *slot_cur) ...@@ -1531,7 +1531,7 @@ static int unconfigure_boot_card (struct slot *slot_cur)
case PCI_HEADER_TYPE_MULTIDEVICE: case PCI_HEADER_TYPE_MULTIDEVICE:
rc = unconfigure_boot_device (busno, device, function); rc = unconfigure_boot_device (busno, device, function);
if (rc) { if (rc) {
err ("was not able to unconfigure device %x func %x on bus %x. bailing out... \n", err ("was not able to unconfigure device %x func %x on bus %x. bailing out...\n",
device, function, busno); device, function, busno);
return rc; return rc;
} }
...@@ -1567,7 +1567,7 @@ static int unconfigure_boot_card (struct slot *slot_cur) ...@@ -1567,7 +1567,7 @@ static int unconfigure_boot_card (struct slot *slot_cur)
} }
break; break;
default: default:
err ("MAJOR PROBLEM!!!! Cannot read device's header \n"); err ("MAJOR PROBLEM!!!! Cannot read device's header\n");
return -1; return -1;
break; break;
} /* end of switch */ } /* end of switch */
...@@ -1575,7 +1575,7 @@ static int unconfigure_boot_card (struct slot *slot_cur) ...@@ -1575,7 +1575,7 @@ static int unconfigure_boot_card (struct slot *slot_cur)
} /* end of for */ } /* end of for */
if (!valid_device) { if (!valid_device) {
err ("Could not find device to unconfigure. Or could not read the card. \n"); err ("Could not find device to unconfigure. Or could not read the card.\n");
return -1; return -1;
} }
return 0; return 0;
...@@ -1623,19 +1623,19 @@ int ibmphp_unconfigure_card (struct slot **slot_cur, int the_end) ...@@ -1623,19 +1623,19 @@ int ibmphp_unconfigure_card (struct slot **slot_cur, int the_end)
for (i = 0; i < count; i++) { for (i = 0; i < count; i++) {
if (cur_func->io[i]) { if (cur_func->io[i]) {
debug ("io[%d] exists \n", i); debug ("io[%d] exists\n", i);
if (the_end > 0) if (the_end > 0)
ibmphp_remove_resource (cur_func->io[i]); ibmphp_remove_resource (cur_func->io[i]);
cur_func->io[i] = NULL; cur_func->io[i] = NULL;
} }
if (cur_func->mem[i]) { if (cur_func->mem[i]) {
debug ("mem[%d] exists \n", i); debug ("mem[%d] exists\n", i);
if (the_end > 0) if (the_end > 0)
ibmphp_remove_resource (cur_func->mem[i]); ibmphp_remove_resource (cur_func->mem[i]);
cur_func->mem[i] = NULL; cur_func->mem[i] = NULL;
} }
if (cur_func->pfmem[i]) { if (cur_func->pfmem[i]) {
debug ("pfmem[%d] exists \n", i); debug ("pfmem[%d] exists\n", i);
if (the_end > 0) if (the_end > 0)
ibmphp_remove_resource (cur_func->pfmem[i]); ibmphp_remove_resource (cur_func->pfmem[i]);
cur_func->pfmem[i] = NULL; cur_func->pfmem[i] = NULL;
...@@ -1682,7 +1682,7 @@ static int add_new_bus (struct bus_node *bus, struct resource_node *io, struct r ...@@ -1682,7 +1682,7 @@ static int add_new_bus (struct bus_node *bus, struct resource_node *io, struct r
if (io) { if (io) {
io_range = kmalloc (sizeof (struct range_node), GFP_KERNEL); io_range = kmalloc (sizeof (struct range_node), GFP_KERNEL);
if (!io_range) { if (!io_range) {
err ("out of system memory \n"); err ("out of system memory\n");
return -ENOMEM; return -ENOMEM;
} }
memset (io_range, 0, sizeof (struct range_node)); memset (io_range, 0, sizeof (struct range_node));
...@@ -1695,7 +1695,7 @@ static int add_new_bus (struct bus_node *bus, struct resource_node *io, struct r ...@@ -1695,7 +1695,7 @@ static int add_new_bus (struct bus_node *bus, struct resource_node *io, struct r
if (mem) { if (mem) {
mem_range = kmalloc (sizeof (struct range_node), GFP_KERNEL); mem_range = kmalloc (sizeof (struct range_node), GFP_KERNEL);
if (!mem_range) { if (!mem_range) {
err ("out of system memory \n"); err ("out of system memory\n");
return -ENOMEM; return -ENOMEM;
} }
memset (mem_range, 0, sizeof (struct range_node)); memset (mem_range, 0, sizeof (struct range_node));
...@@ -1708,7 +1708,7 @@ static int add_new_bus (struct bus_node *bus, struct resource_node *io, struct r ...@@ -1708,7 +1708,7 @@ static int add_new_bus (struct bus_node *bus, struct resource_node *io, struct r
if (pfmem) { if (pfmem) {
pfmem_range = kmalloc (sizeof (struct range_node), GFP_KERNEL); pfmem_range = kmalloc (sizeof (struct range_node), GFP_KERNEL);
if (!pfmem_range) { if (!pfmem_range) {
err ("out of system memory \n"); err ("out of system memory\n");
return -ENOMEM; return -ENOMEM;
} }
memset (pfmem_range, 0, sizeof (struct range_node)); memset (pfmem_range, 0, sizeof (struct range_node));
......
...@@ -52,13 +52,13 @@ static struct bus_node * __init alloc_error_bus (struct ebda_pci_rsrc * curr, u8 ...@@ -52,13 +52,13 @@ static struct bus_node * __init alloc_error_bus (struct ebda_pci_rsrc * curr, u8
struct bus_node * newbus; struct bus_node * newbus;
if (!(curr) && !(flag)) { if (!(curr) && !(flag)) {
err ("NULL pointer passed \n"); err ("NULL pointer passed\n");
return NULL; return NULL;
} }
newbus = kmalloc (sizeof (struct bus_node), GFP_KERNEL); newbus = kmalloc (sizeof (struct bus_node), GFP_KERNEL);
if (!newbus) { if (!newbus) {
err ("out of system memory \n"); err ("out of system memory\n");
return NULL; return NULL;
} }
...@@ -76,13 +76,13 @@ static struct resource_node * __init alloc_resources (struct ebda_pci_rsrc * cur ...@@ -76,13 +76,13 @@ static struct resource_node * __init alloc_resources (struct ebda_pci_rsrc * cur
struct resource_node *rs; struct resource_node *rs;
if (!curr) { if (!curr) {
err ("NULL passed to allocate \n"); err ("NULL passed to allocate\n");
return NULL; return NULL;
} }
rs = kmalloc (sizeof (struct resource_node), GFP_KERNEL); rs = kmalloc (sizeof (struct resource_node), GFP_KERNEL);
if (!rs) { if (!rs) {
err ("out of system memory \n"); err ("out of system memory\n");
return NULL; return NULL;
} }
memset (rs, 0, sizeof (struct resource_node)); memset (rs, 0, sizeof (struct resource_node));
...@@ -103,7 +103,7 @@ static int __init alloc_bus_range (struct bus_node **new_bus, struct range_node ...@@ -103,7 +103,7 @@ static int __init alloc_bus_range (struct bus_node **new_bus, struct range_node
if (first_bus) { if (first_bus) {
newbus = kmalloc (sizeof (struct bus_node), GFP_KERNEL); newbus = kmalloc (sizeof (struct bus_node), GFP_KERNEL);
if (!newbus) { if (!newbus) {
err ("out of system memory. \n"); err ("out of system memory.\n");
return -ENOMEM; return -ENOMEM;
} }
memset (newbus, 0, sizeof (struct bus_node)); memset (newbus, 0, sizeof (struct bus_node));
...@@ -127,7 +127,7 @@ static int __init alloc_bus_range (struct bus_node **new_bus, struct range_node ...@@ -127,7 +127,7 @@ static int __init alloc_bus_range (struct bus_node **new_bus, struct range_node
if (!newrange) { if (!newrange) {
if (first_bus) if (first_bus)
kfree (newbus); kfree (newbus);
err ("out of system memory \n"); err ("out of system memory\n");
return -ENOMEM; return -ENOMEM;
} }
memset (newrange, 0, sizeof (struct range_node)); memset (newrange, 0, sizeof (struct range_node));
...@@ -607,7 +607,7 @@ int ibmphp_add_resource (struct resource_node *res) ...@@ -607,7 +607,7 @@ int ibmphp_add_resource (struct resource_node *res)
debug ("%s - enter\n", __FUNCTION__); debug ("%s - enter\n", __FUNCTION__);
if (!res) { if (!res) {
err ("NULL passed to add \n"); err ("NULL passed to add\n");
return -ENODEV; return -ENODEV;
} }
...@@ -634,7 +634,7 @@ int ibmphp_add_resource (struct resource_node *res) ...@@ -634,7 +634,7 @@ int ibmphp_add_resource (struct resource_node *res)
res_start = bus_cur->firstPFMem; res_start = bus_cur->firstPFMem;
break; break;
default: default:
err ("cannot read the type of the resource to add... problem \n"); err ("cannot read the type of the resource to add... problem\n");
return -EINVAL; return -EINVAL;
} }
while (range_cur) { while (range_cur) {
...@@ -787,7 +787,7 @@ int ibmphp_remove_resource (struct resource_node *res) ...@@ -787,7 +787,7 @@ int ibmphp_remove_resource (struct resource_node *res)
char * type = ""; char * type = "";
if (!res) { if (!res) {
err ("resource to remove is NULL \n"); err ("resource to remove is NULL\n");
return -ENODEV; return -ENODEV;
} }
...@@ -813,7 +813,7 @@ int ibmphp_remove_resource (struct resource_node *res) ...@@ -813,7 +813,7 @@ int ibmphp_remove_resource (struct resource_node *res)
type = "pfmem"; type = "pfmem";
break; break;
default: default:
err ("unknown type for resource to remove \n"); err ("unknown type for resource to remove\n");
return -EINVAL; return -EINVAL;
} }
res_prev = NULL; res_prev = NULL;
...@@ -954,7 +954,7 @@ static struct range_node * find_range (struct bus_node *bus_cur, struct resource ...@@ -954,7 +954,7 @@ static struct range_node * find_range (struct bus_node *bus_cur, struct resource
range = bus_cur->rangePFMem; range = bus_cur->rangePFMem;
break; break;
default: default:
err ("cannot read resource type in find_range \n"); err ("cannot read resource type in find_range\n");
} }
while (range) { while (range) {
...@@ -1002,7 +1002,7 @@ int ibmphp_check_resource (struct resource_node *res, u8 bridge) ...@@ -1002,7 +1002,7 @@ int ibmphp_check_resource (struct resource_node *res, u8 bridge)
if (!bus_cur) { if (!bus_cur) {
/* didn't find a bus, smth's wrong!!! */ /* didn't find a bus, smth's wrong!!! */
debug ("no bus in the system, either pci_dev's wrong or allocation failed \n"); debug ("no bus in the system, either pci_dev's wrong or allocation failed\n");
return -EINVAL; return -EINVAL;
} }
...@@ -1027,7 +1027,7 @@ int ibmphp_check_resource (struct resource_node *res, u8 bridge) ...@@ -1027,7 +1027,7 @@ int ibmphp_check_resource (struct resource_node *res, u8 bridge)
noranges = bus_cur->noPFMemRanges; noranges = bus_cur->noPFMemRanges;
break; break;
default: default:
err ("wrong type of resource to check \n"); err ("wrong type of resource to check\n");
return -EINVAL; return -EINVAL;
} }
res_prev = NULL; res_prev = NULL;
...@@ -1496,7 +1496,7 @@ int ibmphp_find_resource (struct bus_node *bus, u32 start_address, struct resour ...@@ -1496,7 +1496,7 @@ int ibmphp_find_resource (struct bus_node *bus, u32 start_address, struct resour
char * type = ""; char * type = "";
if (!bus) { if (!bus) {
err ("The bus passed in NULL to find resource \n"); err ("The bus passed in NULL to find resource\n");
return -ENODEV; return -ENODEV;
} }
...@@ -1514,7 +1514,7 @@ int ibmphp_find_resource (struct bus_node *bus, u32 start_address, struct resour ...@@ -1514,7 +1514,7 @@ int ibmphp_find_resource (struct bus_node *bus, u32 start_address, struct resour
type = "pfmem"; type = "pfmem";
break; break;
default: default:
err ("wrong type of flag \n"); err ("wrong type of flag\n");
return -EINVAL; return -EINVAL;
} }
...@@ -1540,17 +1540,17 @@ int ibmphp_find_resource (struct bus_node *bus, u32 start_address, struct resour ...@@ -1540,17 +1540,17 @@ int ibmphp_find_resource (struct bus_node *bus, u32 start_address, struct resour
res_cur = res_cur->next; res_cur = res_cur->next;
} }
if (!res_cur) { if (!res_cur) {
debug ("SOS...cannot find %s resource in the bus. \n", type); debug ("SOS...cannot find %s resource in the bus.\n", type);
return -EINVAL; return -EINVAL;
} }
} else { } else {
debug ("SOS... cannot find %s resource in the bus. \n", type); debug ("SOS... cannot find %s resource in the bus.\n", type);
return -EINVAL; return -EINVAL;
} }
} }
if (*res) if (*res)
debug ("*res->start = %x \n", (*res)->start); debug ("*res->start = %x\n", (*res)->start);
return 0; return 0;
} }
...@@ -1708,7 +1708,7 @@ static int __init once_over (void) ...@@ -1708,7 +1708,7 @@ static int __init once_over (void)
mem = kmalloc (sizeof (struct resource_node), GFP_KERNEL); mem = kmalloc (sizeof (struct resource_node), GFP_KERNEL);
if (!mem) { if (!mem) {
err ("out of system memory \n"); err ("out of system memory\n");
return -ENOMEM; return -ENOMEM;
} }
memset (mem, 0, sizeof (struct resource_node)); memset (mem, 0, sizeof (struct resource_node));
...@@ -1792,7 +1792,7 @@ void ibmphp_print_test (void) ...@@ -1792,7 +1792,7 @@ void ibmphp_print_test (void)
list_for_each (tmp, &gbuses) { list_for_each (tmp, &gbuses) {
bus_cur = list_entry (tmp, struct bus_node, bus_list); bus_cur = list_entry (tmp, struct bus_node, bus_list);
debug_pci ("This is bus # %d. There are \n", bus_cur->busno); debug_pci ("This is bus # %d. There are\n", bus_cur->busno);
debug_pci ("IORanges = %d\t", bus_cur->noIORanges); debug_pci ("IORanges = %d\t", bus_cur->noIORanges);
debug_pci ("MemRanges = %d\t", bus_cur->noMemRanges); debug_pci ("MemRanges = %d\t", bus_cur->noMemRanges);
debug_pci ("PFMemRanges = %d\n", bus_cur->noPFMemRanges); debug_pci ("PFMemRanges = %d\n", bus_cur->noPFMemRanges);
...@@ -1903,7 +1903,7 @@ static int range_exists_already (struct range_node * range, struct bus_node * bu ...@@ -1903,7 +1903,7 @@ static int range_exists_already (struct range_node * range, struct bus_node * bu
range_cur = bus_cur->rangePFMem; range_cur = bus_cur->rangePFMem;
break; break;
default: default:
err ("wrong type passed to find out if range already exists \n"); err ("wrong type passed to find out if range already exists\n");
return -ENODEV; return -ENODEV;
} }
...@@ -1948,7 +1948,7 @@ static int __init update_bridge_ranges (struct bus_node **bus) ...@@ -1948,7 +1948,7 @@ static int __init update_bridge_ranges (struct bus_node **bus)
return -ENODEV; return -ENODEV;
ibmphp_pci_bus->number = bus_cur->busno; ibmphp_pci_bus->number = bus_cur->busno;
debug ("inside %s \n", __FUNCTION__); debug ("inside %s\n", __FUNCTION__);
debug ("bus_cur->busno = %x\n", bus_cur->busno); debug ("bus_cur->busno = %x\n", bus_cur->busno);
for (device = 0; device < 32; device++) { for (device = 0; device < 32; device++) {
...@@ -1997,7 +1997,7 @@ static int __init update_bridge_ranges (struct bus_node **bus) ...@@ -1997,7 +1997,7 @@ static int __init update_bridge_ranges (struct bus_node **bus)
if ((start_address) && (start_address <= end_address)) { if ((start_address) && (start_address <= end_address)) {
range = kmalloc (sizeof (struct range_node), GFP_KERNEL); range = kmalloc (sizeof (struct range_node), GFP_KERNEL);
if (!range) { if (!range) {
err ("out of system memory \n"); err ("out of system memory\n");
return -ENOMEM; return -ENOMEM;
} }
memset (range, 0, sizeof (struct range_node)); memset (range, 0, sizeof (struct range_node));
...@@ -2024,7 +2024,7 @@ static int __init update_bridge_ranges (struct bus_node **bus) ...@@ -2024,7 +2024,7 @@ static int __init update_bridge_ranges (struct bus_node **bus)
io = kmalloc (sizeof (struct resource_node), GFP_KERNEL); io = kmalloc (sizeof (struct resource_node), GFP_KERNEL);
if (!io) { if (!io) {
kfree (range); kfree (range);
err ("out of system memory \n"); err ("out of system memory\n");
return -ENOMEM; return -ENOMEM;
} }
memset (io, 0, sizeof (struct resource_node)); memset (io, 0, sizeof (struct resource_node));
...@@ -2048,7 +2048,7 @@ static int __init update_bridge_ranges (struct bus_node **bus) ...@@ -2048,7 +2048,7 @@ static int __init update_bridge_ranges (struct bus_node **bus)
range = kmalloc (sizeof (struct range_node), GFP_KERNEL); range = kmalloc (sizeof (struct range_node), GFP_KERNEL);
if (!range) { if (!range) {
err ("out of system memory \n"); err ("out of system memory\n");
return -ENOMEM; return -ENOMEM;
} }
memset (range, 0, sizeof (struct range_node)); memset (range, 0, sizeof (struct range_node));
...@@ -2076,7 +2076,7 @@ static int __init update_bridge_ranges (struct bus_node **bus) ...@@ -2076,7 +2076,7 @@ static int __init update_bridge_ranges (struct bus_node **bus)
mem = kmalloc (sizeof (struct resource_node), GFP_KERNEL); mem = kmalloc (sizeof (struct resource_node), GFP_KERNEL);
if (!mem) { if (!mem) {
kfree (range); kfree (range);
err ("out of system memory \n"); err ("out of system memory\n");
return -ENOMEM; return -ENOMEM;
} }
memset (mem, 0, sizeof (struct resource_node)); memset (mem, 0, sizeof (struct resource_node));
...@@ -2104,7 +2104,7 @@ static int __init update_bridge_ranges (struct bus_node **bus) ...@@ -2104,7 +2104,7 @@ static int __init update_bridge_ranges (struct bus_node **bus)
range = kmalloc (sizeof (struct range_node), GFP_KERNEL); range = kmalloc (sizeof (struct range_node), GFP_KERNEL);
if (!range) { if (!range) {
err ("out of system memory \n"); err ("out of system memory\n");
return -ENOMEM; return -ENOMEM;
} }
memset (range, 0, sizeof (struct range_node)); memset (range, 0, sizeof (struct range_node));
...@@ -2131,7 +2131,7 @@ static int __init update_bridge_ranges (struct bus_node **bus) ...@@ -2131,7 +2131,7 @@ static int __init update_bridge_ranges (struct bus_node **bus)
pfmem = kmalloc (sizeof (struct resource_node), GFP_KERNEL); pfmem = kmalloc (sizeof (struct resource_node), GFP_KERNEL);
if (!pfmem) { if (!pfmem) {
kfree (range); kfree (range);
err ("out of system memory \n"); err ("out of system memory\n");
return -ENOMEM; return -ENOMEM;
} }
memset (pfmem, 0, sizeof (struct resource_node)); memset (pfmem, 0, sizeof (struct resource_node));
......
...@@ -19,9 +19,8 @@ ...@@ -19,9 +19,8 @@
#include <asm/io_apic.h> #include <asm/io_apic.h>
#include <mach_apic.h> #include <mach_apic.h>
#include <linux/pci_msi.h> #include "msi.h"
_DEFINE_DBG_BUFFER
static spinlock_t msi_lock = SPIN_LOCK_UNLOCKED; static spinlock_t msi_lock = SPIN_LOCK_UNLOCKED;
static struct msi_desc* msi_desc[NR_IRQS] = { [0 ... NR_IRQS-1] = NULL }; static struct msi_desc* msi_desc[NR_IRQS] = { [0 ... NR_IRQS-1] = NULL };
......
/* /*
* ../include/linux/pci_msi.h * msi.h
* *
*/ */
#ifndef _ASM_PCI_MSI_H #ifndef MSI_H
#define _ASM_PCI_MSI_H #define MSI_H
#include <linux/pci.h>
#define MSI_AUTO -1 #define MSI_AUTO -1
#define NR_REPEATS 23 #define NR_REPEATS 23
...@@ -82,29 +80,6 @@ extern void restore_ioapic_irq_handler(int irq); ...@@ -82,29 +80,6 @@ extern void restore_ioapic_irq_handler(int irq);
#define msix_mask(address) (address | PCI_MSIX_FLAGS_BITMASK) #define msix_mask(address) (address | PCI_MSIX_FLAGS_BITMASK)
#define msix_is_pending(address) (address & PCI_MSIX_FLAGS_PENDMASK) #define msix_is_pending(address) (address & PCI_MSIX_FLAGS_PENDMASK)
extern char __dbg_str_buf[256];
#define _DEFINE_DBG_BUFFER char __dbg_str_buf[256];
#define _DBG_K_TRACE_ENTRY ((unsigned int)0x00000001)
#define _DBG_K_TRACE_EXIT ((unsigned int)0x00000002)
#define _DBG_K_INFO ((unsigned int)0x00000004)
#define _DBG_K_ERROR ((unsigned int)0x00000008)
#define _DBG_K_TRACE (_DBG_K_TRACE_ENTRY | _DBG_K_TRACE_EXIT)
#define _DEBUG_LEVEL (_DBG_K_INFO | _DBG_K_ERROR | _DBG_K_TRACE)
#define _DBG_PRINT( dbg_flags, args... ) \
if ( _DEBUG_LEVEL & (dbg_flags) ) \
{ \
int len; \
len = sprintf(__dbg_str_buf, "%s:%d: %s ", \
__FILE__, __LINE__, __FUNCTION__ ); \
sprintf(__dbg_str_buf + len, args); \
printk(KERN_INFO "%s\n", __dbg_str_buf); \
}
#define MSI_FUNCTION_TRACE_ENTER \
_DBG_PRINT (_DBG_K_TRACE_ENTRY, "%s", "[Entry]");
#define MSI_FUNCTION_TRACE_EXIT \
_DBG_PRINT (_DBG_K_TRACE_EXIT, "%s", "[Entry]");
/* /*
* MSI Defined Data Structures * MSI Defined Data Structures
...@@ -190,4 +165,4 @@ struct msi_desc { ...@@ -190,4 +165,4 @@ struct msi_desc {
struct pci_dev *dev; struct pci_dev *dev;
}; };
#endif /* _ASM_PCI_MSI_H */ #endif /* MSI_H */
...@@ -241,7 +241,7 @@ pci_device_probe_static(struct pci_driver *drv, struct pci_dev *pci_dev) ...@@ -241,7 +241,7 @@ pci_device_probe_static(struct pci_driver *drv, struct pci_dev *pci_dev)
error = drv->probe(pci_dev, id); error = drv->probe(pci_dev, id);
if (error >= 0) { if (error >= 0) {
pci_dev->driver = drv; pci_dev->driver = drv;
return 0; error = 0;
} }
return error; return error;
} }
......
...@@ -5871,6 +5871,11 @@ ...@@ -5871,6 +5871,11 @@
14f1 2004 Dynalink 56PMi 14f1 2004 Dynalink 56PMi
8234 RS8234 ATM SAR Controller [ServiceSAR Plus] 8234 RS8234 ATM SAR Controller [ServiceSAR Plus]
14f2 MOBILITY Electronics 14f2 MOBILITY Electronics
0120 EV1000 bridge
0121 EV1000 Parallel port
0122 EV1000 Serial port
0123 EV1000 Keyboard controller
0124 EV1000 Mouse controller
14f3 BROADLOGIC 14f3 BROADLOGIC
14f4 TOKYO Electronic Industry CO Ltd 14f4 TOKYO Electronic Industry CO Ltd
14f5 SOPAC Ltd 14f5 SOPAC Ltd
...@@ -6667,6 +6672,9 @@ ...@@ -6667,6 +6672,9 @@
1040 536EP Data Fax Modem 1040 536EP Data Fax Modem
16be 1040 V.9X DSP Data Fax Modem 16be 1040 V.9X DSP Data Fax Modem
1043 PRO/Wireless LAN 2100 3B Mini PCI Adapter 1043 PRO/Wireless LAN 2100 3B Mini PCI Adapter
1048 82597EX 10GbE Ethernet Controller
8086 a01f PRO/10GbE LR Server Adapter
8086 a11f PRO/10GbE LR Server Adapter
1059 82551QM Ethernet Controller 1059 82551QM Ethernet Controller
1130 82815 815 Chipset Host Bridge and Memory Controller Hub 1130 82815 815 Chipset Host Bridge and Memory Controller Hub
1025 1016 Travelmate 612 TX 1025 1016 Travelmate 612 TX
......
...@@ -456,8 +456,6 @@ static int pci_setup_device(struct pci_dev * dev) ...@@ -456,8 +456,6 @@ static int pci_setup_device(struct pci_dev * dev)
sprintf(pci_name(dev), "%04x:%02x:%02x.%d", pci_domain_nr(dev->bus), sprintf(pci_name(dev), "%04x:%02x:%02x.%d", pci_domain_nr(dev->bus),
dev->bus->number, PCI_SLOT(dev->devfn), PCI_FUNC(dev->devfn)); dev->bus->number, PCI_SLOT(dev->devfn), PCI_FUNC(dev->devfn));
INIT_LIST_HEAD(&dev->pools);
pci_read_config_dword(dev, PCI_CLASS_REVISION, &class); pci_read_config_dword(dev, PCI_CLASS_REVISION, &class);
class >>= 8; /* upper 3 bytes */ class >>= 8; /* upper 3 bytes */
dev->class = class; dev->class = class;
......
...@@ -83,7 +83,7 @@ void pci_remove_bus_device(struct pci_dev *dev) ...@@ -83,7 +83,7 @@ void pci_remove_bus_device(struct pci_dev *dev)
list_del(&b->node); list_del(&b->node);
spin_unlock(&pci_bus_lock); spin_unlock(&pci_bus_lock);
kfree(b); class_device_unregister(&b->class_dev);
dev->subordinate = NULL; dev->subordinate = NULL;
} }
......
...@@ -43,20 +43,12 @@ ...@@ -43,20 +43,12 @@
#define FL_BASE4 0x0004 #define FL_BASE4 0x0004
#define FL_GET_BASE(x) (x & FL_BASE_MASK) #define FL_GET_BASE(x) (x & FL_BASE_MASK)
#define FL_IRQ_MASK (0x0007 << 4)
#define FL_IRQBASE0 (0x0000 << 4)
#define FL_IRQBASE1 (0x0001 << 4)
#define FL_IRQBASE2 (0x0002 << 4)
#define FL_IRQBASE3 (0x0003 << 4)
#define FL_IRQBASE4 (0x0004 << 4)
#define FL_GET_IRQBASE(x) ((x & FL_IRQ_MASK) >> 4)
/* Use successive BARs (PCI base address registers), /* Use successive BARs (PCI base address registers),
else use offset into some specified BAR */ else use offset into some specified BAR */
#define FL_BASE_BARS 0x0008 #define FL_BASE_BARS 0x0008
/* Use the irq resource table instead of dev->irq */ /* do not assign an irq */
#define FL_IRQRESOURCE 0x0080 #define FL_NOIRQ 0x0080
/* Use the Base address register size to cap number of ports */ /* Use the Base address register size to cap number of ports */
#define FL_REGION_SZ_CAP 0x0100 #define FL_REGION_SZ_CAP 0x0100
...@@ -850,17 +842,10 @@ static struct pci_serial_quirk *find_quirk(struct pci_dev *dev) ...@@ -850,17 +842,10 @@ static struct pci_serial_quirk *find_quirk(struct pci_dev *dev)
static _INLINE_ int static _INLINE_ int
get_pci_irq(struct pci_dev *dev, struct pci_board *board, int idx) get_pci_irq(struct pci_dev *dev, struct pci_board *board, int idx)
{ {
int base_idx; if (board->flags & FL_NOIRQ)
if ((board->flags & FL_IRQRESOURCE) == 0)
return dev->irq;
base_idx = FL_GET_IRQBASE(board->flags);
if (base_idx > DEVICE_COUNT_IRQ)
return 0; return 0;
else
return dev->irq_resource[base_idx].start; return dev->irq;
} }
/* /*
...@@ -1314,7 +1299,7 @@ static struct pci_board pci_boards[] __devinitdata = { ...@@ -1314,7 +1299,7 @@ static struct pci_board pci_boards[] __devinitdata = {
.first_offset = 0x10000, .first_offset = 0x10000,
}, },
[pbn_sgi_ioc3] = { [pbn_sgi_ioc3] = {
.flags = FL_BASE0|FL_IRQRESOURCE, .flags = FL_BASE0|FL_NOIRQ,
.num_ports = 1, .num_ports = 1,
.base_baud = 458333, .base_baud = 458333,
.uart_offset = 8, .uart_offset = 8,
......
...@@ -285,6 +285,7 @@ struct device { ...@@ -285,6 +285,7 @@ struct device {
detached from its driver. */ detached from its driver. */
u64 *dma_mask; /* dma mask (if dma'able device) */ u64 *dma_mask; /* dma mask (if dma'able device) */
struct list_head dma_pools; /* dma pools (if dma'ble) */
void (*release)(struct device * dev); void (*release)(struct device * dev);
}; };
......
/*
* include/linux/dmapool.h
*
* Allocation pools for DMAable (coherent) memory.
*
* This file is licensed under the terms of the GNU General Public
* License version 2. This program is licensed "as is" without any
* warranty of any kind, whether express or implied.
*/
#ifndef LINUX_DMAPOOL_H
#define LINUX_DMAPOOL_H
#include <asm/io.h>
#include <asm/scatterlist.h>
struct dma_pool *dma_pool_create(const char *name, struct device *dev,
size_t size, size_t align, size_t allocation);
void dma_pool_destroy(struct dma_pool *pool);
void *dma_pool_alloc(struct dma_pool *pool, int mem_flags, dma_addr_t *handle);
void dma_pool_free(struct dma_pool *pool, void *vaddr, dma_addr_t addr);
#endif
...@@ -393,7 +393,6 @@ struct pci_dev { ...@@ -393,7 +393,6 @@ struct pci_dev {
0xffffffff. You only need to change 0xffffffff. You only need to change
this if your device has broken DMA this if your device has broken DMA
or supports 64-bit transfers. */ or supports 64-bit transfers. */
struct list_head pools; /* pci_pools tied to this device */
u64 consistent_dma_mask;/* Like dma_mask, but for u64 consistent_dma_mask;/* Like dma_mask, but for
pci_alloc_consistent mappings as pci_alloc_consistent mappings as
...@@ -416,8 +415,6 @@ struct pci_dev { ...@@ -416,8 +415,6 @@ struct pci_dev {
*/ */
unsigned int irq; unsigned int irq;
struct resource resource[DEVICE_COUNT_RESOURCE]; /* I/O and memory regions + expansion ROMs */ struct resource resource[DEVICE_COUNT_RESOURCE]; /* I/O and memory regions + expansion ROMs */
struct resource dma_resource[DEVICE_COUNT_DMA];
struct resource irq_resource[DEVICE_COUNT_IRQ];
char * slot_name; /* pointer to dev.bus_id */ char * slot_name; /* pointer to dev.bus_id */
...@@ -694,12 +691,15 @@ const struct pci_device_id *pci_match_device(const struct pci_device_id *ids, co ...@@ -694,12 +691,15 @@ const struct pci_device_id *pci_match_device(const struct pci_device_id *ids, co
int pci_scan_bridge(struct pci_bus *bus, struct pci_dev * dev, int max, int pass); int pci_scan_bridge(struct pci_bus *bus, struct pci_dev * dev, int max, int pass);
/* kmem_cache style wrapper around pci_alloc_consistent() */ /* kmem_cache style wrapper around pci_alloc_consistent() */
struct pci_pool *pci_pool_create (const char *name, struct pci_dev *dev,
size_t size, size_t align, size_t allocation);
void pci_pool_destroy (struct pci_pool *pool);
void *pci_pool_alloc (struct pci_pool *pool, int flags, dma_addr_t *handle); #include <linux/dmapool.h>
void pci_pool_free (struct pci_pool *pool, void *vaddr, dma_addr_t addr);
#define pci_pool dma_pool
#define pci_pool_create(name, pdev, size, align, allocation) \
dma_pool_create(name, &pdev->dev, size, align, allocation)
#define pci_pool_destroy(pool) dma_pool_destroy(pool)
#define pci_pool_alloc(pool, flags, handle) dma_pool_alloc(pool, flags, handle)
#define pci_pool_free(pool, vaddr, addr) dma_pool_free(pool, vaddr, addr)
#if defined(CONFIG_ISA) || defined(CONFIG_EISA) #if defined(CONFIG_ISA) || defined(CONFIG_EISA)
extern struct pci_dev *isa_bridge; extern struct pci_dev *isa_bridge;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment