Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 30 Apr 2010 17:08:28 +0000 (UTC)
From:      Bernhard Schmidt <bschmidt@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org
Subject:   svn commit: r207440 - stable/8/sys/dev/ipw
Message-ID:  <201004301708.o3UH8STt027406@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: bschmidt
Date: Fri Apr 30 17:08:27 2010
New Revision: 207440
URL: http://svn.freebsd.org/changeset/base/207440

Log:
  MFC r206763-206767:
  
  r206763:
  Fix comment about ipw_assoc and remove some whitespaces; no functional
  changes.
  
  r206764:
  Pass correct RSSI to ieee80211_input*().
  
  r206765:
  - Make ipw usable again by moving directly into ASSOC state.
  - No need to manually switch to RUN state, assoc response takes care
    of that.
  
  r206766:
  Use iv_appie_wpa, with this commit WPA works again.
  
  r206767:
  Remove IPW_LOCK_DECL and fix various LORs.
  
  Approved by:	rpaulo (mentor)

Modified:
  stable/8/sys/dev/ipw/if_ipw.c
  stable/8/sys/dev/ipw/if_ipwvar.h
Directory Properties:
  stable/8/sys/   (props changed)
  stable/8/sys/amd64/include/xen/   (props changed)
  stable/8/sys/cddl/contrib/opensolaris/   (props changed)
  stable/8/sys/contrib/dev/acpica/   (props changed)
  stable/8/sys/contrib/pf/   (props changed)
  stable/8/sys/dev/xen/xenpci/   (props changed)
  stable/8/sys/geom/sched/   (props changed)

