}
 
 static int sta_link_apply_parameters(struct ieee80211_local *local,
-                                    struct sta_info *sta,
+                                    struct sta_info *sta, bool new_link,
                                     struct link_station_parameters *params)
 {
        int ret = 0;
                return -EINVAL;
 
        if (params->link_mac) {
-               memcpy(link_sta->addr, params->link_mac, ETH_ALEN);
-               memcpy(link_sta->pub->addr, params->link_mac, ETH_ALEN);
+               if (new_link) {
+                       memcpy(link_sta->addr, params->link_mac, ETH_ALEN);
+                       memcpy(link_sta->pub->addr, params->link_mac, ETH_ALEN);
+               } else if (!ether_addr_equal(link_sta->addr,
+                                            params->link_mac)) {
+                       return -EINVAL;
+               }
        }
 
        if (params->txpwr_set) {
        if (params->listen_interval >= 0)
                sta->listen_interval = params->listen_interval;
 
-       ret = sta_link_apply_parameters(local, sta, ¶ms->link_sta_params);
+       ret = sta_link_apply_parameters(local, sta, false,
+                                       ¶ms->link_sta_params);
        if (ret)
                return ret;
 
        if (ret)
                return ret;
 
-       ret = sta_link_apply_parameters(local, sta, params);
+       ret = sta_link_apply_parameters(local, sta, true, params);
        if (ret) {
                ieee80211_sta_free_link(sta, params->link_id);
                return ret;
        if (!(sta->sta.valid_links & BIT(params->link_id)))
                return -EINVAL;
 
-       return sta_link_apply_parameters(local, sta, params);
+       return sta_link_apply_parameters(local, sta, false, params);
 }
 
 static int