diff options
Diffstat (limited to 'net/mac80211/cfg.c')
-rw-r--r-- | net/mac80211/cfg.c | 36 |
1 files changed, 22 insertions, 14 deletions
diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c index 8c35418d1c96..f07c4abefe56 100644 --- a/net/mac80211/cfg.c +++ b/net/mac80211/cfg.c | |||
@@ -1399,15 +1399,25 @@ static int ieee80211_set_bitrate_mask(struct wiphy *wiphy, | |||
1399 | { | 1399 | { |
1400 | struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); | 1400 | struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); |
1401 | struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr); | 1401 | struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr); |
1402 | int i, err = -EINVAL; | 1402 | int i; |
1403 | u32 target_rate; | 1403 | u32 target_rate; |
1404 | struct ieee80211_supported_band *sband; | 1404 | struct ieee80211_supported_band *sband; |
1405 | 1405 | ||
1406 | /* | ||
1407 | * This _could_ be supported by providing a hook for | ||
1408 | * drivers for this function, but at this point it | ||
1409 | * doesn't seem worth bothering. | ||
1410 | */ | ||
1411 | if (local->hw.flags & IEEE80211_HW_HAS_RATE_CONTROL) | ||
1412 | return -EOPNOTSUPP; | ||
1413 | |||
1406 | sband = local->hw.wiphy->bands[local->hw.conf.channel->band]; | 1414 | sband = local->hw.wiphy->bands[local->hw.conf.channel->band]; |
1407 | 1415 | ||
1408 | /* target_rate = -1, rate->fixed = 0 means auto only, so use all rates | 1416 | /* |
1417 | * target_rate = -1, rate->fixed = 0 means auto only, so use all rates | ||
1409 | * target_rate = X, rate->fixed = 1 means only rate X | 1418 | * target_rate = X, rate->fixed = 1 means only rate X |
1410 | * target_rate = X, rate->fixed = 0 means all rates <= X */ | 1419 | * target_rate = X, rate->fixed = 0 means all rates <= X |
1420 | */ | ||
1411 | sdata->max_ratectrl_rateidx = -1; | 1421 | sdata->max_ratectrl_rateidx = -1; |
1412 | sdata->force_unicast_rateidx = -1; | 1422 | sdata->force_unicast_rateidx = -1; |
1413 | 1423 | ||
@@ -1418,20 +1428,18 @@ static int ieee80211_set_bitrate_mask(struct wiphy *wiphy, | |||
1418 | else | 1428 | else |
1419 | return 0; | 1429 | return 0; |
1420 | 1430 | ||
1421 | for (i=0; i< sband->n_bitrates; i++) { | 1431 | for (i = 0; i< sband->n_bitrates; i++) { |
1422 | struct ieee80211_rate *brate = &sband->bitrates[i]; | 1432 | if (target_rate != sband->bitrates[i].bitrate) |
1423 | int this_rate = brate->bitrate; | 1433 | continue; |
1424 | 1434 | ||
1425 | if (target_rate == this_rate) { | 1435 | /* requested bitrate found */ |
1426 | sdata->max_ratectrl_rateidx = i; | 1436 | sdata->max_ratectrl_rateidx = i; |
1427 | if (mask->fixed) | 1437 | if (mask->fixed) |
1428 | sdata->force_unicast_rateidx = i; | 1438 | sdata->force_unicast_rateidx = i; |
1429 | err = 0; | 1439 | return 0; |
1430 | break; | ||
1431 | } | ||
1432 | } | 1440 | } |
1433 | 1441 | ||
1434 | return err; | 1442 | return -EINVAL; |
1435 | } | 1443 | } |
1436 | 1444 | ||
1437 | struct cfg80211_ops mac80211_config_ops = { | 1445 | struct cfg80211_ops mac80211_config_ops = { |