From: Michael Buesch The backplane on the b44 chip seems to have a silicon bug in the IRQ routing. The ethernet core IRQ routing does not work with the routing bit returned from the backplaneflag register. This patch adds a workaround for the b44 chip to use a hardcoded constant. This constant was also used in the old b44 driver. Signed-off-by: Michael Buesch Tested-by: Maximilian Engelhardt Cc: Gary Zambrano Signed-off-by: Andrew Morton --- drivers/ssb/driver_pcicore.c | 12 +++++++++--- 1 files changed, 9 insertions(+), 3 deletions(-) diff -puN drivers/ssb/driver_pcicore.c~b44-ssb-fix-irq-routing-bits-on-the-backplane drivers/ssb/driver_pcicore.c --- a/drivers/ssb/driver_pcicore.c~b44-ssb-fix-irq-routing-bits-on-the-backplane +++ a/drivers/ssb/driver_pcicore.c @@ -496,9 +496,15 @@ int ssb_pcicore_dev_irqvecs_enable(struc u32 intvec; intvec = ssb_read32(pdev, SSB_INTVEC); - tmp = ssb_read32(dev, SSB_TPSFLAG); - tmp &= SSB_TPSFLAG_BPFLAG; - intvec |= tmp; + if ((bus->chip_id & 0xFF00) == 0x4400) { + /* Workaround: On the BCM44XX the BPFLAG routing + * bit is wrong. Use a hardcoded constant. */ + intvec |= 0x00000002; + } else { + tmp = ssb_read32(dev, SSB_TPSFLAG); + tmp &= SSB_TPSFLAG_BPFLAG; + intvec |= tmp; + } ssb_write32(pdev, SSB_INTVEC, intvec); } _