}
 
        if (params->vlan && params->vlan != sta->sdata->dev) {
+               bool prev_4addr = false;
+               bool new_4addr = false;
+
                vlansdata = IEEE80211_DEV_TO_SUB_IF(params->vlan);
 
                if (vlansdata->vif.type != NL80211_IFTYPE_AP_VLAN &&
                        }
 
                        rcu_assign_pointer(vlansdata->u.vlan.sta, sta);
+                       new_4addr = true;
+               }
+
+               if (sta->sdata->vif.type == NL80211_IFTYPE_AP_VLAN &&
+                   sta->sdata->u.vlan.sta) {
+                       rcu_assign_pointer(sta->sdata->u.vlan.sta, NULL);
+                       prev_4addr = true;
                }
 
                sta->sdata = vlansdata;
+
+               if (sta->sta_state == IEEE80211_STA_AUTHORIZED &&
+                   prev_4addr != new_4addr) {
+                       if (new_4addr)
+                               atomic_dec(&sta->sdata->bss->num_mcast_sta);
+                       else
+                               atomic_inc(&sta->sdata->bss->num_mcast_sta);
+               }
+
                ieee80211_send_layer2_update(sta);
        }
 
 
                if (sta->sta_state == IEEE80211_STA_AUTH) {
                        set_bit(WLAN_STA_ASSOC, &sta->_flags);
                } else if (sta->sta_state == IEEE80211_STA_AUTHORIZED) {
-                       if (sta->sdata->vif.type == NL80211_IFTYPE_AP)
-                               atomic_dec(&sta->sdata->u.ap.num_mcast_sta);
+                       if (sta->sdata->vif.type == NL80211_IFTYPE_AP ||
+                           (sta->sdata->vif.type == NL80211_IFTYPE_AP_VLAN &&
+                            !sta->sdata->u.vlan.sta))
+                               atomic_dec(&sta->sdata->bss->num_mcast_sta);
                        clear_bit(WLAN_STA_AUTHORIZED, &sta->_flags);
                }
                break;
        case IEEE80211_STA_AUTHORIZED:
                if (sta->sta_state == IEEE80211_STA_ASSOC) {
-                       if (sta->sdata->vif.type == NL80211_IFTYPE_AP)
-                               atomic_inc(&sta->sdata->u.ap.num_mcast_sta);
+                       if (sta->sdata->vif.type == NL80211_IFTYPE_AP ||
+                           (sta->sdata->vif.type == NL80211_IFTYPE_AP_VLAN &&
+                            !sta->sdata->u.vlan.sta))
+                               atomic_inc(&sta->sdata->bss->num_mcast_sta);
                        set_bit(WLAN_STA_AUTHORIZED, &sta->_flags);
                }
                break;