Modified: stable/8/sys/dev/ipw/if_ipw.c
==============================================================================
--- stable/8/sys/dev/ipw/if_ipw.c	Fri Apr 30 16:29:05 2010	(r207439)
+++ stable/8/sys/dev/ipw/if_ipw.c	Fri Apr 30 17:08:27 2010	(r207440)
@@ -888,10 +888,10 @@ ipw_newstate(struct ieee80211vap *vap, e
 			/*
 			 * XXX when joining an ibss network we are called
 			 * with a SCAN -> RUN transition on scan complete.
-			 * Use that to call ipw_auth_and_assoc.  On completing
-			 * the join we are then called again with an
-			 * AUTH -> RUN transition and we want to do nothing.
-			 * This is all totally bogus and needs to be redone.
+			 * Use that to call ipw_assoc.  On completing the
+			 * join we are then called again with an AUTH -> RUN
+			 * transition and we want to do nothing.  This is
+			 * all totally bogus and needs to be redone.
 			 */
 			if (ostate == IEEE80211_S_SCAN)
 				ipw_assoc(ic, vap);
@@ -904,12 +904,19 @@ ipw_newstate(struct ieee80211vap *vap, e
 		break;
 
 	case IEEE80211_S_AUTH:
+		/*
+		 * Move to ASSOC state after the ipw_assoc() call.  Firmware
+		 * takes care of authentication, after the call we'll receive
+		 * only an assoc response which would otherwise be discared
+		 * if we are still in AUTH state.
+		 */
+		nstate = IEEE80211_S_ASSOC;
 		ipw_assoc(ic, vap);
 		break;
 
 	case IEEE80211_S_ASSOC:
 		/*
-		 * If we are not transitioning from AUTH the resend the
+		 * If we are not transitioning from AUTH then resend the
 		 * association request.
 		 */
 		if (ostate != IEEE80211_S_AUTH)
@@ -1021,7 +1028,6 @@ ipw_rx_newstate_intr(struct ipw_softc *s
 		}
 		sc->flags &= ~IPW_FLAG_ASSOCIATING;
 		sc->flags |= IPW_FLAG_ASSOCIATED;
-		ieee80211_new_state(vap, IEEE80211_S_RUN, -1);
 		break;
 
 	case IPW_STATE_SCANNING:
@@ -1034,8 +1040,10 @@ ipw_rx_newstate_intr(struct ipw_softc *s
 		 * we checked the 802.11 layer state.
 		 */
 		if (sc->flags & IPW_FLAG_ASSOCIATED) {
+			IPW_UNLOCK(sc);
 			/* XXX probably need to issue disassoc to fw */
 			ieee80211_beacon_miss(ic);
+			IPW_LOCK(sc);
 		}
 		break;
 
@@ -1054,7 +1062,9 @@ ipw_rx_newstate_intr(struct ipw_softc *s
 			break;
 		}
 		if (sc->flags & IPW_FLAG_SCANNING) {
+			IPW_UNLOCK(sc);
 			ieee80211_scan_done(vap);
+			IPW_LOCK(sc);
 			sc->flags &= ~IPW_FLAG_SCANNING;
 			sc->sc_scan_timer = 0;
 		}
@@ -1064,13 +1074,16 @@ ipw_rx_newstate_intr(struct ipw_softc *s
 		DPRINTFN(2, ("Association lost (%s flags 0x%x)\n",
 			IEEESTATE(vap), sc->flags));
 		sc->flags &= ~(IPW_FLAG_ASSOCIATING | IPW_FLAG_ASSOCIATED);
-		if (vap->iv_state == IEEE80211_S_RUN)
+		if (vap->iv_state == IEEE80211_S_RUN) {
+			IPW_UNLOCK(sc);
 			ieee80211_new_state(vap, IEEE80211_S_SCAN, -1);
+			IPW_LOCK(sc);
+		}
 		break;
 
 	case IPW_STATE_DISABLED:
 		/* XXX? is this right? */
-		sc->flags &= ~(IPW_FLAG_HACK | IPW_FLAG_SCANNING | 
+		sc->flags &= ~(IPW_FLAG_HACK | IPW_FLAG_SCANNING |
 		    IPW_FLAG_ASSOCIATING | IPW_FLAG_ASSOCIATED);
 		DPRINTFN(2, ("Firmware disabled (%s flags 0x%x)\n",
 			IEEESTATE(vap), sc->flags));
@@ -1164,7 +1177,6 @@ ipw_rx_data_intr(struct ipw_softc *sc, s
 	bus_addr_t physaddr;
 	int error;
 	int8_t rssi, nf;
-	IPW_LOCK_DECL;
 
 	DPRINTFN(5, ("received frame len=%u, rssi=%u\n", le32toh(status->len),
 	    status->rssi));
@@ -1234,10 +1246,10 @@ ipw_rx_data_intr(struct ipw_softc *sc, s
 	IPW_UNLOCK(sc);
 	ni = ieee80211_find_rxnode(ic, mtod(m, struct ieee80211_frame_min *));
 	if (ni != NULL) {
-		(void) ieee80211_input(ni, m, rssi, nf);
+		(void) ieee80211_input(ni, m, rssi - nf, nf);
 		ieee80211_free_node(ni);
 	} else
-		(void) ieee80211_input_all(ic, m, rssi, nf);
+		(void) ieee80211_input_all(ic, m, rssi - nf, nf);
 	IPW_LOCK(sc);
 
 	bus_dmamap_sync(sc->rbd_dmat, sc->rbd_map, BUS_DMASYNC_PREWRITE);
@@ -1378,8 +1390,11 @@ ipw_fatal_error_intr(struct ipw_softc *s
 	struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
 
 	device_printf(sc->sc_dev, "firmware error\n");
-	if (vap != NULL)
+	if (vap != NULL) {
+		IPW_UNLOCK(sc);
 		ieee80211_cancel_scan(vap);
+		IPW_LOCK(sc);
+	}
 	ieee80211_runtask(ic, &sc->sc_init_task);
 }
 
@@ -1388,7 +1403,6 @@ ipw_intr(void *arg)
 {
 	struct ipw_softc *sc = arg;
 	uint32_t r;
-	IPW_LOCK_DECL;
 
 	IPW_LOCK(sc);
 
@@ -1718,7 +1732,6 @@ static void
 ipw_start(struct ifnet *ifp)
 {
 	struct ipw_softc *sc = ifp->if_softc;
-	IPW_LOCK_DECL;
 
 	IPW_LOCK(sc);
 	ipw_start_locked(ifp);
@@ -1775,7 +1788,9 @@ ipw_watchdog(void *arg)
 			DPRINTFN(3, ("Scan timeout\n"));
 			/* End the scan */
 			if (sc->flags & IPW_FLAG_SCANNING) {
+				IPW_UNLOCK(sc);
 				ieee80211_scan_done(TAILQ_FIRST(&ic->ic_vaps));
+				IPW_LOCK(sc);
 				sc->flags &= ~IPW_FLAG_SCANNING;
 			}
 		}
@@ -1791,7 +1806,6 @@ ipw_ioctl(struct ifnet *ifp, u_long cmd,
 	struct ieee80211com *ic = ifp->if_l2com;
 	struct ifreq *ifr = (struct ifreq *) data;
 	int error = 0, startall = 0;
-	IPW_LOCK_DECL;
 
 	switch (cmd) {
 	case SIOCSIFFLAGS:
@@ -2201,7 +2215,6 @@ ipw_assoc(struct ieee80211com *ic, struc
 	struct ipw_security security;
 	uint32_t data;
 	int error;
-	IPW_LOCK_DECL;
 
 	IPW_LOCK(sc);
 	error = ipw_disable(sc);
@@ -2260,8 +2273,8 @@ ipw_assoc(struct ieee80211com *ic, struc
 	if (error != 0)
 		goto done;
 
-	if (vap->iv_appie_assocreq != NULL) {
-		struct ieee80211_appie *ie = vap->iv_appie_assocreq;
+	if (vap->iv_appie_wpa != NULL) {
+		struct ieee80211_appie *ie = vap->iv_appie_wpa;
 		error = ipw_setwpaie(sc, ie->ie_data, ie->ie_len);
 		if (error != 0)
 			goto done;
@@ -2291,7 +2304,6 @@ ipw_disassoc(struct ieee80211com *ic, st
 	struct ifnet *ifp = vap->iv_ic->ic_ifp;
 	struct ieee80211_node *ni = vap->iv_bss;
 	struct ipw_softc *sc = ifp->if_softc;
-	IPW_LOCK_DECL;
 
 	IPW_LOCK(sc);
 	DPRINTF(("Disassociate from %6D\n", ni->ni_bssid, ":"));
@@ -2327,7 +2339,6 @@ ipw_init(void *priv)
 	struct ipw_softc *sc = priv;
 	struct ifnet *ifp = sc->sc_ifp;
 	struct ieee80211com *ic = ifp->if_l2com;
-	IPW_LOCK_DECL;
 
 	IPW_LOCK(sc);
 	ipw_init_locked(sc);
@@ -2534,7 +2545,6 @@ static void
 ipw_stop(void *priv)
 {
 	struct ipw_softc *sc = priv;
-	IPW_LOCK_DECL;
 
 	IPW_LOCK(sc);
 	ipw_stop_locked(sc);
@@ -2661,7 +2671,6 @@ ipw_scan_start(struct ieee80211com *ic)
 {
 	struct ifnet *ifp = ic->ic_ifp;
 	struct ipw_softc *sc = ifp->if_softc;
-	IPW_LOCK_DECL;
 
 	IPW_LOCK(sc);
 	ipw_scan(sc);
@@ -2673,7 +2682,6 @@ ipw_set_channel(struct ieee80211com *ic)
 {
 	struct ifnet *ifp = ic->ic_ifp;
 	struct ipw_softc *sc = ifp->if_softc;
-	IPW_LOCK_DECL;
 
 	IPW_LOCK(sc);
 	if (ic->ic_opmode == IEEE80211_M_MONITOR) {
@@ -2701,7 +2709,6 @@ ipw_scan_end(struct ieee80211com *ic)
 {
 	struct ifnet *ifp = ic->ic_ifp;
 	struct ipw_softc *sc = ifp->if_softc;
-	IPW_LOCK_DECL;
 
 	IPW_LOCK(sc);
 	sc->flags &= ~IPW_FLAG_SCANNING;

Modified: stable/8/sys/dev/ipw/if_ipwvar.h
==============================================================================
--- stable/8/sys/dev/ipw/if_ipwvar.h	Fri Apr 30 16:29:05 2010	(r207439)
+++ stable/8/sys/dev/ipw/if_ipwvar.h	Fri Apr 30 17:08:27 2010	(r207440)
@@ -164,13 +164,6 @@ struct ipw_softc {
  * NB.: This models the only instance of async locking in ipw_init_locked
  *	and must be kept in sync.
  */
-#define	IPW_LOCK_DECL	int	__waslocked = 0
-#define IPW_LOCK(sc)	do {				\
-	if (!(__waslocked = mtx_owned(&(sc)->sc_mtx)))	\
-		mtx_lock(&sc->sc_mtx);			\
-} while (0)
-#define IPW_UNLOCK(sc)	do {				\
-	if (!__waslocked)				\
-		mtx_unlock(&sc->sc_mtx);		\
-} while (0)
+#define IPW_LOCK(sc)		mtx_lock(&sc->sc_mtx);
+#define IPW_UNLOCK(sc)		mtx_unlock(&sc->sc_mtx);
 #define IPW_LOCK_ASSERT(sc)	mtx_assert(&(sc)->sc_mtx, MA_OWNED)



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201004301708.o3UH8STt027406>