wicontrol TX patch
Jiri Mikulas
konfer at mikulas.com
Tue Sep 30 05:55:21 PDT 2003
Hello
My questoin is about status of wicontrol TX power control in current ?
Anybody planing to commit it into wicontrol ?
I use modified patch from "imp" for three months
it works well, but problem is, that if card is reseted by wi_reset - i
guess,
value from register is owerwrited by default (I think ALC also turns on)
any ideas/solutions how keep this TX power value after card reset ?
for this time I use cron to periodicaly refresh TX power ..
sorry for my english ;)
thaks for reply
Jiri
-------------- next part --------------
--- usr.sbin/wicontrol/wicontrol.c Tue Sep 30 00:55:25 2003
+++ usr.sbin/wicontrol/wicontrol.c Tue Sep 30 12:54:26 2003
@@ -1070,6 +1070,135 @@
opt);
}
+/* TX Power patch */
+static void
+wi_setdebug(const char *iface, struct wi_req *wreq)
+{
+ struct ifreq ifr;
+ int s;
+
+ bzero((char *)&ifr, sizeof(ifr));
+
+ strlcpy(ifr.ifr_name, iface, sizeof(ifr.ifr_name));
+ ifr.ifr_data = (caddr_t)wreq;
+
+ s = socket(AF_INET, SOCK_DGRAM, 0);
+
+ if (s == -1)
+ err(1, "socket");
+
+ if (ioctl(s, SIOCSPRISM2DEBUG, &ifr) == -1)
+ err(1, "SIOCSPRISM2DEBUG");
+
+ close(s);
+
+ return;
+}
+
+#if 0
+static void
+wi_getdebug(const char *iface, struct wi_req *wreq)
+{
+ struct ifreq ifr;
+ int s;
+
+ bzero((char *)&ifr, sizeof(ifr));
+
+ strlcpy(ifr.ifr_name, iface, sizeof(ifr.ifr_name));
+ ifr.ifr_data = (caddr_t)wreq;
+
+ s = socket(AF_INET, SOCK_DGRAM, 0);
+
+ if (s == -1)
+ err(1, "socket");
+
+ if (ioctl(s, SIOCGPRISM2DEBUG, &ifr) == -1)
+ err(1, "SIOCGPRISM2DEBUG");
+
+ close(s);
+
+ return;
+}
+#endif
+
+/* Map HFA386x's CR31 to and from dBm with some sort of ad hoc mapping..
+ * This version assumes following mapping:
+ * CR31 is 7-bit value with -64 to 63 range.
+ * -64 is mapped into 20dBm and 63 into -43dBm.
+ * This is certainly not an exact mapping for every card, but at least
+ * increasing dBm value should correspond to increasing TX power.
+ */
+
+static int
+wi_txpower_to_dBm(uint16_t val)
+{
+ signed char tmp;
+
+ if (val > 255)
+ val = 255;
+
+ tmp = val;
+ tmp >>= 2;
+
+ return -12 - tmp;
+}
+
+#if 0
+static uint16_t
+wi_dBm_to_txpower(int val)
+{
+ signed char tmp;
+
+ if (val > 20)
+ return 128;
+ else if (val < -43)
+ return 127;
+
+ tmp = val;
+ tmp = -12 - tmp;
+ tmp <<= 2;
+
+ return (unsigned char) tmp;
+}
+#endif
+
+static void
+wi_readpower(const char *iface)
+{
+ struct wi_req wreq;
+
+ printf("reading power\n");
+
+ wreq.wi_type = WI_RID_MIF;
+ wreq.wi_val[0] = WI_HFA386X_CR_MANUAL_TX_POWER;
+ wreq.wi_len = 1 + 1;
+
+ wi_getval(iface, &wreq);
+ printf("Value returned was 0x%x or %d dBm\n", wreq.wi_val[0],
+ wi_txpower_to_dBm(wreq.wi_val[0]));
+}
+
+static void
+wi_writepower(const char *iface, int power)
+{
+ struct wi_req wreq;
+
+ wreq.wi_type = WI_RID_MIF;
+ wreq.wi_val[0] = WI_HFA386X_CR_MANUAL_TX_POWER;
+ wreq.wi_val[1] = power;
+ wreq.wi_len = 1 + 1 + 1;
+ wi_setval(iface, &wreq);
+
+ wreq.wi_type = WI_DEBUG_CONFBITS;
+ wreq.wi_val[0] = 0;
+ wreq.wi_val[1] = 0x8;
+ wreq.wi_len = 1 + 1 + 1;
+ wi_setdebug(iface, &wreq);
+
+}
+
+/* TX Power patch end */
+
int
main(int argc, char *argv[])
{
@@ -1097,8 +1226,20 @@
opterr = 1;
while((ch = getopt(argc, argv,
- "a:c:d:e:f:hi:k:lm:n:op:q:r:s:t:v:CF:LP:QS:T:Z")) != -1) {
+ /* Patched ARGS for tx power (AB added) */
+ /* old: "a:c:d:e:f:hi:k:lm:n:op:q:r:s:t:v:CF:LP:QS:T:Z")) != -1) { */
+ "a:c:d:e:f:hi:k:lm:n:op:q:r:s:t:v:AB:CF:LP:QS:T:Z")) != -1) {
switch(ch) {
+ /* TX Power patch */
+ case 'A':
+ wi_readpower(iface);
+ exit(0);
+ break;
+ case 'B':
+ wi_writepower(iface, atoi(optarg));
+ exit(0);
+ break;
+ /* TX Power patch end */
case 'Z':
#ifdef WICACHE
wi_zerocache(iface);
More information about the freebsd-current
mailing list