Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 12 Jan 2009 17:15:09 +0000 (UTC)
From:      Andrew Thompson <thompsa@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r187104 - head/sys/dev/if_ndis
Message-ID:  <200901121715.n0CHF9Td071540@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: thompsa
Date: Mon Jan 12 17:15:09 2009
New Revision: 187104
URL: http://svn.freebsd.org/changeset/base/187104

Log:
  Provide a NDIS tx power level converstion to/from net80211, this uses a loookup
  table to approximate mW<->dBM.
  
  Submitted by:	Paul B. Mahol

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 Jan 12 16:54:41 2009	(r187103)
+++ head/sys/dev/if_ndis/if_ndis.c	Mon Jan 12 17:15:09 2009	(r187104)
@@ -101,6 +101,17 @@ int ndisusb_halt = 1;
 SYSCTL_INT(_hw_ndisusb, OID_AUTO, halt, CTLFLAG_RW, &ndisusb_halt, 0,
     "Halt NDIS USB driver when it's attached");
 
+/* 0 - 30 dBm to mW conversion table */
+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,
+	32, 35, 40, 45, 50, 56, 63, 71, 79, 89,
+	100, 112, 126, 141, 158, 178, 200, 224, 251, 282,
+	316, 355, 398, 447, 501, 562, 631, 708, 794, 891,
+	1000
+};
+
 MODULE_DEPEND(ndis, ether, 1, 1, 1);
 MODULE_DEPEND(ndis, wlan, 1, 1, 1);
 MODULE_DEPEND(ndis, ndisapi, 1, 1, 1);
@@ -739,7 +750,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;
+		ic->ic_caps = IEEE80211_C_STA | IEEE80211_C_IBSS | IEEE80211_C_TXPMGT;
 		setbit(ic->ic_modecaps, IEEE80211_MODE_AUTO);
 		len = 0;
 		r = ndis_get_info(sc, OID_802_11_NETWORK_TYPES_SUPPORTED,
@@ -2312,6 +2323,13 @@ ndis_setstate_80211(sc)
 		arg = NDIS_80211_POWERMODE_CAM;
 	ndis_set_info(sc, OID_802_11_POWER_MODE, &arg, &len);
 
+	/* Set TX power */
+	if (ic->ic_txpowlimit < sizeof(dBm2mW)) {
+		len = sizeof(arg);
+		arg = dBm2mW[ic->ic_txpowlimit];
+		ndis_set_info(sc, OID_802_11_TX_POWER_LEVEL, &arg, &len);
+	}
+
 	/*
 	 * Default encryption mode to off, authentication
 	 * to open and privacy to 'accept everything.'
@@ -2778,6 +2796,17 @@ ndis_getstate_80211(sc)
 			ic->ic_flags |= IEEE80211_F_PMGTON;
 	}
 
+	/* 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 (dBm2mW[i] >= arg)
+				break;
+		ic->ic_txpowlimit = i;
+	}
+
 	/*
 	 * Use the current association information to reflect
 	 * what channel we're on.



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