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 --- usr.sbin/wicontrol/wicontrol.c Tue Sep 30 00:55:25 2003 +++ usr.sbin/wicontrol/wicontrol.c Tue Sep 30 12:54:26 2003 _at__at_ -1070,6 +1070,135 _at__at_ 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[]) { _at__at_ -1097,8 +1226,20 _at__at_ 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);Received on Tue Sep 30 2003 - 03:55:21 UTC
This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:37:24 UTC