Show
Ignore:
Timestamp:
09/17/07 18:34:10 (5 years ago)
Author:
mentor
Message:

The aforementioned patch. It currently does no work, and I can no longer remember where I was going with it. I think I needed to add some logic for fiddling TX power on channel change at least.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • branches/madwifi-ng-txpower/net80211/ieee80211_wireless.c

    r2659 r2711  
    749749#endif 
    750750        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) { 
    753753                /* Monitor and wds modes can switch directly. */ 
    754                 ic->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) 
    756756                        ic->ic_set_channel(ic); 
    757                 } 
    758         } else if(vap->iv_opmode == IEEE80211_M_HOSTAP) { 
     757        } else if (vap->iv_opmode == IEEE80211_M_HOSTAP) { 
    759758                /* Need to use channel switch announcement on beacon if we are  
    760759                 * up and running.  We use ic_set_channel directly if we are  
    761760                 * "running" but not "up".  Otherwise, iv_des_chan will take 
    762761                 * 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); 
    766766                else if (vap->iv_state == IEEE80211_S_RUN) { 
    767                         ic->ic_curchan = vap->iv_des_chan
     767                        ieee80211_set_channel(vap->iv_des_chan)
    768768                        ic->ic_set_channel(ic); 
    769769                } 
     
    905905        struct ieee80211_rateset *rs; 
    906906        u_int8_t reported[IEEE80211_CHAN_BYTES];        /* XXX stack usage? */ 
    907         int i, r; 
    908         int step = 0; 
     907        int i, r, maxtxpow; 
    909908 
    910909        data->length = sizeof(struct iw_range); 
     
    912911 
    913912        /* 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; 
    916916 
    917917        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)); 
    921922 
    922923        range->txpower_capa = IW_TXPOW_DBM; 
     
    935936 
    936937        range->we_version_compiled = WIRELESS_EXT; 
    937         range->we_version_source = 18
     938        range->we_version_source = 21
    938939 
    939940        range->retry_capa = IW_RETRY_LIMIT; 
     
    13621363        struct ieee80211vap *vap = dev->priv; 
    13631364        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)) { 
    13721384                        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 
    13831389                        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 
    14111396        return IS_UP(ic->ic_dev) ? ic->ic_reset(ic->ic_dev) : 0; 
    14121397} 
     
    14191404        struct ieee80211com *ic = vap->iv_ic; 
    14201405 
    1421         rrq->value = vap->iv_bss->ni_txpower / 2; 
     1406        rrq->value = vap->iv_txpower / 2; 
    14221407        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)); 
    14241409        rrq->flags = IW_TXPOW_DBM; 
    14251410        return 0; 
     
    24422427                retv = ENETRESET;       /* requires restart */ 
    24432428                break; 
    2444         case IEEE80211_PARAM_PWRTARGET: 
    2445                 ic->ic_curchanmaxpwr = value; 
    2446                 break; 
    24472429        case IEEE80211_PARAM_GENREASSOC: 
    24482430                IEEE80211_SEND_MGMT(vap->iv_bss, IEEE80211_FC0_SUBTYPE_REASSOC_REQ, 0); 
     
    28482830        case IEEE80211_PARAM_SHPREAMBLE: 
    28492831                param[0] = (ic->ic_caps & IEEE80211_C_SHPREAMBLE) != 0; 
    2850                 break; 
    2851         case IEEE80211_PARAM_PWRTARGET: 
    2852                 param[0] = ic->ic_curchanmaxpwr; 
    28532832                break; 
    28542833        case IEEE80211_PARAM_PUREG: 
     
    51335112        { IEEE80211_PARAM_DOTH, 
    51345113          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" }, 
    51395114        { IEEE80211_PARAM_GENREASSOC, 
    51405115          IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "doth_reassoc" },