Subject: fix to i4b_avm_fritz_pci.c From: Gary Jennejohn Date: Mon, 31 May 1999 23:09:26 +0200 Thanks to Joachim Kuebart and Udo Schweigert a nasty bug has been fixed in the Fritz!Card PCI driver. The bug fixed seems to only affect sPPP use since I never observed it using IPR. With this fix you can use sPPP with tcp_extensions="YES" in the appropriate config file ! I've tested this with sPPP and haven't observed any problems. In fact, it works considerably better. And IPR works just as well as it did before. This patch also includes a fix from Udo which I believe he posted to the list sometime in the last 2 weeks. The patch is relative to the source in FreeBSD-current. I believe that's the same as the 0.81 beta. ============================ Patch =========================== *** i4b_avm_fritz_pci.c.ctm Sun May 30 22:57:10 1999 --- i4b_avm_fritz_pci.c Sun May 30 23:16:53 1999 *************** *** 390,419 **** } /* tell the board to use the ISAC fifo */ outb(sc->sc_port + ADDR_REG_OFFSET, ISAC_FIFO); ! outsb(sc->sc_port + ISAC_REG_OFFSET, (u_char *)buf, len); } static void hscx_write_fifo(int chan, const void *buf, size_t len, struct isic_softc *sc) { ! register u_int *ip; register size_t cnt; isic_Bchan_t *Bchan = &sc->sc_chan[chan]; sc->avma1pp_cmd &= ~HSCX_CMD_XME; sc->avma1pp_txl = 0; ! if (len != sc->sc_bfifolen) { if (Bchan->bprot != BPROT_NONE) sc->avma1pp_cmd |= HSCX_CMD_XME; - sc->avma1pp_txl = len; } ! cnt = 0; /* borrow cnt */ AVMA1PPSETCMDLONG(cnt); hscx_write_reg(chan, HSCX_STAT, cnt, sc); ! ip = (u_int *)buf; cnt = 0; while (cnt < len) { --- 390,420 ---- } /* tell the board to use the ISAC fifo */ outb(sc->sc_port + ADDR_REG_OFFSET, ISAC_FIFO); ! outsb(sc->sc_port + ISAC_REG_OFFSET, (const u_char *)buf, len); } static void hscx_write_fifo(int chan, const void *buf, size_t len, struct isic_softc *sc) { ! register const u_int *ip; register size_t cnt; isic_Bchan_t *Bchan = &sc->sc_chan[chan]; sc->avma1pp_cmd &= ~HSCX_CMD_XME; sc->avma1pp_txl = 0; ! if (Bchan->out_mbuf_cur == NULL) { if (Bchan->bprot != BPROT_NONE) sc->avma1pp_cmd |= HSCX_CMD_XME; } ! if (len != sc->sc_bfifolen) ! sc->avma1pp_txl = len; ! cnt = 0; /* borrow cnt */ AVMA1PPSETCMDLONG(cnt); hscx_write_reg(chan, HSCX_STAT, cnt, sc); ! ip = (const u_int *)buf; cnt = 0; while (cnt < len) { *************** *** 450,461 **** sc->avma1pp_cmd &= ~HSCX_CMD_XME; sc->avma1pp_txl = 0; ! if (len != sc->sc_bfifolen) { if (Bchan->bprot != BPROT_NONE) sc->avma1pp_cmd |= HSCX_CMD_XME; - sc->avma1pp_txl = len; } cnt = 0; /* borrow cnt */ AVMA1PPSETCMDLONG(cnt); --- 451,463 ---- sc->avma1pp_cmd &= ~HSCX_CMD_XME; sc->avma1pp_txl = 0; ! if (Bchan->out_mbuf_cur == NULL) { if (Bchan->bprot != BPROT_NONE) sc->avma1pp_cmd |= HSCX_CMD_XME; } + if (len != sc->sc_bfifolen) + sc->avma1pp_txl = len; cnt = 0; /* borrow cnt */ AVMA1PPSETCMDLONG(cnt); *************** *** 492,498 **** hscx_write_reg(0, offset, v, sc); return; } ! if (((int)base & IS_HSCX_MASK) == HSCX0FAKE) { hscx_write_reg(1, offset, v, sc); return; --- 494,500 ---- hscx_write_reg(0, offset, v, sc); return; } ! if (((int)base & IS_HSCX_MASK) == HSCX1FAKE) { hscx_write_reg(1, offset, v, sc); return; -------- Gary Jennejohn Home - garyj@muc.de Work - garyj@fkr.dec.com