Rune Klausen wrote:
>
> Jeg har FreeBSD 4.3
>
Så burde følgende virke, det har det i hvert fald gjort for mig i sin
tid. Det er lidt vanskeligt, men jeg skal forsøge at forklare det så
enkelt som muligt.
Punkt 1:
Lav backup af de nuværende drivere, if_vr.c og if_vrreg.h, der ligger i
biblioteket "/sys/pci".
Punkt 2:
Hent version 1.17 af if_vr.c fra CVS og placer den i "/sys/pci". Så vidt
jeg husker blev filens linieskift ændret, hvis man benyttede wget, så
brug evt. fetch:
# fetch
http://www.freebsd.org/cgi/cvsweb.cgi/src/sys/pci/if_vr.c?rev=1.17
Dernæst skal du hente version 1.6 af if_vrreg.h, v.h.a.:
# fetch
http://www.freebsd.org/cgi/cvsweb.cgi/src/sys/pci/if_vrreg.h?rev=1.6
Sørg for at begge filer hedder henholdsvis if_vr.c og if_vrreg.h, og
befinder sig i "/sys/pci".
Punkt 3:
Gem den vedlagte diff-fil i "/sys/pci", og udfør følgende kommando i biblioteket:
# patch <vrfix.diff
Punkt 4:
Nu er du klar til at bygge en ny kerne, som gerne skulle kører noget
bedre med vr-driveren. I mit tilfælde løste det problemet helt.
Jeg går udfra at du ved hvordan man bygger en kerne, da du i følge et
andet indlæg benytter ipfw :)
--
Med venlig hilsen
Michael Rasmussen
--------------- vrfix.diff - starter herunder ---------------
--- if_vr.c Fri Sep 17 13:25:30 1999
+++ if_vr.c.patched Sun Feb 11 19:02:19 2001
@@ -59,8 +59,6 @@
* transmission.
*/
-#include "bpf.h"
-
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/sockio.h>
@@ -75,9 +73,7 @@
#include <net/if_dl.h>
#include <net/if_media.h>
-#if NBPF > 0
#include <net/bpf.h>
-#endif
#include "opt_bdg.h"
#ifdef BRIDGE
@@ -116,6 +112,8 @@
"VIA VT3043 Rhine I 10/100BaseTX" },
{ VIA_VENDORID, VIA_DEVICEID_RHINE_II,
"VIA VT86C100A Rhine II 10/100BaseTX" },
+ { VIA_VENDORID, VIA_DEVICEID_RHINE_II_2,
+ "VIA VT6102 Rhine II 10/100BaseTX" },
{ DELTA_VENDORID, DELTA_DEVICEID_RHINE_II,
"Delta Electronics Rhine II 10/100BaseTX" },
{ ADDTRON_VENDORID, ADDTRON_DEVICEID_RHINE_II,
@@ -1163,12 +1161,7 @@
/*
* Call MI attach routines.
*/
- if_attach(ifp);
- ether_ifattach(ifp);
-
-#if NBPF > 0
- bpfattach(ifp, DLT_EN10MB, sizeof(struct ether_header));
-#endif
+ ether_ifattach(ifp, ETHER_BPF_SUPPORTED);
fail:
splx(s);
@@ -1188,7 +1181,7 @@
ifp = &sc->arpcom.ac_if;
vr_stop(sc);
- if_detach(ifp);
+ ether_ifdetach(ifp, ETHER_BPF_SUPPORTED);
bus_teardown_intr(dev, sc->vr_irq, sc->vr_intrhand);
bus_release_resource(dev, SYS_RES_IRQ, 0, sc->vr_irq);
@@ -1634,14 +1627,14 @@
MGETHDR(m_new, M_DONTWAIT, MT_DATA);
if (m_new == NULL) {
- printf("vr%d: no memory for tx list", sc->vr_unit);
+ printf("vr%d: no memory for tx list\n", sc->vr_unit);
return(1);
}
if (m_head->m_pkthdr.len > MHLEN) {
MCLGET(m_new, M_DONTWAIT);
if (!(m_new->m_flags & M_EXT)) {
m_freem(m_new);
- printf("vr%d: no memory for tx list",
+ printf("vr%d: no memory for tx list\n",
sc->vr_unit);
return(1);
}
@@ -1717,7 +1710,12 @@
sc->vr_cdata.vr_tx_free = cur_tx->vr_nextdesc;
/* Pack the data into the descriptor. */
- vr_encap(sc, cur_tx, m_head);
+ if(vr_encap(sc, cur_tx, m_head)) {
+ IF_PREPEND(&ifp->if_snd, m_head);
+ ifp->if_flags |= IFF_OACTIVE;
+ cur_tx = NULL;
+ break;
+ }
if (cur_tx != start_tx)
VR_TXOWN(cur_tx) = VR_TXSTAT_OWN;
--- if_vrreg.h Fri Aug 27 19:50:59 1999
+++ if_vrreg.h.patched Sun Feb 11 19:00:20 2001
@@ -450,6 +450,7 @@
*/
#define VIA_DEVICEID_RHINE 0x3043
#define VIA_DEVICEID_RHINE_II 0x6100
+#define VIA_DEVICEID_RHINE_II_2 0x3065
/*
* Delta Electronics device ID.