summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohannes Berg <johannes@sipsolutions.net>2009-12-04 09:26:38 +0100
committerJohn W. Linville <linville@tuxdriver.com>2009-12-22 19:46:28 +0100
commit2c7e6bc9ac7cb518cf037495932d80f71a1596f2 (patch)
tree99a83d89eccb9dc9d1f3cf2d2e628812f83b7671
parentiwmc3200wifi: Avoid an offset calculation for each management frame. (diff)
downloadlinux-2c7e6bc9ac7cb518cf037495932d80f71a1596f2.tar.xz
linux-2c7e6bc9ac7cb518cf037495932d80f71a1596f2.zip
mac80211: disallow fixing bitrates with hw rate control
When hw rate control is used, these parameters have no meaning because the hardware cannot get at them right now, so disallow setting them. Also clean up the function a bit. Signed-off-by: Johannes Berg <johannes@sipsolutions.net> Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r--net/mac80211/cfg.c36
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,
{
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
- int i, err = -EINVAL;
+ int i;
u32 target_rate;
struct ieee80211_supported_band *sband;
+ /*
+ * This _could_ be supported by providing a hook for
+ * drivers for this function, but at this point it
+ * doesn't seem worth bothering.
+ */
+ if (local->hw.flags & IEEE80211_HW_HAS_RATE_CONTROL)
+ return -EOPNOTSUPP;
+
sband = local->hw.wiphy->bands[local->hw.conf.channel->band];
- /* target_rate = -1, rate->fixed = 0 means auto only, so use all rates
+ /*
+ * target_rate = -1, rate->fixed = 0 means auto only, so use all rates
* target_rate = X, rate->fixed = 1 means only rate X
- * target_rate = X, rate->fixed = 0 means all rates <= X */
+ * target_rate = X, rate->fixed = 0 means all rates <= X
+ */
sdata->max_ratectrl_rateidx = -1;
sdata->force_unicast_rateidx = -1;
@@ -1418,20 +1428,18 @@ static int ieee80211_set_bitrate_mask(struct wiphy *wiphy,
else
return 0;
- for (i=0; i< sband->n_bitrates; i++) {
- struct ieee80211_rate *brate = &sband->bitrates[i];
- int this_rate = brate->bitrate;
+ for (i = 0; i< sband->n_bitrates; i++) {
+ if (target_rate != sband->bitrates[i].bitrate)
+ continue;
- if (target_rate == this_rate) {
- sdata->max_ratectrl_rateidx = i;
- if (mask->fixed)
- sdata->force_unicast_rateidx = i;
- err = 0;
- break;
- }
+ /* requested bitrate found */
+ sdata->max_ratectrl_rateidx = i;
+ if (mask->fixed)
+ sdata->force_unicast_rateidx = i;
+ return 0;
}
- return err;
+ return -EINVAL;
}
struct cfg80211_ops mac80211_config_ops = {