svn commit: r305721 - head/sys/dev/ath

Adrian Chadd adrian at FreeBSD.org
Mon Sep 12 04:55:15 UTC 2016


Author: adrian
Date: Mon Sep 12 04:55:13 2016
New Revision: 305721
URL: https://svnweb.freebsd.org/changeset/base/305721

Log:
  [ath] set the relevant TOA/TOD locationing bits when trying to do locationing.
  
  * Don't do RTS/CTS - experiments show that we get ACK frames for each of them
    and this ends up causing the timestamps to look all funny.
  * Set the HAL_TXDESC_POS bit, so the AR9300 HAL sets up the hardware to return
    location and CSI information.

Modified:
  head/sys/dev/ath/if_ath_tx.c

Modified: head/sys/dev/ath/if_ath_tx.c
==============================================================================
--- head/sys/dev/ath/if_ath_tx.c	Mon Sep 12 04:50:40 2016	(r305720)
+++ head/sys/dev/ath/if_ath_tx.c	Mon Sep 12 04:55:13 2016	(r305721)
@@ -1042,6 +1042,14 @@ ath_tx_calc_protection(struct ath_softc 
 	shortPreamble = bf->bf_state.bfs_shpream;
 	wh = mtod(bf->bf_m, struct ieee80211_frame *);
 
+	/* Disable frame protection for TOA probe frames */
+	if (bf->bf_flags & ATH_BUF_TOA_PROBE) {
+		/* XXX count */
+		flags &= ~(HAL_TXDESC_CTSENA | HAL_TXDESC_RTSENA);
+		bf->bf_state.bfs_doprot = 0;
+		goto finish;
+	}
+
 	/*
 	 * If 802.11g protection is enabled, determine whether
 	 * to use RTS/CTS or just CTS.  Note that this is only
@@ -1081,6 +1089,8 @@ ath_tx_calc_protection(struct ath_softc 
 		flags |= HAL_TXDESC_RTSENA;
 		sc->sc_stats.ast_tx_htprotect++;
 	}
+
+finish:
 	bf->bf_state.bfs_txflags = flags;
 }
 
@@ -1739,6 +1749,34 @@ ath_tx_normal_setup(struct ath_softc *sc
 	}
 #endif
 
+	/*
+	 * If it's a frame to do location reporting on,
+	 * communicate it to the HAL.
+	 */
+	if (ieee80211_get_toa_params(m0, NULL)) {
+		device_printf(sc->sc_dev,
+		    "%s: setting TX positioning bit\n", __func__);
+		flags |= HAL_TXDESC_POS;
+
+		/*
+		 * Note: The hardware reports timestamps for
+		 * each of the RX'ed packets as part of the packet
+		 * exchange.  So this means things like RTS/CTS
+		 * exchanges, as well as the final ACK.
+		 *
+		 * So, if you send a RTS-protected NULL data frame,
+		 * you'll get an RX report for the RTS response, then
+		 * an RX report for the NULL frame, and then the TX
+		 * completion at the end.
+		 *
+		 * NOTE: it doesn't work right for CCK frames;
+		 * there's no channel info data provided unless
+		 * it's OFDM or HT.  Will have to dig into it.
+		 */
+		flags &= ~(HAL_TXDESC_RTSENA | HAL_TXDESC_CTSENA);
+		bf->bf_flags |= ATH_BUF_TOA_PROBE;
+	}
+
 #if 0
 	/*
 	 * Placeholder: if you want to transmit with the azimuth
@@ -2175,6 +2213,18 @@ ath_tx_raw_start(struct ath_softc *sc, s
 		try0 = ATH_TXMAXTRY;	/* XXX?too many? */
 	}
 
+	/*
+	 * If it's a frame to do location reporting on,
+	 * communicate it to the HAL.
+	 */
+	if (ieee80211_get_toa_params(m0, NULL)) {
+		device_printf(sc->sc_dev,
+		    "%s: setting TX positioning bit\n", __func__);
+		flags |= HAL_TXDESC_POS;
+		flags &= ~(HAL_TXDESC_RTSENA | HAL_TXDESC_CTSENA);
+		bf->bf_flags |= ATH_BUF_TOA_PROBE;
+	}
+
 	txrate = rt->info[rix].rateCode;
 	if (params->ibp_flags & IEEE80211_BPF_SHORTPRE)
 		txrate |= rt->info[rix].shortPreamble;


More information about the svn-src-head mailing list