[PATCH] powerpc: pci_address_to_pio fix
This fixes pci_address_to_pio() to return an unsigned long (to be safe) and fixes a bug in the implementation that caused it to return a bogus IO port number Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> Signed-off-by: Paul Mackerras <paulus@samba.org>
This commit is contained in:
committed by
Paul Mackerras
parent
a04c8780fd
commit
f2c4583a38
@@ -1365,16 +1365,17 @@ struct pci_controller* pci_find_hose_for_OF_device(struct device_node* node)
|
|||||||
|
|
||||||
#endif /* CONFIG_PPC_MULTIPLATFORM */
|
#endif /* CONFIG_PPC_MULTIPLATFORM */
|
||||||
|
|
||||||
unsigned int pci_address_to_pio(phys_addr_t address)
|
unsigned long pci_address_to_pio(phys_addr_t address)
|
||||||
{
|
{
|
||||||
struct pci_controller *hose, *tmp;
|
struct pci_controller *hose, *tmp;
|
||||||
|
|
||||||
list_for_each_entry_safe(hose, tmp, &hose_list, list_node) {
|
list_for_each_entry_safe(hose, tmp, &hose_list, list_node) {
|
||||||
if (address >= hose->io_base_phys &&
|
if (address >= hose->io_base_phys &&
|
||||||
address < (hose->io_base_phys + hose->pci_io_size))
|
address < (hose->io_base_phys + hose->pci_io_size)) {
|
||||||
return (unsigned int)
|
unsigned long base =
|
||||||
((unsigned long)hose->io_base_virt +
|
(unsigned long)hose->io_base_virt - pci_io_base;
|
||||||
(address - hose->io_base_phys));
|
return base + (address - hose->io_base_phys);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return (unsigned int)-1;
|
return (unsigned int)-1;
|
||||||
}
|
}
|
||||||
|
@@ -503,9 +503,9 @@ static int __of_address_to_resource(struct device_node *dev, u32 *addrp,
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
memset(r, 0, sizeof(struct resource));
|
memset(r, 0, sizeof(struct resource));
|
||||||
if (flags & IORESOURCE_IO) {
|
if (flags & IORESOURCE_IO) {
|
||||||
unsigned int port;
|
unsigned long port;
|
||||||
port = pci_address_to_pio(taddr);
|
port = pci_address_to_pio(taddr);
|
||||||
if (port == (unsigned int)-1)
|
if (port == (unsigned long)-1)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
r->start = port;
|
r->start = port;
|
||||||
r->end = port + size - 1;
|
r->end = port + size - 1;
|
||||||
|
@@ -1811,7 +1811,7 @@ void pci_iounmap(struct pci_dev *dev, void __iomem *addr)
|
|||||||
EXPORT_SYMBOL(pci_iomap);
|
EXPORT_SYMBOL(pci_iomap);
|
||||||
EXPORT_SYMBOL(pci_iounmap);
|
EXPORT_SYMBOL(pci_iounmap);
|
||||||
|
|
||||||
unsigned int pci_address_to_pio(phys_addr_t address)
|
unsigned long pci_address_to_pio(phys_addr_t address)
|
||||||
{
|
{
|
||||||
struct pci_controller* hose = hose_head;
|
struct pci_controller* hose = hose_head;
|
||||||
|
|
||||||
@@ -1819,9 +1819,11 @@ unsigned int pci_address_to_pio(phys_addr_t address)
|
|||||||
unsigned int size = hose->io_resource.end -
|
unsigned int size = hose->io_resource.end -
|
||||||
hose->io_resource.start + 1;
|
hose->io_resource.start + 1;
|
||||||
if (address >= hose->io_base_phys &&
|
if (address >= hose->io_base_phys &&
|
||||||
address < (hose->io_base_phys + size))
|
address < (hose->io_base_phys + size)) {
|
||||||
return (unsigned int)hose->io_base_virt +
|
unsigned long base =
|
||||||
(address - hose->io_base_phys);
|
(unsigned long)hose->io_base_virt - _IO_BASE;
|
||||||
|
return base + (address - hose->io_base_phys);
|
||||||
|
|
||||||
}
|
}
|
||||||
return (unsigned int)-1;
|
return (unsigned int)-1;
|
||||||
}
|
}
|
||||||
|
@@ -158,11 +158,11 @@ pcibios_alloc_controller(struct device_node *dev);
|
|||||||
extern void pcibios_free_controller(struct pci_controller *phb);
|
extern void pcibios_free_controller(struct pci_controller *phb);
|
||||||
|
|
||||||
#ifdef CONFIG_PCI
|
#ifdef CONFIG_PCI
|
||||||
extern unsigned int pci_address_to_pio(phys_addr_t address);
|
extern unsigned long pci_address_to_pio(phys_addr_t address);
|
||||||
#else
|
#else
|
||||||
static inline unsigned int pci_address_to_pio(phys_addr_t address)
|
static inline unsigned long pci_address_to_pio(phys_addr_t address)
|
||||||
{
|
{
|
||||||
return (unsigned int)-1;
|
return (unsigned long)-1;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@@ -138,11 +138,11 @@ static inline unsigned char bridge_swizzle(unsigned char pin,
|
|||||||
extern int pciauto_bus_scan(struct pci_controller *, int);
|
extern int pciauto_bus_scan(struct pci_controller *, int);
|
||||||
|
|
||||||
#ifdef CONFIG_PCI
|
#ifdef CONFIG_PCI
|
||||||
extern unsigned int pci_address_to_pio(phys_addr_t address);
|
extern unsigned long pci_address_to_pio(phys_addr_t address);
|
||||||
#else
|
#else
|
||||||
static inline unsigned int pci_address_to_pio(phys_addr_t address)
|
static inline unsigned long pci_address_to_pio(phys_addr_t address)
|
||||||
{
|
{
|
||||||
return (unsigned int)-1;
|
return (unsigned long)-1;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user