Subject: Re: kern/29903 (register data)
To: None <kern-bug-people@netbsd.org, gnats-admin@netbsd.org,>
From: Steve Woodford <scw@netbsd.org>
List: netbsd-bugs
Date: 04/25/2005 07:45:01
The following reply was made to PR kern/29903; it has been noted by GNATS.

From: Steve Woodford <scw@netbsd.org>
To: gnats-bugs@netbsd.org
Cc: kern-bug-people@netbsd.org, gnats-admin@netbsd.org,
	netbsd-bugs@netbsd.org
Subject: Re: kern/29903 (register data)
Date: Mon, 25 Apr 2005 08:44:41 +0100

 --Boundary-00=_p/JbCvR7Vx8V9K4
 Content-Type: text/plain;
   charset="iso-8859-1"
 Content-Transfer-Encoding: 7bit
 Content-Disposition: inline
 
 On Saturday 23 April 2005 11:18, Arto Selonen wrote:
 
 >  On Fri, 22 Apr 2005, Steve Woodford wrote:
 >  > 2) If the wm(4) card is sharing a PCI interrupt line with some
 >  > other device then wm_intr() will be called regardless.
 >
 >  Not sure if you're talking about something else, but just in case:
 >
 >  % dmesg | fgrep interrupt
 [snip no sign of interrupt sharing]
 
 I've come up with what should be a cleaner fix for this problem; one 
 which doesn't add extra code to critical paths.
 
 Please try the attached patch and let me know how it goes.
 
 Cheers, Steve
 
 --Boundary-00=_p/JbCvR7Vx8V9K4
 Content-Type: text/x-diff;
   charset="iso-8859-1";
   name="if_wm.c.patch2"
 Content-Transfer-Encoding: 7bit
 Content-Disposition: attachment;
 	filename="if_wm.c.patch2"
 
 Index: if_wm.c
 ===================================================================
 RCS file: /cvsroot/src/sys/dev/pci/if_wm.c,v
 retrieving revision 1.101
 diff -u -r1.101 if_wm.c
 --- if_wm.c	19 Mar 2005 11:58:03 -0000	1.101
 +++ if_wm.c	25 Apr 2005 07:42:02 -0000
 @@ -2840,6 +2840,15 @@
  	CSR_WRITE(sc, WMREG_TCTL, 0);
  	CSR_WRITE(sc, WMREG_RCTL, 0);
  
 +	/*
 +	 * Clear the interrupt mask to ensure the device cannot assert its
 +	 * interrupt line.
 +	 * Clear sc->sc_icr to ensure wm_intr() makes no attempt to service
 +	 * any currently pending or shared interrupt.
 +	 */
 +	CSR_WRITE(sc, WMREG_IMC, 0xffffffffU);
 +	sc->sc_icr = 0;
 +
  	/* Release any queued transmit buffers. */
  	for (i = 0; i < WM_TXQUEUELEN(sc); i++) {
  		txs = &sc->sc_txsoft[i];
 
 --Boundary-00=_p/JbCvR7Vx8V9K4--