kern/116295: nfe driver hangs on boot (MSI K9N SLI Platinum)

Mark Derbyshire mark at taom.com
Tue Sep 11 18:30:02 PDT 2007


>Number:         116295
>Category:       kern
>Synopsis:       nfe driver hangs on boot (MSI K9N SLI Platinum)
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Wed Sep 12 01:30:02 GMT 2007
>Closed-Date:
>Last-Modified:
>Originator:     Mark Derbyshire
>Release:        7-CURRENT/6.2-RELEASE backport
>Organization:
>Environment:
FreeBSD freebsd.taom.com 6.2-RELEASE FreeBSD 6.2-RELEASE #10: Tue Sep 11 17:00:01 MDT 2007     root at freebsd.taom.com:/usr/obj/usr/src/sys/TAOM  amd64
>Description:
Driver hangs in an apparent interrupt loop on boot in nfe_int_task with the MSI K9N SLI Platinum motherboard. It seems to work fine on other MCPxx-based boards I tried. If nfe0 is not plugged to a live switch, the boot will succeed. However when nfe0 is plugged into a GbE, full-duplex switch it hangs every time. It does not matter whether nfe1 is plugged in for either of these cases. Revision 1.14 of if_nfe.c does not have this problem. Revision 1.17 appears to have introduced the bug.
>How-To-Repeat:
Plug nfe0 from a MSI K9N SLI Platinum motherboard into a GbE switch and boot the system. 
>Fix:
--- if_nfe.c.orig       2007-07-23 19:11:00.000000000 -0600
+++ if_nfe.c    2007-09-11 19:24:58.000000000 -0600
@@ -1930,18 +1930,18 @@
        }
 #endif
 
-       if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) {
-               NFE_UNLOCK(sc);
-               nfe_enable_intr(sc);
-               return;
-       }
-
        if (r & NFE_IRQ_LINK) {
                NFE_READ(sc, NFE_PHY_STATUS);
                NFE_WRITE(sc, NFE_PHY_STATUS, 0xf);
                DPRINTF(sc, "link state changed\n");
        }
 
+       if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) {
+               NFE_UNLOCK(sc);
+               nfe_enable_intr(sc);
+               return;
+       }
+
        domore = 0;
        /* check Rx ring */
        if (sc->nfe_framesize > MCLBYTES - ETHER_HDR_LEN)


>Release-Note:
>Audit-Trail:
>Unformatted:


More information about the freebsd-bugs mailing list