if (!sta)
                return -ENOMEM;
 
-       /*
-        * defaults -- if userspace wants something else we'll
-        * change it accordingly in sta_apply_parameters()
-        */
-       if (!(params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) &&
-           !(params->sta_flags_set & (BIT(NL80211_STA_FLAG_AUTHENTICATED) |
-                                       BIT(NL80211_STA_FLAG_ASSOCIATED)))) {
-               sta_info_pre_move_state(sta, IEEE80211_STA_AUTH);
-               sta_info_pre_move_state(sta, IEEE80211_STA_ASSOC);
-       }
        if (params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER))
                sta->sta.tdls = true;
 
 
        struct net_device *dev = info->user_ptr[1];
        struct station_parameters params;
        u8 *mac_addr = NULL;
+       u32 auth_assoc = BIT(NL80211_STA_FLAG_AUTHENTICATED) |
+                        BIT(NL80211_STA_FLAG_ASSOCIATED);
 
        memset(¶ms, 0, sizeof(params));
 
                /* allow authenticated/associated only if driver handles it */
                if (!(rdev->wiphy.features &
                                NL80211_FEATURE_FULL_AP_CLIENT_STATE) &&
-                   params.sta_flags_mask &
-                               (BIT(NL80211_STA_FLAG_AUTHENTICATED) |
-                                BIT(NL80211_STA_FLAG_ASSOCIATED)))
-                       return -EINVAL;
+                   params.sta_flags_mask & auth_assoc)
+                       return -EINVAL;
+
+               /* Older userspace, or userspace wanting to be compatible with
+                * !NL80211_FEATURE_FULL_AP_CLIENT_STATE, will not set the auth
+                * and assoc flags in the mask, but assumes the station will be
+                * added as associated anyway since this was the required driver
+                * behaviour before NL80211_FEATURE_FULL_AP_CLIENT_STATE was
+                * introduced.
+                * In order to not bother drivers with this quirk in the API
+                * set the flags in both the mask and set for new stations in
+                * this case.
+                */
+               if (!(params.sta_flags_mask & auth_assoc)) {
+                       params.sta_flags_mask |= auth_assoc;
+                       params.sta_flags_set |= auth_assoc;
+               }
 
                /* must be last in here for error handling */
                params.vlan = get_vlan(info, rdev);