kern/77982: lnc0 can NOT be detected in vmware 4.5.2 while using PXE to load FreebSD 4.x

Paul mirnshi at 163.com
Wed Feb 23 14:50:25 GMT 2005


>Number:         77982
>Category:       kern
>Synopsis:       lnc0 can NOT be detected in vmware 4.5.2 while using PXE to load FreebSD 4.x
>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 Feb 23 14:50:23 GMT 2005
>Closed-Date:
>Last-Modified:
>Originator:     Paul
>Release:        4.10 4.11
>Organization:
>Environment:
FreeBSD bsd 4.11-RELEASE FreeBSD 4.11-RELEASE #0: Wed Feb 16 20:41:07 CST 2005     root at bsd:/GENERIC  i386
>Description:
The driver can NOT work in vmware 4.5.2(79C970A) while using PXE.
The lnc0 can not be detected. It is same as
http://lists.freebsd.org/pipermail/freebsd-stable/2004-October/008971.html

It should be reset but NOT, see patch.
>How-To-Repeat:
pxe boot in vmware
>Fix:
--- i386/isa/if_lnc.c.orig   Wed Feb 13 08:43:10 2002
+++ i386/isa/if_lnc.c   Wed Feb 23 17:15:41 2005
@@ -114,6 +114,7 @@
   int rap;
   int rdp;
   int bdp;
+   int reset;
#ifdef DEBUG
   int lnc_debug;
#endif
@@ -1120,13 +1121,20 @@
{
   u_long chip_id;
   int type;
-
-   /*
+   int reset_val;
+   
+   /*
    * The PCnet family don't reset the RAP register on reset so we'll
    * have to write during the probe :-) It does have an ID register
    * though so the probe is just a matter of reading it.
+    *
+    * THAT can NOT work in vmware 4.5.2(79C970A) while using PXE.
+    * The lnc0 can not be detected, but lnc1 or/and lnc2 fine.
+    * So it's better to reset first.
+    *                                       -- Paul Meng
    */
-
+   reset_val = inw(sc->reset);
+   outw(reset_val, sc->reset);
   if ((type = lance_probe(sc))) {
      chip_id = read_csr(sc, CSR89);
      chip_id <<= 16;
@@ -1293,6 +1301,7 @@
      sc->rap = iobase + PCNET_RAP;
      sc->rdp = iobase + PCNET_RDP;
      sc->bdp = iobase + PCNET_BDP;
+      sc->reset = iobase + PCNET_RESET;

      sc->nic.ic = pcnet_probe(sc);
      if (sc->nic.ic >= PCnet_32) { 
>Release-Note:
>Audit-Trail:
>Unformatted:


More information about the freebsd-bugs mailing list