Return to BSD News archive
Path: euryale.cc.adfa.oz.au!newshost.anu.edu.au!harbinger.cc.monash.edu.au!munnari.OZ.AU!spool.mu.edu!howland.reston.ans.net!swrinde!newsfeed.internetmci.com!news.mathworks.com!nntp.primenet.com!uunet!inXS.uu.net!news.iij.ad.jp!tyo2.gate.nec!newssv1.ho.nec!newsserv.cl.nec!sbl.cl.nec!newsmasters@sbl.cl.nec.co.jp
From: nao@sbl.cl.nec.co.jp (Naoki Hamada)
Newsgroups: comp.unix.bsd.freebsd.misc
Subject: Re: problem with 3c590
Date: 17 Jul 1996 11:35:07 +0900
Organization: NEC Corporation
Lines: 64
Sender: nao@sirius.sbl.cl.nec.co.jp
Distribution: world
Message-ID: <uphgr71uas.fsf@sirius.sbl.cl.nec.co.jp>
References: <4rf9u3$7vp@news.uit.no> <4rl1vb$u3@anorak.coverform.lan>
<4rt0bd$4fl@uriah.heep.sax.de> <4s0hqt$a6@anorak.coverform.lan>
<4s4n0a$721@phobos.Candle.Com>
NNTP-Posting-Host: sirius.sbl.cl.nec.co.jp
In-reply-to: mevans@candle.com's message of Fri, 12 Jul 96 00:13:50
X-Newsreader: Gnus v5.0.15
Mike wrote:
>An alternative fix
>might be to check free FIFO space again, after requesting the transmit
>available interrupt, but I haven't bothered pursuing this.
OK, I tried it. I have no 3C590, so I am not sure if it really works.
J"org wrote:
>When it's hanging, it doesn't unwedge itself. Re-ifconfig'ing is the
>only way out.
Because the watchdog always sleeps. I woke it up :-)
-nao
--- if_vx.c.1.10 Wed Jul 17 09:14:25 1996
+++ if_vx.c Wed Jul 17 10:39:52 1996
@@ -512,9 +512,12 @@
if (inw(BASE + VX_W1_FREE_TX) < len + pad + 4) {
/* no room in FIFO */
outw(BASE + VX_COMMAND, SET_TX_AVAIL_THRESH | (len + pad + 4));
- sc->arpcom.ac_if.if_flags |= IFF_OACTIVE;
- splx(s);
- return;
+ /* confirmation */
+ if (inw(BASE + VX_W1_FREE_TX) < len + pad + 4) {
+ sc->arpcom.ac_if.if_flags |= IFF_OACTIVE;
+ splx(s);
+ return;
+ }
}
IF_DEQUEUE(&sc->arpcom.ac_if.if_snd, m);
@@ -558,6 +561,7 @@
}
#endif
+ sc->arpcom.ac_if.if_timer=2;
sc->arpcom.ac_if.if_opackets++;
m_freem(top);
/*
@@ -613,12 +617,14 @@
}
if (status & S_TX_AVAIL) {
/* we need ACK */
+ sc->arpcom.ac_if.if_timer=0;
sc->arpcom.ac_if.if_flags &= ~IFF_OACTIVE;
GO_WINDOW(1);
inw(BASE + VX_W1_FREE_TX);
vxstart(&sc->arpcom.ac_if);
}
if (status & S_CARD_FAILURE) {
+ sc->arpcom.ac_if.if_timer=0;
#ifdef VX_LOCAL_STATS
printf("\nvx%d:\n\tStatus: %x\n", unit, status);
GO_WINDOW(4);
@@ -637,6 +643,7 @@
return;
}
if (status & S_TX_COMPLETE) {
+ sc->arpcom.ac_if.if_timer=0;
/* we need ACK. we do it at the end */
/*
* We need to read TX_STATUS until we get a 0 status in order to