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