diff --git a/arch/x86_64/kernel/pci-calgary.c b/arch/x86_64/kernel/pci-calgary.c index b3296cc..3124265 100644 --- a/arch/x86_64/kernel/pci-calgary.c +++ b/arch/x86_64/kernel/pci-calgary.c @@ -732,6 +732,22 @@ static void calgary_watchdog(unsigned lo } } +#define CONFIG_REGISTER 0x108 +static void __init calgary_disable_sc_timeout(void __iomem *bbar) +{ + u64 val64; + void __iomem *target; + + target = calgary_reg(bbar, CONFIG_REGISTER); + val64 = be64_to_cpu(readq(target)); + /* sets PHB1 timeout to 0x1110, which is a 2s timeout */ + val64 &= 0xFFFFFF0FFFFFFFFF; + val64 |= 0x000000E000000000; + writeq(cpu_to_be64(val64), target); + readq(target); /* flush */ +} + + static void __init calgary_enable_translation(struct pci_dev *dev) { u32 val32; @@ -756,6 +772,9 @@ static void __init calgary_enable_transl writel(cpu_to_be32(val32), target); readl(target); /* flush */ + if (busnum == 1) + calgary_disable_sc_timeout(bbar); + init_timer(&tbl->watchdog_timer); tbl->watchdog_timer.function = &calgary_watchdog; tbl->watchdog_timer.data = (unsigned long)dev;