From nobody@FreeBSD.org  Tue Jul 31 23:47:15 2012
Return-Path: <nobody@FreeBSD.org>
Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52])
	by hub.freebsd.org (Postfix) with ESMTP id 915C0106566C
	for <freebsd-gnats-submit@FreeBSD.org>; Tue, 31 Jul 2012 23:47:15 +0000 (UTC)
	(envelope-from nobody@FreeBSD.org)
Received: from red.freebsd.org (red.freebsd.org [IPv6:2001:4f8:fff6::22])
	by mx1.freebsd.org (Postfix) with ESMTP id 7D3148FC14
	for <freebsd-gnats-submit@FreeBSD.org>; Tue, 31 Jul 2012 23:47:15 +0000 (UTC)
Received: from red.freebsd.org (localhost [127.0.0.1])
	by red.freebsd.org (8.14.4/8.14.4) with ESMTP id q6VNlFE8097445
	for <freebsd-gnats-submit@FreeBSD.org>; Tue, 31 Jul 2012 23:47:15 GMT
	(envelope-from nobody@red.freebsd.org)
Received: (from nobody@localhost)
	by red.freebsd.org (8.14.4/8.14.4/Submit) id q6VNlFV6097444;
	Tue, 31 Jul 2012 23:47:15 GMT
	(envelope-from nobody)
Message-Id: <201207312347.q6VNlFV6097444@red.freebsd.org>
Date: Tue, 31 Jul 2012 23:47:15 GMT
From: Adrian Chadd <adrian@FreeBSD.org>
To: freebsd-gnats-submit@FreeBSD.org
Subject: [ath] 802.11n frames are not being transmitted with multiple rates
X-Send-Pr-Version: www-3.1
X-GNATS-Notify:

>Number:         170302
>Category:       kern
>Synopsis:       [ath] 802.11n frames are not being transmitted with multiple rates
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-wireless
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:  
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Tue Jul 31 23:50:09 UTC 2012
>Closed-Date:    
>Last-Modified:  Wed Aug  1 00:20:07 UTC 2012
>Originator:     Adrian Chadd
>Release:        9.0-STABLE i386, with -HEAD net80211/ath
>Organization:
>Environment:
FreeBSD marilyn 9.0-STABLE FreeBSD 9.0-STABLE #6 r238210M: Sat Jul 21 16:59:42 PDT 2012     adrian@marilyn:/home/adrian/work/freebsd/stable/9/sys/i386/compile/MARILYN-9-STABLE  i386

>Description:
When doing some debugging, I noticed that the rate control code is not transmitting frames with multiple rate retries.

For example, with 'sysctl dev.ath.0.debug=2' set (TX descriptor debugging):


Q1[  0] (DS.V:0xea739000 DS.P:0x1d29c000) L:00000000 D:3958d82c F:0005
        Seq: 1904 swtry: 0 ADDBAW?: 0 DOBAW?: 0
        417f0242 00008240 00048000 0000008f 0000803a 00000000
        00000000 0090000f 00000000 3f000000 3f000000 3f000000 0080292c 00000101
        4ccfdabf ffffffff ffffffff 2d80282a 80808080 80808080 80808080 0000056b
  [end]
Q1[  0] (DS.V:0xea739000 DS.P:0x1d29c000) L:00000000 D:3958d82c F:0005 *
        Seq: 1904 swtry: 0 ADDBAW?: 0 DOBAW?: 0
        417f0242 00008240 00048000 0000008f 0000803a 00000000
        00000000 0090000f 00000000 3f000000 3f000000 3f000000 0080292c 00000101
        4ccfdabf ffffffff ffffffff 2d80282a 80808080 80808080 80808080 0000056b
  [end]

