Subject: kern/28955: wm(4) broken on IQ31244 since if_wm.c revision 1.53
To: None <kern-bug-people@netbsd.org, gnats-admin@netbsd.org,>
From: Richard Earnshaw <rearnsha@buzzard.freeserve.co.uk>
List: netbsd-bugs
Date: 01/13/2005 22:33:00
>Number:         28955
>Category:       kern
>Synopsis:       wm(4) broken on IQ31244 since if_wm.c revision 1.53
>Confidential:   no
>Severity:       critical
>Priority:       high
>Responsible:    kern-bug-people
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Thu Jan 13 22:33:00 +0000 2005
>Originator:     Richard Earnshaw
>Release:        NetBSD 2.0
>Organization:
	ARM
>Environment:
	
	
System: NetBSD goshawk.buzzard.freeserve.co.uk 2.0 NetBSD 2.0 (IQ31244) #35: Thu Jan 13 22:12:18 GMT 2005 rearnsha@merlin.buzzard.freeserve.co.uk:/work/rearnsha/netbsd/build/evbarm/src/sys/arch/evbarm/compile/IQ31244 evbarm
Architecture: arm
Machine: evbarm
>Description:
	Revision 1.53 if if_wm.c introduced a reset of the if_wm device using
	an IO map handle.  Since this time the IQ31244 port seems to have been
	completely unable to communicate over the wm device (the chip seems to
	be incompletely reset).  Symptoms are that packets are being received
	but are complete garbage (in fact, it seems like the buffers fetched
	from the chip are for other packets sent long before, a remote host
	constantly pinging the machine sees packets returned after about 180
	seconds at a ping rate of 1/sec.
	
>How-To-Repeat:
	Try to run an IQ31244 board as a diskless machine.
	
>Fix:
	

	The following patch is a work-around, but it does show where the
	problem lies:


Index: if_wm.c
===================================================================
RCS file: /cvsroot/src/sys/dev/pci/if_wm.c,v
retrieving revision 1.68.2.5
diff -p -p -r1.68.2.5 if_wm.c
*** if_wm.c     8 Jan 2005 08:59:16 -0000       1.68.2.5
--- if_wm.c     13 Jan 2005 22:28:42 -0000
*************** wm_attach(struct device *parent, struct 
*** 793,798 ****
--- 793,800 ----
                            sc->sc_dev.dv_xname);
        }
  
+       sc->sc_flags &= ~WM_F_IOH_VALID;
+ 
        /* Enable bus mastering.  Disable MWI on the i82542 2.0. */
        preg = pci_conf_read(pc, pa->pa_tag, PCI_COMMAND_STATUS_REG);
        preg |= PCI_COMMAND_MASTER_ENABLE;

>Unformatted: