Module Name:    src
Committed By:   christos
Date:           Fri Jul  2 14:47:25 UTC 2010

Modified Files:
        src/sys/dev/pci: if_iwn.c if_iwnvar.h

Log Message:
- Fix the recursive iwn_init() call problem properly.
- Don't print the scan request while scanning all the time. Perhaps I will
  remove this completely.


To generate a diff of this commit:
cvs rdiff -u -r1.46 -r1.47 src/sys/dev/pci/if_iwn.c
cvs rdiff -u -r1.11 -r1.12 src/sys/dev/pci/if_iwnvar.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/pci/if_iwn.c
diff -u src/sys/dev/pci/if_iwn.c:1.46 src/sys/dev/pci/if_iwn.c:1.47
--- src/sys/dev/pci/if_iwn.c:1.46	Fri Jun 18 17:10:23 2010
+++ src/sys/dev/pci/if_iwn.c	Fri Jul  2 10:47:25 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_iwn.c,v 1.46 2010/06/18 21:10:23 christos Exp $	*/
+/*	$NetBSD: if_iwn.c,v 1.47 2010/07/02 14:47:25 christos Exp $	*/
 /*	$OpenBSD: if_iwn.c,v 1.96 2010/05/13 09:25:03 damien Exp $	*/
 
 /*-
@@ -22,7 +22,7 @@
  * adapters.
  */
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_iwn.c,v 1.46 2010/06/18 21:10:23 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_iwn.c,v 1.47 2010/07/02 14:47:25 christos Exp $");
 
 #define IWN_USE_RBUF	/* Use local storage for RX */
 #undef IWN_HWCRYPTO	/* XXX does not even compile yet */
@@ -416,6 +416,7 @@
 	sc->sc_pct = pa->pa_pc;
 	sc->sc_pcitag = pa->pa_tag;
 	sc->sc_dmat = pa->pa_dmat;
+	mutex_init(&sc->sc_mtx, MUTEX_DEFAULT, IPL_NONE);
 
 	callout_init(&sc->calib_to, 0);
 	callout_setfunc(&sc->calib_to, iwn_calib_timeout, sc);
@@ -1836,8 +1837,10 @@
 	case IEEE80211_S_SCAN:
 		/* XXX Do not abort a running scan. */
 		if (sc->sc_flags & IWN_FLAG_SCANNING) {
-			aprint_error_dev(sc->sc_dev,
-			    "scan request while scanning ignored\n");
+			if (ic->ic_state != nstate)
+				aprint_error_dev(sc->sc_dev, "scan request(%d) "
+				    "while scanning(%d) ignored\n", nstate,
+				    ic->ic_state);
 			break;
 		}
 
@@ -3161,22 +3164,6 @@
 	int s, error = 0;
 
 	s = splnet();
-	/*
-	 * Prevent processes from entering this function while another
-	 * process is tsleep'ing in it.
-	 */
-	if (sc->sc_flags & IWN_FLAG_BUSY) {
-		switch (cmd) {
-		case SIOCSIFADDR:
-			/* FALLTHROUGH */
-		case SIOCSIFFLAGS:
-			splx(s);
-			aprint_normal_dev(sc->sc_dev,
-			    "ioctl while busy cmd = 0x%lx\n", cmd);
-			return EBUSY;
-		}
-	}
-	sc->sc_flags |= IWN_FLAG_BUSY;
 
 	switch (cmd) {
 	case SIOCSIFADDR:
@@ -3224,7 +3211,6 @@
 		}
 	}
 
-	sc->sc_flags &= ~IWN_FLAG_BUSY;
 	splx(s);
 	return error;
 }
@@ -5856,6 +5842,9 @@
 	struct ieee80211com *ic = &sc->sc_ic;
 	int error;
 
+	mutex_spin_enter(&sc->sc_mtx);
+	if (sc->sc_flags & IWN_FLAG_HW_INITED)
+		return 0;
 	if ((error = iwn_hw_prepare(sc)) != 0) {
 		aprint_error_dev(sc->sc_dev,
 		    "hardware not ready\n");
@@ -5908,9 +5897,12 @@
 	else
 		ieee80211_new_state(ic, IEEE80211_S_RUN, -1);
 
+	sc->sc_flags |= IWN_FLAG_HW_INITED;
+	mutex_spin_exit(&sc->sc_mtx);
 	return 0;
 
-fail:	iwn_stop(ifp, 1);
+fail:	mutex_spin_exit(&sc->sc_mtx);
+	iwn_stop(ifp, 1);
 	return error;
 }
 
@@ -5920,6 +5912,8 @@
 	struct iwn_softc *sc = ifp->if_softc;
 	struct ieee80211com *ic = &sc->sc_ic;
 
+	mutex_spin_enter(&sc->sc_mtx);
+	sc->sc_flags &= ~IWN_FLAG_HW_INITED;
 	ifp->if_timer = sc->sc_tx_timer = 0;
 	ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
 
@@ -5933,6 +5927,7 @@
 	sc->sc_sensor.value_cur = 0;
 	sc->sc_sensor.state = ENVSYS_SINVALID;
 #endif
+	mutex_spin_exit(&sc->sc_mtx);
 }
 
 /*

Index: src/sys/dev/pci/if_iwnvar.h
diff -u src/sys/dev/pci/if_iwnvar.h:1.11 src/sys/dev/pci/if_iwnvar.h:1.12
--- src/sys/dev/pci/if_iwnvar.h:1.11	Fri Jun 18 17:10:23 2010
+++ src/sys/dev/pci/if_iwnvar.h	Fri Jul  2 10:47:25 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_iwnvar.h,v 1.11 2010/06/18 21:10:23 christos Exp $	*/
+/*	$NetBSD: if_iwnvar.h,v 1.12 2010/07/02 14:47:25 christos Exp $	*/
 /*	$OpenBSD: if_iwnvar.h,v 1.19 2010/05/05 19:47:43 damien Exp $	*/
 
 /*-
@@ -226,9 +226,9 @@
 #define IWN_FLAG_CALIB_DONE	(1 << 2)
 #define IWN_FLAG_USE_ICT	(1 << 3)
 #define IWN_FLAG_INTERNAL_PA	(1 << 4)
-#define IWN_FLAG_BUSY		(1 << 5)
 /* Added for NetBSD */
 #define IWN_FLAG_SCANNING	(1 << 8)
+#define IWN_FLAG_HW_INITED	(1 << 9)
 
 	uint8_t 		hw_type;
 	const struct iwn_hal	*sc_hal;
@@ -321,5 +321,8 @@
 	} sc_txtapu;
 #define sc_txtap	sc_txtapu.th
 	int			sc_txtap_len;
+
+	kmutex_t		sc_mtx;         /* mutex for init/stop */
+
 };
 

Reply via email to