On 11/06/15 13:44, Johannes Berg wrote:
On Thu, 2015-06-11 at 13:06 +0200, Matthias May wrote:

  const struct ieee80211_reg_rule *freq_reg_info(struct wiphy *wiphy,
-                                              u32 center_freq)
+                                              u32 center_freq, u32 min_bw)
  {
        const struct ieee80211_regdomain *regd;
+       const struct ieee80211_reg_rule *rr_tmp = NULL;
+       const struct ieee80211_reg_rule *reg_rule = NULL;
+       u32 bw;
regd = reg_get_regdomain(wiphy); - return freq_reg_info_regd(wiphy, center_freq, regd);
+       for(bw=min_bw; bw <= MHZ_TO_KHZ(20); bw=bw*2) {
+               rr_tmp = freq_reg_info_regd(wiphy, center_freq, bw, regd);
+               if(!reg_rule || !IS_ERR(rr_tmp))
+                       reg_rule = rr_tmp;
+       }
+
+       return reg_rule;
This makes no sense to me.

You have the same code below, but why would you care? You can just look
at the reg_rule's max_bandwidth, no?

johannes

Using the dummy country code:
country XS: DFS-UNSET
    (5170 - 5180 @ 5), (N/A, 14), (N/A)
    (5175 - 5185 @ 10), (N/A, 17), (N/A)
    (5170 - 5190 @ 20), (N/A, 20), (N/A)

For a center freq of 5175
The first loop finds the first rule. --> we want this.
The second loop doesn't find anything.
The third loop doesn't find anything.

However for a center freq of 5180
The first loop find the first rule
The second loop find the second rule
The third loop find the third rule. --> We want this

If there are different overlapping rules for the different bandwidths different results can be returned, especially at the border of a frequency range.

A work colleague pointed out that it could be done more efficiently:

        const struct ieee80211_regdomain *regd;
        const struct ieee80211_reg_rule *reg_rule = NULL;
        u32 bw;
regd = reg_get_regdomain(wiphy); for (bw = MHZ_TO_KHZ(20); bw >= min_bw; bw = bw / 2) {
                reg_rule = freq_reg_info_regd(wiphy, center_freq, bw, regd);
                if (!IS_ERR(reg_rule))
                        return reg_rule;
        }

        return reg_rule;

However after some more discussion we noticed, that this again would allow to start 20MHz wide operation at the border This is because when setting the flags we only look at the max_bandwidth of the returned rule. I guess we would have to recheck if a certain width fits a center freq when setting this flags.

Will have to think a bit more how to solve this without having to recheck everything again...

Matthias
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to