Messages in this thread Patch in this message | ![/](/images/icornerl.gif) | | Date | Sat, 18 Dec 1999 13:29:45 +0100 | From | Karsten Keil <> | Subject | Re: ISDN Problem with Linux 2.2.13 |
| |
On Fri, Dec 17, 1999 at 03:09:41PM -0500, Nicholas Waltham wrote: > Hello All, > I am using Linux 2.2.13 on a Compaq Proliant 800 with a Fritz PCI ISDN > Card. I am using Diald to control the link, and ibod to bring up the > second channel when I need 128k instead of just 64k. I am using ipppd > synchronous ppp. I notice that sometimes when the second channel is > swicthed off the ISDN blocks and no traffic flows. Diald seems also > unable to take down the link as well. The only way to set it to work > again is to take down the ISDN subsystem completely and then restart it. > Has anyone else seen this yet? Is it a known problem? It seems to be > slightly more of a problem when the kernel is compiled for UP than for > SMP. >
Yes this was found few days ago, I am preparing a new patch for 2.2.14 and 2.3....
Here the relevant part for this problem.
--- /tmp/avm_pci.c.3066 Thu Dec 2 14:20:11 1999 +++ /usr/src/linux/drivers/isdn/hisax/avm_pci.c Thu Dec 2 14:19:19 1999 @@ -269,18 +269,26 @@ int hdlc = bcs->channel; if (cs->debug & L1_DEB_HSCX) - debugl1(cs, "hdlc %c mode %d ichan %d", - 'A' + hdlc, mode, bc); - bcs->mode = mode; - bcs->channel = bc; + debugl1(cs, "hdlc %c mode %d --> %d ichan %d --> %d", + 'A' + hdlc, bcs->mode, mode, hdlc, bc); bcs->hw.hdlc.ctrl.ctrl = 0; switch (mode) { + case (-1): /* used for init */ + bcs->mode = 1; + bcs->channel = bc; + bc = 0; case (L1_MODE_NULL): + if (bcs->mode == L1_MODE_NULL) + return; bcs->hw.hdlc.ctrl.sr.cmd = HDLC_CMD_XRS | HDLC_CMD_RRS; bcs->hw.hdlc.ctrl.sr.mode = HDLC_MODE_TRANS; write_ctrl(bcs, 5); + bcs->mode = L1_MODE_NULL; + bcs->channel = bc; break; case (L1_MODE_TRANS): + bcs->mode = mode; + bcs->channel = bc; bcs->hw.hdlc.ctrl.sr.cmd = HDLC_CMD_XRS | HDLC_CMD_RRS; bcs->hw.hdlc.ctrl.sr.mode = HDLC_MODE_TRANS; write_ctrl(bcs, 5); @@ -290,6 +298,8 @@ hdlc_sched_event(bcs, B_XMTBUFREADY); break; case (L1_MODE_HDLC): + bcs->mode = mode; + bcs->channel = bc; bcs->hw.hdlc.ctrl.sr.cmd = HDLC_CMD_XRS | HDLC_CMD_RRS; bcs->hw.hdlc.ctrl.sr.mode = HDLC_MODE_ITF_FLG; write_ctrl(bcs, 5); @@ -695,8 +705,8 @@ cs->bcs[1].BC_SetStack = setstack_hdlc; cs->bcs[0].BC_Close = close_hdlcstate; cs->bcs[1].BC_Close = close_hdlcstate; - modehdlc(cs->bcs, 0, 0); - modehdlc(cs->bcs + 1, 0, 0); + modehdlc(cs->bcs, -1, 0); + modehdlc(cs->bcs + 1, -1, 1); } static void
Karsten Keil
- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.rutgers.edu Please read the FAQ at http://www.tux.org/lkml/
| ![\](/images/icornerr.gif) |