diff options
author | Stephen Rothwell <sfr@canb.auug.org.au> | 2007-12-07 01:52:45 +1100 |
---|---|---|
committer | Paul Mackerras <paulus@samba.org> | 2007-12-11 13:42:23 +1100 |
commit | 0d416f2a9eb31823f824ac067be7771fd93bffa3 (patch) | |
tree | fcc77273849f177c041477d7fb93c2da446b6053 | |
parent | 3f1786328a1c5f6240d96ca6359246c4bded7ec3 (diff) |
[POWERPC] iSeries: Consoldiate PCI IO error check
Signed-off-by: Stephen Rothwell <sfr@canb.auug.org.au>
Signed-off-by: Paul Mackerras <paulus@samba.org>
-rw-r--r-- | arch/powerpc/platforms/iseries/pci.c | 105 |
1 files changed, 26 insertions, 79 deletions
diff --git a/arch/powerpc/platforms/iseries/pci.c b/arch/powerpc/platforms/iseries/pci.c index 8e2ac3d0c81a..105b23d33608 100644 --- a/arch/powerpc/platforms/iseries/pci.c +++ b/arch/powerpc/platforms/iseries/pci.c @@ -342,7 +342,7 @@ static int check_return_code(char *type, struct device_node *dn, */ static inline struct device_node *xlate_iomm_address( const volatile void __iomem *addr, - u64 *dsaptr, u64 *bar_offset) + u64 *dsaptr, u64 *bar_offset, const char *func) { unsigned long orig_addr; unsigned long base_addr; @@ -350,8 +350,20 @@ static inline struct device_node *xlate_iomm_address( struct device_node *dn; orig_addr = (unsigned long __force)addr; - if ((orig_addr < BASE_IO_MEMORY) || (orig_addr >= max_io_memory)) + if ((orig_addr < BASE_IO_MEMORY) || (orig_addr >= max_io_memory)) { + static unsigned long last_jiffies; + static int num_printed; + + if ((jiffies - last_jiffies) > 60 * HZ) { + last_jiffies = jiffies; + num_printed = 0; + } + if (num_printed++ < 10) + printk(KERN_ERR + "iSeries_%s: invalid access at IO address %p\n", + func, addr); return NULL; + } base_addr = orig_addr - BASE_IO_MEMORY; ind = base_addr / IOMM_TABLE_ENTRY_SIZE; dn = iomm_table[ind]; @@ -377,21 +389,10 @@ static u8 iSeries_read_byte(const volatile void __iomem *addr) int retry = 0; struct HvCallPci_LoadReturn ret; struct device_node *dn = - xlate_iomm_address(addr, &dsa, &bar_offset); - - if (dn == NULL) { - static unsigned long last_jiffies; - static int num_printed; + xlate_iomm_address(addr, &dsa, &bar_offset, "read_byte"); - if ((jiffies - last_jiffies) > 60 * HZ) { - last_jiffies = jiffies; - num_printed = 0; - } - if (num_printed++ < 10) - printk(KERN_ERR "iSeries_read_byte: invalid access at IO address %p\n", - addr); + if (dn == NULL) return 0xff; - } do { HvCall3Ret16(HvCallPciBarLoad8, &ret, dsa, bar_offset, 0); } while (check_return_code("RDB", dn, &retry, ret.rc) != 0); @@ -406,21 +407,10 @@ static u16 iSeries_read_word(const volatile void __iomem *addr) int retry = 0; struct HvCallPci_LoadReturn ret; struct device_node *dn = - xlate_iomm_address(addr, &dsa, &bar_offset); - - if (dn == NULL) { - static unsigned long last_jiffies; - static int num_printed; + xlate_iomm_address(addr, &dsa, &bar_offset, "read_word"); - if ((jiffies - last_jiffies) > 60 * HZ) { - last_jiffies = jiffies; - num_printed = 0; - } - if (num_printed++ < 10) - printk(KERN_ERR "iSeries_read_word: invalid access at IO address %p\n", - addr); + if (dn == NULL) return 0xffff; - } do { HvCall3Ret16(HvCallPciBarLoad16, &ret, dsa, bar_offset, 0); @@ -436,21 +426,10 @@ static u32 iSeries_read_long(const volatile void __iomem *addr) int retry = 0; struct HvCallPci_LoadReturn ret; struct device_node *dn = - xlate_iomm_address(addr, &dsa, &bar_offset); - - if (dn == NULL) { - static unsigned long last_jiffies; - static int num_printed; + xlate_iomm_address(addr, &dsa, &bar_offset, "read_long"); - if ((jiffies - last_jiffies) > 60 * HZ) { - last_jiffies = jiffies; - num_printed = 0; - } - if (num_printed++ < 10) - printk(KERN_ERR "iSeries_read_long: invalid access at IO address %p\n", - addr); + if (dn == NULL) return 0xffffffff; - } do { HvCall3Ret16(HvCallPciBarLoad32, &ret, dsa, bar_offset, 0); @@ -470,20 +449,10 @@ static void iSeries_write_byte(u8 data, volatile void __iomem *addr) int retry = 0; u64 rc; struct device_node *dn = - xlate_iomm_address(addr, &dsa, &bar_offset); + xlate_iomm_address(addr, &dsa, &bar_offset, "write_byte"); - if (dn == NULL) { - static unsigned long last_jiffies; - static int num_printed; - - if ((jiffies - last_jiffies) > 60 * HZ) { - last_jiffies = jiffies; - num_printed = 0; - } - if (num_printed++ < 10) - printk(KERN_ERR "iSeries_write_byte: invalid access at IO address %p\n", addr); + if (dn == NULL) return; - } do { rc = HvCall4(HvCallPciBarStore8, dsa, bar_offset, data, 0); } while (check_return_code("WWB", dn, &retry, rc) != 0); @@ -496,21 +465,10 @@ static void iSeries_write_word(u16 data, volatile void __iomem *addr) int retry = 0; u64 rc; struct device_node *dn = - xlate_iomm_address(addr, &dsa, &bar_offset); - - if (dn == NULL) { - static unsigned long last_jiffies; - static int num_printed; + xlate_iomm_address(addr, &dsa, &bar_offset, "write_word"); - if ((jiffies - last_jiffies) > 60 * HZ) { - last_jiffies = jiffies; - num_printed = 0; - } - if (num_printed++ < 10) - printk(KERN_ERR "iSeries_write_word: invalid access at IO address %p\n", - addr); + if (dn == NULL) return; - } do { rc = HvCall4(HvCallPciBarStore16, dsa, bar_offset, data, 0); } while (check_return_code("WWW", dn, &retry, rc) != 0); @@ -523,21 +481,10 @@ static void iSeries_write_long(u32 data, volatile void __iomem *addr) int retry = 0; u64 rc; struct device_node *dn = - xlate_iomm_address(addr, &dsa, &bar_offset); + xlate_iomm_address(addr, &dsa, &bar_offset, "write_long"); - if (dn == NULL) { - static unsigned long last_jiffies; - static int num_printed; - - if ((jiffies - last_jiffies) > 60 * HZ) { - last_jiffies = jiffies; - num_printed = 0; - } - if (num_printed++ < 10) - printk(KERN_ERR "iSeries_write_long: invalid access at IO address %p\n", - addr); + if (dn == NULL) return; - } do { rc = HvCall4(HvCallPciBarStore32, dsa, bar_offset, data, 0); } while (check_return_code("WWL", dn, &retry, rc) != 0); |