int r;
        char *data = NULL;
 
-       if (!info->attrs[NL80211_ATTR_REG_ALPHA2])
-               return -EINVAL;
+       /*
+        * You should only get this when cfg80211 hasn't yet initialized
+        * completely when built-in to the kernel right between the time
+        * window between nl80211_init() and regulatory_init(), if that is
+        * even possible.
+        */
+       mutex_lock(&cfg80211_mutex);
+       if (unlikely(!cfg80211_regdomain)) {
+               r = -EINPROGRESS;
+               goto out;
+       }
+
+       if (!info->attrs[NL80211_ATTR_REG_ALPHA2]) {
+               r = -EINVAL;
+               goto out;
+       }
 
        data = nla_data(info->attrs[NL80211_ATTR_REG_ALPHA2]);
 
 #ifdef CONFIG_WIRELESS_OLD_REGULATORY
        /* We ignore world regdom requests with the old regdom setup */
-       if (is_world_regdom(data))
-               return -EINVAL;
+       if (is_world_regdom(data)) {
+               r = -EINVAL;
+               goto out;
+       }
 #endif
-       mutex_lock(&cfg80211_mutex);
        r = __regulatory_hint(NULL, REGDOM_SET_BY_USER, data, 0, ENVIRON_ANY);
-       mutex_unlock(&cfg80211_mutex);
-       /* This means the regulatory domain was already set, however
+       /*
+        * This means the regulatory domain was already set, however
         * we don't want to confuse userspace with a "successful error"
-        * message so lets just treat it as a success */
+        * message so lets just treat it as a success
+        */
        if (r == -EALREADY)
                r = 0;
+out:
+       mutex_unlock(&cfg80211_mutex);
        return r;
 }