Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next
[linux-2.6-block.git] / drivers / staging / rtl8723au / os_dep / ioctl_cfg80211.c
index 50840b9a11fa06075ba0d58386a449957c5aa192..f0839f6a9345073a23f5b2db4d4f613a071e9369 100644 (file)
@@ -20,7 +20,6 @@
 #include <xmit_osdep.h>
 
 #include "ioctl_cfg80211.h"
-#include <linux/version.h>
 
 #define RTW_MAX_MGMT_TX_CNT 8
 
@@ -260,26 +259,21 @@ static int rtw_cfg80211_inform_bss(struct rtw_adapter *padapter,
        size_t notify_ielen;
        s32 notify_signal;
        u8 buf[MAX_BSSINFO_LEN], *pbuf;
-       size_t len, bssinf_len = 0;
+       size_t len;
        struct ieee80211_hdr *pwlanhdr;
-       unsigned short *fctrl;
-       u8 bc_addr[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
-
        struct wireless_dev *wdev = padapter->rtw_wdev;
        struct wiphy *wiphy = wdev->wiphy;
        struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
 
        /* DBG_8723A("%s\n", __func__); */
 
-       bssinf_len =
-               pnetwork->network.IELength + sizeof(struct ieee80211_hdr_3addr);
-       if (bssinf_len > MAX_BSSINFO_LEN) {
+       if (pnetwork->network.IELength > MAX_IE_SZ) {
                DBG_8723A("%s IE Length too long > %d byte\n", __func__,
-                         MAX_BSSINFO_LEN);
+                         MAX_IE_SZ);
                goto exit;
        }
 
-       channel = pnetwork->network.Configuration.DSConfig;
+       channel = pnetwork->network.DSConfig;
        if (channel <= RTW_CH_MAX_2G_CHANNEL)
                freq = ieee80211_channel_to_frequency(channel,
                                                      IEEE80211_BAND_2GHZ);
@@ -289,14 +283,13 @@ static int rtw_cfg80211_inform_bss(struct rtw_adapter *padapter,
 
        notify_channel = ieee80211_get_channel(wiphy, freq);
 
-       /* rtw_get_timestampe_from_ie23a() */
        notify_timestamp = jiffies_to_msecs(jiffies) * 1000;    /* uSec */
 
        notify_interval =
-           le16_to_cpu(*(u16 *)
+               get_unaligned_le16(
                        rtw_get_beacon_interval23a_from_ie(pnetwork->network.IEs));
        notify_capability =
-           le16_to_cpu(*(u16 *)
+               get_unaligned_le16(
                        rtw_get_capability23a_from_ie(pnetwork->network.IEs));
 
        notify_ie = pnetwork->network.IEs + _FIXED_IE_LENGTH_;
@@ -315,21 +308,22 @@ static int rtw_cfg80211_inform_bss(struct rtw_adapter *padapter,
        pbuf = buf;
 
        pwlanhdr = (struct ieee80211_hdr *)pbuf;
-       fctrl = &pwlanhdr->frame_control;
-       *(fctrl) = 0;
 
-       SetSeqNum(pwlanhdr, 0);
+       pwlanhdr->seq_ctrl = 0;
 
        if (pnetwork->network.reserved == 1) {  /*  WIFI_BEACON */
-               memcpy(pwlanhdr->addr1, bc_addr, ETH_ALEN);
-               SetFrameSubType(pbuf, WIFI_BEACON);
+               eth_broadcast_addr(pwlanhdr->addr1);
+               pwlanhdr->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
+                                                     IEEE80211_STYPE_BEACON);
        } else {
-               memcpy(pwlanhdr->addr1, myid(&padapter->eeprompriv), ETH_ALEN);
-               SetFrameSubType(pbuf, WIFI_PROBERSP);
+               ether_addr_copy(pwlanhdr->addr1, myid(&padapter->eeprompriv));
+               pwlanhdr->frame_control =
+                       cpu_to_le16(IEEE80211_FTYPE_MGMT |
+                                   IEEE80211_STYPE_PROBE_RESP);
        }
 
-       memcpy(pwlanhdr->addr2, pnetwork->network.MacAddress, ETH_ALEN);
-       memcpy(pwlanhdr->addr3, pnetwork->network.MacAddress, ETH_ALEN);
+       ether_addr_copy(pwlanhdr->addr2, pnetwork->network.MacAddress);
+       ether_addr_copy(pwlanhdr->addr3, pnetwork->network.MacAddress);
 
        pbuf += sizeof(struct ieee80211_hdr_3addr);
        len = sizeof(struct ieee80211_hdr_3addr);
@@ -357,9 +351,6 @@ void rtw_cfg80211_indicate_connect(struct rtw_adapter *padapter)
        struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
        struct wlan_network *cur_network = &pmlmepriv->cur_network;
        struct wireless_dev *pwdev = padapter->rtw_wdev;
-#ifdef CONFIG_8723AU_P2P
-       struct wifidirect_info *pwdinfo = &padapter->wdinfo;
-#endif
 
        DBG_8723A("%s(padapter =%p)\n", __func__, padapter);
 
@@ -370,22 +361,11 @@ void rtw_cfg80211_indicate_connect(struct rtw_adapter *padapter)
        if (check_fwstate(pmlmepriv, WIFI_AP_STATE))
                return;
 
-#ifdef CONFIG_8723AU_P2P
-       if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) {
-               rtw_p2p_set_pre_state(pwdinfo, rtw_p2p_state(pwdinfo));
-               rtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT);
-               rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_OK);
-               DBG_8723A("%s, role =%d, p2p_state =%d, pre_p2p_state =%d\n",
-                         __func__, rtw_p2p_role(pwdinfo),
-                         rtw_p2p_state(pwdinfo), rtw_p2p_pre_state(pwdinfo));
-       }
-#endif /* CONFIG_8723AU_P2P */
-
-       if (rtw_to_roaming(padapter) > 0) {
+       if (padapter->mlmepriv.to_roaming > 0) {
                struct wiphy *wiphy = pwdev->wiphy;
                struct ieee80211_channel *notify_channel;
                u32 freq;
-               u16 channel = cur_network->network.Configuration.DSConfig;
+               u16 channel = cur_network->network.DSConfig;
 
                if (channel <= RTW_CH_MAX_2G_CHANNEL)
                        freq =
@@ -429,9 +409,6 @@ void rtw_cfg80211_indicate_disconnect(struct rtw_adapter *padapter)
 {
        struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
        struct wireless_dev *pwdev = padapter->rtw_wdev;
-#ifdef CONFIG_8723AU_P2P
-       struct wifidirect_info *pwdinfo = &padapter->wdinfo;
-#endif
 
        DBG_8723A("%s(padapter =%p)\n", __func__, padapter);
 
@@ -442,21 +419,6 @@ void rtw_cfg80211_indicate_disconnect(struct rtw_adapter *padapter)
        if (check_fwstate(pmlmepriv, WIFI_AP_STATE))
                return;
 
-#ifdef CONFIG_8723AU_P2P
-       if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) {
-               del_timer_sync(&pwdinfo->find_phase_timer);
-               del_timer_sync(&pwdinfo->restore_p2p_state_timer);
-               del_timer_sync(&pwdinfo->pre_tx_scan_timer);
-
-               rtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo));
-               rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE);
-
-               DBG_8723A("%s, role =%d, p2p_state =%d, pre_p2p_state =%d\n",
-                         __func__, rtw_p2p_role(pwdinfo),
-                         rtw_p2p_state(pwdinfo), rtw_p2p_pre_state(pwdinfo));
-       }
-#endif /* CONFIG_8723AU_P2P */
-
        if (!padapter->mlmepriv.not_indic_disco) {
                if (check_fwstate(&padapter->mlmepriv, WIFI_UNDER_LINKING)) {
                        cfg80211_connect_result(padapter->pnetdev, NULL, NULL,
@@ -471,12 +433,12 @@ void rtw_cfg80211_indicate_disconnect(struct rtw_adapter *padapter)
 }
 
 #ifdef CONFIG_8723AU_AP_MODE
-static u8 set_pairwise_key(struct rtw_adapter *padapter, struct sta_info *psta)
+static int set_pairwise_key(struct rtw_adapter *padapter, struct sta_info *psta)
 {
        struct cmd_obj *ph2c;
        struct set_stakey_parm *psetstakey_para;
        struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
-       u8 res = _SUCCESS;
+       int res = _SUCCESS;
 
        ph2c = kzalloc(sizeof(struct cmd_obj), GFP_KERNEL);
        if (ph2c == NULL) {
@@ -493,9 +455,9 @@ static u8 set_pairwise_key(struct rtw_adapter *padapter, struct sta_info *psta)
 
        init_h2fwcmd_w_parm_no_rsp(ph2c, psetstakey_para, _SetStaKey_CMD_);
 
-       psetstakey_para->algorithm = (u8) psta->dot118021XPrivacy;
+       psetstakey_para->algorithm = psta->dot118021XPrivacy;
 
-       memcpy(psetstakey_para->addr, psta->hwaddr, ETH_ALEN);
+       ether_addr_copy(psetstakey_para->addr, psta->hwaddr);
 
        memcpy(psetstakey_para->key, &psta->dot118021x_UncstKey, 16);
 
@@ -505,8 +467,8 @@ exit:
        return res;
 }
 
-static int set_group_key(struct rtw_adapter *padapter, u8 *key, u8 alg,
-                        int keyid)
+static int set_group_key(struct rtw_adapter *padapter, u8 *key, u32 alg,
+                        u8 keyid)
 {
        u8 keylen;
        struct cmd_obj *pcmd;
@@ -516,6 +478,11 @@ static int set_group_key(struct rtw_adapter *padapter, u8 *key, u8 alg,
 
        DBG_8723A("%s\n", __func__);
 
+       if (keyid >= 4) {
+               res = _FAIL;
+               goto exit;
+       }
+
        pcmd = kzalloc(sizeof(struct cmd_obj), GFP_KERNEL);
        if (!pcmd) {
                res = _FAIL;
@@ -528,24 +495,23 @@ static int set_group_key(struct rtw_adapter *padapter, u8 *key, u8 alg,
                goto exit;
        }
 
-       psetkeyparm->keyid = (u8) keyid;
+       psetkeyparm->keyid = keyid;
        if (is_wep_enc(alg))
-               padapter->mlmepriv.key_mask |= CHKBIT(psetkeyparm->keyid);
+               padapter->mlmepriv.key_mask |= BIT(psetkeyparm->keyid);
 
        psetkeyparm->algorithm = alg;
 
        psetkeyparm->set_tx = 1;
 
        switch (alg) {
-       case _WEP40_:
+       case WLAN_CIPHER_SUITE_WEP40:
                keylen = 5;
                break;
-       case _WEP104_:
+       case WLAN_CIPHER_SUITE_WEP104:
                keylen = 13;
                break;
-       case _TKIP_:
-       case _TKIP_WTMIC_:
-       case _AES_:
+       case WLAN_CIPHER_SUITE_TKIP:
+       case WLAN_CIPHER_SUITE_CCMP:
        default:
                keylen = 16;
        }
@@ -558,28 +524,26 @@ static int set_group_key(struct rtw_adapter *padapter, u8 *key, u8 alg,
        pcmd->rsp = NULL;
        pcmd->rspsz = 0;
 
-       INIT_LIST_HEAD(&pcmd->list);
-
        res = rtw_enqueue_cmd23a(pcmdpriv, pcmd);
 
 exit:
        return res;
 }
 
-static int set_wep_key(struct rtw_adapter *padapter, u8 *key, u8 keylen,
-                      int keyid)
+static int set_wep_key(struct rtw_adapter *padapter, u8 *key, u16 keylen,
+                      u8 keyid)
 {
-       u8 alg;
+       u32 alg;
 
        switch (keylen) {
        case 5:
-               alg = _WEP40_;
+               alg = WLAN_CIPHER_SUITE_WEP40;
                break;
        case 13:
-               alg = _WEP104_;
+               alg = WLAN_CIPHER_SUITE_WEP104;
                break;
        default:
-               alg = _NO_PRIVACY_;
+               alg = 0;
        }
 
        return set_group_key(padapter, key, alg, keyid);
@@ -590,7 +554,8 @@ static int rtw_cfg80211_ap_set_encryption(struct net_device *dev,
                                          u32 param_len)
 {
        int ret = 0;
-       u32 wep_key_idx, wep_key_len;
+       u16 wep_key_len;
+       u8 wep_key_idx;
        struct sta_info *psta = NULL, *pbcmc_sta = NULL;
        struct rtw_adapter *padapter = netdev_priv(dev);
        struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
@@ -658,21 +623,21 @@ static int rtw_cfg80211_ap_set_encryption(struct net_device *dev,
 
                        psecuritypriv->ndisencryptstatus =
                                Ndis802_11Encryption1Enabled;
-                       psecuritypriv->dot11PrivacyAlgrthm = _WEP40_;
-                       psecuritypriv->dot118021XGrpPrivacy = _WEP40_;
+                       psecuritypriv->dot11PrivacyAlgrthm = WLAN_CIPHER_SUITE_WEP40;
+                       psecuritypriv->dot118021XGrpPrivacy = WLAN_CIPHER_SUITE_WEP40;
 
                        if (wep_key_len == 13) {
-                               psecuritypriv->dot11PrivacyAlgrthm = _WEP104_;
-                               psecuritypriv->dot118021XGrpPrivacy = _WEP104_;
+                               psecuritypriv->dot11PrivacyAlgrthm = WLAN_CIPHER_SUITE_WEP104;
+                               psecuritypriv->dot118021XGrpPrivacy = WLAN_CIPHER_SUITE_WEP104;
                        }
 
                        psecuritypriv->dot11PrivacyKeyIndex = wep_key_idx;
                }
 
-               memcpy(&psecuritypriv->dot11DefKey[wep_key_idx].skey[0],
+               memcpy(&psecuritypriv->wep_key[wep_key_idx].key,
                       param->u.crypt.key, wep_key_len);
 
-               psecuritypriv->dot11DefKeylen[wep_key_idx] = wep_key_len;
+               psecuritypriv->wep_key[wep_key_idx].keylen = wep_key_len;
 
                set_wep_key(padapter, param->u.crypt.key, wep_key_len,
                            wep_key_idx);
@@ -684,8 +649,7 @@ static int rtw_cfg80211_ap_set_encryption(struct net_device *dev,
        if (!psta && check_fwstate(pmlmepriv, WIFI_AP_STATE)) { /*  group key */
                if (param->u.crypt.set_tx == 0) {       /* group key */
                        if (strcmp(param->u.crypt.alg, "WEP") == 0) {
-                               DBG_8723A("%s, set group_key, WEP\n",
-                                         __func__);
+                               DBG_8723A("%s, set group_key, WEP\n", __func__);
 
                                memcpy(psecuritypriv->
                                       dot118021XGrpKey[param->u.crypt.idx].
@@ -693,17 +657,17 @@ static int rtw_cfg80211_ap_set_encryption(struct net_device *dev,
                                       (param->u.crypt.key_len >
                                        16 ? 16 : param->u.crypt.key_len));
 
-                               psecuritypriv->dot118021XGrpPrivacy = _WEP40_;
+                               psecuritypriv->dot118021XGrpPrivacy = WLAN_CIPHER_SUITE_WEP40;
                                if (param->u.crypt.key_len == 13) {
                                        psecuritypriv->dot118021XGrpPrivacy =
-                                           _WEP104_;
+                                           WLAN_CIPHER_SUITE_WEP104;
                                }
 
                        } else if (strcmp(param->u.crypt.alg, "TKIP") == 0) {
                                DBG_8723A("%s, set group_key, TKIP\n",
                                          __func__);
 
-                               psecuritypriv->dot118021XGrpPrivacy = _TKIP_;
+                               psecuritypriv->dot118021XGrpPrivacy = WLAN_CIPHER_SUITE_TKIP;
 
                                memcpy(psecuritypriv->
                                       dot118021XGrpKey[param->u.crypt.idx].
@@ -722,13 +686,13 @@ static int rtw_cfg80211_ap_set_encryption(struct net_device *dev,
                                                             idx].skey,
                                       &param->u.crypt.key[24], 8);
 
-                               psecuritypriv->busetkipkey = true;
+                               psecuritypriv->busetkipkey = 1;
 
                        } else if (strcmp(param->u.crypt.alg, "CCMP") == 0) {
                                DBG_8723A("%s, set group_key, CCMP\n",
                                          __func__);
 
-                               psecuritypriv->dot118021XGrpPrivacy = _AES_;
+                               psecuritypriv->dot118021XGrpPrivacy = WLAN_CIPHER_SUITE_CCMP;
 
                                memcpy(psecuritypriv->
                                       dot118021XGrpKey[param->u.crypt.idx].
@@ -740,12 +704,12 @@ static int rtw_cfg80211_ap_set_encryption(struct net_device *dev,
                                          __func__);
 
                                psecuritypriv->dot118021XGrpPrivacy =
-                                   _NO_PRIVACY_;
+                                   0;
                        }
 
                        psecuritypriv->dot118021XGrpKeyid = param->u.crypt.idx;
 
-                       psecuritypriv->binstallGrpkey = true;
+                       psecuritypriv->binstallGrpkey = 1;
 
                        psecuritypriv->dot11PrivacyAlgrthm =
                                psecuritypriv->dot118021XGrpPrivacy;
@@ -782,16 +746,16 @@ static int rtw_cfg80211_ap_set_encryption(struct net_device *dev,
                                        DBG_8723A("%s, set pairwise key, WEP\n",
                                                  __func__);
 
-                                       psta->dot118021XPrivacy = _WEP40_;
+                                       psta->dot118021XPrivacy = WLAN_CIPHER_SUITE_WEP40;
                                        if (param->u.crypt.key_len == 13) {
                                                psta->dot118021XPrivacy =
-                                                       _WEP104_;
+                                                       WLAN_CIPHER_SUITE_WEP104;
                                        }
                                } else if (!strcmp(param->u.crypt.alg, "TKIP")) {
                                        DBG_8723A("%s, set pairwise key, "
                                                  "TKIP\n", __func__);
 
-                                       psta->dot118021XPrivacy = _TKIP_;
+                                       psta->dot118021XPrivacy = WLAN_CIPHER_SUITE_TKIP;
 
                                        /* DEBUG_ERR("set key length :param->u.crypt.key_len =%d\n", param->u.crypt.key_len); */
                                        /* set mic key */
@@ -800,19 +764,19 @@ static int rtw_cfg80211_ap_set_encryption(struct net_device *dev,
                                        memcpy(psta->dot11tkiprxmickey.skey,
                                               &param->u.crypt.key[24], 8);
 
-                                       psecuritypriv->busetkipkey = true;
+                                       psecuritypriv->busetkipkey = 1;
 
                                } else if (!strcmp(param->u.crypt.alg, "CCMP")) {
 
                                        DBG_8723A("%s, set pairwise key, "
                                                  "CCMP\n", __func__);
 
-                                       psta->dot118021XPrivacy = _AES_;
+                                       psta->dot118021XPrivacy = WLAN_CIPHER_SUITE_CCMP;
                                } else {
                                        DBG_8723A("%s, set pairwise key, "
                                                  "none\n", __func__);
 
-                                       psta->dot118021XPrivacy = _NO_PRIVACY_;
+                                       psta->dot118021XPrivacy = 0;
                                }
 
                                set_pairwise_key(padapter, psta);
@@ -831,15 +795,15 @@ static int rtw_cfg80211_ap_set_encryption(struct net_device *dev,
                                                key_len));
 
                                        psecuritypriv->dot118021XGrpPrivacy =
-                                               _WEP40_;
+                                               WLAN_CIPHER_SUITE_WEP40;
                                        if (param->u.crypt.key_len == 13) {
                                                psecuritypriv->
                                                    dot118021XGrpPrivacy =
-                                                       _WEP104_;
+                                                       WLAN_CIPHER_SUITE_WEP104;
                                        }
                                } else if (!strcmp(param->u.crypt.alg, "TKIP")) {
                                        psecuritypriv->dot118021XGrpPrivacy =
-                                           _TKIP_;
+                                           WLAN_CIPHER_SUITE_TKIP;
 
                                        memcpy(psecuritypriv->
                                               dot118021XGrpKey[param->u.crypt.
@@ -864,11 +828,11 @@ static int rtw_cfg80211_ap_set_encryption(struct net_device *dev,
                                               skey, &param->u.crypt.key[24],
                                               8);
 
-                                       psecuritypriv->busetkipkey = true;
+                                       psecuritypriv->busetkipkey = 1;
 
                                } else if (!strcmp(param->u.crypt.alg, "CCMP")) {
                                        psecuritypriv->dot118021XGrpPrivacy =
-                                               _AES_;
+                                               WLAN_CIPHER_SUITE_CCMP;
 
                                        memcpy(psecuritypriv->
                                               dot118021XGrpKey[param->u.crypt.
@@ -879,13 +843,13 @@ static int rtw_cfg80211_ap_set_encryption(struct net_device *dev,
                                                key_len));
                                } else {
                                        psecuritypriv->dot118021XGrpPrivacy =
-                                               _NO_PRIVACY_;
+                                               0;
                                }
 
                                psecuritypriv->dot118021XGrpKeyid =
                                        param->u.crypt.idx;
 
-                               psecuritypriv->binstallGrpkey = true;
+                               psecuritypriv->binstallGrpkey = 1;
 
                                psecuritypriv->dot11PrivacyAlgrthm =
                                        psecuritypriv->dot118021XGrpPrivacy;
@@ -917,15 +881,11 @@ static int rtw_cfg80211_set_encryption(struct net_device *dev,
                                       struct ieee_param *param, u32 param_len)
 {
        int ret = 0;
-       u32 wep_key_idx, wep_key_len;
+       u32 wep_key_idx;
+       u16 wep_key_len;
        struct rtw_adapter *padapter = netdev_priv(dev);
        struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
        struct security_priv *psecuritypriv = &padapter->securitypriv;
-#ifdef CONFIG_8723AU_P2P
-       struct wifidirect_info *pwdinfo = &padapter->wdinfo;
-#endif /* CONFIG_8723AU_P2P */
-
-
 
        DBG_8723A("%s\n", __func__);
 
@@ -970,21 +930,21 @@ static int rtw_cfg80211_set_encryption(struct net_device *dev,
 
                        psecuritypriv->ndisencryptstatus =
                                Ndis802_11Encryption1Enabled;
-                       psecuritypriv->dot11PrivacyAlgrthm = _WEP40_;
-                       psecuritypriv->dot118021XGrpPrivacy = _WEP40_;
+                       psecuritypriv->dot11PrivacyAlgrthm = WLAN_CIPHER_SUITE_WEP40;
+                       psecuritypriv->dot118021XGrpPrivacy = WLAN_CIPHER_SUITE_WEP40;
 
                        if (wep_key_len == 13) {
-                               psecuritypriv->dot11PrivacyAlgrthm = _WEP104_;
-                               psecuritypriv->dot118021XGrpPrivacy = _WEP104_;
+                               psecuritypriv->dot11PrivacyAlgrthm = WLAN_CIPHER_SUITE_WEP104;
+                               psecuritypriv->dot118021XGrpPrivacy = WLAN_CIPHER_SUITE_WEP104;
                        }
 
                        psecuritypriv->dot11PrivacyKeyIndex = wep_key_idx;
                }
 
-               memcpy(&psecuritypriv->dot11DefKey[wep_key_idx].skey[0],
+               memcpy(&psecuritypriv->wep_key[wep_key_idx].key,
                       param->u.crypt.key, wep_key_len);
 
-               psecuritypriv->dot11DefKeylen[wep_key_idx] = wep_key_len;
+               psecuritypriv->wep_key[wep_key_idx].keylen = wep_key_len;
 
                rtw_set_key23a(padapter, psecuritypriv, wep_key_idx, 0);
 
@@ -1041,7 +1001,7 @@ static int rtw_cfg80211_set_encryption(struct net_device *dev,
                                                       8);
 
                                                padapter->securitypriv.
-                                                       busetkipkey = false;
+                                                       busetkipkey = 0;
                                        }
                                        DBG_8723A(" ~~~~set sta key:unicastkey\n");
 
@@ -1067,7 +1027,7 @@ static int rtw_cfg80211_set_encryption(struct net_device *dev,
                                               skey, &param->u.crypt.key[24],
                                               8);
                                        padapter->securitypriv.binstallGrpkey =
-                                           true;
+                                               1;
                                        /* DEBUG_ERR((" param->u.crypt.key_len"
                                           "=%d\n", param->u.crypt.key_len)); */
                                        DBG_8723A
@@ -1080,15 +1040,6 @@ static int rtw_cfg80211_set_encryption(struct net_device *dev,
                                        rtw_set_key23a(padapter,
                                                    &padapter->securitypriv,
                                                    param->u.crypt.idx, 1);
-#ifdef CONFIG_8723AU_P2P
-                                       if (rtw_p2p_chk_state
-                                           (pwdinfo,
-                                            P2P_STATE_PROVISIONING_ING)) {
-                                               rtw_p2p_set_state(pwdinfo,
-                                                                 P2P_STATE_PROVISIONING_DONE);
-                                       }
-#endif /* CONFIG_8723AU_P2P */
-
                                }
                        }
 
@@ -1127,13 +1078,13 @@ static int cfg80211_rtw_add_key(struct wiphy *wiphy, struct net_device *ndev,
 {
        char *alg_name;
        u32 param_len;
-       struct ieee_param *param = NULL;
+       struct ieee_param *param;
        int ret = 0;
        struct wireless_dev *rtw_wdev = wiphy_to_wdev(wiphy);
        struct rtw_adapter *padapter = wiphy_to_adapter(wiphy);
        struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
 
-       DBG_8723A(FUNC_NDEV_FMT " adding key for %pM\n", FUNC_NDEV_ARG(ndev),
+       DBG_8723A("%s(%s): adding key for %pM\n", __func__, ndev->name,
                  mac_addr);
        DBG_8723A("cipher = 0x%x\n", params->cipher);
        DBG_8723A("key_len = 0x%x\n", params->key_len);
@@ -1143,11 +1094,11 @@ static int cfg80211_rtw_add_key(struct wiphy *wiphy, struct net_device *ndev,
 
        param_len = sizeof(struct ieee_param) + params->key_len;
        param = kzalloc(param_len, GFP_KERNEL);
-       if (param == NULL)
-               return -1;
+       if (!param)
+               return -ENOMEM;
 
        param->cmd = IEEE_CMD_SET_ENCRYPTION;
-       memset(param->sta_addr, 0xff, ETH_ALEN);
+       eth_broadcast_addr(param->sta_addr);
 
        switch (params->cipher) {
        case IW_AUTH_CIPHER_NONE:
@@ -1196,7 +1147,7 @@ static int cfg80211_rtw_add_key(struct wiphy *wiphy, struct net_device *ndev,
        } else if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) {
 #ifdef CONFIG_8723AU_AP_MODE
                if (mac_addr)
-                       memcpy(param->sta_addr, (void *)mac_addr, ETH_ALEN);
+                       ether_addr_copy(param->sta_addr, mac_addr);
 
                ret = rtw_cfg80211_ap_set_encryption(ndev, param, param_len);
 #endif
@@ -1218,7 +1169,7 @@ cfg80211_rtw_get_key(struct wiphy *wiphy, struct net_device *ndev,
                     void *cookie,
                     void (*callback) (void *cookie, struct key_params *))
 {
-       DBG_8723A(FUNC_NDEV_FMT "\n", FUNC_NDEV_ARG(ndev));
+       DBG_8723A("%s(%s)\n", __func__, ndev->name);
        return 0;
 }
 
@@ -1229,8 +1180,7 @@ static int cfg80211_rtw_del_key(struct wiphy *wiphy, struct net_device *ndev,
        struct rtw_adapter *padapter = netdev_priv(ndev);
        struct security_priv *psecuritypriv = &padapter->securitypriv;
 
-       DBG_8723A(FUNC_NDEV_FMT " key_index =%d\n", FUNC_NDEV_ARG(ndev),
-                 key_index);
+       DBG_8723A("%s(%s): key_index =%d\n", __func__, ndev->name, key_index);
 
        if (key_index == psecuritypriv->dot11PrivacyKeyIndex) {
                /* clear the flag of wep default key set. */
@@ -1247,23 +1197,24 @@ static int cfg80211_rtw_set_default_key(struct wiphy *wiphy,
        struct rtw_adapter *padapter = netdev_priv(ndev);
        struct security_priv *psecuritypriv = &padapter->securitypriv;
 
-       DBG_8723A(FUNC_NDEV_FMT " key_index =%d"
-                 ", unicast =%d, multicast =%d.\n", FUNC_NDEV_ARG(ndev),
-                 key_index, unicast, multicast);
+       DBG_8723A("%s(%s): key_index =%d, unicast =%d, multicast =%d.\n",
+                 __func__, ndev->name, key_index, unicast, multicast);
 
-       if ((key_index < WEP_KEYS) &&
-           ((psecuritypriv->dot11PrivacyAlgrthm == _WEP40_) ||
-            (psecuritypriv->dot11PrivacyAlgrthm == _WEP104_))) {
+       if (key_index < NUM_WEP_KEYS &&
+           (psecuritypriv->dot11PrivacyAlgrthm == WLAN_CIPHER_SUITE_WEP40 ||
+            psecuritypriv->dot11PrivacyAlgrthm == WLAN_CIPHER_SUITE_WEP104)) {
                /* set wep default key */
                psecuritypriv->ndisencryptstatus = Ndis802_11Encryption1Enabled;
 
                psecuritypriv->dot11PrivacyKeyIndex = key_index;
 
-               psecuritypriv->dot11PrivacyAlgrthm = _WEP40_;
-               psecuritypriv->dot118021XGrpPrivacy = _WEP40_;
-               if (psecuritypriv->dot11DefKeylen[key_index] == 13) {
-                       psecuritypriv->dot11PrivacyAlgrthm = _WEP104_;
-                       psecuritypriv->dot118021XGrpPrivacy = _WEP104_;
+               psecuritypriv->dot11PrivacyAlgrthm = WLAN_CIPHER_SUITE_WEP40;
+               psecuritypriv->dot118021XGrpPrivacy = WLAN_CIPHER_SUITE_WEP40;
+               if (psecuritypriv->wep_key[key_index].keylen == 13) {
+                       psecuritypriv->dot11PrivacyAlgrthm =
+                               WLAN_CIPHER_SUITE_WEP104;
+                       psecuritypriv->dot118021XGrpPrivacy =
+                               WLAN_CIPHER_SUITE_WEP104;
                }
 
                /* set the flag to represent that wep default key
@@ -1276,7 +1227,7 @@ static int cfg80211_rtw_set_default_key(struct wiphy *wiphy,
 
 static int cfg80211_rtw_get_station(struct wiphy *wiphy,
                                    struct net_device *ndev,
-                                   u8 *mac, struct station_info *sinfo)
+                                   const u8 *mac, struct station_info *sinfo)
 {
        int ret = 0;
        struct rtw_adapter *padapter = wiphy_to_adapter(wiphy);
@@ -1287,7 +1238,7 @@ static int cfg80211_rtw_get_station(struct wiphy *wiphy,
        sinfo->filled = 0;
 
        if (!mac) {
-               DBG_8723A(FUNC_NDEV_FMT " mac ==%p\n", FUNC_NDEV_ARG(ndev), mac);
+               DBG_8723A("%s(%s): mac ==%p\n", __func__, ndev->name, mac);
                ret = -ENOENT;
                goto exit;
        }
@@ -1298,17 +1249,15 @@ static int cfg80211_rtw_get_station(struct wiphy *wiphy,
                ret = -ENOENT;
                goto exit;
        }
-#ifdef CONFIG_DEBUG_CFG80211
-       DBG_8723A(FUNC_NDEV_FMT " mac =" MAC_FMT "\n", FUNC_NDEV_ARG(ndev),
+       DBG_8723A("%s(%s): mac =" MAC_FMT "\n", __func__, ndev->name,
                  MAC_ARG(mac));
-#endif
 
        /* for infra./P2PClient mode */
        if (check_fwstate(pmlmepriv, WIFI_STATION_STATE) &&
            check_fwstate(pmlmepriv, _FW_LINKED)) {
                struct wlan_network *cur_network = &pmlmepriv->cur_network;
 
-               if (memcmp(mac, cur_network->network.MacAddress, ETH_ALEN)) {
+               if (!ether_addr_equal(mac, cur_network->network.MacAddress)) {
                        DBG_8723A("%s, mismatch bssid =" MAC_FMT "\n", __func__,
                                  MAC_ARG(cur_network->network.MacAddress));
                        ret = -ENOENT;
@@ -1342,78 +1291,122 @@ exit:
        return ret;
 }
 
+int cfg80211_infrastructure_mode(struct rtw_adapter* padapter,
+                                enum nl80211_iftype ifmode)
+{
+       struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
+       struct wlan_network *cur_network = &pmlmepriv->cur_network;
+       enum nl80211_iftype old_mode;
+
+       old_mode = cur_network->network.ifmode;
+
+       RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_notice_,
+                ("+%s: old =%d new =%d fw_state = 0x%08x\n", __func__,
+                 old_mode, ifmode, get_fwstate(pmlmepriv)));
+
+       if (old_mode != ifmode) {
+               spin_lock_bh(&pmlmepriv->lock);
+
+               RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_info_,
+                        (" change mode!"));
+
+               if (old_mode == NL80211_IFTYPE_AP ||
+                   old_mode == NL80211_IFTYPE_P2P_GO) {
+                       /* change to other mode from Ndis802_11APMode */
+                       cur_network->join_res = -1;
+
+#ifdef CONFIG_8723AU_AP_MODE
+                       stop_ap_mode23a(padapter);
+#endif
+               }
+
+               if (check_fwstate(pmlmepriv, _FW_LINKED) ||
+                   old_mode == NL80211_IFTYPE_ADHOC)
+                       rtw_disassoc_cmd23a(padapter, 0, true);
+
+               if (check_fwstate(pmlmepriv, _FW_LINKED) ||
+                   check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE))
+                       rtw_free_assoc_resources23a(padapter, 1);
+
+               if (old_mode == NL80211_IFTYPE_STATION ||
+                   old_mode == NL80211_IFTYPE_P2P_CLIENT ||
+                   old_mode == NL80211_IFTYPE_ADHOC) {
+                       if (check_fwstate(pmlmepriv, _FW_LINKED)) {
+                               /* will clr Linked_state; before this function,
+                                  we must have chked whether issue
+                                  dis-assoc_cmd or not */
+                               rtw_indicate_disconnect23a(padapter);
+                       }
+              }
+
+               cur_network->network.ifmode = ifmode;
+
+               _clr_fwstate_(pmlmepriv, ~WIFI_NULL_STATE);
+
+               switch (ifmode) {
+               case NL80211_IFTYPE_ADHOC:
+                       set_fwstate(pmlmepriv, WIFI_ADHOC_STATE);
+                       break;
+
+               case NL80211_IFTYPE_P2P_CLIENT:
+               case NL80211_IFTYPE_STATION:
+                       set_fwstate(pmlmepriv, WIFI_STATION_STATE);
+                       break;
+
+               case NL80211_IFTYPE_P2P_GO:
+               case NL80211_IFTYPE_AP:
+                       set_fwstate(pmlmepriv, WIFI_AP_STATE);
+#ifdef CONFIG_8723AU_AP_MODE
+                       start_ap_mode23a(padapter);
+                       /* rtw_indicate_connect23a(padapter); */
+#endif
+                       break;
+
+               default:
+                       break;
+               }
+
+               /* SecClearAllKeys(adapter); */
+
+               /* RT_TRACE(COMP_OID_SET, DBG_LOUD,
+                  ("set_infrastructure: fw_state:%x after changing mode\n", */
+               /* get_fwstate(pmlmepriv))); */
+
+               spin_unlock_bh(&pmlmepriv->lock);
+       }
+
+       return _SUCCESS;
+}
+
 static int cfg80211_rtw_change_iface(struct wiphy *wiphy,
                                     struct net_device *ndev,
                                     enum nl80211_iftype type, u32 *flags,
                                     struct vif_params *params)
 {
        enum nl80211_iftype old_type;
-       enum ndis_802_11_net_infra networkType;
        struct rtw_adapter *padapter = wiphy_to_adapter(wiphy);
        struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
        struct wireless_dev *rtw_wdev = wiphy_to_wdev(wiphy);
-#ifdef CONFIG_8723AU_P2P
-       struct wifidirect_info *pwdinfo = &padapter->wdinfo;
-#endif
        int ret = 0;
-       u8 change = false;
-
-       DBG_8723A(FUNC_NDEV_FMT " call netdev_open23a\n", FUNC_NDEV_ARG(ndev));
-       if (netdev_open23a(ndev) != 0) {
-               ret = -EPERM;
-               goto exit;
-       }
 
-       if (_FAIL == rtw_pwr_wakeup(padapter)) {
-               ret = -EPERM;
-               goto exit;
-       }
+       DBG_8723A("%s(%s): call netdev_open23a\n", __func__, ndev->name);
 
        old_type = rtw_wdev->iftype;
-       DBG_8723A(FUNC_NDEV_FMT " old_iftype =%d, new_iftype =%d\n",
-                 FUNC_NDEV_ARG(ndev), old_type, type);
+       DBG_8723A("%s(%s): old_iftype =%d, new_iftype =%d\n",
+                 __func__, ndev->name, old_type, type);
 
        if (old_type != type) {
-               change = true;
                pmlmeext->action_public_rxseq = 0xffff;
                pmlmeext->action_public_dialog_token = 0xff;
        }
 
        switch (type) {
        case NL80211_IFTYPE_ADHOC:
-               networkType = Ndis802_11IBSS;
-               break;
        case NL80211_IFTYPE_P2P_CLIENT:
        case NL80211_IFTYPE_STATION:
-               networkType = Ndis802_11Infrastructure;
-#ifdef CONFIG_8723AU_P2P
-               if (change && rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) {
-                       del_timer_sync(&pwdinfo->find_phase_timer);
-                       del_timer_sync(&pwdinfo->restore_p2p_state_timer);
-                       del_timer_sync(&pwdinfo->pre_tx_scan_timer);
-
-                       /* it means remove GO and change mode from AP(GO)
-                          to station(P2P DEVICE) */
-                       rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE);
-                       rtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo));
-
-                       DBG_8723A("%s, role =%d, p2p_state =%d, pre_p2p_state ="
-                                 "%d\n", __func__, rtw_p2p_role(pwdinfo),
-                                 rtw_p2p_state(pwdinfo),
-                                 rtw_p2p_pre_state(pwdinfo));
-               }
-#endif /* CONFIG_8723AU_P2P */
-               break;
        case NL80211_IFTYPE_P2P_GO:
        case NL80211_IFTYPE_AP:
-               networkType = Ndis802_11APMode;
-#ifdef CONFIG_8723AU_P2P
-               if (change && !rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) {
-                       /* it means P2P Group created, we will be GO
-                          and change mode from  P2P DEVICE to AP(GO) */
-                       rtw_p2p_set_role(pwdinfo, P2P_ROLE_GO);
-               }
-#endif /* CONFIG_8723AU_P2P */
+       case NL80211_IFTYPE_UNSPECIFIED:
                break;
        default:
                return -EOPNOTSUPP;
@@ -1421,13 +1414,13 @@ static int cfg80211_rtw_change_iface(struct wiphy *wiphy,
 
        rtw_wdev->iftype = type;
 
-       if (rtw_set_802_11_infrastructure_mode23a(padapter, networkType) == false) {
+       if (cfg80211_infrastructure_mode(padapter, type) != _SUCCESS) {
                rtw_wdev->iftype = old_type;
                ret = -EPERM;
                goto exit;
        }
 
-       rtw_setopmode_cmd23a(padapter, networkType);
+       rtw_setopmode_cmd23a(padapter, type);
 
 exit:
        return ret;
@@ -1438,9 +1431,8 @@ void rtw_cfg80211_indicate_scan_done(struct rtw_wdev_priv *pwdev_priv,
 {
        spin_lock_bh(&pwdev_priv->scan_req_lock);
        if (pwdev_priv->scan_request != NULL) {
-#ifdef CONFIG_DEBUG_CFG80211
                DBG_8723A("%s with scan req\n", __func__);
-#endif
+
                if (pwdev_priv->scan_request->wiphy !=
                    pwdev_priv->rtw_wdev->wiphy)
                        DBG_8723A("error wiphy compare\n");
@@ -1449,9 +1441,7 @@ void rtw_cfg80211_indicate_scan_done(struct rtw_wdev_priv *pwdev_priv,
 
                pwdev_priv->scan_request = NULL;
        } else {
-#ifdef CONFIG_DEBUG_CFG80211
                DBG_8723A("%s without scan req\n", __func__);
-#endif
        }
        spin_unlock_bh(&pwdev_priv->scan_req_lock);
 }
@@ -1463,10 +1453,6 @@ void rtw_cfg80211_surveydone_event_callback(struct rtw_adapter *padapter)
        struct rtw_queue *queue = &pmlmepriv->scanned_queue;
        struct wlan_network *pnetwork;
 
-#ifdef CONFIG_DEBUG_CFG80211
-       DBG_8723A("%s\n", __func__);
-#endif
-
        spin_lock_bh(&pmlmepriv->scanned_queue.lock);
 
        phead = get_list_head(queue);
@@ -1478,7 +1464,7 @@ void rtw_cfg80211_surveydone_event_callback(struct rtw_adapter *padapter)
                   contains the channel to which this network belongs */
                if (rtw_ch_set_search_ch23a
                    (padapter->mlmeextpriv.channel_set,
-                    pnetwork->network.Configuration.DSConfig) >= 0)
+                    pnetwork->network.DSConfig) >= 0)
                        rtw_cfg80211_inform_bss(padapter, pnetwork);
        }
 
@@ -1495,93 +1481,31 @@ static int rtw_cfg80211_set_probe_req_wpsp2pie(struct rtw_adapter *padapter,
        int ret = 0;
        uint wps_ielen = 0;
        u8 *wps_ie;
-#ifdef CONFIG_8723AU_P2P
-       u32 p2p_ielen = 0;
-       u8 *p2p_ie;
-       u32 wfd_ielen = 0;
-#endif
        struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
 
-#ifdef CONFIG_DEBUG_CFG80211
        DBG_8723A("%s, ielen =%d\n", __func__, len);
-#endif
 
        if (len > 0) {
                wps_ie = rtw_get_wps_ie23a(buf, len, NULL, &wps_ielen);
                if (wps_ie) {
-#ifdef CONFIG_DEBUG_CFG80211
                        DBG_8723A("probe_req_wps_ielen =%d\n", wps_ielen);
-#endif
+
                        if (pmlmepriv->wps_probe_req_ie) {
                                pmlmepriv->wps_probe_req_ie_len = 0;
                                kfree(pmlmepriv->wps_probe_req_ie);
                                pmlmepriv->wps_probe_req_ie = NULL;
                        }
 
-                       pmlmepriv->wps_probe_req_ie =
-                               kmalloc(wps_ielen, GFP_KERNEL);
+                       pmlmepriv->wps_probe_req_ie = kmemdup(wps_ie,
+                                                             wps_ielen,
+                                                             GFP_KERNEL);
                        if (pmlmepriv->wps_probe_req_ie == NULL) {
                                DBG_8723A("%s()-%d: kmalloc() ERROR!\n",
                                          __func__, __LINE__);
                                return -EINVAL;
                        }
-                       memcpy(pmlmepriv->wps_probe_req_ie, wps_ie, wps_ielen);
                        pmlmepriv->wps_probe_req_ie_len = wps_ielen;
                }
-#ifdef CONFIG_8723AU_P2P
-               p2p_ie = rtw_get_p2p_ie23a(buf, len, NULL, &p2p_ielen);
-               if (p2p_ie) {
-#ifdef CONFIG_DEBUG_CFG80211
-                       DBG_8723A("probe_req_p2p_ielen =%d\n", p2p_ielen);
-#endif
-
-                       if (pmlmepriv->p2p_probe_req_ie) {
-                               pmlmepriv->p2p_probe_req_ie_len = 0;
-                               kfree(pmlmepriv->p2p_probe_req_ie);
-                               pmlmepriv->p2p_probe_req_ie = NULL;
-                       }
-
-                       pmlmepriv->p2p_probe_req_ie =
-                               kmalloc(p2p_ielen, GFP_KERNEL);
-                       if (pmlmepriv->p2p_probe_req_ie == NULL) {
-                               DBG_8723A("%s()-%d: kmalloc() ERROR!\n",
-                                         __func__, __LINE__);
-                               return -EINVAL;
-
-                       }
-                       memcpy(pmlmepriv->p2p_probe_req_ie, p2p_ie, p2p_ielen);
-                       pmlmepriv->p2p_probe_req_ie_len = p2p_ielen;
-               }
-#endif /* CONFIG_8723AU_P2P */
-
-               /* buf += p2p_ielen; */
-               /* len -= p2p_ielen; */
-
-#ifdef CONFIG_8723AU_P2P
-               if (rtw_get_wfd_ie(buf, len, NULL, &wfd_ielen)) {
-#ifdef CONFIG_DEBUG_CFG80211
-                       DBG_8723A("probe_req_wfd_ielen =%d\n", wfd_ielen);
-#endif
-
-                       if (pmlmepriv->wfd_probe_req_ie) {
-                               pmlmepriv->wfd_probe_req_ie_len = 0;
-                               kfree(pmlmepriv->wfd_probe_req_ie);
-                               pmlmepriv->wfd_probe_req_ie = NULL;
-                       }
-
-                       pmlmepriv->wfd_probe_req_ie =
-                               kmalloc(wfd_ielen, GFP_KERNEL);
-                       if (pmlmepriv->wfd_probe_req_ie == NULL) {
-                               DBG_8723A("%s()-%d: kmalloc() ERROR!\n",
-                                         __func__, __LINE__);
-                               return -EINVAL;
-
-                       }
-                       rtw_get_wfd_ie(buf, len, pmlmepriv->wfd_probe_req_ie,
-                                      &pmlmepriv->wfd_probe_req_ie_len);
-               }
-#endif /* CONFIG_8723AU_P2P */
-
        }
 
        return ret;
@@ -1599,25 +1523,16 @@ static int cfg80211_rtw_scan(struct wiphy *wiphy,
        struct rtw_ieee80211_channel ch[RTW_CHANNEL_SCAN_AMOUNT];
        struct rtw_wdev_priv *pwdev_priv = wdev_to_priv(padapter->rtw_wdev);
        struct cfg80211_ssid *ssids = request->ssids;
-#ifdef CONFIG_8723AU_P2P
-       struct wifidirect_info *pwdinfo = &padapter->wdinfo;
-       int social_channel = 0;
-#endif /* CONFIG_8723AU_P2P */
        bool need_indicate_scan_done = false;
 
-#ifdef CONFIG_DEBUG_CFG80211
-       DBG_8723A(FUNC_ADPT_FMT "\n", FUNC_ADPT_ARG(padapter));
-#endif
+       DBG_8723A("%s(%s)\n", __func__, padapter->pnetdev->name);
 
        spin_lock_bh(&pwdev_priv->scan_req_lock);
        pwdev_priv->scan_request = request;
        spin_unlock_bh(&pwdev_priv->scan_req_lock);
 
        if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) {
-
-#ifdef CONFIG_DEBUG_CFG80211
                DBG_8723A("%s under WIFI_AP_STATE\n", __func__);
-#endif
                /* need_indicate_scan_done = true; */
                /* goto check_need_indicate_scan_done; */
        }
@@ -1626,29 +1541,6 @@ static int cfg80211_rtw_scan(struct wiphy *wiphy,
                need_indicate_scan_done = true;
                goto check_need_indicate_scan_done;
        }
-#ifdef CONFIG_8723AU_P2P
-       if (!memcmp(ssids->ssid, "DIRECT-", 7) &&
-           rtw_get_p2p_ie23a((u8 *) request->ie, request->ie_len, NULL, NULL)) {
-               if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) {
-                       rtw_p2p_enable23a(padapter, P2P_ROLE_DEVICE);
-                       wdev_to_priv(padapter->rtw_wdev)->p2p_enabled = true;
-               } else {
-                       rtw_p2p_set_pre_state(pwdinfo, rtw_p2p_state(pwdinfo));
-#ifdef CONFIG_DEBUG_CFG80211
-                       DBG_8723A("%s, role =%d, p2p_state =%d\n", __func__,
-                                 rtw_p2p_role(pwdinfo),
-                                 rtw_p2p_state(pwdinfo));
-#endif
-               }
-               rtw_p2p_set_state(pwdinfo, P2P_STATE_LISTEN);
-
-               if (request->n_channels == 3 &&
-                   request->channels[0]->hw_value == 1 &&
-                   request->channels[1]->hw_value == 6 &&
-                   request->channels[2]->hw_value == 11)
-                       social_channel = 1;
-       }
-#endif /* CONFIG_8723AU_P2P */
 
        if (request->ie && request->ie_len > 0) {
                rtw_cfg80211_set_probe_req_wpsp2pie(padapter,
@@ -1662,8 +1554,8 @@ static int cfg80211_rtw_scan(struct wiphy *wiphy,
                goto check_need_indicate_scan_done;
        }
        if (rtw_is_scan_deny(padapter)) {
-               DBG_8723A(FUNC_ADPT_FMT ": scan deny\n",
-                         FUNC_ADPT_ARG(padapter));
+               DBG_8723A("%s(%s): scan deny\n", __func__,
+                         padapter->pnetdev->name);
                need_indicate_scan_done = true;
                goto check_need_indicate_scan_done;
        }
@@ -1674,28 +1566,12 @@ static int cfg80211_rtw_scan(struct wiphy *wiphy,
                need_indicate_scan_done = true;
                goto check_need_indicate_scan_done;
        }
-#ifdef CONFIG_8723AU_P2P
-       if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE) &&
-           !rtw_p2p_chk_state(pwdinfo, P2P_STATE_IDLE)) {
-               rtw_p2p_set_state(pwdinfo, P2P_STATE_FIND_PHASE_SEARCH);
-               rtw_free_network_queue23a(padapter, true);
-
-               if (social_channel == 0)
-                       rtw_p2p_findphase_ex_set(pwdinfo,
-                                                P2P_FINDPHASE_EX_NONE);
-               else
-                       rtw_p2p_findphase_ex_set(pwdinfo,
-                                                P2P_FINDPHASE_EX_SOCIAL_LAST);
-       }
-#endif /* CONFIG_8723AU_P2P */
 
        memset(ssid, 0, sizeof(struct cfg80211_ssid) * RTW_SSID_SCAN_AMOUNT);
        /* parsing request ssids, n_ssids */
        for (i = 0; i < request->n_ssids && i < RTW_SSID_SCAN_AMOUNT; i++) {
-#ifdef CONFIG_DEBUG_CFG80211
                DBG_8723A("ssid =%s, len =%d\n", ssids[i].ssid,
                          ssids[i].ssid_len);
-#endif
                memcpy(ssid[i].ssid, ssids[i].ssid, ssids[i].ssid_len);
                ssid[i].ssid_len = ssids[i].ssid_len;
        }
@@ -1707,11 +1583,9 @@ static int cfg80211_rtw_scan(struct wiphy *wiphy,
        if (request->n_channels == 1) {
                for (i = 0; i < request->n_channels &&
                     i < RTW_CHANNEL_SCAN_AMOUNT; i++) {
-#ifdef CONFIG_DEBUG_CFG80211
-                       DBG_8723A(FUNC_ADPT_FMT CHAN_FMT "\n",
-                                 FUNC_ADPT_ARG(padapter),
+                       DBG_8723A("%s:(%s):" CHAN_FMT "\n",
+                                 __func__, padapter->pnetdev->name,
                                  CHAN_ARG(request->channels[i]));
-#endif
                        ch[i].hw_value = request->channels[i]->hw_value;
                        ch[i].flags = request->channels[i]->flags;
                }
@@ -1747,13 +1621,13 @@ static int cfg80211_rtw_set_wiphy_params(struct wiphy *wiphy, u32 changed)
 static int cfg80211_rtw_join_ibss(struct wiphy *wiphy, struct net_device *ndev,
                                  struct cfg80211_ibss_params *params)
 {
-       DBG_8723A(FUNC_NDEV_FMT "\n", FUNC_NDEV_ARG(ndev));
+       DBG_8723A("%s(%s)\n", __func__, ndev->name);
        return 0;
 }
 
 static int cfg80211_rtw_leave_ibss(struct wiphy *wiphy, struct net_device *ndev)
 {
-       DBG_8723A(FUNC_NDEV_FMT "\n", FUNC_NDEV_ARG(ndev));
+       DBG_8723A("%s(%s)\n", __func__, ndev->name);
        return 0;
 }
 
@@ -1822,30 +1696,30 @@ static int rtw_cfg80211_set_cipher(struct security_priv *psecuritypriv,
        DBG_8723A("%s, ucast =%d, cipher = 0x%x\n", __func__, ucast, cipher);
 
        if (!cipher) {
-               *profile_cipher = _NO_PRIVACY_;
+               *profile_cipher = 0;
                psecuritypriv->ndisencryptstatus = ndisencryptstatus;
                return 0;
        }
 
        switch (cipher) {
        case IW_AUTH_CIPHER_NONE:
-               *profile_cipher = _NO_PRIVACY_;
+               *profile_cipher = 0;
                ndisencryptstatus = Ndis802_11EncryptionDisabled;
                break;
        case WLAN_CIPHER_SUITE_WEP40:
-               *profile_cipher = _WEP40_;
+               *profile_cipher = WLAN_CIPHER_SUITE_WEP40;
                ndisencryptstatus = Ndis802_11Encryption1Enabled;
                break;
        case WLAN_CIPHER_SUITE_WEP104:
-               *profile_cipher = _WEP104_;
+               *profile_cipher = WLAN_CIPHER_SUITE_WEP104;
                ndisencryptstatus = Ndis802_11Encryption1Enabled;
                break;
        case WLAN_CIPHER_SUITE_TKIP:
-               *profile_cipher = _TKIP_;
+               *profile_cipher = WLAN_CIPHER_SUITE_TKIP;
                ndisencryptstatus = Ndis802_11Encryption2Enabled;
                break;
        case WLAN_CIPHER_SUITE_CCMP:
-               *profile_cipher = _AES_;
+               *profile_cipher = WLAN_CIPHER_SUITE_CCMP;
                ndisencryptstatus = Ndis802_11Encryption3Enabled;
                break;
        default:
@@ -1877,13 +1751,10 @@ static int rtw_cfg80211_set_key_mgt(struct security_priv *psecuritypriv,
 static int rtw_cfg80211_set_wpa_ie(struct rtw_adapter *padapter, const u8 *pie,
                                   size_t ielen)
 {
-       u8 *buf = NULL, *pos = NULL;
+       u8 *buf = NULL;
        int group_cipher = 0, pairwise_cipher = 0;
        int ret = 0;
-       int wpa_ielen = 0;
-       int wpa2_ielen = 0;
-       u8 *pwpa, *pwpa2;
-       u8 null_addr[] = { 0, 0, 0, 0, 0, 0 };
+       const u8 *pwpa, *pwpa2;
        int i;
 
        if (!pie || !ielen) {
@@ -1896,12 +1767,11 @@ static int rtw_cfg80211_set_wpa_ie(struct rtw_adapter *padapter, const u8 *pie,
                ret = -EINVAL;
                goto exit;
        }
-       buf = kzalloc(ielen, GFP_KERNEL);
+       buf = kmemdup(pie, ielen, GFP_KERNEL);
        if (buf == NULL) {
                ret = -ENOMEM;
                goto exit;
        }
-       memcpy(buf, pie, ielen);
 
        /* dump */
        DBG_8723A("set wpa_ie(length:%zu):\n", ielen);
@@ -1910,7 +1780,6 @@ static int rtw_cfg80211_set_wpa_ie(struct rtw_adapter *padapter, const u8 *pie,
                          buf[i], buf[i + 1],
                          buf[i + 2], buf[i + 3], buf[i + 4],
                          buf[i + 5], buf[i + 6], buf[i + 7]);
-       pos = buf;
        if (ielen < RSN_HEADER_LEN) {
                RT_TRACE(_module_rtl871x_ioctl_os_c, _drv_err_,
                         ("Ie len too short %d\n", (int)ielen));
@@ -1918,33 +1787,35 @@ static int rtw_cfg80211_set_wpa_ie(struct rtw_adapter *padapter, const u8 *pie,
                goto exit;
        }
 
-       pwpa = rtw_get_wpa_ie23a(buf, &wpa_ielen, ielen);
-       if (pwpa && wpa_ielen > 0) {
-               if (rtw_parse_wpa_ie23a(pwpa, wpa_ielen + 2, &group_cipher,
-                                    &pairwise_cipher, NULL) == _SUCCESS) {
+       pwpa = cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT,
+                                      WLAN_OUI_TYPE_MICROSOFT_WPA,
+                                      buf, ielen);
+       if (pwpa && pwpa[1] > 0) {
+               if (rtw_parse_wpa_ie23a(pwpa, pwpa[1] + 2, &group_cipher,
+                                       &pairwise_cipher, NULL) == _SUCCESS) {
                        padapter->securitypriv.dot11AuthAlgrthm =
                                dot11AuthAlgrthm_8021X;
                        padapter->securitypriv.ndisauthtype =
                                Ndis802_11AuthModeWPAPSK;
-                       memcpy(padapter->securitypriv.supplicant_ie, &pwpa[0],
-                              wpa_ielen + 2);
+                       memcpy(padapter->securitypriv.supplicant_ie, pwpa,
+                              pwpa[1] + 2);
 
-                       DBG_8723A("got wpa_ie, wpa_ielen:%u\n", wpa_ielen);
+                       DBG_8723A("got wpa_ie, wpa_ielen:%u\n", pwpa[1]);
                }
        }
 
-       pwpa2 = rtw_get_wpa2_ie23a(buf, &wpa2_ielen, ielen);
-       if (pwpa2 && wpa2_ielen > 0) {
-               if (rtw_parse_wpa2_ie23a (pwpa2, wpa2_ielen + 2, &group_cipher,
-                                      &pairwise_cipher, NULL) == _SUCCESS) {
+       pwpa2 = cfg80211_find_ie(WLAN_EID_RSN, buf, ielen);
+       if (pwpa2 && pwpa2[1] > 0) {
+               if (rtw_parse_wpa2_ie23a (pwpa2, pwpa2[1] + 2, &group_cipher,
+                                         &pairwise_cipher, NULL) == _SUCCESS) {
                        padapter->securitypriv.dot11AuthAlgrthm =
                                dot11AuthAlgrthm_8021X;
                        padapter->securitypriv.ndisauthtype =
                                Ndis802_11AuthModeWPA2PSK;
-                       memcpy(padapter->securitypriv.supplicant_ie, &pwpa2[0],
-                              wpa2_ielen + 2);
+                       memcpy(padapter->securitypriv.supplicant_ie, pwpa2,
+                              pwpa2[1] + 2);
 
-                       DBG_8723A("got wpa2_ie, wpa2_ielen:%u\n", wpa2_ielen);
+                       DBG_8723A("got wpa2_ie, wpa2_ielen:%u\n", pwpa2[1]);
                }
        }
 
@@ -1957,27 +1828,27 @@ static int rtw_cfg80211_set_wpa_ie(struct rtw_adapter *padapter, const u8 *pie,
 
        switch (group_cipher) {
        case WPA_CIPHER_NONE:
-               padapter->securitypriv.dot118021XGrpPrivacy = _NO_PRIVACY_;
+               padapter->securitypriv.dot118021XGrpPrivacy = 0;
                padapter->securitypriv.ndisencryptstatus =
                        Ndis802_11EncryptionDisabled;
                break;
        case WPA_CIPHER_WEP40:
-               padapter->securitypriv.dot118021XGrpPrivacy = _WEP40_;
+               padapter->securitypriv.dot118021XGrpPrivacy = WLAN_CIPHER_SUITE_WEP40;
                padapter->securitypriv.ndisencryptstatus =
                        Ndis802_11Encryption1Enabled;
                break;
        case WPA_CIPHER_TKIP:
-               padapter->securitypriv.dot118021XGrpPrivacy = _TKIP_;
+               padapter->securitypriv.dot118021XGrpPrivacy = WLAN_CIPHER_SUITE_TKIP;
                padapter->securitypriv.ndisencryptstatus =
                        Ndis802_11Encryption2Enabled;
                break;
        case WPA_CIPHER_CCMP:
-               padapter->securitypriv.dot118021XGrpPrivacy = _AES_;
+               padapter->securitypriv.dot118021XGrpPrivacy = WLAN_CIPHER_SUITE_CCMP;
                padapter->securitypriv.ndisencryptstatus =
                        Ndis802_11Encryption3Enabled;
                break;
        case WPA_CIPHER_WEP104:
-               padapter->securitypriv.dot118021XGrpPrivacy = _WEP104_;
+               padapter->securitypriv.dot118021XGrpPrivacy = WLAN_CIPHER_SUITE_WEP104;
                padapter->securitypriv.ndisencryptstatus =
                        Ndis802_11Encryption1Enabled;
                break;
@@ -1985,27 +1856,27 @@ static int rtw_cfg80211_set_wpa_ie(struct rtw_adapter *padapter, const u8 *pie,
 
        switch (pairwise_cipher) {
        case WPA_CIPHER_NONE:
-               padapter->securitypriv.dot11PrivacyAlgrthm = _NO_PRIVACY_;
+               padapter->securitypriv.dot11PrivacyAlgrthm = 0;
                padapter->securitypriv.ndisencryptstatus =
                        Ndis802_11EncryptionDisabled;
                break;
        case WPA_CIPHER_WEP40:
-               padapter->securitypriv.dot11PrivacyAlgrthm = _WEP40_;
+               padapter->securitypriv.dot11PrivacyAlgrthm = WLAN_CIPHER_SUITE_WEP40;
                padapter->securitypriv.ndisencryptstatus =
                        Ndis802_11Encryption1Enabled;
                break;
        case WPA_CIPHER_TKIP:
-               padapter->securitypriv.dot11PrivacyAlgrthm = _TKIP_;
+               padapter->securitypriv.dot11PrivacyAlgrthm = WLAN_CIPHER_SUITE_TKIP;
                padapter->securitypriv.ndisencryptstatus =
                        Ndis802_11Encryption2Enabled;
                break;
        case WPA_CIPHER_CCMP:
-               padapter->securitypriv.dot11PrivacyAlgrthm = _AES_;
+               padapter->securitypriv.dot11PrivacyAlgrthm = WLAN_CIPHER_SUITE_CCMP;
                padapter->securitypriv.ndisencryptstatus =
                        Ndis802_11Encryption3Enabled;
                break;
        case WPA_CIPHER_WEP104:
-               padapter->securitypriv.dot11PrivacyAlgrthm = _WEP104_;
+               padapter->securitypriv.dot11PrivacyAlgrthm = WLAN_CIPHER_SUITE_WEP104;
                padapter->securitypriv.ndisencryptstatus =
                        Ndis802_11Encryption1Enabled;
                break;
@@ -2029,75 +1900,14 @@ static int rtw_cfg80211_set_wpa_ie(struct rtw_adapter *padapter, const u8 *pie,
                }
        }
 
-#ifdef CONFIG_8723AU_P2P
-       {                       /* check p2p_ie for assoc req; */
-               uint p2p_ielen = 0;
-               u8 *p2p_ie;
-               struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
-
-               p2p_ie = rtw_get_p2p_ie23a(buf, ielen, NULL, &p2p_ielen);
-               if (p2p_ie) {
-#ifdef CONFIG_DEBUG_CFG80211
-                       DBG_8723A("%s p2p_assoc_req_ielen =%d\n", __func__,
-                                 p2p_ielen);
-#endif
-
-                       if (pmlmepriv->p2p_assoc_req_ie) {
-                               pmlmepriv->p2p_assoc_req_ie_len = 0;
-                               kfree(pmlmepriv->p2p_assoc_req_ie);
-                               pmlmepriv->p2p_assoc_req_ie = NULL;
-                       }
-
-                       pmlmepriv->p2p_assoc_req_ie =
-                               kmalloc(p2p_ielen, GFP_KERNEL);
-                       if (pmlmepriv->p2p_assoc_req_ie == NULL) {
-                               DBG_8723A("%s()-%d: kmalloc() ERROR!\n",
-                                         __func__, __LINE__);
-                               goto exit;
-                       }
-                       memcpy(pmlmepriv->p2p_assoc_req_ie, p2p_ie, p2p_ielen);
-                       pmlmepriv->p2p_assoc_req_ie_len = p2p_ielen;
-               }
-       }
-#endif /* CONFIG_8723AU_P2P */
-
-#ifdef CONFIG_8723AU_P2P
-       {                       /* check wfd_ie for assoc req; */
-               uint wfd_ielen = 0;
-               struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
-
-               if (rtw_get_wfd_ie(buf, ielen, NULL, &wfd_ielen)) {
-#ifdef CONFIG_DEBUG_CFG80211
-                       DBG_8723A("%s wfd_assoc_req_ielen =%d\n", __func__,
-                                 wfd_ielen);
-#endif
-
-                       if (pmlmepriv->wfd_assoc_req_ie) {
-                               pmlmepriv->wfd_assoc_req_ie_len = 0;
-                               kfree(pmlmepriv->wfd_assoc_req_ie);
-                               pmlmepriv->wfd_assoc_req_ie = NULL;
-                       }
-
-                       pmlmepriv->wfd_assoc_req_ie =
-                               kmalloc(wfd_ielen, GFP_KERNEL);
-                       if (pmlmepriv->wfd_assoc_req_ie == NULL) {
-                               DBG_8723A("%s()-%d: kmalloc() ERROR!\n",
-                                         __func__, __LINE__);
-                               goto exit;
-                       }
-                       rtw_get_wfd_ie(buf, ielen, pmlmepriv->wfd_assoc_req_ie,
-                                      &pmlmepriv->wfd_assoc_req_ie_len);
-               }
-       }
-#endif /* CONFIG_8723AU_P2P */
-
        /* TKIP and AES disallow multicast packets until installing group key */
-       if (padapter->securitypriv.dot11PrivacyAlgrthm == _TKIP_ ||
-           padapter->securitypriv.dot11PrivacyAlgrthm == _TKIP_WTMIC_ ||
-           padapter->securitypriv.dot11PrivacyAlgrthm == _AES_)
+       if (padapter->securitypriv.dot11PrivacyAlgrthm ==
+           WLAN_CIPHER_SUITE_TKIP ||
+           padapter->securitypriv.dot11PrivacyAlgrthm ==
+           WLAN_CIPHER_SUITE_CCMP)
                /* WPS open need to enable multicast */
                /* check_fwstate(&padapter->mlmepriv, WIFI_UNDER_WPS) == true)*/
-               rtw_hal_set_hwreg23a(padapter, HW_VAR_OFF_RCR_AM, null_addr);
+               rtl8723a_off_rcr_am(padapter);
 
        RT_TRACE(_module_rtl871x_ioctl_os_c, _drv_info_,
                 ("rtw_set_wpa_ie: pairwise_cipher = 0x%08x padapter->"
@@ -2113,6 +1923,70 @@ exit:
        return ret;
 }
 
+static int rtw_cfg80211_add_wep(struct rtw_adapter *padapter,
+                               struct rtw_wep_key *wep, u8 keyid)
+{
+       int res;
+       struct security_priv *psecuritypriv = &padapter->securitypriv;
+
+       if (keyid >= NUM_WEP_KEYS) {
+               RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_,
+                        ("%s:keyid>4 =>fail\n", __func__));
+               res = _FAIL;
+               goto exit;
+       }
+
+       switch (wep->keylen) {
+       case 5:
+               psecuritypriv->dot11PrivacyAlgrthm = WLAN_CIPHER_SUITE_WEP40;
+               RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_info_,
+                        ("%s:wep->KeyLength = 5\n", __func__));
+               break;
+       case 13:
+               psecuritypriv->dot11PrivacyAlgrthm = WLAN_CIPHER_SUITE_WEP104;
+               RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_info_,
+                        ("%s:wep->KeyLength = 13\n", __func__));
+               break;
+       default:
+               psecuritypriv->dot11PrivacyAlgrthm = 0;
+               RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_info_,
+                        ("%s:wep->KeyLength!= 5 or 13\n", __func__));
+               res = _FAIL;
+               goto exit;
+       }
+
+       RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_info_,
+                ("%s:before memcpy, wep->KeyLength = 0x%x keyid =%x\n",
+                 __func__, wep->keylen, keyid));
+
+       memcpy(&psecuritypriv->wep_key[keyid], wep, sizeof(struct rtw_wep_key));
+
+       psecuritypriv->dot11PrivacyKeyIndex = keyid;
+
+       RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_info_,
+                ("%s:security key material : "
+                 "%x %x %x %x %x %x %x %x %x %x %x %x %x\n", __func__,
+                 psecuritypriv->wep_key[keyid].key[0],
+                 psecuritypriv->wep_key[keyid].key[1],
+                 psecuritypriv->wep_key[keyid].key[2],
+                 psecuritypriv->wep_key[keyid].key[3],
+                 psecuritypriv->wep_key[keyid].key[4],
+                 psecuritypriv->wep_key[keyid].key[5],
+                 psecuritypriv->wep_key[keyid].key[6],
+                 psecuritypriv->wep_key[keyid].key[7],
+                 psecuritypriv->wep_key[keyid].key[8],
+                 psecuritypriv->wep_key[keyid].key[9],
+                 psecuritypriv->wep_key[keyid].key[10],
+                 psecuritypriv->wep_key[keyid].key[11],
+                 psecuritypriv->wep_key[keyid].key[12]));
+
+       res = rtw_set_key23a(padapter, psecuritypriv, keyid, 1);
+
+exit:
+
+       return res;
+}
+
 static int cfg80211_rtw_connect(struct wiphy *wiphy, struct net_device *ndev,
                                struct cfg80211_connect_params *sme)
 {
@@ -2133,16 +2007,10 @@ static int cfg80211_rtw_connect(struct wiphy *wiphy, struct net_device *ndev,
        struct security_priv *psecuritypriv = &padapter->securitypriv;
        struct rtw_queue *queue = &pmlmepriv->scanned_queue;
 
-       DBG_8723A("=>" FUNC_NDEV_FMT "\n", FUNC_NDEV_ARG(ndev));
+       DBG_8723A("=>" "%s(%s)\n", __func__, ndev->name);
        DBG_8723A("privacy =%d, key =%p, key_len =%d, key_idx =%d\n",
                  sme->privacy, sme->key, sme->key_len, sme->key_idx);
 
-       if (wdev_to_priv(padapter->rtw_wdev)->block) {
-               ret = -EBUSY;
-               DBG_8723A("%s wdev_priv.block is set\n", __func__);
-               goto exit;
-       }
-
        if (_FAIL == rtw_pwr_wakeup(padapter)) {
                ret = -EPERM;
                goto exit;
@@ -2193,8 +2061,8 @@ static int cfg80211_rtw_connect(struct wiphy *wiphy, struct net_device *ndev,
                dst_bssid = pnetwork->network.MacAddress;
 
                if (sme->bssid) {
-                       if (memcmp(pnetwork->network.MacAddress,
-                                  sme->bssid, ETH_ALEN))
+                       if (!ether_addr_equal(pnetwork->network.MacAddress,
+                                             sme->bssid))
                                continue;
                }
 
@@ -2208,7 +2076,7 @@ static int cfg80211_rtw_connect(struct wiphy *wiphy, struct net_device *ndev,
                if (sme->bssid) {
                        src_bssid = sme->bssid;
 
-                       if ((!memcmp(dst_bssid, src_bssid, ETH_ALEN))) {
+                       if (ether_addr_equal(dst_bssid, src_bssid)) {
                                DBG_8723A("matched by bssid\n");
 
                                ndis_ssid.ssid_len =
@@ -2242,15 +2110,15 @@ static int cfg80211_rtw_connect(struct wiphy *wiphy, struct net_device *ndev,
                goto exit;
        }
 
-       if (rtw_set_802_11_infrastructure_mode23a
-           (padapter, pnetwork->network.InfrastructureMode) == false) {
+       if (cfg80211_infrastructure_mode(
+                   padapter, pnetwork->network.ifmode) != _SUCCESS) {
                ret = -EPERM;
                goto exit;
        }
 
        psecuritypriv->ndisencryptstatus = Ndis802_11EncryptionDisabled;
-       psecuritypriv->dot11PrivacyAlgrthm = _NO_PRIVACY_;
-       psecuritypriv->dot118021XGrpPrivacy = _NO_PRIVACY_;
+       psecuritypriv->dot11PrivacyAlgrthm = 0;
+       psecuritypriv->dot118021XGrpPrivacy = 0;
        psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_Open;
        psecuritypriv->ndisauthtype = Ndis802_11AuthModeOpen;
 
@@ -2283,58 +2151,42 @@ static int cfg80211_rtw_connect(struct wiphy *wiphy, struct net_device *ndev,
        if ((psecuritypriv->dot11AuthAlgrthm == dot11AuthAlgrthm_Shared ||
             psecuritypriv->dot11AuthAlgrthm == dot11AuthAlgrthm_Auto) &&
            sme->key) {
-               u32 wep_key_idx, wep_key_len, wep_total_len;
-               struct ndis_802_11_wep *pwep = NULL;
+               struct rtw_wep_key wep_key;
+               u8 wep_key_idx, wep_key_len;
                DBG_8723A("%s(): Shared/Auto WEP\n", __func__);
 
                wep_key_idx = sme->key_idx;
                wep_key_len = sme->key_len;
 
-               if (sme->key_idx > WEP_KEYS) {
+               if (wep_key_idx > WEP_KEYS || !wep_key_len ||
+                   wep_key_len > WLAN_KEY_LEN_WEP104) {
                        ret = -EINVAL;
                        goto exit;
                }
 
-               if (wep_key_len > 0) {
-                       wep_key_len = wep_key_len <= 5 ? 5 : 13;
-                       wep_total_len =
-                               wep_key_len +
-                               offsetof(struct ndis_802_11_wep, KeyMaterial);
-                       pwep = (struct ndis_802_11_wep *)kmalloc(wep_total_len,
-                                                                GFP_KERNEL);
-                       if (pwep == NULL) {
-                               DBG_8723A(" wpa_set_encryption: pwep "
-                                         "allocate fail !!!\n");
-                               ret = -ENOMEM;
-                               goto exit;
-                       }
+               wep_key_len = wep_key_len <= 5 ? 5 : 13;
 
-                       memset(pwep, 0, wep_total_len);
+               memset(&wep_key, 0, sizeof(struct rtw_wep_key));
 
-                       pwep->KeyLength = wep_key_len;
-                       pwep->Length = wep_total_len;
+               wep_key.keylen = wep_key_len;
 
-                       if (wep_key_len == 13) {
-                               padapter->securitypriv.dot11PrivacyAlgrthm =
-                                   _WEP104_;
-                               padapter->securitypriv.dot118021XGrpPrivacy =
-                                   _WEP104_;
-                       }
+               if (wep_key_len == 13) {
+                       padapter->securitypriv.dot11PrivacyAlgrthm =
+                               WLAN_CIPHER_SUITE_WEP104;
+                       padapter->securitypriv.dot118021XGrpPrivacy =
+                               WLAN_CIPHER_SUITE_WEP104;
                } else {
-                       ret = -EINVAL;
-                       goto exit;
+                       padapter->securitypriv.dot11PrivacyAlgrthm =
+                               WLAN_CIPHER_SUITE_WEP40;
+                       padapter->securitypriv.dot118021XGrpPrivacy =
+                               WLAN_CIPHER_SUITE_WEP40;
                }
 
-               pwep->KeyIndex = wep_key_idx;
-               pwep->KeyIndex |= 0x80000000;
-
-               memcpy(pwep->KeyMaterial, (void *)sme->key, pwep->KeyLength);
+               memcpy(wep_key.key, (void *)sme->key, wep_key.keylen);
 
-               if (rtw_set_802_11_add_wep23a(padapter, pwep) == (u8) _FAIL) {
+               if (rtw_cfg80211_add_wep(padapter, &wep_key, wep_key_idx) !=
+                   _SUCCESS)
                        ret = -EOPNOTSUPP;
-               }
-
-               kfree(pwep);
 
                if (ret < 0)
                        goto exit;
@@ -2380,7 +2232,7 @@ static int cfg80211_rtw_disconnect(struct wiphy *wiphy, struct net_device *ndev,
 {
        struct rtw_adapter *padapter = wiphy_to_adapter(wiphy);
 
-       DBG_8723A(FUNC_NDEV_FMT "\n", FUNC_NDEV_ARG(ndev));
+       DBG_8723A("%s(%s)\n", __func__, ndev->name);
 
        rtw_set_roaming(padapter, 0);
 
@@ -2430,8 +2282,8 @@ static int cfg80211_rtw_set_power_mgmt(struct wiphy *wiphy,
        struct rtw_adapter *padapter = wiphy_to_adapter(wiphy);
        struct rtw_wdev_priv *rtw_wdev_priv = wdev_to_priv(padapter->rtw_wdev);
 
-       DBG_8723A(FUNC_NDEV_FMT " enabled:%u, timeout:%d\n",
-                 FUNC_NDEV_ARG(ndev), enabled, timeout);
+       DBG_8723A("%s(%s): enabled:%u, timeout:%d\n",
+                 __func__, ndev->name, enabled, timeout);
 
        rtw_wdev_priv->power_mgmt = enabled;
 
@@ -2448,25 +2300,22 @@ static int cfg80211_rtw_set_pmksa(struct wiphy *wiphy,
        u8 index, blInserted = false;
        struct rtw_adapter *padapter = wiphy_to_adapter(wiphy);
        struct security_priv *psecuritypriv = &padapter->securitypriv;
-       u8 strZeroMacAddress[ETH_ALEN] = { 0x00 };
 
-       DBG_8723A(FUNC_NDEV_FMT "\n", FUNC_NDEV_ARG(netdev));
+       DBG_8723A("%s(%s)\n", __func__, netdev->name);
 
-       if (!memcmp(pmksa->bssid, strZeroMacAddress, ETH_ALEN)) {
+       if (is_zero_ether_addr(pmksa->bssid))
                return -EINVAL;
-       }
 
        blInserted = false;
 
        /* overwrite PMKID */
        for (index = 0; index < NUM_PMKID_CACHE; index++) {
-               if (!memcmp(psecuritypriv->PMKIDList[index].Bssid,
-                           pmksa->bssid, ETH_ALEN)) {
+               if (ether_addr_equal(psecuritypriv->PMKIDList[index].Bssid,
+                                    pmksa->bssid)) {
                        /* BSSID is matched, the same AP => rewrite with
                           new PMKID. */
-                       DBG_8723A(FUNC_NDEV_FMT
-                                 " BSSID exists in the PMKList.\n",
-                                 FUNC_NDEV_ARG(netdev));
+                       DBG_8723A("%s(%s):  BSSID exists in the PMKList.\n",
+                                 __func__, netdev->name);
 
                        memcpy(psecuritypriv->PMKIDList[index].PMKID,
                               pmksa->pmkid, WLAN_PMKID_LEN);
@@ -2479,12 +2328,12 @@ static int cfg80211_rtw_set_pmksa(struct wiphy *wiphy,
 
        if (!blInserted) {
                /*  Find a new entry */
-               DBG_8723A(FUNC_NDEV_FMT
-                         " Use the new entry index = %d for this PMKID.\n",
-                         FUNC_NDEV_ARG(netdev), psecuritypriv->PMKIDIndex);
+               DBG_8723A("%s(%s): Use new entry index = %d for this PMKID\n",
+                         __func__, netdev->name, psecuritypriv->PMKIDIndex);
 
-               memcpy(psecuritypriv->PMKIDList[psecuritypriv->PMKIDIndex].
-                      Bssid, pmksa->bssid, ETH_ALEN);
+               ether_addr_copy(
+                       psecuritypriv->PMKIDList[psecuritypriv->PMKIDIndex].
+                       Bssid, pmksa->bssid);
                memcpy(psecuritypriv->PMKIDList[psecuritypriv->PMKIDIndex].
                       PMKID, pmksa->pmkid, WLAN_PMKID_LEN);
 
@@ -2507,14 +2356,14 @@ static int cfg80211_rtw_del_pmksa(struct wiphy *wiphy,
        struct rtw_adapter *padapter = wiphy_to_adapter(wiphy);
        struct security_priv *psecuritypriv = &padapter->securitypriv;
 
-       DBG_8723A(FUNC_NDEV_FMT "\n", FUNC_NDEV_ARG(netdev));
+       DBG_8723A("%s(%s)\n", __func__, netdev->name);
 
        for (index = 0; index < NUM_PMKID_CACHE; index++) {
-               if (!memcmp(psecuritypriv->PMKIDList[index].Bssid,
-                           pmksa->bssid, ETH_ALEN)) {
-                       /* BSSID is matched, the same AP => Remove this PMKID information and reset it. */
-                       memset(psecuritypriv->PMKIDList[index].Bssid, 0x00,
-                              ETH_ALEN);
+               if (ether_addr_equal(psecuritypriv->PMKIDList[index].Bssid,
+                                    pmksa->bssid)) {
+                       /* BSSID is matched, the same AP => Remove this PMKID
+                          information and reset it. */
+                       eth_zero_addr(psecuritypriv->PMKIDList[index].Bssid);
                        memset(psecuritypriv->PMKIDList[index].PMKID, 0x00,
                               WLAN_PMKID_LEN);
                        psecuritypriv->PMKIDList[index].bUsed = false;
@@ -2524,8 +2373,8 @@ static int cfg80211_rtw_del_pmksa(struct wiphy *wiphy,
        }
 
        if (false == bMatched) {
-               DBG_8723A(FUNC_NDEV_FMT " do not have matched BSSID\n",
-                         FUNC_NDEV_ARG(netdev));
+               DBG_8723A("%s(%s): do not have matched BSSID\n", __func__,
+                         netdev->name);
                return -EINVAL;
        }
 
@@ -2538,7 +2387,7 @@ static int cfg80211_rtw_flush_pmksa(struct wiphy *wiphy,
        struct rtw_adapter *padapter = wiphy_to_adapter(wiphy);
        struct security_priv *psecuritypriv = &padapter->securitypriv;
 
-       DBG_8723A(FUNC_NDEV_FMT "\n", FUNC_NDEV_ARG(netdev));
+       DBG_8723A("%s(%s)\n", __func__, netdev->name);
 
        memset(&psecuritypriv->PMKIDList[0], 0x00,
               sizeof(struct rt_pmkid_list) * NUM_PMKID_CACHE);
@@ -2583,8 +2432,8 @@ void rtw_cfg80211_indicate_sta_assoc(struct rtw_adapter *padapter,
                freq = ieee80211_channel_to_frequency(channel,
                                                      IEEE80211_BAND_5GHZ);
 
-       rtw_cfg80211_rx_mgmt(padapter, freq, 0, pmgmt_frame, frame_len,
-                            GFP_ATOMIC);
+       cfg80211_rx_mgmt(padapter->rtw_wdev, freq, 0, pmgmt_frame, frame_len,
+                        0, GFP_ATOMIC);
 #endif /* defined(RTW_USE_CFG80211_STA_EVENT) */
 }
 
@@ -2597,14 +2446,15 @@ void rtw_cfg80211_indicate_sta_disassoc(struct rtw_adapter *padapter,
        u8 *pmgmt_frame;
        uint frame_len;
        struct ieee80211_hdr *pwlanhdr;
-       unsigned short *fctrl;
-       u8 mgmt_buf[128] = { 0 };
+       u8 mgmt_buf[128];
        struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
        struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info;
        struct net_device *ndev = padapter->pnetdev;
 
        DBG_8723A("%s(padapter =%p,%s)\n", __func__, padapter, ndev->name);
 
+       memset(mgmt_buf, 0, 128);
+
 #if defined(RTW_USE_CFG80211_STA_EVENT)
        cfg80211_del_sta(ndev, da, GFP_ATOMIC);
 #else /* defined(RTW_USE_CFG80211_STA_EVENT) */
@@ -2619,16 +2469,16 @@ void rtw_cfg80211_indicate_sta_disassoc(struct rtw_adapter *padapter,
        pmgmt_frame = mgmt_buf;
        pwlanhdr = (struct ieee80211_hdr *)pmgmt_frame;
 
-       fctrl = &pwlanhdr->frame_control;
-       *(fctrl) = 0;
+       pwlanhdr->frame_control =
+               cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_DEAUTH);
 
-       memcpy(pwlanhdr->addr1, myid(&padapter->eeprompriv), ETH_ALEN);
-       memcpy(pwlanhdr->addr2, da, ETH_ALEN);
-       memcpy(pwlanhdr->addr3, get_my_bssid23a(&pmlmeinfo->network), ETH_ALEN);
+       ether_addr_copy(pwlanhdr->addr1, myid(&padapter->eeprompriv));
+       ether_addr_copy(pwlanhdr->addr2, da);
+       ether_addr_copy(pwlanhdr->addr3, get_my_bssid23a(&pmlmeinfo->network));
 
-       SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);
+       pwlanhdr->seq_ctrl =
+               cpu_to_le16(IEEE80211_SN_TO_SEQ(pmlmeext->mgnt_seq));
        pmlmeext->mgnt_seq++;
-       SetFrameSubType(pmgmt_frame, WIFI_DEAUTH);
 
        pmgmt_frame += sizeof(struct ieee80211_hdr_3addr);
        frame_len = sizeof(struct ieee80211_hdr_3addr);
@@ -2638,8 +2488,8 @@ void rtw_cfg80211_indicate_sta_disassoc(struct rtw_adapter *padapter,
                                       WLAN_REASON_PREV_AUTH_NOT_VALID,
                                       (unsigned char *)&reason, &frame_len);
 
-       rtw_cfg80211_rx_mgmt(padapter, freq, 0, mgmt_buf, frame_len,
-                            GFP_ATOMIC);
+       cfg80211_rx_mgmt(padapter->rtw_wdev, freq, 0, mgmt_buf, frame_len,
+                        0, GFP_ATOMIC);
 #endif /* defined(RTW_USE_CFG80211_STA_EVENT) */
 }
 
@@ -2676,7 +2526,7 @@ static int rtw_cfg80211_monitor_if_xmit_entry(struct sk_buff *skb,
        struct ieee80211_radiotap_header *rtap_hdr;
        struct rtw_adapter *padapter = netdev_priv(ndev);
 
-       DBG_8723A(FUNC_NDEV_FMT "\n", FUNC_NDEV_ARG(ndev));
+       DBG_8723A("%s(%s)\n", __func__, ndev->name);
 
        if (unlikely(skb->len < sizeof(struct ieee80211_radiotap_header)))
                goto fail;
@@ -2718,8 +2568,8 @@ static int rtw_cfg80211_monitor_if_xmit_entry(struct sk_buff *skb,
                skb_pull(skb, dot11_hdr_len + qos_len + snap_len -
                         ETH_ALEN * 2);
                pdata = (unsigned char *)skb->data;
-               memcpy(pdata, dst_mac_addr, ETH_ALEN);
-               memcpy(pdata + ETH_ALEN, src_mac_addr, ETH_ALEN);
+               ether_addr_copy(pdata, dst_mac_addr);
+               ether_addr_copy(pdata + ETH_ALEN, src_mac_addr);
 
                DBG_8723A("should be eapol packet\n");
 
@@ -2729,6 +2579,7 @@ static int rtw_cfg80211_monitor_if_xmit_entry(struct sk_buff *skb,
                return ret;
 
        } else if (ieee80211_is_action(dot11_hdr->frame_control)) {
+               struct ieee80211_mgmt *mgmt;
                /* only for action frames */
                struct xmit_frame *pmgntframe;
                struct pkt_attrib *pattrib;
@@ -2739,33 +2590,19 @@ static int rtw_cfg80211_monitor_if_xmit_entry(struct sk_buff *skb,
                struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
                u32 len = skb->len;
                u8 category, action;
-#ifdef CONFIG_8723AU_P2P
-               int type = -1;
-#endif
 
-               if (rtw_action_frame_parse23a(skb->data, len, &category,
-                                          &action) == false) {
-                       DBG_8723A(FUNC_NDEV_FMT " frame_control:0x%x\n",
-                                 FUNC_NDEV_ARG(ndev),
-                                 le16_to_cpu(dot11_hdr->frame_control));
-                       goto fail;
-               }
+               mgmt = (struct ieee80211_mgmt *)dot11_hdr;
 
-               DBG_8723A("RTW_Tx:da =" MAC_FMT " via " FUNC_NDEV_FMT "\n",
-                         MAC_ARG(dot11_hdr->addr1), FUNC_NDEV_ARG(ndev));
-#ifdef CONFIG_8723AU_P2P
-               type = rtw_p2p_check_frames(padapter, skb->data, len, true);
-               if (type >= 0)
-                       goto dump;
-#endif
-               if (category == WLAN_CATEGORY_PUBLIC)
+               DBG_8723A("RTW_Tx:da =" MAC_FMT " via %s(%s)\n",
+                         MAC_ARG(mgmt->da), __func__, ndev->name);
+               category = mgmt->u.action.category;
+               action = mgmt->u.action.u.wme_action.action_code;
+               if (mgmt->u.action.category == WLAN_CATEGORY_PUBLIC)
                        DBG_8723A("RTW_Tx:%s\n", action_public_str23a(action));
                else
                        DBG_8723A("RTW_Tx:category(%u), action(%u)\n", category,
                                  action);
-#ifdef CONFIG_8723AU_P2P
-dump:
-#endif
+
                /* starting alloc mgmt frame to dump it */
                pmgntframe = alloc_mgtxmitframe23a(pxmitpriv);
                if (pmgntframe == NULL)
@@ -2781,16 +2618,6 @@ dump:
                pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;
 
                memcpy(pframe, skb->data, len);
-#ifdef CONFIG_8723AU_P2P
-               if (type >= 0) {
-                       struct wifi_display_info *pwfd_info;
-
-                       pwfd_info = padapter->wdinfo.wfd_info;
-
-                       if (pwfd_info->wfd_enable)
-                               rtw_append_wfd_ie(padapter, pframe, &len);
-               }
-#endif /*  CONFIG_8723AU_P2P */
                pattrib->pktlen = len;
 
                /* update seq number */
@@ -2836,24 +2663,23 @@ static int rtw_cfg80211_add_monitor_if(struct rtw_adapter *padapter, char *name,
        struct rtw_wdev_priv *pwdev_priv = wdev_to_priv(padapter->rtw_wdev);
 
        if (!name) {
-               DBG_8723A(FUNC_ADPT_FMT " without specific name\n",
-                         FUNC_ADPT_ARG(padapter));
+               DBG_8723A("%s(%s): without specific name\n",
+                         __func__, padapter->pnetdev->name);
                ret = -EINVAL;
                goto out;
        }
 
        if (pwdev_priv->pmon_ndev) {
-               DBG_8723A(FUNC_ADPT_FMT " monitor interface exist: " NDEV_FMT
-                         "\n", FUNC_ADPT_ARG(padapter),
-                         NDEV_ARG(pwdev_priv->pmon_ndev));
+               DBG_8723A("%s(%s): monitor interface exist: %s\n", __func__,
+                         padapter->pnetdev->name, pwdev_priv->pmon_ndev->name);
                ret = -EBUSY;
                goto out;
        }
 
        mon_ndev = alloc_etherdev(sizeof(struct rtw_adapter));
        if (!mon_ndev) {
-               DBG_8723A(FUNC_ADPT_FMT " allocate ndev fail\n",
-                         FUNC_ADPT_ARG(padapter));
+               DBG_8723A("%s(%s): allocate ndev fail\n", __func__,
+                         padapter->pnetdev->name);
                ret = -ENOMEM;
                goto out;
        }
@@ -2868,8 +2694,8 @@ static int rtw_cfg80211_add_monitor_if(struct rtw_adapter *padapter, char *name,
        /*  wdev */
        mon_wdev = kzalloc(sizeof(struct wireless_dev), GFP_KERNEL);
        if (!mon_wdev) {
-               DBG_8723A(FUNC_ADPT_FMT " allocate mon_wdev fail\n",
-                         FUNC_ADPT_ARG(padapter));
+               DBG_8723A("%s(%s): allocate mon_wdev fail\n", __func__,
+                         padapter->pnetdev->name);
                ret = -ENOMEM;
                goto out;
        }
@@ -2910,8 +2736,8 @@ cfg80211_rtw_add_virtual_intf(struct wiphy *wiphy, const char *name,
        struct net_device *ndev = NULL;
        struct rtw_adapter *padapter = wiphy_to_adapter(wiphy);
 
-       DBG_8723A(FUNC_ADPT_FMT " wiphy:%s, name:%s, type:%d\n",
-                 FUNC_ADPT_ARG(padapter), wiphy_name(wiphy), name, type);
+       DBG_8723A("%s(%s): wiphy:%s, name:%s, type:%d\n", __func__,
+                 padapter->pnetdev->name, wiphy_name(wiphy), name, type);
 
        switch (type) {
        case NL80211_IFTYPE_ADHOC:
@@ -2940,7 +2766,8 @@ cfg80211_rtw_add_virtual_intf(struct wiphy *wiphy, const char *name,
                break;
        }
 
-       DBG_8723A(FUNC_ADPT_FMT " ndev:%p, ret:%d\n", FUNC_ADPT_ARG(padapter),
+       DBG_8723A("%s(%s): ndev:%p, ret:%d\n", __func__,
+                 padapter->pnetdev->name,
                  ndev, ret);
 
        return ndev ? ndev->ieee80211_ptr : ERR_PTR(ret);
@@ -2962,8 +2789,8 @@ static int cfg80211_rtw_del_virtual_intf(struct wiphy *wiphy,
        if (ndev == pwdev_priv->pmon_ndev) {
                pwdev_priv->pmon_ndev = NULL;
                pwdev_priv->ifname_mon[0] = '\0';
-               DBG_8723A(FUNC_NDEV_FMT " remove monitor interface\n",
-                         FUNC_NDEV_ARG(ndev));
+               DBG_8723A("%s(%s): remove monitor interface\n",
+                         __func__, ndev->name);
        }
 
 exit:
@@ -2976,10 +2803,6 @@ static int rtw_add_beacon(struct rtw_adapter *adapter, const u8 *head,
        int ret = 0;
        u8 *pbuf = NULL;
        uint len, wps_ielen = 0;
-#ifdef CONFIG_8723AU_P2P
-       uint p2p_ielen = 0;
-       u8 got_p2p_ie = false;
-#endif
        struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
        /* struct sta_priv *pstapriv = &padapter->stapriv; */
 
@@ -3007,55 +2830,14 @@ static int rtw_add_beacon(struct rtw_adapter *adapter, const u8 *head,
             &wps_ielen))
                DBG_8723A("add bcn, wps_ielen =%d\n", wps_ielen);
 
-#ifdef CONFIG_8723AU_P2P
-       /* check p2p ie if inclued */
-       if (rtw_get_p2p_ie23a
-           (pbuf + _FIXED_IE_LENGTH_, len - _FIXED_IE_LENGTH_, NULL,
-            &p2p_ielen)) {
-               DBG_8723A("got p2p_ie, len =%d\n", p2p_ielen);
-               got_p2p_ie = true;
-       }
-#endif
-
        /* pbss_network->IEs will not include p2p_ie, wfd ie */
-       rtw_ies_remove_ie23a(pbuf, &len, _BEACON_IE_OFFSET_, _VENDOR_SPECIFIC_IE_,
-                         P2P_OUI23A, 4);
-       rtw_ies_remove_ie23a(pbuf, &len, _BEACON_IE_OFFSET_, _VENDOR_SPECIFIC_IE_,
-                         WFD_OUI23A, 4);
+       rtw_ies_remove_ie23a(pbuf, &len, _BEACON_IE_OFFSET_,
+                            WLAN_EID_VENDOR_SPECIFIC, P2P_OUI23A, 4);
+       rtw_ies_remove_ie23a(pbuf, &len, _BEACON_IE_OFFSET_,
+                            WLAN_EID_VENDOR_SPECIFIC, WFD_OUI23A, 4);
 
        if (rtw_check_beacon_data23a(adapter, pbuf, len) == _SUCCESS) {
-#ifdef CONFIG_8723AU_P2P
-               /* check p2p if enable */
-               if (got_p2p_ie == true) {
-                       struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv;
-                       struct wifidirect_info *pwdinfo = &adapter->wdinfo;
-
-                       if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) {
-                               DBG_8723A("Enable P2P function for the first "
-                                         "time\n");
-                               rtw_p2p_enable23a(adapter, P2P_ROLE_GO);
-                               wdev_to_priv(adapter->rtw_wdev)->p2p_enabled =
-                                       true;
-                       } else {
-                               del_timer_sync(&pwdinfo->find_phase_timer);
-                               del_timer_sync(&pwdinfo->
-                                              restore_p2p_state_timer);
-                               del_timer_sync(&pwdinfo->pre_tx_scan_timer);
-
-                               DBG_8723A("enter GO Mode, p2p_ielen =%d\n",
-                                         p2p_ielen);
-
-                               rtw_p2p_set_role(pwdinfo, P2P_ROLE_GO);
-                               rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_OK);
-                               pwdinfo->intent = 15;
-                       }
-
-                       pwdinfo->operating_channel = pmlmeext->cur_channel;
-               }
-#endif /* CONFIG_8723AU_P2P */
-
                ret = 0;
-
        } else {
                ret = -EINVAL;
        }
@@ -3071,8 +2853,8 @@ static int cfg80211_rtw_start_ap(struct wiphy *wiphy, struct net_device *ndev,
        int ret = 0;
        struct rtw_adapter *adapter = wiphy_to_adapter(wiphy);
 
-       DBG_8723A(FUNC_NDEV_FMT " hidden_ssid:%d, auth_type:%d\n",
-                 FUNC_NDEV_ARG(ndev), settings->hidden_ssid,
+       DBG_8723A("%s(%s): hidden_ssid:%d, auth_type:%d\n",
+                 __func__, ndev->name, settings->hidden_ssid,
                  settings->auth_type);
 
        ret = rtw_add_beacon(adapter, settings->beacon.head,
@@ -3088,29 +2870,12 @@ static int cfg80211_rtw_start_ap(struct wiphy *wiphy, struct net_device *ndev,
                struct wlan_bssid_ex *pbss_network_ext =
                        &adapter->mlmeextpriv.mlmext_info.network;
 
-               if (0)
-                       DBG_8723A(FUNC_ADPT_FMT
-                                 " ssid:(%s,%d), from ie:(%s,%d)\n",
-                                 FUNC_ADPT_ARG(adapter), settings->ssid,
-                                 (int)settings->ssid_len,
-                                 pbss_network->Ssid.ssid,
-                                 pbss_network->Ssid.ssid_len);
-
                memcpy(pbss_network->Ssid.ssid, (void *)settings->ssid,
                       settings->ssid_len);
                pbss_network->Ssid.ssid_len = settings->ssid_len;
                memcpy(pbss_network_ext->Ssid.ssid, (void *)settings->ssid,
                       settings->ssid_len);
                pbss_network_ext->Ssid.ssid_len = settings->ssid_len;
-
-               if (0)
-                       DBG_8723A(FUNC_ADPT_FMT
-                                 " after ssid:(%s,%d), (%s,%d)\n",
-                                 FUNC_ADPT_ARG(adapter),
-                                 pbss_network->Ssid.ssid,
-                                 pbss_network->Ssid.ssid_len,
-                                 pbss_network_ext->Ssid.ssid,
-                                 pbss_network_ext->Ssid.ssid_len);
        }
 
        return ret;
@@ -3123,7 +2888,7 @@ static int cfg80211_rtw_change_beacon(struct wiphy *wiphy,
        int ret = 0;
        struct rtw_adapter *adapter = wiphy_to_adapter(wiphy);
 
-       DBG_8723A(FUNC_NDEV_FMT "\n", FUNC_NDEV_ARG(ndev));
+       DBG_8723A("%s(%s)\n", __func__, ndev->name);
 
        ret = rtw_add_beacon(adapter, info->head, info->head_len, info->tail,
                             info->tail_len);
@@ -3133,21 +2898,21 @@ static int cfg80211_rtw_change_beacon(struct wiphy *wiphy,
 
 static int cfg80211_rtw_stop_ap(struct wiphy *wiphy, struct net_device *ndev)
 {
-       DBG_8723A(FUNC_NDEV_FMT "\n", FUNC_NDEV_ARG(ndev));
+       DBG_8723A("%s(%s)\n", __func__, ndev->name);
        return 0;
 }
 
 static int cfg80211_rtw_add_station(struct wiphy *wiphy,
-                                   struct net_device *ndev, u8 *mac,
+                                   struct net_device *ndev, const u8 *mac,
                                    struct station_parameters *params)
 {
-       DBG_8723A(FUNC_NDEV_FMT "\n", FUNC_NDEV_ARG(ndev));
+       DBG_8723A("%s(%s)\n", __func__, ndev->name);
 
        return 0;
 }
 
 static int cfg80211_rtw_del_station(struct wiphy *wiphy,
-                                   struct net_device *ndev, u8 *mac)
+                                   struct net_device *ndev, const u8 *mac)
 {
        int ret = 0;
        struct list_head *phead, *plist, *ptmp;
@@ -3157,7 +2922,7 @@ static int cfg80211_rtw_del_station(struct wiphy *wiphy,
        struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
        struct sta_priv *pstapriv = &padapter->stapriv;
 
-       DBG_8723A("+" FUNC_NDEV_FMT "\n", FUNC_NDEV_ARG(ndev));
+       DBG_8723A("+%s(%s)\n", __func__, ndev->name);
 
        if (check_fwstate(pmlmepriv, (_FW_LINKED | WIFI_AP_STATE)) != true) {
                DBG_8723A("%s, fw_state != FW_LINKED|WIFI_AP_STATE\n",
@@ -3188,7 +2953,7 @@ static int cfg80211_rtw_del_station(struct wiphy *wiphy,
        list_for_each_safe(plist, ptmp, phead) {
                psta = container_of(plist, struct sta_info, asoc_list);
 
-               if (!memcmp(mac, psta->hwaddr, ETH_ALEN)) {
+               if (ether_addr_equal(mac, psta->hwaddr)) {
                        if (psta->dot8021xalg == 1 &&
                            psta->bpairwise_key_installed == false) {
                                DBG_8723A("%s, sta's dot8021xalg = 1 and "
@@ -3217,16 +2982,16 @@ static int cfg80211_rtw_del_station(struct wiphy *wiphy,
 
        associated_clients_update23a(padapter, updated);
 
-       DBG_8723A("-" FUNC_NDEV_FMT "\n", FUNC_NDEV_ARG(ndev));
+       DBG_8723A("-%s(%s)\n", __func__, ndev->name);
 
        return ret;
 }
 
 static int cfg80211_rtw_change_station(struct wiphy *wiphy,
-                                      struct net_device *ndev, u8 *mac,
+                                      struct net_device *ndev, const u8 *mac,
                                       struct station_parameters *params)
 {
-       DBG_8723A(FUNC_NDEV_FMT "\n", FUNC_NDEV_ARG(ndev));
+       DBG_8723A("%s(%s)\n", __func__, ndev->name);
        return 0;
 }
 
@@ -3234,7 +2999,7 @@ static int cfg80211_rtw_dump_station(struct wiphy *wiphy,
                                     struct net_device *ndev, int idx, u8 *mac,
                                     struct station_info *sinfo)
 {
-       DBG_8723A(FUNC_NDEV_FMT "\n", FUNC_NDEV_ARG(ndev));
+       DBG_8723A("%s(%s)\n", __func__, ndev->name);
 
        /* TODO: dump scanned queue */
 
@@ -3244,104 +3009,27 @@ static int cfg80211_rtw_dump_station(struct wiphy *wiphy,
 static int cfg80211_rtw_change_bss(struct wiphy *wiphy, struct net_device *ndev,
                                   struct bss_parameters *params)
 {
-       DBG_8723A(FUNC_NDEV_FMT "\n", FUNC_NDEV_ARG(ndev));
+       DBG_8723A("%s(%s)\n", __func__, ndev->name);
        return 0;
 }
 #endif /* CONFIG_8723AU_AP_MODE */
 
-void rtw_cfg80211_rx_action_p2p(struct rtw_adapter *padapter, u8 *pmgmt_frame,
-                               uint frame_len)
-{
-#ifdef CONFIG_8723AU_P2P
-       int type;
-#endif
-       s32 freq;
-       int channel;
-       u8 category, action;
-
-       channel = rtw_get_oper_ch23a(padapter);
-
-       DBG_8723A("RTW_Rx:cur_ch =%d\n", channel);
-#ifdef CONFIG_8723AU_P2P
-       type = rtw_p2p_check_frames(padapter, pmgmt_frame, frame_len, false);
-       if (type >= 0)
-               goto indicate;
-#endif
-       rtw_action_frame_parse23a(pmgmt_frame, frame_len, &category, &action);
-       DBG_8723A("RTW_Rx:category(%u), action(%u)\n", category, action);
-
-#ifdef CONFIG_8723AU_P2P
-indicate:
-#endif
-       if (channel <= RTW_CH_MAX_2G_CHANNEL)
-               freq = ieee80211_channel_to_frequency(channel,
-                                                     IEEE80211_BAND_2GHZ);
-       else
-               freq = ieee80211_channel_to_frequency(channel,
-                                                     IEEE80211_BAND_5GHZ);
-
-       rtw_cfg80211_rx_mgmt(padapter, freq, 0, pmgmt_frame, frame_len,
-                            GFP_ATOMIC);
-}
-
-void rtw_cfg80211_rx_p2p_action_public(struct rtw_adapter *padapter,
-                                      u8 *pmgmt_frame, uint frame_len)
-{
-#ifdef CONFIG_8723AU_P2P
-       int type;
-#endif
-       s32 freq;
-       int channel;
-       u8 category, action;
-
-       channel = rtw_get_oper_ch23a(padapter);
-
-       DBG_8723A("RTW_Rx:cur_ch =%d\n", channel);
-#ifdef CONFIG_8723AU_P2P
-       type = rtw_p2p_check_frames(padapter, pmgmt_frame, frame_len, false);
-       if (type >= 0) {
-               switch (type) {
-               case P2P_GO_NEGO_CONF:
-               case P2P_PROVISION_DISC_RESP:
-                       rtw_clear_scan_deny(padapter);
-               }
-               goto indicate;
-       }
-#endif
-       rtw_action_frame_parse23a(pmgmt_frame, frame_len, &category, &action);
-       DBG_8723A("RTW_Rx:category(%u), action(%u)\n", category, action);
-
-#ifdef CONFIG_8723AU_P2P
-indicate:
-#endif
-       if (channel <= RTW_CH_MAX_2G_CHANNEL)
-               freq = ieee80211_channel_to_frequency(channel,
-                                                     IEEE80211_BAND_2GHZ);
-       else
-               freq = ieee80211_channel_to_frequency(channel,
-                                                     IEEE80211_BAND_5GHZ);
-
-       rtw_cfg80211_rx_mgmt(padapter, freq, 0, pmgmt_frame, frame_len,
-                            GFP_ATOMIC);
-}
-
 void rtw_cfg80211_rx_action(struct rtw_adapter *adapter, u8 *frame,
                            uint frame_len, const char *msg)
 {
+       struct ieee80211_mgmt *hdr = (struct ieee80211_mgmt *)frame;
        s32 freq;
        int channel;
-       u8 category, action;
 
        channel = rtw_get_oper_ch23a(adapter);
 
-       rtw_action_frame_parse23a(frame, frame_len, &category, &action);
-
        DBG_8723A("RTW_Rx:cur_ch =%d\n", channel);
        if (msg)
                DBG_8723A("RTW_Rx:%s\n", msg);
        else
-               DBG_8723A("RTW_Rx:category(%u), action(%u)\n", category,
-                         action);
+               DBG_8723A("RTW_Rx:category(%u), action(%u)\n",
+                         hdr->u.action.category,
+                         hdr->u.action.u.wme_action.action_code);
 
        if (channel <= RTW_CH_MAX_2G_CHANNEL)
                freq = ieee80211_channel_to_frequency(channel,
@@ -3350,366 +3038,21 @@ void rtw_cfg80211_rx_action(struct rtw_adapter *adapter, u8 *frame,
                freq = ieee80211_channel_to_frequency(channel,
                                                      IEEE80211_BAND_5GHZ);
 
-       rtw_cfg80211_rx_mgmt(adapter, freq, 0, frame, frame_len, GFP_ATOMIC);
+       cfg80211_rx_mgmt(adapter->rtw_wdev, freq, 0, frame, frame_len,
+                        0, GFP_ATOMIC);
 }
 
-#ifdef CONFIG_8723AU_P2P
-void rtw_cfg80211_issue_p2p_provision_request23a(struct rtw_adapter *padapter,
-                                             const u8 *buf, size_t len)
+static int _cfg80211_rtw_mgmt_tx(struct rtw_adapter *padapter, u8 tx_ch,
+                                const u8 *buf, size_t len)
 {
-       u16 wps_devicepassword_id = 0x0000;
-       uint wps_devicepassword_id_len = 0;
-       u8 wpsie[255] = { 0x00 }, p2p_ie[255] = { 0x00 };
-       uint p2p_ielen = 0;
-       uint wpsielen = 0;
-       u32 devinfo_contentlen = 0;
-       u8 devinfo_content[64] = { 0x00 };
-       u16 capability = 0;
-       uint capability_len = 0;
-
-       unsigned char category = WLAN_CATEGORY_PUBLIC;
-       u8 action = P2P_PUB_ACTION_ACTION;
-       u8 dialogToken = 1;
-       u32 p2poui = cpu_to_be32(P2POUI);
-       u8 oui_subtype = P2P_PROVISION_DISC_REQ;
-       u32 p2pielen = 0;
-#ifdef CONFIG_8723AU_P2P
-       u32 wfdielen = 0;
-#endif /* CONFIG_8723AU_P2P */
-
        struct xmit_frame *pmgntframe;
        struct pkt_attrib *pattrib;
        unsigned char *pframe;
-       struct ieee80211_hdr *pwlanhdr, *hdr;
+       int ret = _FAIL;
+       struct ieee80211_hdr *pwlanhdr;
        struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
        struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
 
-       struct wifidirect_info *pwdinfo = &padapter->wdinfo;
-       u8 *frame_body =
-           (unsigned char *)(buf + sizeof(struct ieee80211_hdr_3addr));
-       size_t frame_body_len = len - sizeof(struct ieee80211_hdr_3addr);
-
-       DBG_8723A("[%s] In\n", __func__);
-
-       hdr = (struct ieee80211_hdr *)buf;
-       /* prepare for building provision_request frame */
-       memcpy(pwdinfo->tx_prov_disc_info.peerIFAddr, hdr->addr1, ETH_ALEN);
-       memcpy(pwdinfo->tx_prov_disc_info.peerDevAddr, hdr->addr1, ETH_ALEN);
-
-       pwdinfo->tx_prov_disc_info.wps_config_method_request =
-           WPS_CM_PUSH_BUTTON;
-
-       rtw_get_wps_ie23a(frame_body + _PUBLIC_ACTION_IE_OFFSET_,
-                      frame_body_len - _PUBLIC_ACTION_IE_OFFSET_, wpsie,
-                      &wpsielen);
-       rtw_get_wps_attr_content23a(wpsie, wpsielen, WPS_ATTR_DEVICE_PWID,
-                                   (u8 *)&wps_devicepassword_id,
-                                   &wps_devicepassword_id_len);
-       wps_devicepassword_id = be16_to_cpu(wps_devicepassword_id);
-
-       switch (wps_devicepassword_id) {
-       case WPS_DPID_PIN:
-               pwdinfo->tx_prov_disc_info.wps_config_method_request =
-                       WPS_CM_LABEL;
-               break;
-       case WPS_DPID_USER_SPEC:
-               pwdinfo->tx_prov_disc_info.wps_config_method_request =
-                       WPS_CM_DISPLYA;
-               break;
-       case WPS_DPID_MACHINE_SPEC:
-               break;
-       case WPS_DPID_REKEY:
-               break;
-       case WPS_DPID_PBC:
-               pwdinfo->tx_prov_disc_info.wps_config_method_request =
-                       WPS_CM_PUSH_BUTTON;
-               break;
-       case WPS_DPID_REGISTRAR_SPEC:
-               pwdinfo->tx_prov_disc_info.wps_config_method_request =
-                       WPS_CM_KEYPAD;
-               break;
-       default:
-               break;
-       }
-
-       if (rtw_get_p2p_ie23a(frame_body + _PUBLIC_ACTION_IE_OFFSET_,
-                          frame_body_len - _PUBLIC_ACTION_IE_OFFSET_,
-                          p2p_ie, &p2p_ielen)) {
-               rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen,
-                                        P2P_ATTR_DEVICE_INFO, devinfo_content,
-                                        &devinfo_contentlen);
-               rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen, P2P_ATTR_CAPABILITY,
-                                        (u8 *)&capability, &capability_len);
-       }
-
-       /* start to build provision_request frame */
-       memset(wpsie, 0, sizeof(wpsie));
-       memset(p2p_ie, 0, sizeof(p2p_ie));
-       p2p_ielen = 0;
-
-       pmgntframe = alloc_mgtxmitframe23a(pxmitpriv);
-       if (pmgntframe == NULL)
-               return;
-       /* update attribute */
-       pattrib = &pmgntframe->attrib;
-       update_mgntframe_attrib23a(padapter, pattrib);
-
-       memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);
-
-       pframe = (u8 *) (pmgntframe->buf_addr) + TXDESC_OFFSET;
-       pwlanhdr = (struct ieee80211_hdr *)pframe;
-
-       pwlanhdr->frame_control = 0;
-
-       memcpy(pwlanhdr->addr1, pwdinfo->tx_prov_disc_info.peerDevAddr,
-              ETH_ALEN);
-       memcpy(pwlanhdr->addr2, myid(&padapter->eeprompriv), ETH_ALEN);
-       memcpy(pwlanhdr->addr3, pwdinfo->tx_prov_disc_info.peerDevAddr,
-              ETH_ALEN);
-
-       SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);
-       pmlmeext->mgnt_seq++;
-       SetFrameSubType(pframe, WIFI_ACTION);
-
-       pframe += sizeof(struct ieee80211_hdr_3addr);
-       pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr);
-
-       pframe = rtw_set_fixed_ie23a(pframe, 1, &category, &pattrib->pktlen);
-       pframe = rtw_set_fixed_ie23a(pframe, 1, &action, &pattrib->pktlen);
-       pframe = rtw_set_fixed_ie23a(pframe, 4, (unsigned char *)&p2poui,
-                                 &pattrib->pktlen);
-       pframe = rtw_set_fixed_ie23a(pframe, 1, &oui_subtype, &pattrib->pktlen);
-       pframe = rtw_set_fixed_ie23a(pframe, 1, &dialogToken, &pattrib->pktlen);
-
-       /* build_prov_disc_request_p2p_ie23a */
-       /*      P2P OUI */
-       p2pielen = 0;
-       p2p_ie[p2pielen++] = 0x50;
-       p2p_ie[p2pielen++] = 0x6F;
-       p2p_ie[p2pielen++] = 0x9A;
-       p2p_ie[p2pielen++] = 0x09;      /*      WFA P2P v1.0 */
-
-       /*      Commented by Albert 20110301 */
-       /*      According to the P2P Specification, the provision discovery request frame should contain 3 P2P attributes */
-       /*      1. P2P Capability */
-       /*      2. Device Info */
-       /*      3. Group ID ( When joining an operating P2P Group ) */
-
-       /*      P2P Capability ATTR */
-       /*      Type: */
-       p2p_ie[p2pielen++] = P2P_ATTR_CAPABILITY;
-
-       /*      Length: */
-       put_unaligned_le16(0x0002, p2p_ie + p2pielen);
-       p2pielen += 2;
-
-       /*      Value: */
-       /*      Device Capability Bitmap, 1 byte */
-       /*      Group Capability Bitmap, 1 byte */
-       memcpy(p2p_ie + p2pielen, &capability, 2);
-       p2pielen += 2;
-
-       /*      Device Info ATTR */
-       /*      Type: */
-       p2p_ie[p2pielen++] = P2P_ATTR_DEVICE_INFO;
-
-       /*      Length: */
-       put_unaligned_le16(devinfo_contentlen, p2p_ie + p2pielen);
-       p2pielen += 2;
-
-       /*      Value: */
-       memcpy(p2p_ie + p2pielen, devinfo_content, devinfo_contentlen);
-       p2pielen += devinfo_contentlen;
-
-       pframe = rtw_set_ie23a(pframe, _VENDOR_SPECIFIC_IE_, p2pielen,
-                           (unsigned char *)p2p_ie, &p2p_ielen);
-       pattrib->pktlen += p2p_ielen;
-
-       wpsielen = 0;
-       /*      WPS OUI */
-       *(u32 *)(wpsie) = cpu_to_be32(WPSOUI);
-       wpsielen += 4;
-
-       /*      WPS version */
-       /*      Type: */
-       *(u16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_VER1);
-       wpsielen += 2;
-
-       /*      Length: */
-       *(u16 *)(wpsie + wpsielen) = cpu_to_be16(0x0001);
-       wpsielen += 2;
-
-       /*      Value: */
-       wpsie[wpsielen++] = WPS_VERSION_1;      /*      Version 1.0 */
-
-       /*      Config Method */
-       /*      Type: */
-       *(u16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_CONF_METHOD);
-       wpsielen += 2;
-
-       /*      Length: */
-       *(u16 *)(wpsie + wpsielen) = cpu_to_be16(0x0002);
-       wpsielen += 2;
-
-       /*      Value: */
-       *(u16 *)(wpsie + wpsielen) =
-           cpu_to_be16(pwdinfo->tx_prov_disc_info.wps_config_method_request);
-       wpsielen += 2;
-
-       pframe = rtw_set_ie23a(pframe, _VENDOR_SPECIFIC_IE_, wpsielen,
-                           (unsigned char *)wpsie, &pattrib->pktlen);
-
-#ifdef CONFIG_8723AU_P2P
-       wfdielen = build_provdisc_req_wfd_ie(pwdinfo, pframe);
-       pframe += wfdielen;
-       pattrib->pktlen += wfdielen;
-#endif /* CONFIG_8723AU_P2P */
-
-       pattrib->last_txcmdsz = pattrib->pktlen;
-
-       /* dump_mgntframe23a(padapter, pmgntframe); */
-       if (dump_mgntframe23a_and_wait_ack23a(padapter, pmgntframe) != _SUCCESS)
-               DBG_8723A("%s, ack to\n", __func__);
-}
-
-static s32 cfg80211_rtw_remain_on_channel(struct wiphy *wiphy,
-                                         struct wireless_dev *wdev,
-                                         struct ieee80211_channel *channel,
-                                         unsigned int duration, u64 *cookie)
-{
-       s32 err = 0;
-       struct rtw_adapter *padapter = wiphy_to_adapter(wiphy);
-       struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
-       struct wifidirect_info *pwdinfo = &padapter->wdinfo;
-       struct cfg80211_wifidirect_info *pcfg80211_wdinfo =
-           &padapter->cfg80211_wdinfo;
-       u8 remain_ch =
-               (u8) ieee80211_frequency_to_channel(channel->center_freq);
-       u8 ready_on_channel = false;
-
-       DBG_8723A(FUNC_ADPT_FMT " ch:%u duration:%d\n", FUNC_ADPT_ARG(padapter),
-                 remain_ch, duration);
-
-       if (pcfg80211_wdinfo->is_ro_ch == true) {
-               DBG_8723A("%s, cancel ro ch timer\n", __func__);
-
-               del_timer_sync(&padapter->cfg80211_wdinfo.remain_on_ch_timer);
-
-#ifdef CONFIG_8723AU_P2P
-               p2p_protocol_wk_hdl23a(padapter, P2P_RO_CH_WK);
-#endif
-       }
-
-       pcfg80211_wdinfo->is_ro_ch = true;
-
-       if (_FAIL == rtw_pwr_wakeup(padapter)) {
-               err = -EFAULT;
-               goto exit;
-       }
-
-       memcpy(&pcfg80211_wdinfo->remain_on_ch_channel, channel,
-              sizeof(struct ieee80211_channel));
-       pcfg80211_wdinfo->remain_on_ch_cookie = *cookie;
-
-       rtw_scan_abort23a(padapter);
-       if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) {
-               rtw_p2p_enable23a(padapter, P2P_ROLE_DEVICE);
-               wdev_to_priv(padapter->rtw_wdev)->p2p_enabled = true;
-       } else {
-               rtw_p2p_set_pre_state(pwdinfo, rtw_p2p_state(pwdinfo));
-#ifdef CONFIG_DEBUG_CFG80211
-               DBG_8723A("%s, role =%d, p2p_state =%d\n", __func__,
-                         rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo));
-#endif
-       }
-
-       rtw_p2p_set_state(pwdinfo, P2P_STATE_LISTEN);
-
-       if (duration < 400)
-               duration = duration * 3;        /* extend from exper. */
-
-       pcfg80211_wdinfo->restore_channel = pmlmeext->cur_channel;
-
-       if (rtw_ch_set_search_ch23a(pmlmeext->channel_set, remain_ch) >= 0) {
-               if (remain_ch != pmlmeext->cur_channel) {
-                       ready_on_channel = true;
-               }
-       } else {
-               DBG_8723A("%s remain_ch:%u not in channel plan!!!!\n",
-                         __func__, remain_ch);
-       }
-
-       /* call this after other things have been done */
-       if (ready_on_channel == true) {
-               if (!check_fwstate(&padapter->mlmepriv, _FW_LINKED)) {
-                       pmlmeext->cur_channel = remain_ch;
-
-                       set_channel_bwmode23a(padapter, remain_ch,
-                                          HAL_PRIME_CHNL_OFFSET_DONT_CARE,
-                                          HT_CHANNEL_WIDTH_20);
-               }
-       }
-       DBG_8723A("%s, set ro ch timer, duration =%d\n", __func__, duration);
-       mod_timer(&pcfg80211_wdinfo->remain_on_ch_timer,
-                 jiffies + msecs_to_jiffies(duration));
-
-       rtw_cfg80211_ready_on_channel(padapter, *cookie, channel, channel_type,
-                                     duration, GFP_KERNEL);
-
-       pwdinfo->listen_channel = pmlmeext->cur_channel;
-
-exit:
-       if (err)
-               pcfg80211_wdinfo->is_ro_ch = false;
-
-       return err;
-}
-
-static s32 cfg80211_rtw_cancel_remain_on_channel(struct wiphy *wiphy,
-                                                struct wireless_dev *wdev,
-                                                u64 cookie)
-{
-       s32 err = 0;
-       struct rtw_adapter *padapter = wiphy_to_adapter(wiphy);
-       struct wifidirect_info *pwdinfo = &padapter->wdinfo;
-       struct cfg80211_wifidirect_info *pcfg80211_wdinfo =
-           &padapter->cfg80211_wdinfo;
-
-       DBG_8723A(FUNC_ADPT_FMT "\n", FUNC_ADPT_ARG(padapter));
-
-       if (pcfg80211_wdinfo->is_ro_ch == true) {
-               DBG_8723A("%s, cancel ro ch timer\n", __func__);
-               del_timer_sync(&padapter->cfg80211_wdinfo.remain_on_ch_timer);
-#ifdef CONFIG_8723AU_P2P
-               p2p_protocol_wk_hdl23a(padapter, P2P_RO_CH_WK);
-#endif
-       }
-
-       rtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo));
-#ifdef CONFIG_DEBUG_CFG80211
-       DBG_8723A("%s, role =%d, p2p_state =%d\n", __func__,
-                 rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo));
-#endif
-       pcfg80211_wdinfo->is_ro_ch = false;
-
-       return err;
-}
-
-#endif /* CONFIG_8723AU_P2P */
-
-static int _cfg80211_rtw_mgmt_tx(struct rtw_adapter *padapter, u8 tx_ch,
-                                const u8 *buf, size_t len)
-{
-       struct xmit_frame *pmgntframe;
-       struct pkt_attrib *pattrib;
-       unsigned char *pframe;
-       int ret = _FAIL;
-       bool ack = true;
-       struct ieee80211_hdr *pwlanhdr;
-       struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
-       struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
-       /* struct cfg80211_wifidirect_info *pcfg80211_wdinfo = &padapter->cfg80211_wdinfo; */
-
        if (_FAIL == rtw_pwr_wakeup(padapter)) {
                ret = -EFAULT;
                goto exit;
@@ -3729,7 +3072,7 @@ static int _cfg80211_rtw_mgmt_tx(struct rtw_adapter *padapter, u8 tx_ch,
 
        /* starting alloc mgmt frame to dump it */
        pmgntframe = alloc_mgtxmitframe23a(pxmitpriv);
-       if (pmgntframe == NULL) {
+       if (!pmgntframe) {
                /* ret = -ENOMEM; */
                ret = _FAIL;
                goto exit;
@@ -3753,139 +3096,76 @@ static int _cfg80211_rtw_mgmt_tx(struct rtw_adapter *padapter, u8 tx_ch,
        pattrib->seqnum = pmlmeext->mgnt_seq;
        pmlmeext->mgnt_seq++;
 
-#ifdef CONFIG_8723AU_P2P
-       {
-               struct wifi_display_info *pwfd_info;
-
-               pwfd_info = padapter->wdinfo.wfd_info;
-
-               if (true == pwfd_info->wfd_enable) {
-                       rtw_append_wfd_ie(padapter, pframe, &pattrib->pktlen);
-               }
-       }
-#endif /*  CONFIG_8723AU_P2P */
-
        pattrib->last_txcmdsz = pattrib->pktlen;
 
-       if (dump_mgntframe23a_and_wait_ack23a(padapter, pmgntframe) != _SUCCESS) {
-               ack = false;
-               ret = _FAIL;
+       ret = dump_mgntframe23a_and_wait_ack23a(padapter, pmgntframe);
 
-#ifdef CONFIG_DEBUG_CFG80211
-               DBG_8723A("%s, ack == _FAIL\n", __func__);
-#endif
-       } else {
-#ifdef CONFIG_DEBUG_CFG80211
-               DBG_8723A("%s, ack =%d, ok!\n", __func__, ack);
-#endif
-               ret = _SUCCESS;
-       }
+       if (ret  != _SUCCESS)
+               DBG_8723A("%s, ack == false\n", __func__);
+       else
+               DBG_8723A("%s, ack == true\n", __func__);
 
 exit:
 
-#ifdef CONFIG_DEBUG_CFG80211
        DBG_8723A("%s, ret =%d\n", __func__, ret);
-#endif
 
        return ret;
 }
 
 static int cfg80211_rtw_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 14, 0))
-                               struct ieee80211_channel *chan,
-                               bool offchan,
-                               unsigned int wait,
-                               const u8 *buf, size_t len,
-                               bool no_cck, bool dont_wait_for_ack,
-#else
                                struct cfg80211_mgmt_tx_params *params,
-#endif
                                u64 *cookie)
 {
        struct rtw_adapter *padapter =
                (struct rtw_adapter *)wiphy_to_adapter(wiphy);
-       struct rtw_wdev_priv *pwdev_priv = wdev_to_priv(padapter->rtw_wdev);
        int ret = 0;
        int tx_ret;
        u32 dump_limit = RTW_MAX_MGMT_TX_CNT;
        u32 dump_cnt = 0;
        bool ack = true;
        u8 category, action;
-       int type = (-1);
        unsigned long start = jiffies;
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0))
        size_t len = params->len;
        struct ieee80211_channel *chan = params->chan;
        const u8 *buf = params->buf;
-#endif
-       struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)buf;
+       struct ieee80211_mgmt *hdr = (struct ieee80211_mgmt *)buf;
        u8 tx_ch = (u8) ieee80211_frequency_to_channel(chan->center_freq);
 
+       if (!ieee80211_is_action(hdr->frame_control))
+               return -EINVAL;
+
        /* cookie generation */
        *cookie = (unsigned long)buf;
 
-#ifdef CONFIG_DEBUG_CFG80211
-       DBG_8723A(FUNC_ADPT_FMT " len =%zu, ch =%d"
-                 "\n", FUNC_ADPT_ARG(padapter), len, tx_ch);
-#endif /* CONFIG_DEBUG_CFG80211 */
+       DBG_8723A("%s(%s): len =%zu, ch =%d\n", __func__,
+                 padapter->pnetdev->name, len, tx_ch);
 
        /* indicate ack before issue frame to avoid racing with rsp frame */
-       rtw_cfg80211_mgmt_tx_status(padapter, *cookie, buf, len, ack,
-                                   GFP_KERNEL);
-
-       if (rtw_action_frame_parse23a(buf, len, &category, &action) == false) {
-               DBG_8723A(FUNC_ADPT_FMT " frame_control:0x%x\n",
-                         FUNC_ADPT_ARG(padapter),
-                         le16_to_cpu(hdr->frame_control));
-               goto exit;
-       }
+       cfg80211_mgmt_tx_status(padapter->rtw_wdev, *cookie, buf, len, ack,
+                               GFP_KERNEL);
 
        DBG_8723A("RTW_Tx:tx_ch =%d, da =" MAC_FMT "\n", tx_ch,
-                 MAC_ARG(hdr->addr1));
-#ifdef CONFIG_8723AU_P2P
-       type = rtw_p2p_check_frames(padapter, buf, len, true);
-       if (type >= 0)
-               goto dump;
-#endif
+                 MAC_ARG(hdr->da));
+       category = hdr->u.action.category;
+       action = hdr->u.action.u.wme_action.action_code;
        if (category == WLAN_CATEGORY_PUBLIC)
                DBG_8723A("RTW_Tx:%s\n", action_public_str23a(action));
        else
                DBG_8723A("RTW_Tx:category(%u), action(%u)\n",
                          category, action);
 
-#ifdef CONFIG_8723AU_P2P
-dump:
-#endif
        do {
                dump_cnt++;
                tx_ret = _cfg80211_rtw_mgmt_tx(padapter, tx_ch, buf, len);
        } while (dump_cnt < dump_limit && tx_ret != _SUCCESS);
 
        if (tx_ret != _SUCCESS || dump_cnt > 1) {
-               DBG_8723A(FUNC_ADPT_FMT " %s (%d/%d) in %d ms\n",
-                         FUNC_ADPT_ARG(padapter),
+               DBG_8723A("%s(%s): %s (%d/%d) in %d ms\n",
+                         __func__, padapter->pnetdev->name,
                          tx_ret == _SUCCESS ? "OK" : "FAIL", dump_cnt,
                          dump_limit, jiffies_to_msecs(jiffies - start));
        }
 
-       switch (type) {
-       case P2P_GO_NEGO_CONF:
-               rtw_clear_scan_deny(padapter);
-               break;
-       case P2P_INVIT_RESP:
-               if (pwdev_priv->invit_info.flags & BIT(0)
-                   && pwdev_priv->invit_info.status == 0) {
-                       DBG_8723A(FUNC_ADPT_FMT " agree with invitation of "
-                                 "persistent group\n",
-                                 FUNC_ADPT_ARG(padapter));
-                       rtw_set_scan_deny(padapter, 5000);
-                       rtw_pwr_wakeup_ex(padapter, 5000);
-                       rtw_clear_scan_deny(padapter);
-               }
-               break;
-       }
-
-exit:
        return ret;
 }
 
@@ -3893,358 +3173,12 @@ static void cfg80211_rtw_mgmt_frame_register(struct wiphy *wiphy,
                                             struct wireless_dev *wdev,
                                             u16 frame_type, bool reg)
 {
-
-#ifdef CONFIG_DEBUG_CFG80211
-       DBG_8723A(FUNC_ADPT_FMT " frame_type:%x, reg:%d\n",
-                 FUNC_ADPT_ARG(adapter), frame_type, reg);
-#endif
-
        if (frame_type != (IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_PROBE_REQ))
                return;
 
        return;
 }
 
-static int rtw_cfg80211_set_beacon_wpsp2pie(struct net_device *ndev, char *buf,
-                                           int len)
-{
-       int ret = 0;
-       uint wps_ielen = 0;
-       u8 *wps_ie;
-#ifdef CONFIG_8723AU_P2P
-       u32 p2p_ielen = 0;
-       u32 wfd_ielen = 0;
-       u8 *p2p_ie;
-#endif
-#ifdef CONFIG_8723AU_AP_MODE
-       u8 wps_oui[8] = { 0x0, 0x50, 0xf2, 0x04 };
-#endif
-       struct rtw_adapter *padapter = netdev_priv(ndev);
-       struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
-       struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
-
-       DBG_8723A(FUNC_NDEV_FMT " ielen =%d\n", FUNC_NDEV_ARG(ndev), len);
-
-       if (len > 0) {
-               wps_ie = rtw_get_wps_ie23a(buf, len, NULL, &wps_ielen);
-               if (wps_ie) {
-#ifdef CONFIG_DEBUG_CFG80211
-                       DBG_8723A("bcn_wps_ielen =%d\n", wps_ielen);
-#endif
-
-                       if (pmlmepriv->wps_beacon_ie) {
-                               pmlmepriv->wps_beacon_ie_len = 0;
-                               kfree(pmlmepriv->wps_beacon_ie);
-                               pmlmepriv->wps_beacon_ie = NULL;
-                       }
-
-                       pmlmepriv->wps_beacon_ie =
-                               kmalloc(wps_ielen, GFP_KERNEL);
-                       if (pmlmepriv->wps_beacon_ie == NULL) {
-                               DBG_8723A("%s()-%d: kmalloc() ERROR!\n",
-                                         __func__, __LINE__);
-                               return -EINVAL;
-                       }
-                       memcpy(pmlmepriv->wps_beacon_ie, wps_ie, wps_ielen);
-                       pmlmepriv->wps_beacon_ie_len = wps_ielen;
-
-#ifdef CONFIG_8723AU_AP_MODE
-                       update_beacon23a(padapter, _VENDOR_SPECIFIC_IE_, wps_oui,
-                                     true);
-#endif
-               }
-#ifdef CONFIG_8723AU_P2P
-               p2p_ie = rtw_get_p2p_ie23a(buf, len, NULL, &p2p_ielen);
-               if (p2p_ie) {
-#ifdef CONFIG_DEBUG_CFG80211
-                       DBG_8723A("bcn_p2p_ielen =%d\n", p2p_ielen);
-#endif
-
-                       if (pmlmepriv->p2p_beacon_ie) {
-                               pmlmepriv->p2p_beacon_ie_len = 0;
-                               kfree(pmlmepriv->p2p_beacon_ie);
-                               pmlmepriv->p2p_beacon_ie = NULL;
-                       }
-
-                       pmlmepriv->p2p_beacon_ie =
-                               kmalloc(p2p_ielen, GFP_KERNEL);
-                       if (pmlmepriv->p2p_beacon_ie == NULL) {
-                               DBG_8723A("%s()-%d: kmalloc() ERROR!\n",
-                                         __func__, __LINE__);
-                               return -EINVAL;
-                       }
-
-                       memcpy(pmlmepriv->p2p_beacon_ie, p2p_ie, p2p_ielen);
-                       pmlmepriv->p2p_beacon_ie_len = p2p_ielen;
-               }
-#endif /* CONFIG_8723AU_P2P */
-
-               /* buf += p2p_ielen; */
-               /* len -= p2p_ielen; */
-
-#ifdef CONFIG_8723AU_P2P
-               if (rtw_get_wfd_ie(buf, len, NULL, &wfd_ielen)) {
-#ifdef CONFIG_DEBUG_CFG80211
-                       DBG_8723A("bcn_wfd_ielen =%d\n", wfd_ielen);
-#endif
-
-                       if (pmlmepriv->wfd_beacon_ie) {
-                               pmlmepriv->wfd_beacon_ie_len = 0;
-                               kfree(pmlmepriv->wfd_beacon_ie);
-                               pmlmepriv->wfd_beacon_ie = NULL;
-                       }
-
-                       pmlmepriv->wfd_beacon_ie =
-                               kmalloc(wfd_ielen, GFP_KERNEL);
-                       if (pmlmepriv->wfd_beacon_ie == NULL) {
-                               DBG_8723A("%s()-%d: kmalloc() ERROR!\n",
-                                         __func__, __LINE__);
-                               return -EINVAL;
-
-                       }
-                       rtw_get_wfd_ie(buf, len, pmlmepriv->wfd_beacon_ie,
-                                      &pmlmepriv->wfd_beacon_ie_len);
-               }
-#endif /* CONFIG_8723AU_P2P */
-
-               pmlmeext->bstart_bss = true;
-
-       }
-
-       return ret;
-}
-
-static int rtw_cfg80211_set_probe_resp_wpsp2pie(struct net_device *net,
-                                               char *buf, int len)
-{
-       struct rtw_adapter *padapter = netdev_priv(net);
-       struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
-#ifdef CONFIG_8723AU_P2P
-       u32 p2p_ielen = 0;
-       u8 *p2p_ie;
-       u32 wfd_ielen = 0;
-#endif
-       int ret = 0;
-       uint wps_ielen = 0;
-       u8 *wps_ie;
-
-       if (len > 0) {
-               wps_ie = rtw_get_wps_ie23a(buf, len, NULL, &wps_ielen);
-               if (wps_ie) {
-                       uint attr_contentlen = 0;
-                       u16 uconfig_method, *puconfig_method = NULL;
-
-                       if (pmlmepriv->wps_probe_resp_ie) {
-                               pmlmepriv->wps_probe_resp_ie_len = 0;
-                               kfree(pmlmepriv->wps_probe_resp_ie);
-                               pmlmepriv->wps_probe_resp_ie = NULL;
-                       }
-
-                       pmlmepriv->wps_probe_resp_ie =
-                               kmalloc(wps_ielen, GFP_KERNEL);
-                       if (pmlmepriv->wps_probe_resp_ie == NULL) {
-                               DBG_8723A("%s()-%d: kmalloc() ERROR!\n",
-                                         __func__, __LINE__);
-                               return -EINVAL;
-
-                       }
-
-                       /* add PUSH_BUTTON config_method by driver self in
-                          wpsie of probe_resp at GO Mode */
-                       puconfig_method = (u16 *)rtw_get_wps_attr_content23a(wps_ie, wps_ielen,
-                                                             WPS_ATTR_CONF_METHOD,
-                                                             NULL,
-                                                             &attr_contentlen);
-                       if (puconfig_method) {
-                               uconfig_method = WPS_CM_PUSH_BUTTON;
-                               uconfig_method = cpu_to_be16(uconfig_method);
-
-                               *puconfig_method |= uconfig_method;
-                       }
-
-                       memcpy(pmlmepriv->wps_probe_resp_ie, wps_ie, wps_ielen);
-                       pmlmepriv->wps_probe_resp_ie_len = wps_ielen;
-
-               }
-
-               /* buf += wps_ielen; */
-               /* len -= wps_ielen; */
-
-#ifdef CONFIG_8723AU_P2P
-               p2p_ie = rtw_get_p2p_ie23a(buf, len, NULL, &p2p_ielen);
-               if (p2p_ie) {
-                       u8 is_GO = false;
-                       u32 attr_contentlen = 0;
-                       u16 cap_attr = 0;
-
-#ifdef CONFIG_DEBUG_CFG80211
-                       DBG_8723A("probe_resp_p2p_ielen =%d\n", p2p_ielen);
-#endif
-
-                       /* Check P2P Capability ATTR */
-                       if (rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen,
-                                                    P2P_ATTR_CAPABILITY,
-                                                    (u8 *) &cap_attr,
-                                                    (uint *) &attr_contentlen)) {
-                               u8 grp_cap = 0;
-                               /* DBG_8723A( "[%s] Got P2P Capability Attr!!\n", __func__ ); */
-                               cap_attr = le16_to_cpu(cap_attr);
-                               grp_cap = (u8) ((cap_attr >> 8) & 0xff);
-
-                               is_GO = (grp_cap & BIT(0)) ? true : false;
-
-                               if (is_GO)
-                                       DBG_8723A
-                                           ("Got P2P Capability Attr, grp_cap"
-                                            "= 0x%x, is_GO\n", grp_cap);
-                       }
-
-                       if (is_GO == false) {
-                               if (pmlmepriv->p2p_probe_resp_ie) {
-                                       pmlmepriv->p2p_probe_resp_ie_len = 0;
-                                       kfree(pmlmepriv->p2p_probe_resp_ie);
-                                       pmlmepriv->p2p_probe_resp_ie = NULL;
-                               }
-
-                               pmlmepriv->p2p_probe_resp_ie =
-                                   kmalloc(p2p_ielen, GFP_KERNEL);
-                               if (pmlmepriv->p2p_probe_resp_ie == NULL) {
-                                       DBG_8723A("%s()-%d: kmalloc() ERROR!\n",
-                                                 __func__, __LINE__);
-                                       return -EINVAL;
-                               }
-                               memcpy(pmlmepriv->p2p_probe_resp_ie, p2p_ie,
-                                      p2p_ielen);
-                               pmlmepriv->p2p_probe_resp_ie_len = p2p_ielen;
-                       } else {
-                               if (pmlmepriv->p2p_go_probe_resp_ie) {
-                                       pmlmepriv->p2p_go_probe_resp_ie_len = 0;
-                                       kfree(pmlmepriv->p2p_go_probe_resp_ie);
-                                       pmlmepriv->p2p_go_probe_resp_ie = NULL;
-                               }
-
-                               pmlmepriv->p2p_go_probe_resp_ie =
-                                   kmalloc(p2p_ielen, GFP_KERNEL);
-                               if (pmlmepriv->p2p_go_probe_resp_ie == NULL) {
-                                       DBG_8723A("%s()-%d: kmalloc() ERROR!\n",
-                                                 __func__, __LINE__);
-                                       return -EINVAL;
-
-                               }
-                               memcpy(pmlmepriv->p2p_go_probe_resp_ie,
-                                      p2p_ie, p2p_ielen);
-                               pmlmepriv->p2p_go_probe_resp_ie_len = p2p_ielen;
-                       }
-               }
-#endif /* CONFIG_8723AU_P2P */
-
-               /* buf += p2p_ielen; */
-               /* len -= p2p_ielen; */
-
-#ifdef CONFIG_8723AU_P2P
-               if (rtw_get_wfd_ie(buf, len, NULL, &wfd_ielen)) {
-#ifdef CONFIG_DEBUG_CFG80211
-                       DBG_8723A("probe_resp_wfd_ielen =%d\n", wfd_ielen);
-#endif
-
-                       if (pmlmepriv->wfd_probe_resp_ie) {
-                               pmlmepriv->wfd_probe_resp_ie_len = 0;
-                               kfree(pmlmepriv->wfd_probe_resp_ie);
-                               pmlmepriv->wfd_probe_resp_ie = NULL;
-                       }
-
-                       pmlmepriv->wfd_probe_resp_ie =
-                           kmalloc(wfd_ielen, GFP_KERNEL);
-                       if (pmlmepriv->wfd_probe_resp_ie == NULL) {
-                               DBG_8723A("%s()-%d: kmalloc() ERROR!\n",
-                                         __func__, __LINE__);
-                               return -EINVAL;
-
-                       }
-                       rtw_get_wfd_ie(buf, len, pmlmepriv->wfd_probe_resp_ie,
-                                      &pmlmepriv->wfd_probe_resp_ie_len);
-               }
-#endif /* CONFIG_8723AU_P2P */
-       }
-
-       return ret;
-}
-
-static int rtw_cfg80211_set_assoc_resp_wpsp2pie(struct net_device *net,
-                                               char *buf, int len)
-{
-       int ret = 0;
-       struct rtw_adapter *padapter = netdev_priv(net);
-       struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
-
-       DBG_8723A("%s, ielen =%d\n", __func__, len);
-
-       if (len > 0) {
-               if (pmlmepriv->wps_assoc_resp_ie) {
-                       pmlmepriv->wps_assoc_resp_ie_len = 0;
-                       kfree(pmlmepriv->wps_assoc_resp_ie);
-                       pmlmepriv->wps_assoc_resp_ie = NULL;
-               }
-
-               pmlmepriv->wps_assoc_resp_ie = kmalloc(len, GFP_KERNEL);
-               if (pmlmepriv->wps_assoc_resp_ie == NULL) {
-                       DBG_8723A("%s()-%d: kmalloc() ERROR!\n",
-                                 __func__, __LINE__);
-                       return -EINVAL;
-
-               }
-               memcpy(pmlmepriv->wps_assoc_resp_ie, buf, len);
-               pmlmepriv->wps_assoc_resp_ie_len = len;
-       }
-
-       return ret;
-}
-
-int rtw_cfg80211_set_mgnt_wpsp2pie(struct net_device *net, char *buf, int len,
-                                  int type)
-{
-       int ret = 0;
-       uint wps_ielen = 0;
-#ifdef CONFIG_8723AU_P2P
-       u32 p2p_ielen = 0;
-#endif
-
-#ifdef CONFIG_DEBUG_CFG80211
-       DBG_8723A("%s, ielen =%d\n", __func__, len);
-#endif
-
-       if ((rtw_get_wps_ie23a(buf, len, NULL, &wps_ielen) && (wps_ielen > 0))
-#ifdef CONFIG_8723AU_P2P
-           || (rtw_get_p2p_ie23a(buf, len, NULL, &p2p_ielen) && (p2p_ielen > 0))
-#endif
-           ) {
-               if (net) {
-                       switch (type) {
-                       case 0x1:       /* BEACON */
-                               ret =
-                                   rtw_cfg80211_set_beacon_wpsp2pie(net, buf,
-                                                                    len);
-                               break;
-                       case 0x2:       /* PROBE_RESP */
-                               ret =
-                                   rtw_cfg80211_set_probe_resp_wpsp2pie(net,
-                                                                        buf,
-                                                                        len);
-                               break;
-                       case 0x4:       /* ASSOC_RESP */
-                               ret =
-                                   rtw_cfg80211_set_assoc_resp_wpsp2pie(net,
-                                                                        buf,
-                                                                        len);
-                               break;
-                       }
-               }
-       }
-
-       return ret;
-
-}
-
 static struct cfg80211_ops rtw_cfg80211_ops = {
        .change_virtual_intf = cfg80211_rtw_change_iface,
        .add_key = cfg80211_rtw_add_key,
@@ -4280,11 +3214,6 @@ static struct cfg80211_ops rtw_cfg80211_ops = {
        .change_bss = cfg80211_rtw_change_bss,
 #endif /* CONFIG_8723AU_AP_MODE */
 
-#ifdef CONFIG_8723AU_P2P
-       .remain_on_channel = cfg80211_rtw_remain_on_channel,
-       .cancel_remain_on_channel = cfg80211_rtw_cancel_remain_on_channel,
-#endif
-
        .mgmt_tx = cfg80211_rtw_mgmt_tx,
        .mgmt_frame_register = cfg80211_rtw_mgmt_frame_register,
 };
@@ -4348,7 +3277,7 @@ void rtw_cfg80211_init_wiphy(struct rtw_adapter *padapter)
        struct wireless_dev *pwdev = padapter->rtw_wdev;
        struct wiphy *wiphy = pwdev->wiphy;
 
-       rtw23a_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type));
+       rf_type = rtl8723a_get_rf_type(padapter);
 
        DBG_8723A("%s:rf_type =%d\n", __func__, rf_type);
 
@@ -4387,9 +3316,6 @@ static void rtw_cfg80211_preinit_wiphy(struct rtw_adapter *padapter,
            BIT(NL80211_IFTYPE_ADHOC) |
 #ifdef CONFIG_8723AU_AP_MODE
            BIT(NL80211_IFTYPE_AP) | BIT(NL80211_IFTYPE_MONITOR) |
-#endif
-#if defined(CONFIG_8723AU_P2P)
-           BIT(NL80211_IFTYPE_P2P_CLIENT) | BIT(NL80211_IFTYPE_P2P_GO) |
 #endif
            0;
 
@@ -4440,22 +3366,24 @@ int rtw_wdev_alloc(struct rtw_adapter *padapter, struct device *dev)
                ret = -ENOMEM;
                goto exit;
        }
+
+       /*  wdev */
+       wdev = kzalloc(sizeof(struct wireless_dev), GFP_KERNEL);
+       if (!wdev) {
+               DBG_8723A("Couldn't allocate wireless device\n");
+               ret = -ENOMEM;
+               goto free_wiphy;
+       }
+
        set_wiphy_dev(wiphy, dev);
        rtw_cfg80211_preinit_wiphy(padapter, wiphy);
 
        ret = wiphy_register(wiphy);
        if (ret < 0) {
                DBG_8723A("Couldn't register wiphy device\n");
-               goto free_wiphy;
+               goto free_wdev;
        }
 
-       /*  wdev */
-       wdev = kzalloc(sizeof(struct wireless_dev), GFP_KERNEL);
-       if (!wdev) {
-               DBG_8723A("Couldn't allocate wireless device\n");
-               ret = -ENOMEM;
-               goto unregister_wiphy;
-       }
        wdev->wiphy = wiphy;
        wdev->netdev = pnetdev;
        /* wdev->iftype = NL80211_IFTYPE_STATION; */
@@ -4474,8 +3402,6 @@ int rtw_wdev_alloc(struct rtw_adapter *padapter, struct device *dev)
        spin_lock_init(&pwdev_priv->scan_req_lock);
 
        pwdev_priv->p2p_enabled = false;
-       pwdev_priv->provdisc_req_issued = false;
-       rtw_wdev_invit_info_init(&pwdev_priv->invit_info);
 
        if (padapter->registrypriv.power_mgnt != PS_MODE_ACTIVE)
                pwdev_priv->power_mgmt = true;
@@ -4483,8 +3409,8 @@ int rtw_wdev_alloc(struct rtw_adapter *padapter, struct device *dev)
                pwdev_priv->power_mgmt = false;
 
        return ret;
-unregister_wiphy:
-       wiphy_unregister(wiphy);
+free_wdev:
+       kfree(wdev);
 free_wiphy:
        wiphy_free(wiphy);
 exit:
@@ -4493,15 +3419,11 @@ exit:
 
 void rtw_wdev_free(struct wireless_dev *wdev)
 {
-       struct rtw_wdev_priv *pwdev_priv;
-
        DBG_8723A("%s(wdev =%p)\n", __func__, wdev);
 
        if (!wdev)
                return;
 
-       pwdev_priv = wdev_to_priv(wdev);
-
        kfree(wdev->wiphy->bands[IEEE80211_BAND_2GHZ]);
        kfree(wdev->wiphy->bands[IEEE80211_BAND_5GHZ]);