Subject: Re: kern/22493 (still there, me too, -current, critical?)
To: None <kern-bug-people@netbsd.org, gnats-admin@netbsd.org,>
From: Steve Woodford <scw@netbsd.org>
List: netbsd-bugs
Date: 02/04/2005 11:01:04
The following reply was made to PR kern/22493; 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/22493 (still there, me too, -current, critical?)
Date: Fri, 4 Feb 2005 11:00:41 +0000

 --Boundary-00=_ZX1ACsodAv1z3S+
 Content-Type: text/plain;
   charset="iso-8859-1"
 Content-Transfer-Encoding: 7bit
 Content-Disposition: inline
 
 On Friday 04 February 2005 10:09, Arto Selonen wrote:
 
 >  Just upgraded a -current to 2.99.15 with whatever sources anoncvs-us2
 >  mirror gave on 20050203. Observed a panic quite like in this PR.
 >  We have several NetBSD-current systems with wm(4) cards, and this is
 >  the first time this PR bites us.
 
 Can you try the attached patch and let me know the outcome?
 
 Cheers, Steve
 
 --Boundary-00=_ZX1ACsodAv1z3S+
 Content-Type: text/x-diff;
   charset="iso-8859-1";
   name="if_wm.c.patch"
 Content-Transfer-Encoding: 7bit
 Content-Disposition: attachment;
 	filename="if_wm.c.patch"
 
 Index: if_wm.c
 ===================================================================
 RCS file: /cvsroot/src/sys/dev/pci/if_wm.c,v
 retrieving revision 1.90
 diff -u -r1.90 if_wm.c
 --- if_wm.c	30 Jan 2005 17:33:48 -0000	1.90
 +++ if_wm.c	4 Feb 2005 10:32:34 -0000
 @@ -233,6 +233,7 @@
  	int sc_bus_speed;		/* PCI/PCIX bus speed */
  	int sc_pcix_offset;		/* PCIX capability register offset */
  	int sc_flowflags;		/* 802.3x flow control flags */
 +	int sc_disabled;		/* Interface is disabled */
  
  	void *sc_ih;			/* interrupt cookie */
  
 @@ -840,6 +841,7 @@
  	/*
  	 * Map and establish our interrupt.
  	 */
 +	sc->sc_disabled = 1;
  	if (pci_intr_map(pa, &ih)) {
  		aprint_error("%s: unable to map interrupt\n",
  		    sc->sc_dev.dv_xname);
 @@ -1954,6 +1956,8 @@
  #endif
  
  		handled = 1;
 +		if (sc->sc_disabled)
 +			break;
  
  #if defined(WM_DEBUG) || defined(WM_EVENT_COUNTERS)
  		if (icr & (ICR_RXDMT0|ICR_RXT0)) {
 @@ -1993,7 +1997,8 @@
  			wm_init(ifp);
  
  		/* Try to get more packets going. */
 -		wm_start(ifp);
 +		if (sc->sc_disabled == 0)
 +			wm_start(ifp);
  	}
  
  	return (handled);
 @@ -2588,6 +2593,7 @@
  				 * XXX buffers instead of just failing.
  				 */
  				wm_rxdrain(sc);
 +				sc->sc_disabled = 1;
  				goto out;
  			}
  		} else
 @@ -2727,6 +2733,7 @@
  	/* ...all done! */
  	ifp->if_flags |= IFF_RUNNING; 
  	ifp->if_flags &= ~IFF_OACTIVE;
 +	sc->sc_disabled = 0;
  
   out:
  	if (error)
 @@ -2794,8 +2801,10 @@
  		}
  	}
  
 -	if (disable)
 +	if (disable) {
  		wm_rxdrain(sc);
 +		sc->sc_disabled = 1;
 +	}
  
  	/* Mark the interface as down and cancel the watchdog timer. */
  	ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
 
 --Boundary-00=_ZX1ACsodAv1z3S+--