Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 14 Aug 2011 12:21:08 +0000 (UTC)
From:      Adrian Chadd <adrian@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-user@freebsd.org
Subject:   svn commit: r224862 - user/adrian/if_ath_tx/sys/dev/ath
Message-ID:  <201108141221.p7ECL85S063882@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: adrian
Date: Sun Aug 14 12:21:08 2011
New Revision: 224862
URL: http://svn.freebsd.org/changeset/base/224862

Log:
  Begin fleshing out the BAR handling.
  
  net80211 implements BAR frame queuing and completion handofing.
  The first place a BAR should be TXed is when the software retry
  limit has been exceeded for a TID currently doing aggregation.
  The process should be (just so I don't forget):
  
  * pause the TID;
  * send the BAR;
  * unpause the TID in ath_bar_response()
  
  If multiple BAR's are sent, paused will be incremented and decremented
  appropriately until all BAR frames have been transmitted (succesfully
  or otherwise.)
  
  However, using it with the current code is likely not going to work
  because the ath TX code isn't re-entrant w/ the way locking currently
  is implement.

Modified:
  user/adrian/if_ath_tx/sys/dev/ath/if_ath.c
  user/adrian/if_ath_tx/sys/dev/ath/if_ath_tx.c
  user/adrian/if_ath_tx/sys/dev/ath/if_ath_tx.h
  user/adrian/if_ath_tx/sys/dev/ath/if_athvar.h

Modified: user/adrian/if_ath_tx/sys/dev/ath/if_ath.c
==============================================================================
--- user/adrian/if_ath_tx/sys/dev/ath/if_ath.c	Sun Aug 14 11:47:42 2011	(r224861)
+++ user/adrian/if_ath_tx/sys/dev/ath/if_ath.c	Sun Aug 14 12:21:08 2011	(r224862)
@@ -733,10 +733,12 @@ ath_attach(u_int16_t devid, struct ath_s
 	sc->sc_addba_request = ic->ic_addba_request;
 	sc->sc_addba_response = ic->ic_addba_response;
 	sc->sc_addba_stop = ic->ic_addba_stop;
+	sc->sc_bar_response = ic->ic_bar_response;
 
 	ic->ic_addba_request = ath_addba_request;
 	ic->ic_addba_response = ath_addba_response;
 	ic->ic_addba_stop = ath_addba_stop;
+	ic->ic_bar_response = ath_bar_response;
 
 	ieee80211_radiotap_attach(ic,
 	    &sc->sc_tx_th.wt_ihdr, sizeof(sc->sc_tx_th),

Modified: user/adrian/if_ath_tx/sys/dev/ath/if_ath_tx.c
==============================================================================
--- user/adrian/if_ath_tx/sys/dev/ath/if_ath_tx.c	Sun Aug 14 11:47:42 2011	(r224861)
+++ user/adrian/if_ath_tx/sys/dev/ath/if_ath_tx.c	Sun Aug 14 12:21:08 2011	(r224862)
@@ -2104,6 +2104,12 @@ ath_tx_aggr_retry_unaggr(struct ath_soft
 			ath_tx_update_baw(sc, an, atid,
 			    SEQNO(bf->bf_state.bfs_seqno));
 
+		/* Pause the TID */
+
+		/* Send BAR frame */
+		device_printf(sc->sc_dev, "%s: TID %d: send BAR\n",
+		    __func__, tid);
+
 		/* Free buffer, bf is free after this call */
 		ath_tx_default_comp(sc, bf, 0);
 		return;
@@ -2487,3 +2493,14 @@ ath_addba_stop(struct ieee80211_node *ni
 	ath_tx_cleanup(sc, an, tid);
 	ATH_TXQ_UNLOCK(txq);
 }
+
+void
+ath_bar_response(struct ieee80211_node *ni, struct ieee80211_tx_ampdu *tap,
+    int status)
+{
+	struct ath_softc *sc = ni->ni_ic->ic_ifp->if_softc;
+
+	device_printf(sc->sc_dev, "%s: called\n", __func__);
+
+	sc->sc_bar_response(ni, tap, status);
+}

Modified: user/adrian/if_ath_tx/sys/dev/ath/if_ath_tx.h
==============================================================================
--- user/adrian/if_ath_tx/sys/dev/ath/if_ath_tx.h	Sun Aug 14 11:47:42 2011	(r224861)
+++ user/adrian/if_ath_tx/sys/dev/ath/if_ath_tx.h	Sun Aug 14 12:21:08 2011	(r224862)
@@ -62,5 +62,7 @@ extern	int ath_addba_response(struct iee
     int code, int batimeout);
 extern	void ath_addba_stop(struct ieee80211_node *ni,
     struct ieee80211_tx_ampdu *tap);
+extern	void ath_bar_response(struct ieee80211_node *ni,
+     struct ieee80211_tx_ampdu *tap, int status);
 
 #endif

Modified: user/adrian/if_ath_tx/sys/dev/ath/if_athvar.h
==============================================================================
--- user/adrian/if_ath_tx/sys/dev/ath/if_athvar.h	Sun Aug 14 11:47:42 2011	(r224861)
+++ user/adrian/if_ath_tx/sys/dev/ath/if_athvar.h	Sun Aug 14 12:21:08 2011	(r224862)
@@ -470,6 +470,9 @@ struct ath_softc {
 				    struct ieee80211_tx_ampdu *, int, int, int);
 	void			(*sc_addba_stop)(struct ieee80211_node *,
 				    struct ieee80211_tx_ampdu *);
+	void			(*sc_bar_response)(struct ieee80211_node *ni,
+				    struct ieee80211_tx_ampdu *tap,
+				    int status);
 };
 
 #define	ATH_LOCK_INIT(_sc) \



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