switch (type) {
        case NL80211_IFTYPE_STATION:
        case NL80211_IFTYPE_ADHOC:
+               priv->bss_num = mwifiex_get_unused_bss_num(adapter,
+                        MWIFIEX_BSS_TYPE_STA);
                priv->bss_role =  MWIFIEX_BSS_ROLE_STA;
                priv->bss_type = MWIFIEX_BSS_TYPE_STA;
                break;
        case NL80211_IFTYPE_P2P_CLIENT:
+               priv->bss_num = mwifiex_get_unused_bss_num(adapter,
+                        MWIFIEX_BSS_TYPE_P2P);
                priv->bss_role =  MWIFIEX_BSS_ROLE_STA;
                priv->bss_type = MWIFIEX_BSS_TYPE_P2P;
                break;
        case NL80211_IFTYPE_P2P_GO:
+               priv->bss_num = mwifiex_get_unused_bss_num(adapter,
+                        MWIFIEX_BSS_TYPE_P2P);
                priv->bss_role =  MWIFIEX_BSS_ROLE_UAP;
                priv->bss_type = MWIFIEX_BSS_TYPE_P2P;
                break;
        case NL80211_IFTYPE_AP:
+               priv->bss_num = mwifiex_get_unused_bss_num(adapter,
+                        MWIFIEX_BSS_TYPE_UAP);
                priv->bss_type = MWIFIEX_BSS_TYPE_UAP;
                priv->bss_role = MWIFIEX_BSS_ROLE_UAP;
                break;
                        return ERR_PTR(-EINVAL);
                }
 
-               priv = mwifiex_get_unused_priv(adapter);
+               priv = mwifiex_get_unused_priv_by_bss_type(
+                                               adapter, MWIFIEX_BSS_TYPE_STA);
                if (!priv) {
                        mwifiex_dbg(adapter, ERROR,
                                    "could not get free private struct\n");
                priv->frame_type = MWIFIEX_DATA_FRAME_TYPE_ETH_II;
                priv->bss_priority = 0;
                priv->bss_role = MWIFIEX_BSS_ROLE_STA;
-               priv->bss_num = adapter->curr_iface_comb.sta_intf;
 
                break;
        case NL80211_IFTYPE_AP:
                        return ERR_PTR(-EINVAL);
                }
 
-               priv = mwifiex_get_unused_priv(adapter);
+               priv = mwifiex_get_unused_priv_by_bss_type(
+                                               adapter, MWIFIEX_BSS_TYPE_UAP);
                if (!priv) {
                        mwifiex_dbg(adapter, ERROR,
                                    "could not get free private struct\n");
                priv->bss_priority = 0;
                priv->bss_role = MWIFIEX_BSS_ROLE_UAP;
                priv->bss_started = 0;
-               priv->bss_num = adapter->curr_iface_comb.uap_intf;
                priv->bss_mode = type;
 
                break;
                        return ERR_PTR(-EINVAL);
                }
 
-               priv = mwifiex_get_unused_priv(adapter);
+               priv = mwifiex_get_unused_priv_by_bss_type(
+                                               adapter, MWIFIEX_BSS_TYPE_P2P);
                if (!priv) {
                        mwifiex_dbg(adapter, ERROR,
                                    "could not get free private struct\n");
                priv->bss_priority = MWIFIEX_BSS_ROLE_STA;
                priv->bss_role = MWIFIEX_BSS_ROLE_STA;
                priv->bss_started = 0;
-               priv->bss_num = adapter->curr_iface_comb.p2p_intf;
 
                if (mwifiex_cfg80211_init_p2p_client(priv)) {
                        memset(&priv->wdev, 0, sizeof(priv->wdev));
 
        return ((i < adapter->priv_num) ? adapter->priv[i] : NULL);
 }
 
+/*
+ * This function checks available bss_num when adding new interface or
+ * changing interface type.
+ */
+static inline u8
+mwifiex_get_unused_bss_num(struct mwifiex_adapter *adapter, u8 bss_type)
+{
+       u8 i, j;
+       int index[MWIFIEX_MAX_BSS_NUM];
+
+       memset(index, 0, sizeof(index));
+       for (i = 0; i < adapter->priv_num; i++)
+               if (adapter->priv[i]) {
+                       if (adapter->priv[i]->bss_type == bss_type &&
+                           !(adapter->priv[i]->bss_mode ==
+                             NL80211_IFTYPE_UNSPECIFIED)) {
+                               index[adapter->priv[i]->bss_num] = 1;
+                       }
+               }
+       for (j = 0; j < MWIFIEX_MAX_BSS_NUM; j++)
+               if (!index[j])
+                       return j;
+       return -1;
+}
+
 /*
  * This function returns the first available unused private structure pointer.
  */
 static inline struct mwifiex_private *
-mwifiex_get_unused_priv(struct mwifiex_adapter *adapter)
+mwifiex_get_unused_priv_by_bss_type(struct mwifiex_adapter *adapter,
+                                   u8 bss_type)
 {
-       int i;
+       u8 i;
 
-       for (i = 0; i < adapter->priv_num; i++) {
-               if (adapter->priv[i]) {
-                       if (adapter->priv[i]->bss_mode ==
-                           NL80211_IFTYPE_UNSPECIFIED)
-                               break;
+       for (i = 0; i < adapter->priv_num; i++)
+               if (adapter->priv[i]->bss_mode ==
+                  NL80211_IFTYPE_UNSPECIFIED) {
+                       adapter->priv[i]->bss_num =
+                       mwifiex_get_unused_bss_num(adapter, bss_type);
+                       break;
                }
-       }
 
        return ((i < adapter->priv_num) ? adapter->priv[i] : NULL);
 }