Messages in this thread Patch in this message | | | From | "Nicholas Waltham" <> | Subject | RE: ISDN Problem with Linux 2.2.13 | Date | Thu, 23 Dec 1999 21:13:34 -0500 |
| |
Hello Karsten, This is just to let you know how I got on. I applied the patch on Monday, and all seemed well for most of this week. However, this afternoon the ISDN link did freeze up again. The first time in four days. I think the problem is less than it was... What kind of a test could I do to help try and diagnose what could be the problem.
Best Regards, Nicholas Waltham
-----Original Message----- From: kkeil@suse.de [mailto:kkeil@suse.de] Sent: Saturday, December 18, 1999 7:30 AM To: Nicholas Waltham Cc: linux-kernel@vger.rutgers.edu 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/
| |