From nobody@FreeBSD.org  Thu Mar  5 19:40:26 2009
Return-Path: <nobody@FreeBSD.org>
Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34])
	by hub.freebsd.org (Postfix) with ESMTP id B8E8B106566C
	for <freebsd-gnats-submit@FreeBSD.org>; Thu,  5 Mar 2009 19:40:26 +0000 (UTC)
	(envelope-from nobody@FreeBSD.org)
Received: from www.freebsd.org (www.freebsd.org [IPv6:2001:4f8:fff6::21])
	by mx1.freebsd.org (Postfix) with ESMTP id 8D2158FC17
	for <freebsd-gnats-submit@FreeBSD.org>; Thu,  5 Mar 2009 19:40:26 +0000 (UTC)
	(envelope-from nobody@FreeBSD.org)
Received: from www.freebsd.org (localhost [127.0.0.1])
	by www.freebsd.org (8.14.3/8.14.3) with ESMTP id n25JeQ2W015574
	for <freebsd-gnats-submit@FreeBSD.org>; Thu, 5 Mar 2009 19:40:26 GMT
	(envelope-from nobody@www.freebsd.org)
Received: (from nobody@localhost)
	by www.freebsd.org (8.14.3/8.14.3/Submit) id n25JeQ3O015572;
	Thu, 5 Mar 2009 19:40:26 GMT
	(envelope-from nobody)
Message-Id: <200903051940.n25JeQ3O015572@www.freebsd.org>
Date: Thu, 5 Mar 2009 19:40:26 GMT
From: Paul <onemda@gmail.com>
To: freebsd-gnats-submit@FreeBSD.org
Subject: incorrect number used in for loop; fix TXPMGT reporting
X-Send-Pr-Version: www-3.1
X-GNATS-Notify:

>Number:         132342
>Category:       kern
>Synopsis:       [ndis] [patch] incorrect number used in for loop; fix TXPMGT reporting
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-net
>State:          closed
>Quarter:        
>Keywords:       
>Date-Required:  
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Thu Mar 05 19:50:01 UTC 2009
>Closed-Date:    Thu Mar 26 14:19:28 UTC 2009
>Last-Modified:  Thu Mar 26 14:19:28 UTC 2009
>Originator:     Paul
>Release:        8.0 CURRENT
>Organization:
>Environment:
FreeBSD 8.0-CURRENT FreeBSD 8.0-CURRENT #11 r189300: Tue Mar  3 11:47:21 UTC 2009     root@dhcppc1:/usr/obj/usr/src/sys/kernel  i386
>Description:
Correct size calculation for dBm2mW conversion table in for loop.
Do not claim ndis miniport driver support TXPMGT if it doesnt(available via
OID_802_11_TX_POWER_LEVEL).
>How-To-Repeat:

>Fix:
--- /usr/src/sys/dev/if_ndis/if_ndis.c    2009-02-24 03:59:51.000000000 +0000
+++ if_ndis.c   2009-03-05 19:24:58.000000000 +0000
@@ -750,7 +750,7 @@
                ic->ic_ifp = ifp;
                ic->ic_opmode = IEEE80211_M_STA;
                ic->ic_phytype = IEEE80211_T_DS;
