diff options
Diffstat (limited to 'package/madwifi/patches/448-beacon_handling_fixes.patch')
| -rw-r--r-- | package/madwifi/patches/448-beacon_handling_fixes.patch | 407 | 
1 files changed, 0 insertions, 407 deletions
diff --git a/package/madwifi/patches/448-beacon_handling_fixes.patch b/package/madwifi/patches/448-beacon_handling_fixes.patch deleted file mode 100644 index 9c0f912e4..000000000 --- a/package/madwifi/patches/448-beacon_handling_fixes.patch +++ /dev/null @@ -1,407 +0,0 @@ ---- a/ath/if_ath.c -+++ b/ath/if_ath.c -@@ -160,7 +160,7 @@ static int ath_check_beacon_done(struct - static void ath_beacon_send(struct ath_softc *, int *, uint64_t hw_tsf); - static void ath_beacon_return(struct ath_softc *, struct ath_buf *); - static void ath_beacon_free(struct ath_softc *); --static void ath_beacon_config(struct ath_softc *, struct ieee80211vap *); -+static void ath_beacon_config(struct ath_softc *, struct ieee80211vap *, int); - static void ath_hw_beacon_stop(struct ath_softc *sc); - static int ath_desc_alloc(struct ath_softc *); - static void ath_desc_free(struct ath_softc *); -@@ -387,13 +387,11 @@ static void ath_set_timing(struct ath_so - /* calibrate every 30 secs in steady state but check every second at first. */ - static int ath_calinterval = ATH_SHORT_CALINTERVAL; - static int ath_xchanmode = AH_TRUE;		/* enable extended channels */ --static int ath_maxvaps = ATH_MAXVAPS_DEFAULT;   /* set default maximum vaps */ - static int bstuck_thresh = BSTUCK_THRESH;       /* Stuck beacon count required for reset */ - static char *autocreate = NULL; - static char *ratectl = DEF_RATE_CTL; - static int rfkill = 0; - static int tpc = 1; --static int maxvaps = -1; - static int xchanmode = -1; - #include "ath_wprobe.c" - static int beacon_cal = 1; -@@ -432,7 +430,6 @@ static struct notifier_block ath_event_b -  - #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,52)) - MODULE_PARM(beacon_cal, "i"); --MODULE_PARM(maxvaps, "i"); - MODULE_PARM(xchanmode, "i"); - MODULE_PARM(rfkill, "i"); - #ifdef ATH_CAP_TPC -@@ -444,7 +441,6 @@ MODULE_PARM(ratectl, "s"); - #else - #include <linux/moduleparam.h> - module_param(beacon_cal, int, 0600); --module_param(maxvaps, int, 0600); - module_param(xchanmode, int, 0600); - module_param(rfkill, int, 0600); - #ifdef ATH_CAP_TPC -@@ -454,7 +450,6 @@ module_param(bstuck_thresh, int, 0600); - module_param(autocreate, charp, 0600); - module_param(ratectl, charp, 0600); - #endif --MODULE_PARM_DESC(maxvaps, "Maximum VAPs"); - MODULE_PARM_DESC(xchanmode, "Enable/disable extended channel mode"); - MODULE_PARM_DESC(rfkill, "Enable/disable RFKILL capability"); - #ifdef ATH_CAP_TPC -@@ -512,7 +507,7 @@ MODULE_PARM_DESC(ieee80211_debug, "Load- -  * and use the higher bits as the index of the VAP. -  */ - #define ATH_SET_VAP_BSSID_MASK(bssid_mask)				\ --	((bssid_mask)[0] &= ~(((ath_maxvaps-1) << 2) | 0x02)) -+	((bssid_mask)[0] &= ~(((ATH_MAXVAPS_BCN-1) << 2) | 0x02)) - #define ATH_GET_VAP_ID(bssid)                   ((bssid)[0] >> 2) - #define ATH_SET_VAP_BSSID(bssid, id)					\ - 		do {							\ -@@ -604,8 +599,8 @@ ath_attach(u_int16_t devid, struct net_d -  - 	/* Allocate space for dynamically determined maximum VAP count */ - 	sc->sc_bslot =  --		kmalloc(ath_maxvaps * sizeof(struct ieee80211vap*), GFP_KERNEL); --	memset(sc->sc_bslot, 0, ath_maxvaps * sizeof(struct ieee80211vap*)); -+		kmalloc(ATH_MAXVAPS_BCN * sizeof(struct ieee80211vap*), GFP_KERNEL); -+	memset(sc->sc_bslot, 0, ATH_MAXVAPS_BCN * sizeof(struct ieee80211vap*)); -  - 	/* - 	 * Cache line size is used to size and align various -@@ -694,13 +689,6 @@ ath_attach(u_int16_t devid, struct net_d - 	for (i = 0; i < sc->sc_keymax; i++) - 		ath_hal_keyreset(ah, i); -  --	if (maxvaps != -1) { --		ath_maxvaps = maxvaps; --		if (ath_maxvaps < ATH_MAXVAPS_MIN) --			ath_maxvaps = ATH_MAXVAPS_MIN; --		else if (ath_maxvaps > ATH_MAXVAPS_MAX) --			ath_maxvaps = ATH_MAXVAPS_MAX; --	} - 	if (xchanmode != -1) - 		ath_xchanmode = xchanmode; - 	error = ath_getchannels(dev); -@@ -1349,12 +1337,6 @@ ath_vap_create(struct ieee80211com *ic, - 		return NULL; - 	} -  --	if (sc->sc_nvaps >= ath_maxvaps) { --		EPRINTF(sc, "Too many virtual APs (%d already exist).\n",  --				sc->sc_nvaps); --		return NULL; --	} -- - 	dev = alloc_etherdev(sizeof(struct ath_vap) + sc->sc_rc->arc_vap_space); - 	if (dev == NULL) { - 		/* XXX msg */ -@@ -1424,7 +1406,7 @@ ath_vap_create(struct ieee80211com *ic, - 		TAILQ_FOREACH(v, &ic->ic_vaps, iv_next) - 			id_mask |= (1 << ATH_GET_VAP_ID(v->iv_myaddr)); -  --		for (id = 0; id < ath_maxvaps; id++) { -+		for (id = 0; id < ATH_MAXVAPS_BCN; id++) { - 			/* get the first available slot */ - 			if ((id_mask & (1 << id)) == 0) { - 				ATH_SET_VAP_BSSID(vap->iv_myaddr, id); -@@ -1451,11 +1433,11 @@ ath_vap_create(struct ieee80211com *ic, - 		/* Assign the VAP to a beacon xmit slot.  As - 		 * above, this cannot fail to find one. */ - 		avp->av_bslot = 0; --		for (slot = 0; slot < ath_maxvaps; slot++) -+		for (slot = 0; slot < ATH_MAXVAPS_BCN; slot++) - 			if (sc->sc_bslot[slot] == NULL) { - 				/* XXX: Hack, space out slots to better - 				 * deal with misses. */ --				if (slot + 1 < ath_maxvaps && -+				if (slot + 1 < ATH_MAXVAPS_BCN && - 				    sc->sc_bslot[slot+1] == NULL) { - 					avp->av_bslot = slot + 1; - 					break; -@@ -1463,8 +1445,11 @@ ath_vap_create(struct ieee80211com *ic, - 				avp->av_bslot = slot; - 				/* NB: keep looking for a double slot */ - 			} --		KASSERT(sc->sc_bslot[avp->av_bslot] == NULL, --			("beacon slot %u not empty?", avp->av_bslot)); -+		if (sc->sc_bslot[avp->av_bslot]) { -+			free_netdev(dev); -+			return NULL; -+		} -+ - 		sc->sc_bslot[avp->av_bslot] = vap; - 		sc->sc_nbcnvaps++; -  -@@ -1475,15 +1460,7 @@ ath_vap_create(struct ieee80211com *ic, - 			 * of staggered beacons. - 			 */ - 			/* XXX check for beacon interval too small */ --			if (ath_maxvaps > 4) { --				DPRINTF(sc, ATH_DEBUG_BEACON,  --						"Staggered beacons are not " --						"possible with maxvaps set " --						"to %d.\n", ath_maxvaps); --				sc->sc_stagbeacons = 0; --			} else { --				sc->sc_stagbeacons = 1; --			} -+			sc->sc_stagbeacons = 1; - 		} - 		DPRINTF(sc, ATH_DEBUG_BEACON, "sc->sc_stagbeacons %sabled\n",  - 				(sc->sc_stagbeacons ? "en" : "dis")); -@@ -1553,7 +1530,7 @@ ath_vap_create(struct ieee80211com *ic, - 		if (ath_startrecv(sc) != 0)	/* restart recv */ - 			EPRINTF(sc, "Unable to start receive logic.\n"); - 		if (sc->sc_beacons) --			ath_beacon_config(sc, NULL);	/* restart beacons */ -+			ath_beacon_config(sc, NULL, 0);	/* restart beacons */ - 		ath_hal_intrset(ah, sc->sc_imask); - 	} -  -@@ -1681,7 +1658,7 @@ ath_vap_delete(struct ieee80211vap *vap) - 		if (ath_startrecv(sc) != 0)		/* restart recv. */ - 			EPRINTF(sc, "Unable to start receive logic.\n"); - 		if (sc->sc_beacons) --			ath_beacon_config(sc, NULL);	/* restart beacons */ -+			ath_beacon_config(sc, NULL, 0);	/* restart beacons */ - 		ath_hal_intrset(ah, sc->sc_imask); - 	} - } -@@ -3066,7 +3043,7 @@ ath_reset(struct net_device *dev) - 	 */ - 	ath_chan_change(sc, c); - 	if (sc->sc_beacons) --		ath_beacon_config(sc, NULL);	/* restart beacons */ -+		ath_beacon_config(sc, NULL, 1);	/* restart beacons */ - 	ath_hal_intrset(ah, sc->sc_imask); - 	ath_set_ack_bitrate(sc, sc->sc_ackrate); - 	netif_wake_queue(dev);		/* restart xmit */ -@@ -4763,7 +4740,7 @@ ath_check_beacon_done(struct ath_softc * - 	/* - 	 * check if the last beacon went out with the mode change flag set. - 	 */ --	for (slot = 0; slot < ath_maxvaps; slot++) { -+	for (slot = 0; slot < ATH_MAXVAPS_BCN; slot++) { - 		if (sc->sc_bslot[slot]) { - 			vap = sc->sc_bslot[slot]; - 			break; -@@ -4968,7 +4945,7 @@ ath_beacon_alloc_internal(struct ath_sof - 		 * has a timestamp in one beacon interval while the - 		 * others get a timestamp aligned to the next interval. - 		 */ --		tuadjust = (ni->ni_intval * (ath_maxvaps - avp->av_bslot)) / ath_maxvaps; -+		tuadjust = (ni->ni_intval * (ATH_MAXVAPS_BCN - avp->av_bslot)) / ATH_MAXVAPS_BCN; - 		tsfadjust = cpu_to_le64(tuadjust << 10);	/* TU->TSF */ -  - 		DPRINTF(sc, ATH_DEBUG_BEACON, -@@ -5361,8 +5338,8 @@ ath_beacon_send(struct ath_softc *sc, in - 		u_int32_t tsftu; -  - 		tsftu = hw_tsf >> 10; /* NB: 64 -> 32: See note far above. */ --		slot = ((tsftu % ic->ic_lintval) * ath_maxvaps) / ic->ic_lintval; --		vap = sc->sc_bslot[(slot + 1) % ath_maxvaps]; -+		slot = ((tsftu % ic->ic_lintval) * ATH_MAXVAPS_BCN) / ic->ic_lintval; -+		vap = sc->sc_bslot[(slot + 1) % ATH_MAXVAPS_BCN]; - 		DPRINTF(sc, ATH_DEBUG_BEACON_PROC, - 			"Slot %d [tsf %llu tsftu %llu intval %u] vap %p\n", - 			slot, (unsigned long long)hw_tsf,  -@@ -5377,7 +5354,7 @@ ath_beacon_send(struct ath_softc *sc, in - 		u_int32_t *bflink = NULL; -  - 		/* XXX: rotate/randomize order? */ --		for (slot = 0; slot < ath_maxvaps; slot++) { -+		for (slot = 0; slot < ATH_MAXVAPS_BCN; slot++) { - 			if ((vap = sc->sc_bslot[slot]) != NULL) { - 				if ((bf = ath_beacon_generate( - 						sc, vap,  -@@ -5418,7 +5395,7 @@ ath_beacon_send(struct ath_softc *sc, in - 	 *     again.  If we miss a beacon for that slot then we'll be - 	 *     slow to transition but we'll be sure at least one beacon - 	 *     interval has passed.  When bursting slot is always left --	 *     set to ath_maxvaps so this check is a no-op. -+	 *     set to ATH_MAXVAPS_BCN so this check is a no-op. - 	 */ - 	/* XXX locking */ - 	if (sc->sc_updateslot == UPDATE) { -@@ -5526,7 +5503,7 @@ ath_beacon_free(struct ath_softc *sc) -  * (2^(32 + 10 - 1) - 1)us is a really long time. -  */ - static void --ath_beacon_config(struct ath_softc *sc, struct ieee80211vap *vap) -+ath_beacon_config(struct ath_softc *sc, struct ieee80211vap *vap, int reset) - { - 	struct ieee80211com *ic = &sc->sc_ic; - 	struct ath_hal *ah = sc->sc_ah; -@@ -5553,7 +5530,7 @@ ath_beacon_config(struct ath_softc *sc, - 	/* We should reset hw TSF only once, so we increment - 	 * ni_tstamp.tsf to avoid resetting the hw TSF multiple - 	 * times */ --	if (tsf == 0) { -+	if (tsf == 0 || reset) { - 		reset_tsf = 1; - 		ni->ni_tstamp.tsf = cpu_to_le64(1); - 	} -@@ -5567,7 +5544,7 @@ ath_beacon_config(struct ath_softc *sc, - 		/* NB: the beacon interval is kept internally in TUs */ - 		intval = ic->ic_lintval & HAL_BEACON_PERIOD; - 		if (sc->sc_stagbeacons) --			intval /= ath_maxvaps;	/* for staggered beacons */ -+			intval /= ATH_MAXVAPS_BCN;	/* for staggered beacons */ - 		if ((sc->sc_nostabeacons) && - 		    (vap->iv_opmode == IEEE80211_M_HOSTAP)) - 			reset_tsf = 1; -@@ -5583,31 +5560,24 @@ ath_beacon_config(struct ath_softc *sc, - 		 * time */ - 		nexttbtt = intval; - 	} else if (intval) {	/* NB: can be 0 for monitor mode */ --		if (tsf == 1) { --			/* We have not received any beacons or probe --			 * responses. Since a beacon should be sent --			 * every 'intval' ms, we compute the next --			 * beacon timestamp using the hardware TSF. We --			 * ensure that it is at least FUDGE TUs ahead --			 * of the current TSF. Otherwise, we use the --			 * next beacon timestamp again */ -- 			nexttbtt = roundup(hw_tsftu + FUDGE, intval); --		}  --		else if (ic->ic_opmode == IEEE80211_M_IBSS) { --			if (tsf > hw_tsf) { --				/* We received a beacon, but the HW TSF has --				 * not been updated (otherwise hw_tsf > tsf) --				 * We cannot use the hardware TSF, so we --				 * wait to synchronize beacons again. */ --				sc->sc_syncbeacon = 1; --				goto ath_beacon_config_debug; --			} else { --				/* Normal case: we received a beacon to which --				 * we have synchronized. Make sure that nexttbtt --				 * is at least FUDGE TU ahead of hw_tsf */ --				nexttbtt = tsftu + roundup(hw_tsftu + FUDGE -  --						tsftu, intval); --			} -+		if ((tsf > hw_tsf) && (ic->ic_opmode == IEEE80211_M_IBSS)) { -+			/* We received a beacon, but the HW TSF has -+			 * not been updated (otherwise hw_tsf > tsf) -+			 * We cannot use the hardware TSF, so we -+			 * wait to synchronize beacons again. */ -+			sc->sc_syncbeacon = 1; -+			goto ath_beacon_config_debug; -+		} else if ((tsftu + FUDGE) > hw_tsftu) { -+			if (tsftu > hw_tsftu + 2 * intval) -+				nexttbtt = roundup(hw_tsftu + FUDGE, intval); -+			else -+				nexttbtt = tsftu; -+		} else { -+			/* Normal case: we received a beacon to which -+			 * we have synchronized. Make sure that nexttbtt -+			 * is at least FUDGE TU ahead of hw_tsf */ -+			nexttbtt = tsftu + roundup(hw_tsftu + FUDGE - -+					tsftu, intval); - 		} - 	} -  -@@ -5730,9 +5700,6 @@ ath_beacon_config(struct ath_softc *sc, - 		ath_beacon_dturbo_config(vap, intval & - 				~(HAL_BEACON_RESET_TSF | HAL_BEACON_ENA)); - #endif --		if ((nexttbtt & HAL_BEACON_PERIOD) - (ath_hal_gettsf32(ah) >> 10) --				<= ath_hal_sw_beacon_response_time) --			nexttbtt += intval; - 		sc->sc_nexttbtt = nexttbtt; -  - 		/* stop beacons before reconfiguring the timers to avoid race -@@ -5889,7 +5856,7 @@ ath_desc_alloc(struct ath_softc *sc) -  - 	/* XXX allocate beacon state together with VAP */ - 	error = ath_descdma_setup(sc, &sc->sc_bdma, &sc->sc_bbuf, --			"beacon", ath_maxvaps, 1); -+			"beacon", ATH_MAXVAPS_BCN, 1); - 	if (error != 0) { - 		ath_descdma_cleanup(sc, &sc->sc_txdma, &sc->sc_txbuf, - 			BUS_DMA_TODEVICE); -@@ -6680,7 +6647,7 @@ ath_recv_mgmt(struct ieee80211vap * vap, - 			/* Resync beacon timers using the tsf of the - 			 * beacon frame we just received. */ - 			vap->iv_flags_ext &= ~IEEE80211_FEXT_APPIE_UPDATE; --			ath_beacon_config(sc, vap); -+			ath_beacon_config(sc, vap, 0); - 			DPRINTF(sc, ATH_DEBUG_BEACON,  - 				"Updated beacon timers\n"); - 		} -@@ -9359,7 +9326,7 @@ ath_chan_set(struct ath_softc *sc, struc - 		 * HW seems to turn off beacons during turbo mode switch. - 		 */ - 		if (sc->sc_beacons && !sc->sc_dfs_cac) --			ath_beacon_config(sc, NULL); -+			ath_beacon_config(sc, NULL, 0); - 		/* - 		 * Re-enable interrupts. - 		 */ -@@ -9813,7 +9780,7 @@ ath_newstate(struct ieee80211vap *vap, e - 					ATH_DEBUG_BEACON_PROC,  - 				"Beacons reconfigured by %p[%s]!\n", - 				vap, vap->iv_nickname); --			ath_beacon_config(sc, vap); -+			ath_beacon_config(sc, vap, 1); - 			sc->sc_beacons = 1; - 		} - 	} else { -@@ -9948,9 +9915,6 @@ ath_dfs_cac_completed(unsigned long data - 		} - 		netif_wake_queue(dev); - 		ath_reset(dev); --		if (sc->sc_beacons) { --			ath_beacon_config(sc, NULL); --		} - 		dev->watchdog_timeo = 5 * HZ; /* restore normal timeout */ - 	} else { - 		do_gettimeofday(&tv); -@@ -11473,9 +11437,6 @@ ATH_SYSCTL_DECL(ath_sysctl_halparam, ctl - 		case ATH_OUTDOOR: - 			val = ic->ic_country_outdoor; - 			break; --		case ATH_MAXVAPS: --			val = ath_maxvaps; --			break; - 		case ATH_REGDOMAIN: - 			ath_hal_getregdomain(ah, &val); - 			break; -@@ -11606,12 +11567,6 @@ static const ctl_table ath_sysctl_templa - 	  .extra2	= (void *)ATH_OUTDOOR, - 	}, - 	{ .ctl_name	= CTL_AUTO, --	  .procname	= "maxvaps", --	  .mode		= 0444, --	  .proc_handler	= ath_sysctl_halparam, --	  .extra2	= (void *)ATH_MAXVAPS, --	}, --	{ .ctl_name	= CTL_AUTO, - 	  .procname	= "regdomain", - 	  .mode		= 0644, - 	  .proc_handler	= ath_sysctl_halparam, -@@ -11928,13 +11883,6 @@ static ctl_table ath_static_sysctls[] = - 	}, - #endif - 	{ .ctl_name	= CTL_AUTO, --	  .procname	= "maxvaps", --	  .mode		= 0444, --	  .data		= &ath_maxvaps, --	  .maxlen	= sizeof(ath_maxvaps), --	  .proc_handler	= proc_dointvec --	}, --	{ .ctl_name	= CTL_AUTO, - 	  .procname	= "xchanmode", - 	  .mode		= 0444, - 	  .data		= &ath_xchanmode, ---- a/ath/if_athvar.h -+++ b/ath/if_athvar.h -@@ -211,9 +211,7 @@ static inline struct net_device *_alloc_ - #define	ATH_RXBUF	40		/* number of RX buffers */ - #define	ATH_TXBUF	200		/* number of TX buffers */ -  --#define ATH_MAXVAPS_MIN 	2	/* minimum number of beacon buffers */ --#define ATH_MAXVAPS_MAX 	64	/* maximum number of beacon buffers */ --#define ATH_MAXVAPS_DEFAULT 	4	/* default number of beacon buffers */ -+#define ATH_MAXVAPS_BCN		4	/* maximum number of beacon buffers */ -  - /* free buffer threshold to restart net dev */ - #define	ATH_TXBUF_FREE_THRESHOLD  (ATH_TXBUF / 20)  | 
