rtl8xxxu_write8(priv, REG_RSV_CTRL, val8);
 }
 
+static u8 rtl8xxxu_acquire_macid(struct rtl8xxxu_priv *priv)
+{
+       u8 macid;
+
+       macid = find_first_zero_bit(priv->mac_id_map, RTL8XXXU_MAX_MAC_ID_NUM);
+       if (macid < RTL8XXXU_MAX_MAC_ID_NUM)
+               set_bit(macid, priv->mac_id_map);
+
+       return macid;
+}
+
+static void rtl8xxxu_release_macid(struct rtl8xxxu_priv *priv, u8 macid)
+{
+       clear_bit(macid, priv->mac_id_map);
+}
+
 static int rtl8xxxu_init_device(struct ieee80211_hw *hw)
 {
        struct rtl8xxxu_priv *priv = hw->priv;
        if (priv->rtl_chip == RTL8188E)
                rtl8188e_ra_info_init_all(&priv->ra_info);
 
+       set_bit(RTL8XXXU_BC_MC_MACID, priv->mac_id_map);
+
 exit:
        return ret;
 }
        rtl8xxxu_free_tx_resources(priv);
 }
 
+static int rtl8xxxu_sta_add(struct ieee80211_hw *hw,
+                           struct ieee80211_vif *vif,
+                           struct ieee80211_sta *sta)
+{
+       struct rtl8xxxu_sta_info *sta_info = (struct rtl8xxxu_sta_info *)sta->drv_priv;
+       struct rtl8xxxu_priv *priv = hw->priv;
+
+       if (vif->type == NL80211_IFTYPE_AP) {
+               sta_info->macid = rtl8xxxu_acquire_macid(priv);
+               if (sta_info->macid >= RTL8XXXU_MAX_MAC_ID_NUM)
+                       return -ENOSPC;
+
+               rtl8xxxu_refresh_rate_mask(priv, 0, sta, true);
+               priv->fops->report_connect(priv, sta_info->macid, H2C_MACID_ROLE_STA, true);
+       }
+
+       return 0;
+}
+
+static int rtl8xxxu_sta_remove(struct ieee80211_hw *hw,
+                              struct ieee80211_vif *vif,
+                              struct ieee80211_sta *sta)
+{
+       struct rtl8xxxu_sta_info *sta_info = (struct rtl8xxxu_sta_info *)sta->drv_priv;
+       struct rtl8xxxu_priv *priv = hw->priv;
+
+       if (vif->type == NL80211_IFTYPE_AP)
+               rtl8xxxu_release_macid(priv, sta_info->macid);
+
+       return 0;
+}
+
 static const struct ieee80211_ops rtl8xxxu_ops = {
        .tx = rtl8xxxu_tx,
        .wake_tx_queue = ieee80211_handle_wake_tx_queue,
        .sta_statistics = rtl8xxxu_sta_statistics,
        .get_antenna = rtl8xxxu_get_antenna,
        .set_tim = rtl8xxxu_set_tim,
+       .sta_add = rtl8xxxu_sta_add,
+       .sta_remove = rtl8xxxu_sta_remove,
 };
 
 static int rtl8xxxu_parse_usb(struct rtl8xxxu_priv *priv,