. descriptor field 3 is 0x8f, which shows only one 11n rate (rate attempt #0) is set.

>How-To-Repeat:
associate to an 802.11n AP.

>Fix:
The TX and rate control paths assume that if RTS/CTS is enabled, multi-rate retry should be disabled.

This is because of a limitation with the pre-11n chips - the AR5212 supports multi-rate retry but not with RTS/CTS enabled.


>Release-Note:
>Audit-Trail:
Responsible-Changed-From-To: freebsd-bugs->freebsd-wireless 
Responsible-Changed-By: adrian 
Responsible-Changed-When: Tue Jul 31 23:51:48 UTC 2012 
Responsible-Changed-Why:  
Punt to maintainer 


http://www.freebsd.org/cgi/query-pr.cgi?pr=170302 

From: dfilter@FreeBSD.ORG (dfilter service)
To: bug-followup@FreeBSD.org
Cc:  
Subject: Re: kern/170302: commit references a PR
Date: Tue, 31 Jul 2012 23:54:31 +0000 (UTC)

 Author: adrian
 Date: Tue Jul 31 23:54:15 2012
 New Revision: 238961
 URL: http://svn.freebsd.org/changeset/base/238961
 
 Log:
   Allow 802.11n hardware to support multi-rate retry when RTS/CTS is
   enabled.
   
   The legacy (pre-802.11n) hardware doesn't support this - although
   the AR5212 era hardware supports MRR, it doesn't have all the bits
   needed to support MRR + RTS/CTS.  The AR5416 and later support
   a packet duration and RTS/CTS flags per rate scenario, so we should
   support it.
   
   Tested:
   
   * AR9280, STA
   
   PR:		kern/170302
 
 Modified:
   head/sys/dev/ath/ath_rate/sample/sample.c
   head/sys/dev/ath/if_ath.c
   head/sys/dev/ath/if_ath_tx.c
   head/sys/dev/ath/if_athvar.h
 
 Modified: head/sys/dev/ath/ath_rate/sample/sample.c
 ==============================================================================
 --- head/sys/dev/ath/ath_rate/sample/sample.c	Tue Jul 31 23:34:06 2012	(r238960)
 +++ head/sys/dev/ath/ath_rate/sample/sample.c	Tue Jul 31 23:54:15 2012	(r238961)
 @@ -502,8 +502,10 @@ ath_rate_findrate(struct ath_softc *sc, 
  		goto done;
  	}
  
 -	/* XXX TODO: this doesn't know about 11gn vs 11g protection; teach it */
 -	mrr = sc->sc_mrretry && !(ic->ic_flags & IEEE80211_F_USEPROT);
 +	mrr = sc->sc_mrretry;
 +	/* XXX check HT protmode too */
 +	if (mrr && (ic->ic_flags & IEEE80211_F_USEPROT) && !sc->sc_mrrprot)
 +		mrr = 0;
  
  	best_rix = pick_best_rate(an, rt, size_bin, !mrr);
  	if (best_rix >= 0) {
 @@ -910,7 +912,11 @@ ath_rate_tx_complete(struct ath_softc *s
  		    short_tries, long_tries);
  		return;
  	}
 -	mrr = sc->sc_mrretry && !(ic->ic_flags & IEEE80211_F_USEPROT);
 +	mrr = sc->sc_mrretry;
 +	/* XXX check HT protmode too */
 +	if (mrr && (ic->ic_flags & IEEE80211_F_USEPROT) && !sc->sc_mrrprot)
 +		mrr = 0;
 +
  	if (!mrr || ts->ts_finaltsi == 0) {
  		if (!IS_RATE_DEFINED(sn, final_rix)) {
  			badrate(ifp, 0, ts->ts_rate, long_tries, status);
 
 Modified: head/sys/dev/ath/if_ath.c
 ==============================================================================
 --- head/sys/dev/ath/if_ath.c	Tue Jul 31 23:34:06 2012	(r238960)
 +++ head/sys/dev/ath/if_ath.c	Tue Jul 31 23:54:15 2012	(r238961)
 @@ -705,6 +705,12 @@ ath_attach(u_int16_t devid, struct ath_s
  		(void) ath_hal_settxchainmask(sc->sc_ah, tx_chainmask);
  	}
  
 +	/*
 +	 * Disable MRR with protected frames by default.
 +	 * Only 802.11n series NICs can handle this.
 +	 */
 +	sc->sc_mrrprot = 0;	/* XXX should be a capability */
 +
  #ifdef	ATH_ENABLE_11N
  	/*
  	 * Query HT capabilities
 @@ -714,6 +720,9 @@ ath_attach(u_int16_t devid, struct ath_s
  		int rxs, txs;
  
  		device_printf(sc->sc_dev, "[HT] enabling HT modes\n");
 +
 +		sc->sc_mrrprot = 1;	/* XXX should be a capability */
 +
  		ic->ic_htcaps = IEEE80211_HTC_HT	/* HT operation */
  			    | IEEE80211_HTC_AMPDU	/* A-MPDU tx/rx */
  			    | IEEE80211_HTC_AMSDU	/* A-MSDU tx/rx */
 
 Modified: head/sys/dev/ath/if_ath_tx.c
 ==============================================================================
 --- head/sys/dev/ath/if_ath_tx.c	Tue Jul 31 23:34:06 2012	(r238960)
 +++ head/sys/dev/ath/if_ath_tx.c	Tue Jul 31 23:54:15 2012	(r238961)
 @@ -1051,11 +1051,12 @@ ath_tx_set_rtscts(struct ath_softc *sc, 
  	
  	/*
  	 * Must disable multi-rate retry when using RTS/CTS.
 -	 * XXX TODO: only for pre-11n NICs.
  	 */
 -	bf->bf_state.bfs_ismrr = 0;
 -	bf->bf_state.bfs_try0 =
 -	    bf->bf_state.bfs_rc[0].tries = ATH_TXMGTTRY;	/* XXX ew */
 +	if (!sc->sc_mrrprot) {
 +		bf->bf_state.bfs_ismrr = 0;
 +		bf->bf_state.bfs_try0 =
 +		    bf->bf_state.bfs_rc[0].tries = ATH_TXMGTTRY; /* XXX ew */
 +	}
  }
  
  /*
 
 Modified: head/sys/dev/ath/if_athvar.h
 ==============================================================================
 --- head/sys/dev/ath/if_athvar.h	Tue Jul 31 23:34:06 2012	(r238960)
 +++ head/sys/dev/ath/if_athvar.h	Tue Jul 31 23:54:15 2012	(r238961)
 @@ -463,6 +463,7 @@ struct ath_softc {
  	void			(*sc_setdefantenna)(struct ath_softc *, u_int);
  	unsigned int		sc_invalid  : 1,/* disable hardware accesses */
  				sc_mrretry  : 1,/* multi-rate retry support */
 +				sc_mrrprot  : 1,/* MRR + protection support */
  				sc_softled  : 1,/* enable LED gpio status */
  				sc_hardled  : 1,/* enable MAC LED status */
  				sc_splitmic : 1,/* split TKIP MIC keys */
 _______________________________________________
 svn-src-all@freebsd.org mailing list
 http://lists.freebsd.org/mailman/listinfo/svn-src-all
 To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org"
 

From: dfilter@FreeBSD.ORG (dfilter service)
To: bug-followup@FreeBSD.org
Cc:  
Subject: Re: kern/170302: commit references a PR
Date: Wed,  1 Aug 2012 00:18:17 +0000 (UTC)

 Author: adrian
 Date: Wed Aug  1 00:18:02 2012
 New Revision: 238962
 URL: http://svn.freebsd.org/changeset/base/238962
 
 Log:
   Fix a case of "mis-located braces".
   
   PR:		kern/170302
 
 Modified:
   head/sys/dev/ath/ath_rate/sample/sample.c
 
 Modified: head/sys/dev/ath/ath_rate/sample/sample.c
 ==============================================================================
 --- head/sys/dev/ath/ath_rate/sample/sample.c	Tue Jul 31 23:54:15 2012	(r238961)
 +++ head/sys/dev/ath/ath_rate/sample/sample.c	Wed Aug  1 00:18:02 2012	(r238962)
 @@ -504,7 +504,7 @@ ath_rate_findrate(struct ath_softc *sc, 
  
  	mrr = sc->sc_mrretry;
  	/* XXX check HT protmode too */
 -	if (mrr && (ic->ic_flags & IEEE80211_F_USEPROT) && !sc->sc_mrrprot)
 +	if (mrr && (ic->ic_flags & IEEE80211_F_USEPROT && !sc->sc_mrrprot))
  		mrr = 0;
  
  	best_rix = pick_best_rate(an, rt, size_bin, !mrr);
 @@ -914,7 +914,7 @@ ath_rate_tx_complete(struct ath_softc *s
  	}
  	mrr = sc->sc_mrretry;
  	/* XXX check HT protmode too */
 -	if (mrr && (ic->ic_flags & IEEE80211_F_USEPROT) && !sc->sc_mrrprot)
 +	if (mrr && (ic->ic_flags & IEEE80211_F_USEPROT && !sc->sc_mrrprot))
  		mrr = 0;
  
  	if (!mrr || ts->ts_finaltsi == 0) {
 _______________________________________________
 svn-src-all@freebsd.org mailing list
 http://lists.freebsd.org/mailman/listinfo/svn-src-all
 To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org"
 
>Unformatted:
