From: Thomas Voegtle Thomas Voegtle wrote: [...] > <06>2007 May 30 14:21:40 cbs kern: Sedlbauer: PCI base adr 0xa800 > <03>2007 May 30 14:21:40 cbs kern: irq 11: nobody cared (try booting with the \"irqpoll\" option) [...] > <03>2007 May 30 14:21:40 cbs kern: handlers: > <03>2007 May 30 14:21:40 cbs kern: [] (usb_hcd_irq+0x0/0x4f) > <00>2007 May 30 14:21:40 cbs kern: Disabling IRQ #11 As described, the interrupt handler is registered too late, so early incoming interrupts lead to the original problem. The patch first disables the interrupts (byteout(..., 0)), then registers the irq, and finally enables the irqs again (byteout(..., 2) as was done at the first point before). Please note that the patch was developed without access to technical specifications; the /exact/ meaning of the constants being written to the registers are unknown. Signed-off-by: Bastian Friedrich Signed-off-by: Thomas Voegtle Cc: Karsten Keil Signed-off-by: Andrew Morton --- drivers/isdn/hisax/config.c | 2 ++ drivers/isdn/hisax/sedlbauer.c | 16 +++++++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff -puN drivers/isdn/hisax/config.c~sane-irq-initialization-in-sedlbauer-hisax drivers/isdn/hisax/config.c --- a/drivers/isdn/hisax/config.c~sane-irq-initialization-in-sedlbauer-hisax +++ a/drivers/isdn/hisax/config.c @@ -511,6 +511,7 @@ extern int setup_TeleInt(struct IsdnCard #if CARD_SEDLBAUER extern int setup_sedlbauer(struct IsdnCard *card); +extern void sedlbauer_enable_interrupts(struct IsdnCardState *cs); #endif #if CARD_SPORTSTER @@ -822,6 +823,7 @@ static int init_card(struct IsdnCardStat cs->irq); return 1; } + sedlbauer_enable_interrupts(cs); while (cnt) { cs->cardmsg(cs, CARD_INIT, NULL); /* Timeout 10ms */ diff -puN drivers/isdn/hisax/sedlbauer.c~sane-irq-initialization-in-sedlbauer-hisax drivers/isdn/hisax/sedlbauer.c --- a/drivers/isdn/hisax/sedlbauer.c~sane-irq-initialization-in-sedlbauer-hisax +++ a/drivers/isdn/hisax/sedlbauer.c @@ -529,6 +529,19 @@ static struct isapnp_device_id *ipid __d static struct pnp_card *pnp_c __devinitdata = NULL; #endif +int +sedlbauer_enable_interrupts(struct IsdnCardState *cs) +{ +#ifdef CONFIG_PCI + if ((cs->typ == ISDN_CTYPE_SEDLBAUER) || + (cs->typ == ISDN_CTYPE_SEDLBAUER_FAX)) { + byteout(cs->hw.sedl.cfg_reg+ 5, 0x02); + } +#endif + return 0; +} + + int __devinit setup_sedlbauer(struct IsdnCard *card) { @@ -667,7 +680,8 @@ setup_sedlbauer(struct IsdnCard *card) byteout(cs->hw.sedl.cfg_reg, 0xff); byteout(cs->hw.sedl.cfg_reg, 0x00); byteout(cs->hw.sedl.cfg_reg+ 2, 0xdd); - byteout(cs->hw.sedl.cfg_reg+ 5, 0x02); + byteout(cs->hw.sedl.cfg_reg+ 5, 0x00); + /* 0 seems to be "disable". Enable (-> 0x02) later! */ byteout(cs->hw.sedl.cfg_reg +3, cs->hw.sedl.reset_on); mdelay(2); byteout(cs->hw.sedl.cfg_reg +3, cs->hw.sedl.reset_off); _