-               ic->ic_caps = IEEE80211_C_STA | IEEE80211_C_IBSS | IEEE80211_C_TXPMGT;
+               ic->ic_caps = IEEE80211_C_STA | IEEE80211_C_IBSS;
                setbit(ic->ic_modecaps, IEEE80211_MODE_AUTO);
                len = 0;
                r = ndis_get_info(sc, OID_802_11_NETWORK_TYPES_SUPPORTED,
@@ -929,6 +929,9 @@
                r = ndis_get_info(sc, OID_802_11_POWER_MODE, &arg, &i);
                if (r == 0)
                        ic->ic_caps |= IEEE80211_C_PMGT;
+               r = ndis_get_info(sc, OID_802_11_TX_POWER_LEVEL, &arg, &i);
+               if (r == 0)
+                       ic->ic_caps |= IEEE80211_C_TXPMGT;
                bcopy(eaddr, &ic->ic_myaddr, sizeof(eaddr));
                ieee80211_ifattach(ic);
                ic->ic_raw_xmit = ndis_raw_xmit;
@@ -2324,7 +2327,8 @@
        ndis_set_info(sc, OID_802_11_POWER_MODE, &arg, &len);
 
        /* Set TX power */
-       if (ic->ic_txpowlimit < sizeof(dBm2mW)) {
+       if ((ic->ic_caps & IEEE80211_C_TXPMGT) &&
+                       (ic->ic_txpowlimit < sizeof(dBm2mW)/sizeof(dBm2mW[0]))) {
                len = sizeof(arg);
                arg = dBm2mW[ic->ic_txpowlimit];
                ndis_set_info(sc, OID_802_11_TX_POWER_LEVEL, &arg, &len);
@@ -2797,11 +2801,10 @@
        }
 
        /* Get TX power */
-       len = sizeof(arg);
-       rval = ndis_get_info(sc, OID_802_11_TX_POWER_LEVEL, &arg, &len);
-
-       if (!rval) {
-               for (i = 0; i < sizeof(dBm2mW); i++)
+       if (ic->ic_caps & IEEE80211_C_TXPMGT) {
+               len = sizeof(arg);
+               ndis_get_info(sc, OID_802_11_TX_POWER_LEVEL, &arg, &len);
+               for (i = 0; i < sizeof(dBm2mW)/sizeof(dBm2mW[0]); i++)
                        if (dBm2mW[i] >= arg)
                                break;
                ic->ic_txpowlimit = i;

>Release-Note:
>Audit-Trail:
Responsible-Changed-From-To: freebsd-bugs->freebsd-net 
Responsible-Changed-By: linimon 
Responsible-Changed-When: Thu Mar 5 20:23:01 UTC 2009 
Responsible-Changed-Why:  
Over to maintainer(s). 

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

From: dfilter@FreeBSD.ORG (dfilter service)
To: bug-followup@FreeBSD.org
Cc:  
Subject: Re: kern/132342: commit references a PR
Date: Mon,  9 Mar 2009 02:38:02 +0000 (UTC)

 Author: sam
 Date: Mon Mar  9 02:37:52 2009
 New Revision: 189550
 URL: http://svn.freebsd.org/changeset/base/189550
 
 Log:
   Fix TXPMGT handling:
   o correct dBm<->mW conversion logic
   o set net80211 TXPMGT capability only if driver reports it is capable
   
   PR:		kern/132342
   Submitted by:	"Paul B. Mahol" <onemda@gmail.com>
 
 Modified:
   head/sys/dev/if_ndis/if_ndis.c
 
 Modified: head/sys/dev/if_ndis/if_ndis.c
 ==============================================================================
 --- head/sys/dev/if_ndis/if_ndis.c	Mon Mar  9 02:34:02 2009	(r189549)
 +++ head/sys/dev/if_ndis/if_ndis.c	Mon Mar  9 02:37:52 2009	(r189550)
 @@ -102,7 +102,7 @@ SYSCTL_INT(_hw_ndisusb, OID_AUTO, halt, 
      "Halt NDIS USB driver when it's attached");
  
  /* 0 - 30 dBm to mW conversion table */
 -const uint16_t dBm2mW[] = {
 +static const uint16_t dBm2mW[] = {
  	1, 1, 1, 1, 2, 2, 2, 2, 3, 3,
  	3, 4, 4, 4, 5, 6, 6, 7, 8, 9,
  	10, 11, 13, 14, 16, 18, 20, 22, 25, 28,
 @@ -749,7 +749,7 @@ ndis_attach(dev)
  		ic->ic_ifp = ifp;
  		ic->ic_opmode = IEEE80211_M_STA;
  	        ic->ic_phytype = IEEE80211_T_DS;
 -		ic->ic_caps = IEEE80211_C_STA | IEEE80211_C_IBSS | IEEE80211_C_TXPMGT;
 +		ic->ic_caps = IEEE80211_C_STA | IEEE80211_C_IBSS;
  		setbit(ic->ic_modecaps, IEEE80211_MODE_AUTO);
  		len = 0;
  		r = ndis_get_info(sc, OID_802_11_NETWORK_TYPES_SUPPORTED,
 @@ -928,6 +928,11 @@ got_crypto:
  		r = ndis_get_info(sc, OID_802_11_POWER_MODE, &arg, &i);
  		if (r == 0)
  			ic->ic_caps |= IEEE80211_C_PMGT;
 +
 +		r = ndis_get_info(sc, OID_802_11_TX_POWER_LEVEL, &arg, &i);
 +		if (r == 0)
 +			ic->ic_caps |= IEEE80211_C_TXPMGT;
 +
  		bcopy(eaddr, &ic->ic_myaddr, sizeof(eaddr));
  		ieee80211_ifattach(ic);
  		ic->ic_raw_xmit = ndis_raw_xmit;
 @@ -2325,9 +2330,10 @@ ndis_setstate_80211(sc)
  	ndis_set_info(sc, OID_802_11_POWER_MODE, &arg, &len);
  
  	/* Set TX power */
 -	if (ic->ic_txpowlimit < sizeof(dBm2mW)) {
 -		len = sizeof(arg);
 +	if ((ic->ic_caps & IEEE80211_C_TXPMGT) &&
 +	    ic->ic_txpowlimit < (sizeof(dBm2mW) / sizeof(dBm2mW[0]))) {
  		arg = dBm2mW[ic->ic_txpowlimit];
 +		len = sizeof(arg);
  		ndis_set_info(sc, OID_802_11_TX_POWER_LEVEL, &arg, &len);
  	}
  
 @@ -2798,11 +2804,10 @@ ndis_getstate_80211(sc)
  	}
  
  	/* Get TX power */
 -	len = sizeof(arg);
 -	rval = ndis_get_info(sc, OID_802_11_TX_POWER_LEVEL, &arg, &len);
 -
 -	if (!rval) {
 -		for (i = 0; i < sizeof(dBm2mW); i++)
 +	if (ic->ic_caps & IEEE80211_C_TXPMGT) {
 +		len = sizeof(arg);
 +		ndis_get_info(sc, OID_802_11_TX_POWER_LEVEL, &arg, &len);
 +		for (i = 0; i < (sizeof(dBm2mW) / sizeof(dBm2mW[0])); i++)
  			if (dBm2mW[i] >= arg)
  				break;
  		ic->ic_txpowlimit = i;
 _______________________________________________
 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"
 
State-Changed-From-To: open->patched 
State-Changed-By: gavin 
State-Changed-When: Thu Mar 26 12:24:48 UTC 2009 
State-Changed-Why:  
Mark as patched, as it is fixed in HEAD.  I'm not sure if this actually 
applies to 7.x, however, so it is possible that this should instead be 
closed.  To submitter: do you know if this is also an issue in 7.x? 

http://www.freebsd.org/cgi/query-pr.cgi?pr=132342 
State-Changed-From-To: patched->closed 
State-Changed-By: gavin 
State-Changed-When: Thu Mar 26 14:18:54 UTC 2009 
State-Changed-Why:  
Close, submitter confirms that this is not an issue with 7.x or earlier. 

http://www.freebsd.org/cgi/query-pr.cgi?pr=132342 
>Unformatted:
