- Timestamp:
- 09/17/07 18:34:10 (5 years ago)
- Files:
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
branches/madwifi-ng-txpower/net80211/ieee80211_wireless.c
r2659 r2711 749 749 #endif 750 750 if ((vap->iv_opmode == IEEE80211_M_MONITOR || 751 vap->iv_opmode == IEEE80211_M_WDS) &&752 vap->iv_des_chan != IEEE80211_CHAN_ANYC) {751 vap->iv_opmode == IEEE80211_M_WDS) && 752 vap->iv_des_chan != IEEE80211_CHAN_ANYC) { 753 753 /* Monitor and wds modes can switch directly. */ 754 i c->ic_curchan = vap->iv_des_chan;755 if (vap->iv_state == IEEE80211_S_RUN) {754 ieee80211_set_channel(ic, vap->iv_des_chan); 755 if (vap->iv_state == IEEE80211_S_RUN) 756 756 ic->ic_set_channel(ic); 757 } 758 } else if(vap->iv_opmode == IEEE80211_M_HOSTAP) { 757 } else if (vap->iv_opmode == IEEE80211_M_HOSTAP) { 759 758 /* Need to use channel switch announcement on beacon if we are 760 759 * up and running. We use ic_set_channel directly if we are 761 760 * "running" but not "up". Otherwise, iv_des_chan will take 762 761 * effect when we are transitioned to RUN state later. */ 763 if(IS_UP(vap->iv_dev)) { 764 pre_announced_chanswitch(dev, ieee80211_chan2ieee(ic, vap->iv_des_chan), IEEE80211_DEFAULT_CHANCHANGE_TBTT_COUNT); 765 } 762 if (IS_UP(vap->iv_dev)) 763 pre_announced_chanswitch(dev, 764 ieee80211_chan2ieee(ic, vap->iv_des_chan), 765 IEEE80211_DEFAULT_CHANCHANGE_TBTT_COUNT); 766 766 else if (vap->iv_state == IEEE80211_S_RUN) { 767 i c->ic_curchan = vap->iv_des_chan;767 ieee80211_set_channel(vap->iv_des_chan); 768 768 ic->ic_set_channel(ic); 769 769 } … … 905 905 struct ieee80211_rateset *rs; 906 906 u_int8_t reported[IEEE80211_CHAN_BYTES]; /* XXX stack usage? */ 907 int i, r; 908 int step = 0; 907 int i, r, maxtxpow; 909 908 910 909 data->length = sizeof(struct iw_range); … … 912 911 913 912 /* txpower (128 values, but will print out only IW_MAX_TXPOWER) */ 914 range->num_txpower = (ic->ic_txpowlimit >= 8) ? IW_MAX_TXPOWER : ic->ic_txpowlimit; 915 step = ic->ic_txpowlimit / (2 * (IW_MAX_TXPOWER - 1)); 913 range->num_txpower = IW_MAX_TXPOWER; 914 maxtxpow = (ic->ic_bsschan == IEEE80211_CHAN_ANYC) ? 915 IEEE80211_TXPOWER_MAX : ic->ic_bsschan->ic_maxpower; 916 916 917 917 range->txpower[0] = 0; 918 for (i = 1; i < IW_MAX_TXPOWER; i++) 919 range->txpower[i] = (ic->ic_txpowlimit/2) 920 - (IW_MAX_TXPOWER - i - 1) * step; 918 range->txpower[IW_MAX_TXPOWER - 1] = maxtxpow; 919 for (i = 1; i < (IW_MAX_TXPOWER - 1); i++) 920 range->txpower[i] = i * (maxtxpow 921 / (IW_MAX_TXPOWER - 1)); 921 922 922 923 range->txpower_capa = IW_TXPOW_DBM; … … 935 936 936 937 range->we_version_compiled = WIRELESS_EXT; 937 range->we_version_source = 18;938 range->we_version_source = 21; 938 939 939 940 range->retry_capa = IW_RETRY_LIMIT; … … 1362 1363 struct ieee80211vap *vap = dev->priv; 1363 1364 struct ieee80211com *ic = vap->iv_ic; 1364 int fixed, disabled; 1365 1366 fixed = (ic->ic_flags & IEEE80211_F_TXPOW_FIXED); 1367 disabled = (fixed && vap->iv_bss->ni_txpower == 0); 1368 if (rrq->disabled) { 1369 if (!disabled) { 1370 if ((ic->ic_caps & IEEE80211_C_TXPMGT) == 0) 1371 return -EOPNOTSUPP; 1365 int fixed, halfdbm; 1366 1367 if ((ic->ic_caps & IEEE80211_C_TXPMGT) == 0) 1368 return -EOPNOTSUPP; 1369 1370 fixed = (ic->ic_flags & IEEE80211_F_TXPOW_FIXED); 1371 if (rrq->disabled) { 1372 if (fixed && (vap->iv_txpower == 0)) /* No change */ 1373 return 0; 1374 ic->ic_flags |= IEEE80211_F_TXPOW_FIXED; 1375 vap->iv_txpower = 0; 1376 } else if (rrq->fixed) { 1377 if (rrq->flags != IW_TXPOW_DBM) 1378 return -EOPNOTSUPP; 1379 1380 /* Set 'halfdbm' to requested TX power in 0.5 dBm units */ 1381 halfdbm = 2 * rrq->value; 1382 if (!(ic->ic_bsschan != IEEE80211_CHAN_ANYC) || 1383 (ic->ic_bsschan->ic_maxpower >= rrq->value)) { 1372 1384 ic->ic_flags |= IEEE80211_F_TXPOW_FIXED; 1373 vap->iv_bss->ni_txpower = 0; 1374 goto done; 1375 } 1376 return 0; 1377 } 1378 1379 if (rrq->fixed) { 1380 if ((ic->ic_caps & IEEE80211_C_TXPMGT) == 0) 1381 return -EOPNOTSUPP; 1382 if (rrq->flags != IW_TXPOW_DBM) 1385 1386 vap->iv_txpower = halfdbm; 1387 ic->ic_set_txpow(ic, halfdbm); 1388 } else 1383 1389 return -EINVAL; 1384 if (ic->ic_bsschan != IEEE80211_CHAN_ANYC) { 1385 if ((ic->ic_bsschan->ic_maxregpower >= rrq->value) && 1386 (ic->ic_txpowlimit/2 >= rrq->value)) { 1387 vap->iv_bss->ni_txpower = 2 * rrq->value; 1388 ic->ic_newtxpowlimit = 2 * rrq->value; 1389 ic->ic_flags |= IEEE80211_F_TXPOW_FIXED; 1390 } else 1391 return -EINVAL; 1392 } else { 1393 /* 1394 * No channel set yet 1395 */ 1396 if (ic->ic_txpowlimit/2 >= rrq->value) { 1397 vap->iv_bss->ni_txpower = 2 * rrq->value; 1398 ic->ic_newtxpowlimit = 2 * rrq->value; 1399 ic->ic_flags |= IEEE80211_F_TXPOW_FIXED; 1400 } 1401 else 1402 return -EINVAL; 1403 } 1404 } else { 1405 if (!fixed) /* no change */ 1406 return 0; 1407 ic->ic_newtxpowlimit = IEEE80211_TXPOWER_MAX; 1408 ic->ic_flags &= ~IEEE80211_F_TXPOW_FIXED; 1409 } 1410 done: 1390 } else { 1391 if (!fixed) /* no change */ 1392 return 0; 1393 ic->ic_flags &= ~IEEE80211_F_TXPOW_FIXED; 1394 } 1395 1411 1396 return IS_UP(ic->ic_dev) ? ic->ic_reset(ic->ic_dev) : 0; 1412 1397 } … … 1419 1404 struct ieee80211com *ic = vap->iv_ic; 1420 1405 1421 rrq->value = vap->iv_ bss->ni_txpower / 2;1406 rrq->value = vap->iv_txpower / 2; 1422 1407 rrq->fixed = (ic->ic_flags & IEEE80211_F_TXPOW_FIXED) != 0; 1423 rrq->disabled = (rrq->fixed && rrq->value == 0);1408 rrq->disabled = (rrq->fixed && (rrq->value == 0)); 1424 1409 rrq->flags = IW_TXPOW_DBM; 1425 1410 return 0; … … 2442 2427 retv = ENETRESET; /* requires restart */ 2443 2428 break; 2444 case IEEE80211_PARAM_PWRTARGET:2445 ic->ic_curchanmaxpwr = value;2446 break;2447 2429 case IEEE80211_PARAM_GENREASSOC: 2448 2430 IEEE80211_SEND_MGMT(vap->iv_bss, IEEE80211_FC0_SUBTYPE_REASSOC_REQ, 0); … … 2848 2830 case IEEE80211_PARAM_SHPREAMBLE: 2849 2831 param[0] = (ic->ic_caps & IEEE80211_C_SHPREAMBLE) != 0; 2850 break;2851 case IEEE80211_PARAM_PWRTARGET:2852 param[0] = ic->ic_curchanmaxpwr;2853 2832 break; 2854 2833 case IEEE80211_PARAM_PUREG: … … 5133 5112 { IEEE80211_PARAM_DOTH, 5134 5113 0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "get_doth" }, 5135 { IEEE80211_PARAM_PWRTARGET,5136 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "doth_pwrtgt" },5137 { IEEE80211_PARAM_PWRTARGET,5138 0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "get_doth_pwrtgt" },5139 5114 { IEEE80211_PARAM_GENREASSOC, 5140 5115 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "doth_reassoc" },
