Re: ISDN Problem with Linux 2.2.13

Karsten Keil (kkeil@suse.de)
Sat, 18 Dec 1999 13:29:45 +0100


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/