diff options
-rw-r--r-- | include/net/wireless.h | 7 | ||||
-rw-r--r-- | net/wireless/reg.c | 13 |
2 files changed, 19 insertions, 1 deletions
diff --git a/include/net/wireless.h b/include/net/wireless.h index c85fa0ea5c51..21c5d966142d 100644 --- a/include/net/wireless.h +++ b/include/net/wireless.h | |||
@@ -181,6 +181,11 @@ struct ieee80211_supported_band { | |||
181 | * struct wiphy - wireless hardware description | 181 | * struct wiphy - wireless hardware description |
182 | * @idx: the wiphy index assigned to this item | 182 | * @idx: the wiphy index assigned to this item |
183 | * @class_dev: the class device representing /sys/class/ieee80211/<wiphy-name> | 183 | * @class_dev: the class device representing /sys/class/ieee80211/<wiphy-name> |
184 | * @fw_handles_regulatory: tells us the firmware for this device | ||
185 | * has its own regulatory solution and cannot identify the | ||
186 | * ISO / IEC 3166 alpha2 it belongs to. When this is enabled | ||
187 | * we will disregard the first regulatory hint (when the | ||
188 | * initiator is %REGDOM_SET_BY_CORE). | ||
184 | * @reg_notifier: the driver's regulatory notification callback | 189 | * @reg_notifier: the driver's regulatory notification callback |
185 | */ | 190 | */ |
186 | struct wiphy { | 191 | struct wiphy { |
@@ -192,6 +197,8 @@ struct wiphy { | |||
192 | /* Supported interface modes, OR together BIT(NL80211_IFTYPE_...) */ | 197 | /* Supported interface modes, OR together BIT(NL80211_IFTYPE_...) */ |
193 | u16 interface_modes; | 198 | u16 interface_modes; |
194 | 199 | ||
200 | bool fw_handles_regulatory; | ||
201 | |||
195 | /* If multiple wiphys are registered and you're handed e.g. | 202 | /* If multiple wiphys are registered and you're handed e.g. |
196 | * a regular netdev with assigned ieee80211_ptr, you won't | 203 | * a regular netdev with assigned ieee80211_ptr, you won't |
197 | * know whether it points to a wiphy your driver has registered | 204 | * know whether it points to a wiphy your driver has registered |
diff --git a/net/wireless/reg.c b/net/wireless/reg.c index 4dab993ea488..0990059f7e48 100644 --- a/net/wireless/reg.c +++ b/net/wireless/reg.c | |||
@@ -816,12 +816,23 @@ static void handle_band(struct ieee80211_supported_band *sband) | |||
816 | handle_channel(&sband->channels[i]); | 816 | handle_channel(&sband->channels[i]); |
817 | } | 817 | } |
818 | 818 | ||
819 | static bool ignore_reg_update(struct wiphy *wiphy, enum reg_set_by setby) | ||
820 | { | ||
821 | if (!last_request) | ||
822 | return true; | ||
823 | if (setby == REGDOM_SET_BY_CORE && | ||
824 | wiphy->fw_handles_regulatory) | ||
825 | return true; | ||
826 | return false; | ||
827 | } | ||
828 | |||
819 | static void update_all_wiphy_regulatory(enum reg_set_by setby) | 829 | static void update_all_wiphy_regulatory(enum reg_set_by setby) |
820 | { | 830 | { |
821 | struct cfg80211_registered_device *drv; | 831 | struct cfg80211_registered_device *drv; |
822 | 832 | ||
823 | list_for_each_entry(drv, &cfg80211_drv_list, list) | 833 | list_for_each_entry(drv, &cfg80211_drv_list, list) |
824 | wiphy_update_regulatory(&drv->wiphy, setby); | 834 | if (!ignore_reg_update(&drv->wiphy, setby)) |
835 | wiphy_update_regulatory(&drv->wiphy, setby); | ||
825 | } | 836 | } |
826 | 837 | ||
827 | void wiphy_update_regulatory(struct wiphy *wiphy, enum reg_set_by setby) | 838 | void wiphy_update_regulatory(struct wiphy *wiphy, enum reg_set_by setby) |