mac80211: disallow fixing bitrates with hw rate control
Johannes Berg [Fri, 4 Dec 2009 08:26:38 +0000 (09:26 +0100)]
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>

net/mac80211/cfg.c

index 8c35418..f07c4ab 100644 (file)
@@ -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 = {