ath: fix dynamic user regulatory domain support
authorLuis R. Rodriguez <mcgrof@do-not-panic.com>
Tue, 29 Oct 2013 23:10:07 +0000 (00:10 +0100)
committerJohn W. Linville <linville@tuxdriver.com>
Thu, 5 Dec 2013 20:45:51 +0000 (15:45 -0500)
As it stands dynamic user regulatory domain support is
only possible for a few programmed regulatory domains as
a few countries do not allow for this.

The existing code however only would take advantage of
the feature if a custom world regulatory domain is used
though as that's when we clear beconing flags. We need
to lift this restriction as otherwise this feature is
pointless.

Signed-off-by: Luis R. Rodriguez <mcgrof@do-not-panic.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ath/regd.c

index 4a6c232c6c9b177bb2f49baf4a2cc5d8c47bcafe..9e154732afaacfefe661befa0053e881ba083106 100644 (file)
@@ -302,6 +302,7 @@ static void ath_force_no_ir_freq(struct wiphy *wiphy, u16 center_freq)
 
 static void
 __ath_reg_apply_beaconing_flags(struct wiphy *wiphy,
+                               struct ath_regulatory *reg,
                                enum nl80211_reg_initiator initiator,
                                struct ieee80211_channel *ch)
 {
@@ -313,6 +314,10 @@ __ath_reg_apply_beaconing_flags(struct wiphy *wiphy,
        case NL80211_REGDOM_SET_BY_COUNTRY_IE:
                ath_force_clear_no_ir_chan(wiphy, ch);
                break;
+       case NL80211_REGDOM_SET_BY_USER:
+               if (ath_reg_dyn_country_user_allow(reg))
+                       ath_force_clear_no_ir_chan(wiphy, ch);
+               break;
        default:
                if (ch->beacon_found)
                        ch->flags &= ~IEEE80211_CHAN_NO_IR;
@@ -328,6 +333,7 @@ __ath_reg_apply_beaconing_flags(struct wiphy *wiphy,
  */
 static void
 ath_reg_apply_beaconing_flags(struct wiphy *wiphy,
+                             struct ath_regulatory *reg,
                              enum nl80211_reg_initiator initiator)
 {
        enum ieee80211_band band;
@@ -341,8 +347,8 @@ ath_reg_apply_beaconing_flags(struct wiphy *wiphy,
                sband = wiphy->bands[band];
                for (i = 0; i < sband->n_channels; i++) {
                        ch = &sband->channels[i];
-                       __ath_reg_apply_beaconing_flags(wiphy, initiator, ch);
-
+                       __ath_reg_apply_beaconing_flags(wiphy, reg,
+                                                       initiator, ch);
                }
        }
 }
@@ -363,7 +369,8 @@ ath_reg_apply_beaconing_flags(struct wiphy *wiphy,
  */
 static void
 ath_reg_apply_ir_flags(struct wiphy *wiphy,
-                               enum nl80211_reg_initiator initiator)
+                      struct ath_regulatory *reg,
+                      enum nl80211_reg_initiator initiator)
 {
        struct ieee80211_supported_band *sband;
 
@@ -376,6 +383,12 @@ ath_reg_apply_ir_flags(struct wiphy *wiphy,
                ath_force_clear_no_ir_freq(wiphy, 2467);
                ath_force_clear_no_ir_freq(wiphy, 2472);
                break;
+       case NL80211_REGDOM_SET_BY_USER:
+               if (!ath_reg_dyn_country_user_allow(reg))
+                       break;
+               ath_force_clear_no_ir_freq(wiphy, 2467);
+               ath_force_clear_no_ir_freq(wiphy, 2472);
+               break;
        default:
                ath_force_no_ir_freq(wiphy, 2467);
                ath_force_no_ir_freq(wiphy, 2472);
@@ -424,12 +437,15 @@ static void ath_reg_apply_world_flags(struct wiphy *wiphy,
        case 0x66:
        case 0x67:
        case 0x6C:
-               ath_reg_apply_beaconing_flags(wiphy, initiator);
+               ath_reg_apply_beaconing_flags(wiphy, reg, initiator);
                break;
        case 0x68:
-               ath_reg_apply_beaconing_flags(wiphy, initiator);
-               ath_reg_apply_ir_flags(wiphy, initiator);
+               ath_reg_apply_beaconing_flags(wiphy, reg, initiator);
+               ath_reg_apply_ir_flags(wiphy, reg, initiator);
                break;
+       default:
+               if (ath_reg_dyn_country_user_allow(reg))
+                       ath_reg_apply_beaconing_flags(wiphy, reg, initiator);
        }
 }