kern/120915: GENERIC does not boot: if_de is broken
Peter Much
pmc at citylink.dinoex.sub.org
Wed Feb 20 19:40:03 UTC 2008
>Number: 120915
>Category: kern
>Synopsis: GENERIC does not boot: if_de is broken
>Confidential: no
>Severity: serious
>Priority: high
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Wed Feb 20 19:40:02 UTC 2008
>Closed-Date:
>Last-Modified:
>Originator: Peter Much
>Release: FreeBSD 6.3-RELEASE-p1 i386
>Organization:
n/a
>Environment:
kernel: FreeBSD 6.3-RELEASE-p1
de0: <Digital 21040 Ethernet> port 0xa000-0xa07f mem
0xf4800000-0xf480007f at device 13.0 on pci0
de0: SMC 8432BT 21040 [10Mb/s] pass 2.3
>Description:
After upgrade from 5.5 to 6.3 kernel has pagefault on boot.
kernel.GENERIC has the same problem.
Location: tulip_txput+0x1eb
Backtrace (more or less, due to optimization):
device_attach
-> tulip_pci_attach
-> tulip_reset
-> tulip_media_select
-> tulip_txprobe
-> tulip_txput
compiling a kernel without if_de will help (depending on the
definition of "help"), but when loading if_de.ko the
pagefault is here again.
>How-To-Repeat:
Try to boot generic with the appropriate netif card.
>Fix:
The problem seems to be that during attach a mediaselect
is done, during mediaselect a testpacket is sent and during
packetsend the BPF is fed - but at that point of the attach
the BPF structure seems not yet available - which is nowhere
checked.
Patch (see below) helps for me, while I do not know if this
is now the way things should be done. And what I do not really
understand is how such a thing can go undetected for seemingly
two+ years, as it is practically a "can-not-work-by-design"
condition.
*** sys/pci/if_de.c.orig Wed Feb 20 18:37:57 2008
--- sys/pci/if_de.c Wed Feb 20 19:00:09 2008
***************
*** 4041,4047 ****
/*
* bounce a copy to the bpf listener, if any.
*/
! BPF_MTAP(sc->tulip_ifp, m);
/*
* The descriptors have been filled in. Now get ready
--- 4041,4048 ----
/*
* bounce a copy to the bpf listener, if any.
*/
! if(sc->tulip_ifp->if_bpf != NULL)
! BPF_MTAP(sc->tulip_ifp, m);
/*
* The descriptors have been filled in. Now get ready
***************
*** 4403,4408 ****
--- 4404,4410 ----
/* XXX: driver name/unit should be set some other way */
if_initname(ifp, "de", sc->tulip_unit);
+ ifp->if_bpf = NULL;
ifp->if_softc = sc;
ifp->if_flags = IFF_BROADCAST|IFF_SIMPLEX|IFF_MULTICAST;
ifp->if_ioctl = tulip_ifioctl;
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the freebsd-bugs
mailing list