case REGDOM_SET_BY_INIT:
                return -EINVAL;
        case REGDOM_SET_BY_CORE:
-               /*
-                * Always respect new wireless core hints, should only happen
-                * when updating the world regulatory domain at init.
-                */
-               return 0;
+               return -EINVAL;
        case REGDOM_SET_BY_COUNTRY_IE:
                if (unlikely(!is_an_alpha2(alpha2)))
                        return -EINVAL;
        return call_crda(alpha2);
 }
 
+static int regulatory_hint_core(const char *alpha2)
+{
+       struct regulatory_request *request;
+
+       BUG_ON(last_request);
+
+       request = kzalloc(sizeof(struct regulatory_request),
+                         GFP_KERNEL);
+       if (!request)
+               return -ENOMEM;
+
+       request->alpha2[0] = alpha2[0];
+       request->alpha2[1] = alpha2[1];
+       request->initiator = REGDOM_SET_BY_CORE;
+
+       last_request = request;
+
+       return call_crda(alpha2);
+}
+
 void regulatory_hint(struct wiphy *wiphy, const char *alpha2)
 {
        int r;
         * stuck with the static values. We ignore "EU" code as
         * that is not a valid ISO / IEC 3166 alpha2 */
        if (ieee80211_regdom[0] != 'E' || ieee80211_regdom[1] != 'U')
-               err = __regulatory_hint(NULL, REGDOM_SET_BY_CORE,
-                                       ieee80211_regdom, 0, ENVIRON_ANY);
+               err = regulatory_hint_core(ieee80211_regdom);
 #else
        cfg80211_regdomain = cfg80211_world_regdom;
 
-       err = __regulatory_hint(NULL, REGDOM_SET_BY_CORE, "00", 0, ENVIRON_ANY);
-       if (err)
+       err = regulatory_hint_core("00");
+       if (err) {
                printk(KERN_ERR "cfg80211: calling CRDA failed - "
                       "unable to update world regulatory domain, "
                       "using static definition\n");
+       }
 #endif
 
        return 0;