staging: rtl8723au: Remove P2P/WiFiDirect/WiFiDisplay code
authorJes Sorensen <Jes.Sorensen@redhat.com>
Tue, 15 Apr 2014 17:43:35 +0000 (19:43 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 15 Apr 2014 18:03:56 +0000 (11:03 -0700)
Discussing with Johannes Berg and Larry Finger, we have concluded that
this code really should be handled through wpa_supplicant, and not in
the kernel.

Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
24 files changed:
drivers/staging/rtl8723au/Kconfig
drivers/staging/rtl8723au/Makefile
drivers/staging/rtl8723au/core/rtw_ap.c
drivers/staging/rtl8723au/core/rtw_cmd.c
drivers/staging/rtl8723au/core/rtw_ieee80211.c
drivers/staging/rtl8723au/core/rtw_mlme.c
drivers/staging/rtl8723au/core/rtw_mlme_ext.c
drivers/staging/rtl8723au/core/rtw_p2p.c [deleted file]
drivers/staging/rtl8723au/core/rtw_pwrctrl.c
drivers/staging/rtl8723au/core/rtw_wlan_util.c
drivers/staging/rtl8723au/hal/rtl8723a_cmd.c
drivers/staging/rtl8723au/hal/rtl8723a_dm.c
drivers/staging/rtl8723au/include/drv_types.h
drivers/staging/rtl8723au/include/ieee80211.h
drivers/staging/rtl8723au/include/rtl8723a_cmd.h
drivers/staging/rtl8723au/include/rtl8723a_hal.h
drivers/staging/rtl8723au/include/rtw_cmd.h
drivers/staging/rtl8723au/include/rtw_mlme.h
drivers/staging/rtl8723au/include/rtw_mlme_ext.h
drivers/staging/rtl8723au/include/rtw_p2p.h [deleted file]
drivers/staging/rtl8723au/include/wifi.h
drivers/staging/rtl8723au/os_dep/ioctl_cfg80211.c
drivers/staging/rtl8723au/os_dep/os_intfs.c
drivers/staging/rtl8723au/os_dep/usb_intf.c

index 07fb5e4e50fa7cc7e89e5c30592d31783c234ccb..435f3594dabeb341016f5d6dcda64ee996d850de 100644 (file)
@@ -19,14 +19,6 @@ config 8723AU_AP_MODE
        will never be used as an AP, or the target system has limited memory,
        "Y" should be selected.
 
-config 8723AU_P2P
-       bool "Realtek RTL8723AU Peer-to-peer mode"
-       default y
-       ---help---
-       This option enables peer-to-peer mode for the r8723au driver. Unless you
-       know that peer-to-peer (P2P) mode will never be used, or the target system has
-       limited memory, "Y" should be selected.
-
 config 8723AU_BT_COEXIST
        bool "Realtek RTL8723AU BlueTooth Coexistence"
        default y
index 11c6dd4864621532bc36a7170638e2caf6789539..bbf503dd437a2713efc5b65b78f88bd451c7dae4 100644 (file)
@@ -8,7 +8,6 @@ r8723au-y :=                            \
                core/rtw_led.o          \
                core/rtw_mlme.o         \
                core/rtw_mlme_ext.o     \
-               core/rtw_p2p.o          \
                core/rtw_pwrctrl.o      \
                core/rtw_recv.o         \
                core/rtw_security.o     \
index b9bf353e6b4e627676898c767b5dd966ad7ef267..f04d9dfb4446989a5c624e592ba797855a9d465f 100644 (file)
@@ -659,9 +659,6 @@ static void start_bss_network(struct rtw_adapter *padapter, u8 *pbuf)
        struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info;
        struct wlan_bssid_ex *pnetwork_mlmeext = &pmlmeinfo->network;
        struct HT_info_element *pht_info = NULL;
-#ifdef CONFIG_8723AU_P2P
-       struct wifidirect_info *pwdinfo = &padapter->wdinfo;
-#endif /* CONFIG_8723AU_P2P */
 
        bcn_interval = (u16)pnetwork->Configuration.BeaconPeriod;
        cur_channel = pnetwork->Configuration.DSConfig;
@@ -773,12 +770,6 @@ static void start_bss_network(struct rtw_adapter *padapter, u8 *pbuf)
        /* let pnetwork_mlmeext == pnetwork_mlme. */
        memcpy(pnetwork_mlmeext, pnetwork, pnetwork->Length);
 
-#ifdef CONFIG_8723AU_P2P
-       memcpy(pwdinfo->p2p_group_ssid, pnetwork->Ssid.ssid,
-              pnetwork->Ssid.ssid_len);
-       pwdinfo->p2p_group_ssid_len = pnetwork->Ssid.ssid_len;
-#endif /* CONFIG_8723AU_P2P */
-
        if (pmlmeext->bstart_bss) {
                update_beacon23a(padapter, WLAN_EID_TIM, NULL, false);
 
index f8306efa979d666f80e553d87a8167803b0522ef..cb15ddaae12ea87e1698525dc6d0dbf43e90b244 100644 (file)
@@ -527,12 +527,6 @@ u8 rtw_sitesurvey_cmd23a(struct rtw_adapter *padapter,
        if (check_fwstate(pmlmepriv, _FW_LINKED) == true)
                rtw_lps_ctrl_wk_cmd23a(padapter, LPS_CTRL_SCAN, 1);
 
-#ifdef CONFIG_8723AU_P2P
-       if (check_fwstate(pmlmepriv, _FW_LINKED) == true) {
-               p2p_ps_wk_cmd23a(padapter, P2P_PS_SCAN, 1);
-       }
-#endif /* CONFIG_8723AU_P2P */
-
        ph2c = kzalloc(sizeof(struct cmd_obj), GFP_ATOMIC);
        if (!ph2c)
                return _FAIL;
@@ -1354,48 +1348,6 @@ static void power_saving_wk_hdl(struct rtw_adapter *padapter, u8 *pbuf, int sz)
         rtw_ps_processor23a(padapter);
 }
 
-#ifdef CONFIG_8723AU_P2P
-u8 p2p_protocol_wk_cmd23a(struct rtw_adapter*padapter, int intCmdType)
-{
-       struct cmd_obj *ph2c;
-       struct drvextra_cmd_parm *pdrvextra_cmd_parm;
-       struct wifidirect_info *pwdinfo = &padapter->wdinfo;
-       struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
-       u8 res = _SUCCESS;
-
-       if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))
-       {
-               return res;
-       }
-
-       ph2c = kzalloc(sizeof(struct cmd_obj), GFP_ATOMIC);
-       if (!ph2c) {
-               res = _FAIL;
-               goto exit;
-       }
-
-       pdrvextra_cmd_parm = kzalloc(sizeof(struct drvextra_cmd_parm),
-                                    GFP_ATOMIC);
-       if (!pdrvextra_cmd_parm) {
-               kfree(ph2c);
-               res = _FAIL;
-               goto exit;
-       }
-
-       pdrvextra_cmd_parm->ec_id = P2P_PROTO_WK_CID;
-       pdrvextra_cmd_parm->type_size = intCmdType; /* As the command tppe. */
-       pdrvextra_cmd_parm->pbuf = NULL;            /* Must be NULL here */
-
-       init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm,
-                                  GEN_CMD_CODE(_Set_Drv_Extra));
-
-       res = rtw_enqueue_cmd23a(pcmdpriv, ph2c);
-exit:
-
-       return res;
-}
-#endif /* CONFIG_8723AU_P2P */
-
 u8 rtw_ps_cmd23a(struct rtw_adapter*padapter)
 {
        struct cmd_obj *ppscmd;
@@ -1634,16 +1586,6 @@ u8 rtw_drvextra_cmd_hdl23a(struct rtw_adapter *padapter, unsigned char *pbuf)
        case LPS_CTRL_WK_CID:
                lps_ctrl_wk_hdl(padapter, (u8)pdrvextra_cmd->type_size);
                break;
-#ifdef CONFIG_8723AU_P2P
-       case P2P_PS_WK_CID:
-               p2p_ps_wk_hdl23a(padapter, pdrvextra_cmd->type_size);
-               break;
-       case P2P_PROTO_WK_CID:
-               /*      Commented by Albert 2011/07/01 */
-               /*      I used the type_size as the type command */
-               p2p_protocol_wk_hdl23a(padapter, pdrvextra_cmd->type_size);
-               break;
-#endif /*  CONFIG_8723AU_P2P */
 #ifdef CONFIG_8723AU_AP_MODE
        case CHECK_HIQ_WK_CID:
                rtw_chk_hi_queue_hdl(padapter);
index 966b7be80923e31f843289990d4ece8cd5cb97ad..d7a6b47b49b30712054d0188d4f86f3c025c8266 100644 (file)
@@ -1227,9 +1227,6 @@ void dump_ies23a(u8 *buf, u32 buf_len) {
                len = *(pos + 1);
 
                DBG_8723A("%s ID:%u, LEN:%u\n", __func__, id, len);
-#ifdef CONFIG_8723AU_P2P
-               dump_p2p_ie23a(pos, len);
-#endif
                dump_wps_ie23a(pos, len);
 
                pos += (2 + len);
@@ -1259,314 +1256,6 @@ void dump_wps_ie23a(u8 *ie, u32 ie_len) {
        }
 }
 
-#ifdef CONFIG_8723AU_P2P
-void dump_p2p_ie23a(u8 *ie, u32 ie_len) {
-       u8* pos = (u8*)ie;
-       u8 id;
-       u16 len;
-
-       u8 *p2p_ie;
-       uint p2p_ielen;
-
-       p2p_ie = rtw_get_p2p_ie23a(ie, ie_len, NULL, &p2p_ielen);
-       if (p2p_ie != ie || p2p_ielen == 0)
-               return;
-
-       pos += 6;
-       while (pos-ie < ie_len) {
-               id = *pos;
-               len = get_unaligned_le16(pos+1);
-
-               DBG_8723A("%s ID:%u, LEN:%u\n", __func__, id, len);
-
-               pos+= (3+len);
-       }
-}
-
-/**
- * rtw_get_p2p_ie23a - Search P2P IE from a series of IEs
- * @in_ie: Address of IEs to search
- * @in_len: Length limit from in_ie
- * @p2p_ie: If not NULL and P2P IE is found, P2P IE will be copied to the
- *          buf starting from p2p_ie
- * @p2p_ielen: If not NULL and P2P IE is found, will set to the length of
- *             the entire P2P IE
- *
- * Returns: The address of the P2P IE found, or NULL
- */
-u8 *rtw_get_p2p_ie23a(u8 *in_ie, int in_len, u8 *p2p_ie, uint *p2p_ielen)
-{
-       uint cnt = 0;
-       u8 *p2p_ie_ptr;
-       u8 eid, p2p_oui[4]={0x50, 0x6F, 0x9A, 0x09};
-
-       if (p2p_ielen)
-               *p2p_ielen = 0;
-
-       while (cnt<in_len) {
-               eid = in_ie[cnt];
-               if ((in_len < 0) || (cnt > MAX_IE_SZ)) {
-                       dump_stack();
-                       return NULL;
-               }
-               if ((eid == WLAN_EID_VENDOR_SPECIFIC) &&
-                   !memcmp(&in_ie[cnt + 2], p2p_oui, 4)) {
-                       p2p_ie_ptr = in_ie + cnt;
-
-                       if (p2p_ie != NULL) {
-                               memcpy(p2p_ie, &in_ie[cnt],
-                                      in_ie[cnt + 1] + 2);
-                       }
-
-                       if (p2p_ielen != NULL) {
-                               *p2p_ielen = in_ie[cnt + 1] + 2;
-                       }
-
-                       return p2p_ie_ptr;
-
-                       break;
-               } else {
-                       cnt += in_ie[cnt + 1] + 2; /* goto next */
-               }
-       }
-
-       return NULL;
-}
-
-/**
- * rtw_get_p2p_attr23a - Search a specific P2P attribute from a given P2P IE
- * @p2p_ie: Address of P2P IE to search
- * @p2p_ielen: Length limit from p2p_ie
- * @target_attr_id: The attribute ID of P2P attribute to search
- * @buf_attr: If not NULL and the P2P attribute is found, P2P attribute will
- *            be copied to the buf starting from buf_attr
- * @len_attr: If not NULL and the P2P attribute is found, will set to the
- *            length of the entire P2P attribute
- *
- * Returns: the address of the specific WPS attribute found, or NULL
- */
-u8 *rtw_get_p2p_attr23a(u8 *p2p_ie, uint p2p_ielen, u8 target_attr_id,
-                    u8 *buf_attr, u32 *len_attr)
-{
-       u8 *attr_ptr = NULL;
-       u8 *target_attr_ptr = NULL;
-       u8 p2p_oui[4]={0x50, 0x6F, 0x9A, 0x09};
-
-       if (len_attr)
-               *len_attr = 0;
-
-       if (!p2p_ie || (p2p_ie[0] != WLAN_EID_VENDOR_SPECIFIC) ||
-           memcmp(p2p_ie + 2, p2p_oui, 4)) {
-               return attr_ptr;
-       }
-
-       /*  6 = 1(Element ID) + 1(Length) + 3 (OUI) + 1(OUI Type) */
-       attr_ptr = p2p_ie + 6; /* goto first attr */
-
-       while (attr_ptr - p2p_ie < p2p_ielen) {
-               /*  3 = 1(Attribute ID) + 2(Length) */
-               u8 attr_id = *attr_ptr;
-               u16 attr_data_len = get_unaligned_le16(attr_ptr + 1);
-               u16 attr_len = attr_data_len + 3;
-
-               /* DBG_8723A("%s attr_ptr:%p, id:%u, length:%u\n", __func__, attr_ptr, attr_id, attr_data_len); */
-               if (attr_id == target_attr_id) {
-                       target_attr_ptr = attr_ptr;
-
-                       if (buf_attr)
-                               memcpy(buf_attr, attr_ptr, attr_len);
-
-                       if (len_attr)
-                               *len_attr = attr_len;
-
-                       break;
-               } else {
-                       attr_ptr += attr_len; /* goto next */
-               }
-       }
-
-       return target_attr_ptr;
-}
-
-/**
- * rtw_get_p2p_attr23a_content - Search a specific P2P attribute content from
- * a given P2P IE
- * @p2p_ie: Address of P2P IE to search
- * @p2p_ielen: Length limit from p2p_ie
- * @target_attr_id: The attribute ID of P2P attribute to search
- * @buf_content: If not NULL and the P2P attribute is found, P2P attribute
- *               content will be copied to the buf starting from buf_content
- * @len_content: If not NULL and the P2P attribute is found, will set to the
- *               length of the P2P attribute content
- *
- * Returns: the address of the specific P2P attribute content found, or NULL
- */
-u8 *rtw_get_p2p_attr23a_content(u8 *p2p_ie, uint p2p_ielen, u8 target_attr_id,
-                            u8 *buf_content, uint *len_content)
-{
-       u8 *attr_ptr;
-       u32 attr_len;
-
-       if (len_content)
-               *len_content = 0;
-
-       attr_ptr = rtw_get_p2p_attr23a(p2p_ie, p2p_ielen, target_attr_id,
-                                   NULL, &attr_len);
-
-       if (attr_ptr && attr_len) {
-               if (buf_content)
-                       memcpy(buf_content, attr_ptr + 3, attr_len - 3);
-
-               if (len_content)
-                       *len_content = attr_len - 3;
-
-               return attr_ptr+3;
-       }
-
-       return NULL;
-}
-
-u32 rtw_set_p2p_attr_content23a(u8 *pbuf, u8 attr_id, u16 attr_len, u8 *pdata_attr)
-{
-       u32 a_len;
-
-       *pbuf = attr_id;
-
-       /* u16*)(pbuf + 1) = cpu_to_le16(attr_len); */
-       put_unaligned_le16(attr_len, pbuf + 1);
-
-       if (pdata_attr)
-               memcpy(pbuf + 3, pdata_attr, attr_len);
-
-       a_len = attr_len + 3;
-
-       return a_len;
-}
-
-static uint rtw_p2p_attr_remove(u8 *ie, uint ielen_ori, u8 attr_id)
-{
-       u8 *target_attr;
-       u32 target_attr_len;
-       uint ielen = ielen_ori;
-
-       while(1) {
-               target_attr = rtw_get_p2p_attr23a(ie, ielen, attr_id, NULL,
-                                            &target_attr_len);
-               if (target_attr && target_attr_len) {
-                       u8 *next_attr = target_attr+target_attr_len;
-                       uint remain_len = ielen-(next_attr-ie);
-                       /* dump_ies23a(ie, ielen); */
-
-                       memset(target_attr, 0, target_attr_len);
-                       memcpy(target_attr, next_attr, remain_len);
-                       memset(target_attr+remain_len, 0, target_attr_len);
-                       *(ie + 1) -= target_attr_len;
-                       ielen -= target_attr_len;
-               } else {
-                       /* if (index>0) */
-                       /*      dump_ies23a(ie, ielen); */
-                       break;
-               }
-       }
-
-       return ielen;
-}
-
-void rtw_wlan_bssid_ex_remove_p2p_attr23a(struct wlan_bssid_ex *bss_ex, u8 attr_id)
-{
-       u8 *p2p_ie;
-       uint p2p_ielen, p2p_ielen_ori;
-
-       if ((p2p_ie = rtw_get_p2p_ie23a(bss_ex->IEs + _FIXED_IE_LENGTH_,
-                                    bss_ex->IELength - _FIXED_IE_LENGTH_,
-                                    NULL, &p2p_ielen_ori))) {
-               p2p_ielen = rtw_p2p_attr_remove(p2p_ie, p2p_ielen_ori, attr_id);
-               if (p2p_ielen != p2p_ielen_ori) {
-                       u8 *next_ie_ori = p2p_ie+p2p_ielen_ori;
-                       u8 *next_ie = p2p_ie+p2p_ielen;
-                       uint remain_len;
-                       remain_len = bss_ex->IELength-(next_ie_ori-bss_ex->IEs);
-
-                       memcpy(next_ie, next_ie_ori, remain_len);
-                       memset(next_ie+remain_len, 0, p2p_ielen_ori-p2p_ielen);
-                       bss_ex->IELength -= p2p_ielen_ori-p2p_ielen;
-               }
-       }
-}
-
-#endif /* CONFIG_8723AU_P2P */
-
-#ifdef CONFIG_8723AU_P2P
-int rtw_get_wfd_ie(u8 *in_ie, int in_len, u8 *wfd_ie, uint *wfd_ielen)
-{
-       int match;
-       const u8 *ie;
-
-       match = 0;
-
-       if (in_len < 0)
-               return match;
-
-       ie = cfg80211_find_vendor_ie(0x506F9A, 0x0A, in_ie, in_len);
-       if (ie && (ie[1] <= (MAX_WFD_IE_LEN - 2))) {
-               if (wfd_ie) {
-                       *wfd_ielen = ie[1] + 2;
-                       memcpy(wfd_ie, ie, ie[1] + 2);
-               } else
-                       if (wfd_ielen)
-                               *wfd_ielen = 0;
-
-               match = 1;
-       }
-
-       return match;
-}
-
-/*     attr_content: The output buffer, contains the "body field" of
-       WFD attribute. */
-/*     attr_contentlen: The data length of the "body field" of WFD
-       attribute. */
-int rtw_get_wfd_attr_content(u8 *wfd_ie, uint wfd_ielen, u8 target_attr_id,
-                            u8 *attr_content, uint *attr_contentlen)
-{
-       int match;
-       uint cnt = 0;
-       u8 attr_id, wfd_oui[4] = {0x50, 0x6F, 0x9A, 0x0A};
-
-       match = false;
-
-       if ((wfd_ie[0] != WLAN_EID_VENDOR_SPECIFIC) ||
-           memcmp(wfd_ie + 2, wfd_oui, 4)) {
-               return match;
-       }
-
-       /*      1 (WFD IE) + 1 (Length) + 3 (OUI) + 1 (OUI Type) */
-       cnt = 6;
-       while (cnt < wfd_ielen) {
-               u16 attrlen = get_unaligned_be16(wfd_ie + cnt + 1);
-
-               attr_id = wfd_ie[cnt];
-               if (attr_id == target_attr_id) {
-                       /*      3 -> 1 byte for attribute ID field, 2
-                               bytes for length field */
-                       if (attr_content)
-                               memcpy(attr_content, &wfd_ie[cnt + 3], attrlen);
-
-                       if (attr_contentlen)
-                               *attr_contentlen = attrlen;
-
-                       cnt += attrlen + 3;
-
-                       match = true;
-                       break;
-               } else {
-                       cnt += attrlen + 3; /* goto next */
-               }
-       }
-
-       return match;
-}
-#endif /*  CONFIG_8723AU_P2P */
 
 /* Baron adds to avoid FreeBSD warning */
 int ieee80211_is_empty_essid23a(const char *essid, int essid_len)
index 59b2c6cedcf7dd8c7033e5a7eea0c923c37937fe..67df0d7bd116aa7e5514a983ae1d3e91d3c14e94 100644 (file)
@@ -787,11 +787,6 @@ void rtw_surveydone_event_callback23a(struct rtw_adapter   *adapter, u8 *pbuf)
 
        spin_unlock_bh(&pmlmepriv->lock);
 
-#ifdef CONFIG_8723AU_P2P
-       if (check_fwstate(pmlmepriv, _FW_LINKED) == true)
-               p2p_ps_wk_cmd23a(adapter, P2P_PS_SCAN_DONE, 0);
-#endif /*  CONFIG_8723AU_P2P */
-
        rtw_os_xmit_schedule23a(adapter);
 
        if(pmlmeext->sitesurvey_res.bss_cnt == 0)
@@ -956,10 +951,6 @@ void rtw_indicate_disconnect23a(struct rtw_adapter *padapter)
 
        }
 
-#ifdef CONFIG_8723AU_P2P
-       p2p_ps_wk_cmd23a(padapter, P2P_PS_DISABLE, 1);
-#endif /*  CONFIG_8723AU_P2P */
-
        rtw_lps_ctrl_wk_cmd23a(padapter, LPS_CTRL_DISCONNECT, 1);
 
 }
@@ -1581,16 +1572,9 @@ void rtw_dynamic_check_timer_handler(unsigned long data)
 
        rtw_dynamic_chk_wk_cmd23a(adapter);
 
-       if (pregistrypriv->wifi_spec == 1)
-       {
-#ifdef CONFIG_8723AU_P2P
-               struct wifidirect_info *pwdinfo = &adapter->wdinfo;
-               if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))
-#endif
-               {
-                       /* auto site survey */
-                       rtw_auto_scan_handler(adapter);
-               }
+       if (pregistrypriv->wifi_spec == 1) {
+               /* auto site survey */
+               rtw_auto_scan_handler(adapter);
        }
 out:
        mod_timer(&adapter->mlmepriv.dynamic_chk_timer,
index 9b9124c531ec39f460fd0d6a02600d78e2c68f9e..084003943396dee5a6c56891bcd052e52bf346e6 100644 (file)
@@ -631,30 +631,6 @@ void mgt_dispatcher23a(struct rtw_adapter *padapter,
 #endif
 }
 
-#ifdef CONFIG_8723AU_P2P
-static u32 p2p_listen_state_process(struct rtw_adapter *padapter,
-                                   unsigned char *da)
-{
-       bool response = true;
-
-       if (wdev_to_priv(padapter->rtw_wdev)->p2p_enabled == false ||
-           padapter->mlmepriv.wps_probe_resp_ie == NULL ||
-           padapter->mlmepriv.p2p_probe_resp_ie == NULL) {
-               DBG_8723A("DON'T issue_probersp23a_p2p23a: p2p_enabled:%d, "
-                         "wps_probe_resp_ie:%p, p2p_probe_resp_ie:%p\n",
-                         wdev_to_priv(padapter->rtw_wdev)->p2p_enabled,
-                         padapter->mlmepriv.wps_probe_resp_ie,
-                         padapter->mlmepriv.p2p_probe_resp_ie);
-               response = false;
-       }
-
-       if (response == true)
-               issue_probersp23a_p2p23a(padapter, da);
-
-       return _SUCCESS;
-}
-#endif /* CONFIG_8723AU_P2P */
-
 /****************************************************************************
 
 Following are the callback functions for each subtype of the management frames
@@ -676,46 +652,6 @@ unsigned int OnProbeReq23a(struct rtw_adapter *padapter,
        uint len = skb->len;
        u8 is_valid_p2p_probereq = false;
 
-#ifdef CONFIG_8723AU_P2P
-       struct wifidirect_info *pwdinfo = &padapter->wdinfo;
-       u8 wifi_test_chk_rate = 1;
-
-       if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE) &&
-           !rtw_p2p_chk_state(pwdinfo, P2P_STATE_IDLE) &&
-           !rtw_p2p_chk_role(pwdinfo, P2P_ROLE_CLIENT) &&
-           !rtw_p2p_chk_state(pwdinfo, P2P_STATE_FIND_PHASE_SEARCH) &&
-           !rtw_p2p_chk_state(pwdinfo, P2P_STATE_SCAN)) {
-               /*      mcs_rate = 0 -> CCK 1M rate */
-               /*      mcs_rate = 1 -> CCK 2M rate */
-               /*      mcs_rate = 2 -> CCK 5.5M rate */
-               /*      mcs_rate = 3 -> CCK 11M rate */
-               /*      In the P2P mode, the driver should not support
-                       the CCK rate */
-
-               /*      IOT issue: Google Nexus7 use 1M rate to send
-                       p2p_probe_req after GO nego completed and Nexus7
-                       is client */
-               if (wifi_test_chk_rate == 1) {
-                       if ((is_valid_p2p_probereq =
-                            process_probe_req_p2p_ie23a(pwdinfo, pframe,
-                                                        len)) == true) {
-                               if (rtw_p2p_chk_role(pwdinfo,
-                                                    P2P_ROLE_DEVICE)) {
-                                       u8 *sa = ieee80211_get_SA(hdr);
-                                       p2p_listen_state_process(padapter, sa);
-                                       return _SUCCESS;
-                               }
-
-                               if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) {
-                                       goto _continue;
-                               }
-                       }
-               }
-       }
-
-_continue:
-#endif /* CONFIG_8723AU_P2P */
-
        if (check_fwstate(pmlmepriv, WIFI_STATION_STATE)) {
                return _SUCCESS;
        }
@@ -761,56 +697,6 @@ unsigned int OnProbeRsp23a(struct rtw_adapter *padapter,
                           struct recv_frame *precv_frame)
 {
        struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
-#ifdef CONFIG_8723AU_P2P
-       struct sk_buff *skb = precv_frame->pkt;
-       struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
-       struct wifidirect_info  *pwdinfo = &padapter->wdinfo;
-#endif
-
-#ifdef CONFIG_8723AU_P2P
-       if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_TX_PROVISION_DIS_REQ)) {
-               if (pwdinfo->tx_prov_disc_info.benable == true) {
-                       if (ether_addr_equal(pwdinfo->tx_prov_disc_info.peerIFAddr,
-                                   hdr->addr2)) {
-                               if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_CLIENT)) {
-                                       pwdinfo->tx_prov_disc_info.benable = false;
-                                       issue_p2p_provision_request23a(padapter,
-                                                                                               pwdinfo->tx_prov_disc_info.ssid.ssid,
-                                                                                               pwdinfo->tx_prov_disc_info.ssid.ssid_len,
-                                                                                               pwdinfo->tx_prov_disc_info.peerDevAddr);
-                               }
-                               else if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_DEVICE) || rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO))
-                               {
-                                       pwdinfo->tx_prov_disc_info.benable = false;
-                                       issue_p2p_provision_request23a(padapter,
-                                                                                               NULL,
-                                                                                               0,
-                                                                                               pwdinfo->tx_prov_disc_info.peerDevAddr);
-                               }
-                       }
-               }
-               return _SUCCESS;
-       } else if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_ING)) {
-               if (pwdinfo->nego_req_info.benable == true) {
-                       DBG_8723A("[%s] P2P State is GONEGO ING!\n", __func__);
-                       if (ether_addr_equal(pwdinfo->nego_req_info.peerDevAddr,
-                                            hdr->addr2)) {
-                               pwdinfo->nego_req_info.benable = false;
-                               issue_p2p_GO_request23a(padapter, pwdinfo->nego_req_info.peerDevAddr);
-                       }
-               }
-       } else if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_TX_INVITE_REQ)) {
-               if (pwdinfo->invitereq_info.benable == true) {
-                       DBG_8723A("[%s] P2P_STATE_TX_INVITE_REQ!\n", __func__);
-                       if (ether_addr_equal(
-                                   pwdinfo->invitereq_info.peer_macaddr,
-                                   hdr->addr2)) {
-                               pwdinfo->invitereq_info.benable = false;
-                               issue_p2p_invitation_request23a(padapter, pwdinfo->invitereq_info.peer_macaddr);
-                       }
-               }
-       }
-#endif
 
        if (pmlmeext->sitesurvey_res.state == SCAN_PROCESS) {
                report_survey_event23a(padapter, precv_frame);
@@ -910,10 +796,6 @@ unsigned int OnBeacon23a(struct rtw_adapter *padapter,
                                        update_beacon23a_info(padapter, pframe,
                                                              len, psta);
                                }
-
-#ifdef CONFIG_8723AU_P2P
-                               process_p2p_ps_ie23a(padapter, (pframe + sizeof(struct ieee80211_hdr_3addr)), (len - sizeof(struct ieee80211_hdr_3addr)));
-#endif /* CONFIG_8723AU_P2P */
                        }
                } else if ((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) {
                        psta = rtw_get_stainfo23a(pstapriv, hdr->addr2);
@@ -1276,14 +1158,6 @@ unsigned int OnAssocReq23a(struct rtw_adapter *padapter, struct recv_frame *prec
        uint pkt_len = skb->len;
        struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
        u16 frame_control;
-#ifdef CONFIG_8723AU_P2P
-       struct wifidirect_info *pwdinfo = &padapter->wdinfo;
-       u8 p2p_status_code = P2P_STATUS_SUCCESS;
-       u8 *p2pie;
-       u32 p2pielen = 0;
-       u8      wfd_ie[MAX_WFD_IE_LEN] = { 0x00 };
-       u32     wfd_ielen = 0;
-#endif /* CONFIG_8723AU_P2P */
 
        if ((pmlmeinfo->state&0x03) != WIFI_FW_AP_STATE)
                return _FAIL;
@@ -1645,39 +1519,6 @@ unsigned int OnAssocReq23a(struct rtw_adapter *padapter, struct recv_frame *prec
        if (status != WLAN_STATUS_SUCCESS)
                goto OnAssocReq23aFail;
 
-#ifdef CONFIG_8723AU_P2P
-       pstat->is_p2p_device = false;
-       if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO))
-       {
-               if ((p2pie = rtw_get_p2p_ie23a(pframe + sizeof(struct ieee80211_hdr_3addr) + ie_offset, pkt_len - sizeof(struct ieee80211_hdr_3addr) - ie_offset, NULL, &p2pielen)))
-               {
-                       pstat->is_p2p_device = true;
-                       if ((p2p_status_code = (u8)process_assoc_req_p2p_ie23a(pwdinfo, pframe, pkt_len, pstat))>0)
-                       {
-                               pstat->p2p_status_code = p2p_status_code;
-                               status = WLAN_STATUS_CAPS_UNSUPPORTED;
-                               goto OnAssocReq23aFail;
-                       }
-               }
-#ifdef CONFIG_8723AU_P2P
-               if (rtw_get_wfd_ie(pframe + sizeof(struct ieee80211_hdr_3addr) + ie_offset, pkt_len - sizeof(struct ieee80211_hdr_3addr) - ie_offset, wfd_ie, &wfd_ielen))
-               {
-                       u8      attr_content[ 10 ] = { 0x00 };
-                       u32     attr_contentlen = 0;
-
-                       DBG_8723A("[%s] WFD IE Found!!\n", __func__);
-                       rtw_get_wfd_attr_content(wfd_ie, wfd_ielen, WFD_ATTR_DEVICE_INFO, attr_content, &attr_contentlen);
-                       if (attr_contentlen)
-                       {
-                               pwdinfo->wfd_info->peer_rtsp_ctrlport = get_unaligned_be16(attr_content + 2);
-                               DBG_8723A("[%s] Peer PORT NUM = %d\n", __func__, pwdinfo->wfd_info->peer_rtsp_ctrlport);
-                       }
-               }
-#endif
-       }
-       pstat->p2p_status_code = p2p_status_code;
-#endif /* CONFIG_8723AU_P2P */
-
        /* TODO: identify_proprietary_vendor_ie(); */
        /*  Realtek proprietary IE */
        /*  identify if this is Broadcom sta */
@@ -1833,13 +1674,7 @@ unsigned int OnAssocRsp23a(struct rtw_adapter *padapter, struct recv_frame *prec
                {
                case WLAN_EID_VENDOR_SPECIFIC:
                        if (!memcmp(pIE->data, WMM_PARA_OUI23A, 6))/* WMM */
-                                       WMM_param_handler23a(padapter, pIE);
-#if defined(CONFIG_8723AU_P2P)
-                       else if (!memcmp(pIE->data, WFD_OUI23A, 4)) { /* WFD */
-                               DBG_8723A("[%s] Found WFD IE\n", __func__);
-                               WFD_info_handler(padapter, pIE);
-                       }
-#endif
+                               WMM_param_handler23a(padapter, pIE);
                        break;
 
                case WLAN_EID_HT_CAPABILITY:    /* HT caps */
@@ -1893,21 +1728,11 @@ unsigned int OnDeAuth23a(struct rtw_adapter *padapter,
        struct sk_buff *skb = precv_frame->pkt;
        struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
        u8 *pframe = skb->data;
-#ifdef CONFIG_8723AU_P2P
-       struct wifidirect_info *pwdinfo = &padapter->wdinfo;
-#endif /* CONFIG_8723AU_P2P */
 
        /* check A3 */
        if (!ether_addr_equal(hdr->addr3, get_my_bssid23a(&pmlmeinfo->network)))
                return _SUCCESS;
 
-#ifdef CONFIG_8723AU_P2P
-       if (pwdinfo->rx_invitereq_info.scan_op_ch_only) {
-               mod_timer(&pwdinfo->reset_ch_sitesurvey,
-                         jiffies + msecs_to_jiffies(10));
-       }
-#endif /* CONFIG_8723AU_P2P */
-
        reason = le16_to_cpu(*(unsigned short *)(pframe + sizeof(struct ieee80211_hdr_3addr)));
 
        DBG_8723A("%s Reason code(%d)\n", __func__, reason);
@@ -1959,22 +1784,11 @@ unsigned int OnDisassoc23a(struct rtw_adapter *padapter, struct recv_frame *prec
        struct sk_buff *skb = precv_frame->pkt;
        struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
        u8 *pframe = skb->data;
-#ifdef CONFIG_8723AU_P2P
-       struct wifidirect_info *pwdinfo = &padapter->wdinfo;
-#endif /* CONFIG_8723AU_P2P */
 
        /* check A3 */
        if (!ether_addr_equal(hdr->addr3, get_my_bssid23a(&pmlmeinfo->network)))
                return _SUCCESS;
 
-#ifdef CONFIG_8723AU_P2P
-       if (pwdinfo->rx_invitereq_info.scan_op_ch_only)
-       {
-               mod_timer(&pwdinfo->reset_ch_sitesurvey,
-                         jiffies + msecs_to_jiffies(10));
-       }
-#endif /* CONFIG_8723AU_P2P */
-
        reason = le16_to_cpu(*(unsigned short *)
                             (pframe + sizeof(struct ieee80211_hdr_3addr)));
 
@@ -2115,2388 +1929,26 @@ unsigned int OnAction23a_back23a(struct rtw_adapter *padapter, struct recv_frame
 
                                /* reason_code = frame_body[4] | (frame_body[5] << 8); */
                                reason_code = get_unaligned_le16(&frame_body[4]);
-                       } else if ((frame_body[3] & BIT(3)) == BIT(3)) {
-                               tid = (frame_body[3] >> 4) & 0x0F;
-
-                               preorder_ctrl =  &psta->recvreorder_ctrl[tid];
-                               preorder_ctrl->enable = false;
-                               preorder_ctrl->indicate_seq = 0xffff;
-                       }
-
-                       DBG_8723A("%s(): DELBA: %x(%x)\n", __func__,
-                                 pmlmeinfo->agg_enable_bitmap, reason_code);
-                       /* todo: how to notify the host while receiving
-                          DELETE BA */
-                       break;
-               default:
-                       break;
-               }
-       }
-       return _SUCCESS;
-}
-
-#ifdef CONFIG_8723AU_P2P
-
-static int get_reg_classes_full_count(struct p2p_channels channel_list) {
-       int cnt = 0;
-       int i;
-
-       for (i = 0; i < channel_list.reg_classes; i++)
-               cnt += channel_list.reg_class[i].channels;
-
-       return cnt;
-}
-
-void issue_p2p_GO_request23a(struct rtw_adapter *padapter, u8* raddr)
-{
-       unsigned char category = WLAN_CATEGORY_PUBLIC;
-       u8                      action = P2P_PUB_ACTION_ACTION;
-       u32                     p2poui = cpu_to_be32(P2POUI);
-       u8                      oui_subtype = P2P_GO_NEGO_REQ;
-       u8                      wpsie[ 255 ] = { 0x00 }, p2pie[ 255 ] = { 0x00 };
-       u8                      wpsielen = 0, p2pielen = 0;
-       u16                     len_channellist_attr = 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;
-       unsigned short                          *fctrl;
-       struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
-       struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
-       struct wifidirect_info *pwdinfo = &padapter->wdinfo;
-
-       if ((pmgntframe = alloc_mgtxmitframe23a(pxmitpriv)) == NULL)
-               return;
-
-       DBG_8723A("[%s] In\n", __func__);
-       /* 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;
-
-       fctrl = &pwlanhdr->frame_control;
-       *fctrl = 0;
-
-       ether_addr_copy(pwlanhdr->addr1, raddr);
-       ether_addr_copy(pwlanhdr->addr2, myid(&padapter->eeprompriv));
-       ether_addr_copy(pwlanhdr->addr3, myid(&padapter->eeprompriv));
-
-       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);
-       pwdinfo->negotiation_dialog_token = 1;  /*Initialize the dialog value*/
-       pframe = rtw_set_fixed_ie23a(pframe, 1,
-                                    &pwdinfo->negotiation_dialog_token,
-                                    &pattrib->pktlen);
-
-       /*      WPS Section */
-       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 */
-
-       /*      Device Password ID */
-       /*      Type: */
-       *(u16*) (wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_DEVICE_PWID);
-       wpsielen += 2;
-
-       /*      Length: */
-       *(u16*) (wpsie + wpsielen) = cpu_to_be16(0x0002);
-       wpsielen += 2;
-
-       /*      Value: */
-
-       if (pwdinfo->ui_got_wps_info == P2P_GOT_WPSINFO_PEER_DISPLAY_PIN)
-       {
-               *(u16*) (wpsie + wpsielen) = cpu_to_be16(WPS_DPID_USER_SPEC);
-       }
-       else if (pwdinfo->ui_got_wps_info == P2P_GOT_WPSINFO_SELF_DISPLAY_PIN)
-       {
-               *(u16*) (wpsie + wpsielen) = cpu_to_be16(WPS_DPID_REGISTRAR_SPEC);
-       }
-       else if (pwdinfo->ui_got_wps_info == P2P_GOT_WPSINFO_PBC)
-       {
-               *(u16*) (wpsie + wpsielen) = cpu_to_be16(WPS_DPID_PBC);
-       }
-
-       wpsielen += 2;
-
-       pframe = rtw_set_ie23a(pframe, WLAN_EID_VENDOR_SPECIFIC, wpsielen,
-                              (unsigned char *) wpsie, &pattrib->pktlen);
-
-       /*      P2P IE Section. */
-
-       /*      P2P OUI */
-       p2pielen = 0;
-       p2pie[p2pielen++] = 0x50;
-       p2pie[p2pielen++] = 0x6F;
-       p2pie[p2pielen++] = 0x9A;
-       p2pie[p2pielen++] = 0x09;       /*      WFA P2P v1.0 */
-
-       /*      Commented by Albert 20110306 */
-       /*      According to the P2P Specification, the group negoitation request frame should contain 9 P2P attributes */
-       /*      1. P2P Capability */
-       /*      2. Group Owner Intent */
-       /*      3. Configuration Timeout */
-       /*      4. Listen Channel */
-       /*      5. Extended Listen Timing */
-       /*      6. Intended P2P Interface Address */
-       /*      7. Channel List */
-       /*      8. P2P Device Info */
-       /*      9. Operating Channel */
-
-       /*      P2P Capability */
-       /*      Type: */
-       p2pie[p2pielen++] = P2P_ATTR_CAPABILITY;
-
-       /*      Length: */
-       *(u16*) (p2pie + p2pielen) = cpu_to_le16(0x0002);
-       p2pielen += 2;
-
-       /*      Value: */
-       /*      Device Capability Bitmap, 1 byte */
-       p2pie[p2pielen++] = DMP_P2P_DEVCAP_SUPPORT;
-
-       /*      Group Capability Bitmap, 1 byte */
-       if (pwdinfo->persistent_supported)
-       {
-               p2pie[p2pielen++] = P2P_GRPCAP_CROSS_CONN | P2P_GRPCAP_PERSISTENT_GROUP;
-       }
-       else
-       {
-               p2pie[p2pielen++] = P2P_GRPCAP_CROSS_CONN;
-       }
-
-       /*      Group Owner Intent */
-       /*      Type: */
-       p2pie[p2pielen++] = P2P_ATTR_GO_INTENT;
-
-       /*      Length: */
-       *(u16*) (p2pie + p2pielen) = cpu_to_le16(0x0001);
-       p2pielen += 2;
-
-       /*      Value: */
-       /*      Todo the tie breaker bit. */
-       p2pie[p2pielen++] = ((pwdinfo->intent << 1) | BIT(0));
-
-       /*      Configuration Timeout */
-       /*      Type: */
-       p2pie[p2pielen++] = P2P_ATTR_CONF_TIMEOUT;
-
-       /*      Length: */
-       *(u16*) (p2pie + p2pielen) = cpu_to_le16(0x0002);
-       p2pielen += 2;
-
-       /*      Value: */
-       p2pie[p2pielen++] = 200;        /*      2 seconds needed to be the P2P GO */
-       p2pie[p2pielen++] = 200;        /*      2 seconds needed to be the P2P Client */
-
-       /*      Listen Channel */
-       /*      Type: */
-       p2pie[p2pielen++] = P2P_ATTR_LISTEN_CH;
-
-       /*      Length: */
-       *(u16*) (p2pie + p2pielen) = cpu_to_le16(0x0005);
-       p2pielen += 2;
-
-       /*      Value: */
-       /*      Country String */
-       p2pie[p2pielen++] = 'X';
-       p2pie[p2pielen++] = 'X';
-
-       /*      The third byte should be set to 0x04. */
-       /*      Described in the "Operating Channel Attribute" section. */
-       p2pie[p2pielen++] = 0x04;
-
-       /*      Operating Class */
-       p2pie[p2pielen++] = 0x51;       /*      Copy from SD7 */
-
-       /*      Channel Number */
-       p2pie[p2pielen++] = pwdinfo->listen_channel;    /*      listening channel number */
-
-       /*      Extended Listen Timing ATTR */
-       /*      Type: */
-       p2pie[p2pielen++] = P2P_ATTR_EX_LISTEN_TIMING;
-
-       /*      Length: */
-       *(u16*) (p2pie + p2pielen) = cpu_to_le16(0x0004);
-       p2pielen += 2;
-
-       /*      Value: */
-       /*      Availability Period */
-       *(u16*) (p2pie + p2pielen) = cpu_to_le16(0xFFFF);
-       p2pielen += 2;
-
-       /*      Availability Interval */
-       *(u16*) (p2pie + p2pielen) = cpu_to_le16(0xFFFF);
-       p2pielen += 2;
-
-       /*      Intended P2P Interface Address */
-       /*      Type: */
-       p2pie[p2pielen++] = P2P_ATTR_INTENTED_IF_ADDR;
-
-       /*      Length: */
-       *(u16*) (p2pie + p2pielen) = cpu_to_le16(ETH_ALEN);
-       p2pielen += 2;
-
-       /*      Value: */
-       memcpy(p2pie + p2pielen, myid(&padapter->eeprompriv), ETH_ALEN);
-       p2pielen += ETH_ALEN;
-
-       /*      Channel List */
-       /*      Type: */
-       p2pie[p2pielen++] = P2P_ATTR_CH_LIST;
-
-       /*  Length: */
-       /*  Country String(3) */
-       /*  + (Operating Class (1) + Number of Channels(1)) * Operation Classes (?) */
-       /*  + number of channels in all classes */
-       len_channellist_attr = 3
-          + (1 + 1) * (u16)(pmlmeext->channel_list.reg_classes)
-          + get_reg_classes_full_count(pmlmeext->channel_list);
-
-       *(u16*) (p2pie + p2pielen) = cpu_to_le16(len_channellist_attr);
-       p2pielen += 2;
-
-       /*      Value: */
-       /*      Country String */
-       p2pie[p2pielen++] = 'X';
-       p2pie[p2pielen++] = 'X';
-
-       /*      The third byte should be set to 0x04. */
-       /*      Described in the "Operating Channel Attribute" section. */
-       p2pie[p2pielen++] = 0x04;
-
-       /*      Channel Entry List */
-
-       {
-               int i, j;
-               for (j = 0; j < pmlmeext->channel_list.reg_classes; j++) {
-                       /*      Operating Class */
-                       p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].reg_class;
-
-                       /*      Number of Channels */
-                       p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channels;
-
-                       /*      Channel List */
-                       for (i = 0; i < pmlmeext->channel_list.reg_class[j].channels; i++) {
-                               p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channel[i];
-                       }
-               }
-       }
-
-       /*      Device Info */
-       /*      Type: */
-       p2pie[p2pielen++] = P2P_ATTR_DEVICE_INFO;
-
-       /*      Length: */
-       /*      21 -> P2P Device Address (6bytes) + Config Methods (2bytes) + Primary Device Type (8bytes) */
-       /*      + NumofSecondDevType (1byte) + WPS Device Name ID field (2bytes) + WPS Device Name Len field (2bytes) */
-       *(u16*) (p2pie + p2pielen) = cpu_to_le16(21 + pwdinfo->device_name_len);
-       p2pielen += 2;
-
-       /*      Value: */
-       /*      P2P Device Address */
-       memcpy(p2pie + p2pielen, myid(&padapter->eeprompriv), ETH_ALEN);
-       p2pielen += ETH_ALEN;
-
-       /*      Config Method */
-       /*      This field should be big endian. Noted by P2P specification. */
-
-       *(u16*) (p2pie + p2pielen) = cpu_to_be16(pwdinfo->supported_wps_cm);
-
-       p2pielen += 2;
-
-       /*      Primary Device Type */
-       /*      Category ID */
-       *(u16*) (p2pie + p2pielen) = cpu_to_be16(WPS_PDT_CID_MULIT_MEDIA);
-       p2pielen += 2;
-
-       /*      OUI */
-       *(u32*) (p2pie + p2pielen) = cpu_to_be32(WPSOUI);
-       p2pielen += 4;
-
-       /*      Sub Category ID */
-       *(u16*) (p2pie + p2pielen) = cpu_to_be16(WPS_PDT_SCID_MEDIA_SERVER);
-       p2pielen += 2;
-
-       /*      Number of Secondary Device Types */
-       p2pie[p2pielen++] = 0x00;       /*      No Secondary Device Type List */
-
-       /*      Device Name */
-       /*      Type: */
-       *(u16*) (p2pie + p2pielen) = cpu_to_be16(WPS_ATTR_DEVICE_NAME);
-       p2pielen += 2;
-
-       /*      Length: */
-       *(u16*) (p2pie + p2pielen) = cpu_to_be16(pwdinfo->device_name_len);
-       p2pielen += 2;
-
-       /*      Value: */
-       memcpy(p2pie + p2pielen, pwdinfo->device_name,
-              pwdinfo->device_name_len);
-       p2pielen += pwdinfo->device_name_len;
-
-       /*      Operating Channel */
-       /*      Type: */
-       p2pie[p2pielen++] = P2P_ATTR_OPERATING_CH;
-
-       /*      Length: */
-       *(u16*) (p2pie + p2pielen) = cpu_to_le16(0x0005);
-       p2pielen += 2;
-
-       /*      Value: */
-       /*      Country String */
-       p2pie[p2pielen++] = 'X';
-       p2pie[p2pielen++] = 'X';
-
-       /*      The third byte should be set to 0x04. */
-       /*      Described in the "Operating Channel Attribute" section. */
-       p2pie[p2pielen++] = 0x04;
-
-       /*      Operating Class */
-       if (pwdinfo->operating_channel <= 14)
-       {
-               /*      Operating Class */
-               p2pie[p2pielen++] = 0x51;
-       }
-       else if ((pwdinfo->operating_channel >= 36) && (pwdinfo->operating_channel <= 48))
-       {
-               /*      Operating Class */
-               p2pie[p2pielen++] = 0x73;
-       }
-       else
-       {
-               /*      Operating Class */
-               p2pie[p2pielen++] = 0x7c;
-       }
-
-       /*      Channel Number */
-       p2pie[p2pielen++] = pwdinfo->operating_channel; /*      operating channel number */
-
-       pframe = rtw_set_ie23a(pframe, WLAN_EID_VENDOR_SPECIFIC, p2pielen,
-                              (unsigned char *) p2pie, &pattrib->pktlen);
-
-#ifdef CONFIG_8723AU_P2P
-       wfdielen = build_nego_req_wfd_ie(pwdinfo, pframe);
-       pframe += wfdielen;
-       pattrib->pktlen += wfdielen;
-#endif /* CONFIG_8723AU_P2P */
-
-       pattrib->last_txcmdsz = pattrib->pktlen;
-
-       dump_mgntframe23a(padapter, pmgntframe);
-
-       return;
-}
-
-static void issue_p2p_GO_response(struct rtw_adapter *padapter, u8* raddr, u8* frame_body, uint len, u8 result)
-{
-
-       unsigned char category = WLAN_CATEGORY_PUBLIC;
-       u8 action = P2P_PUB_ACTION_ACTION;
-       u32 p2poui = cpu_to_be32(P2POUI);
-       u8 oui_subtype = P2P_GO_NEGO_RESP;
-       u8 wpsie[255] = { 0x00 }, p2pie[255] = { 0x00 };
-       u8 p2pielen = 0;
-       uint wpsielen = 0;
-       u16 wps_devicepassword_id = 0x0000;
-       uint wps_devicepassword_id_len = 0;
-       u16 len_channellist_attr = 0;
-       int i, j;
-       struct xmit_frame *pmgntframe;
-       struct pkt_attrib *pattrib;
-       unsigned char *pframe;
-       struct ieee80211_hdr *pwlanhdr;
-       unsigned short *fctrl;
-       struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
-       struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
-       struct wifidirect_info *pwdinfo = &padapter->wdinfo;
-#ifdef CONFIG_8723AU_P2P
-       u32 wfdielen = 0;
-#endif /* CONFIG_8723AU_P2P */
-
-       if ((pmgntframe = alloc_mgtxmitframe23a(pxmitpriv)) == NULL)
-               return;
-
-       DBG_8723A("[%s] In, result = %d\n", __func__,  result);
-       /* 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;
-
-       fctrl = &pwlanhdr->frame_control;
-       *fctrl = 0;
-
-       ether_addr_copy(pwlanhdr->addr1, raddr);
-       ether_addr_copy(pwlanhdr->addr2, myid(&padapter->eeprompriv));
-       ether_addr_copy(pwlanhdr->addr3, myid(&padapter->eeprompriv));
-
-       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);
-       /*      The Dialog Token of provisioning discovery request frame. */
-       pwdinfo->negotiation_dialog_token = frame_body[7];
-       pframe = rtw_set_fixed_ie23a(pframe, 1,
-                                    &pwdinfo->negotiation_dialog_token,
-                                    &pattrib->pktlen);
-
-       /*      Commented by Albert 20110328 */
-       /*      Try to get the device password ID from the WPS IE of group
-               negotiation request frame */
-       /*      WiFi Direct test plan 5.1.15 */
-       rtw_get_wps_ie23a(frame_body + _PUBLIC_ACTION_IE_OFFSET_,
-                         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);
-
-       memset(wpsie, 0x00, 255);
-       wpsielen = 0;
-
-       /*      WPS Section */
-       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 */
-
-       /*      Device Password ID */
-       /*      Type: */
-       *(u16*) (wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_DEVICE_PWID);
-       wpsielen += 2;
-
-       /*      Length: */
-       *(u16*) (wpsie + wpsielen) = cpu_to_be16(0x0002);
-       wpsielen += 2;
-
-       /*      Value: */
-       if (wps_devicepassword_id == WPS_DPID_USER_SPEC) {
-               *(u16*) (wpsie + wpsielen) =
-                       cpu_to_be16(WPS_DPID_REGISTRAR_SPEC);
-       } else if (wps_devicepassword_id == WPS_DPID_REGISTRAR_SPEC) {
-               *(u16*) (wpsie + wpsielen) = cpu_to_be16(WPS_DPID_USER_SPEC);
-       } else {
-               *(u16*) (wpsie + wpsielen) = cpu_to_be16(WPS_DPID_PBC);
-       }
-       wpsielen += 2;
-
-       /*      Commented by Kurt 20120113 */
-       /*      If some device wants to do p2p handshake without sending prov_disc_req */
-       /*      We have to get peer_req_cm from here. */
-       if (!memcmp(pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "000", 3)) {
-               if (wps_devicepassword_id == WPS_DPID_USER_SPEC) {
-                       memcpy(pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "dis", 3);
-               } else if (wps_devicepassword_id == WPS_DPID_REGISTRAR_SPEC) {
-                       memcpy(pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "pad", 3);
-               } else {
-                       memcpy(pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "pbc", 3);
-               }
-       }
-
-       pframe = rtw_set_ie23a(pframe, WLAN_EID_VENDOR_SPECIFIC, wpsielen,
-                              (unsigned char *) wpsie, &pattrib->pktlen);
-
-       /*      P2P IE Section. */
-
-       /*      P2P OUI */
-       p2pielen = 0;
-       p2pie[p2pielen++] = 0x50;
-       p2pie[p2pielen++] = 0x6F;
-       p2pie[p2pielen++] = 0x9A;
-       p2pie[p2pielen++] = 0x09;       /*      WFA P2P v1.0 */
-
-       /*      Commented by Albert 20100908 */
-       /*      According to the P2P Specification, the group negoitation
-               response frame should contain 9 P2P attributes */
-       /*      1. Status */
-       /*      2. P2P Capability */
-       /*      3. Group Owner Intent */
-       /*      4. Configuration Timeout */
-       /*      5. Operating Channel */
-       /*      6. Intended P2P Interface Address */
-       /*      7. Channel List */
-       /*      8. Device Info */
-       /*      9. Group ID     (Only GO) */
-
-       /*      ToDo: */
-
-       /*      P2P Status */
-       /*      Type: */
-       p2pie[p2pielen++] = P2P_ATTR_STATUS;
-
-       /*      Length: */
-       *(u16*) (p2pie + p2pielen) = cpu_to_le16(0x0001);
-       p2pielen += 2;
-
-       /*      Value: */
-       p2pie[p2pielen++] = result;
-
-       /*      P2P Capability */
-       /*      Type: */
-       p2pie[p2pielen++] = P2P_ATTR_CAPABILITY;
-
-       /*      Length: */
-       *(u16*) (p2pie + p2pielen) = cpu_to_le16(0x0002);
-       p2pielen += 2;
-
-       /*      Value: */
-       /*      Device Capability Bitmap, 1 byte */
-
-       if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_CLIENT)) {
-               /*      Commented by Albert 2011/03/08 */
-               /*      According to the P2P specification */
-               /*      if the sending device will be client, the P2P
-                       Capability should be reserved of group negotation
-                       response frame */
-               p2pie[p2pielen++] = 0;
-       } else {
-               /*      Be group owner or meet the error case */
-               p2pie[p2pielen++] = DMP_P2P_DEVCAP_SUPPORT;
-       }
-
-       /*      Group Capability Bitmap, 1 byte */
-       if (pwdinfo->persistent_supported) {
-               p2pie[p2pielen++] = P2P_GRPCAP_CROSS_CONN |
-                       P2P_GRPCAP_PERSISTENT_GROUP;
-       } else {
-               p2pie[p2pielen++] = P2P_GRPCAP_CROSS_CONN;
-       }
-
-       /*      Group Owner Intent */
-       /*      Type: */
-       p2pie[p2pielen++] = P2P_ATTR_GO_INTENT;
-
-       /*      Length: */
-       *(u16*) (p2pie + p2pielen) = cpu_to_le16(0x0001);
-       p2pielen += 2;
-
-       /*      Value: */
-       if (pwdinfo->peer_intent & 0x01) {
-               /*      Peer's tie breaker bit is 1, our tie breaker
-                       bit should be 0 */
-               p2pie[p2pielen++] = (pwdinfo->intent << 1);
-       } else {
-               /* Peer's tie breaker bit is 0, our tie breaker bit
-                  should be 1 */
-               p2pie[p2pielen++] = ((pwdinfo->intent << 1) | BIT(0));
-       }
-
-       /*      Configuration Timeout */
-       /*      Type: */
-       p2pie[p2pielen++] = P2P_ATTR_CONF_TIMEOUT;
-
-       /*      Length: */
-       *(u16*) (p2pie + p2pielen) = cpu_to_le16(0x0002);
-       p2pielen += 2;
-
-       /*      Value: */
-       /*      2 seconds needed to be the P2P GO */
-       p2pie[p2pielen++] = 200;
-       /*      2 seconds needed to be the P2P Client */
-       p2pie[p2pielen++] = 200;
-
-       /*      Operating Channel */
-       /*      Type: */
-       p2pie[p2pielen++] = P2P_ATTR_OPERATING_CH;
-
-       /*      Length: */
-       *(u16*) (p2pie + p2pielen) = cpu_to_le16(0x0005);
-       p2pielen += 2;
-
-       /*      Value: */
-       /*      Country String */
-       p2pie[p2pielen++] = 'X';
-       p2pie[p2pielen++] = 'X';
-
-       /*      The third byte should be set to 0x04. */
-       /*      Described in the "Operating Channel Attribute" section. */
-       p2pie[p2pielen++] = 0x04;
-
-       /*      Operating Class */
-       if (pwdinfo->operating_channel <= 14) {
-               /*      Operating Class */
-               p2pie[p2pielen++] = 0x51;
-       } else if ((pwdinfo->operating_channel >= 36) &&
-                  (pwdinfo->operating_channel <= 48)) {
-               /*      Operating Class */
-               p2pie[p2pielen++] = 0x73;
-       } else {
-               /*      Operating Class */
-               p2pie[p2pielen++] = 0x7c;
-       }
-
-       /*      Channel Number */
-       /*      operating channel number */
-       p2pie[p2pielen++] = pwdinfo->operating_channel;
-
-       /*      Intended P2P Interface Address */
-       /*      Type: */
-       p2pie[p2pielen++] = P2P_ATTR_INTENTED_IF_ADDR;
-
-       /*      Length: */
-       *(u16*) (p2pie + p2pielen) = cpu_to_le16(ETH_ALEN);
-       p2pielen += 2;
-
-       /*      Value: */
-       memcpy(p2pie + p2pielen, myid(&padapter->eeprompriv), ETH_ALEN);
-       p2pielen += ETH_ALEN;
-
-       /*      Channel List */
-       /*      Type: */
-       p2pie[p2pielen++] = P2P_ATTR_CH_LIST;
-
-       /*  Country String(3) */
-       /*  + (Operating Class (1) + Number of Channels(1)) *
-           Operation Classes (?) */
-       /*  + number of channels in all classes */
-       len_channellist_attr = 3 +
-               (1 + 1) * (u16)pmlmeext->channel_list.reg_classes +
-               get_reg_classes_full_count(pmlmeext->channel_list);
-
-       *(u16*) (p2pie + p2pielen) = cpu_to_le16(len_channellist_attr);
-
-       p2pielen += 2;
-
-       /*      Value: */
-       /*      Country String */
-       p2pie[p2pielen++] = 'X';
-       p2pie[p2pielen++] = 'X';
-
-       /*      The third byte should be set to 0x04. */
-       /*      Described in the "Operating Channel Attribute" section. */
-       p2pie[p2pielen++] = 0x04;
-
-       /*      Channel Entry List */
-
-       for (j = 0; j < pmlmeext->channel_list.reg_classes; j++) {
-               /*      Operating Class */
-               p2pie[p2pielen++] =
-                       pmlmeext->channel_list.reg_class[j].reg_class;
-
-               /*      Number of Channels */
-               p2pie[p2pielen++] =
-                       pmlmeext->channel_list.reg_class[j].channels;
-
-               /*      Channel List */
-               for (i = 0;
-                    i < pmlmeext->channel_list.reg_class[j].channels; i++) {
-                       p2pie[p2pielen++] =
-                               pmlmeext->channel_list.reg_class[j].channel[i];
-               }
-       }
-
-       /*      Device Info */
-       /*      Type: */
-       p2pie[p2pielen++] = P2P_ATTR_DEVICE_INFO;
-
-       /*      Length: */
-       /*      21 -> P2P Device Address (6bytes) + Config Methods (2bytes) +
-               Primary Device Type (8bytes) */
-       /*      + NumofSecondDevType (1byte) + WPS Device Name ID field
-               (2bytes) + WPS Device Name Len field (2bytes) */
-       *(u16*) (p2pie + p2pielen) = cpu_to_le16(21 + pwdinfo->device_name_len);
-       p2pielen += 2;
-
-       /*      Value: */
-       /*      P2P Device Address */
-       memcpy(p2pie + p2pielen, myid(&padapter->eeprompriv), ETH_ALEN);
-       p2pielen += ETH_ALEN;
-
-       /*      Config Method */
-       /*      This field should be big endian. Noted by P2P specification. */
-
-       *(u16*) (p2pie + p2pielen) = cpu_to_be16(pwdinfo->supported_wps_cm);
-
-       p2pielen += 2;
-
-       /*      Primary Device Type */
-       /*      Category ID */
-       *(u16*) (p2pie + p2pielen) = cpu_to_be16(WPS_PDT_CID_MULIT_MEDIA);
-       p2pielen += 2;
-
-       /*      OUI */
-       *(u32*) (p2pie + p2pielen) = cpu_to_be32(WPSOUI);
-       p2pielen += 4;
-
-       /*      Sub Category ID */
-       *(u16*) (p2pie + p2pielen) = cpu_to_be16(WPS_PDT_SCID_MEDIA_SERVER);
-       p2pielen += 2;
-
-       /*      Number of Secondary Device Types */
-       p2pie[p2pielen++] = 0x00;       /*      No Secondary Device Type List */
-
-       /*      Device Name */
-       /*      Type: */
-       *(u16*) (p2pie + p2pielen) = cpu_to_be16(WPS_ATTR_DEVICE_NAME);
-       p2pielen += 2;
-
-       /*      Length: */
-       *(u16*) (p2pie + p2pielen) = cpu_to_be16(pwdinfo->device_name_len);
-       p2pielen += 2;
-
-       /*      Value: */
-       memcpy(p2pie + p2pielen, pwdinfo->device_name,
-              pwdinfo->device_name_len);
-       p2pielen += pwdinfo->device_name_len;
-
-       if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO))
-       {
-               /*      Group ID Attribute */
-               /*      Type: */
-               p2pie[p2pielen++] = P2P_ATTR_GROUP_ID;
-
-               /*      Length: */
-               *(u16*) (p2pie + p2pielen) =
-                       cpu_to_le16(ETH_ALEN + pwdinfo->nego_ssidlen);
-               p2pielen += 2;
-
-               /*      Value: */
-               /*      p2P Device Address */
-               memcpy(p2pie + p2pielen, pwdinfo->device_addr, ETH_ALEN);
-               p2pielen += ETH_ALEN;
-
-               /*      SSID */
-               memcpy(p2pie + p2pielen, pwdinfo->nego_ssid,
-                      pwdinfo->nego_ssidlen);
-               p2pielen += pwdinfo->nego_ssidlen;
-
-       }
-
-       pframe = rtw_set_ie23a(pframe, WLAN_EID_VENDOR_SPECIFIC, p2pielen,
-                              (unsigned char *) p2pie, &pattrib->pktlen);
-
-#ifdef CONFIG_8723AU_P2P
-       wfdielen = build_nego_resp_wfd_ie(pwdinfo, pframe);
-       pframe += wfdielen;
-       pattrib->pktlen += wfdielen;
-#endif /* CONFIG_8723AU_P2P */
-
-       pattrib->last_txcmdsz = pattrib->pktlen;
-
-       dump_mgntframe23a(padapter, pmgntframe);
-
-       return;
-}
-
-static void issue_p2p_GO_confirm(struct rtw_adapter *padapter, u8* raddr,
-                                u8 result)
-{
-
-       unsigned char category = WLAN_CATEGORY_PUBLIC;
-       u8 action = P2P_PUB_ACTION_ACTION;
-       u32 p2poui = cpu_to_be32(P2POUI);
-       u8 oui_subtype = P2P_GO_NEGO_CONF;
-       u8 p2pie[ 255 ] = { 0x00 };
-       u8 p2pielen = 0;
-       struct xmit_frame *pmgntframe;
-       struct pkt_attrib *pattrib;
-       unsigned char *pframe;
-       struct ieee80211_hdr *pwlanhdr;
-       unsigned short *fctrl;
-       struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
-       struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
-       struct wifidirect_info *pwdinfo = &padapter->wdinfo;
-#ifdef CONFIG_8723AU_P2P
-       u32 wfdielen = 0;
-#endif /* CONFIG_8723AU_P2P */
-
-       if ((pmgntframe = alloc_mgtxmitframe23a(pxmitpriv)) == NULL)
-               return;
-
-       DBG_8723A("[%s] In\n", __func__);
-       /* 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;
-
-       fctrl = &pwlanhdr->frame_control;
-       *fctrl = 0;
-
-       ether_addr_copy(pwlanhdr->addr1, raddr);
-       ether_addr_copy(pwlanhdr->addr2, myid(&padapter->eeprompriv));
-       ether_addr_copy(pwlanhdr->addr3, myid(&padapter->eeprompriv));
-
-       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,
-                                    &pwdinfo->negotiation_dialog_token,
-                                 &pattrib->pktlen);
-       /*      P2P OUI */
-       p2pielen = 0;
-       p2pie[p2pielen++] = 0x50;
-       p2pie[p2pielen++] = 0x6F;
-       p2pie[p2pielen++] = 0x9A;
-       p2pie[p2pielen++] = 0x09;       /*      WFA P2P v1.0 */
-
-       /*      Commented by Albert 20110306 */
-       /*      According to the P2P Specification, the group negoitation
-               request frame should contain 5 P2P attributes */
-       /*      1. Status */
-       /*      2. P2P Capability */
-       /*      3. Operating Channel */
-       /*      4. Channel List */
-       /*      5. Group ID     (if this WiFi is GO) */
-
-       /*      P2P Status */
-       /*      Type: */
-       p2pie[p2pielen++] = P2P_ATTR_STATUS;
-
-       /*      Length: */
-       *(u16*) (p2pie + p2pielen) = cpu_to_le16(0x0001);
-       p2pielen += 2;
-
-       /*      Value: */
-       p2pie[p2pielen++] = result;
-
-       /*      P2P Capability */
-       /*      Type: */
-       p2pie[p2pielen++] = P2P_ATTR_CAPABILITY;
-
-       /*      Length: */
-       *(u16*) (p2pie + p2pielen) = cpu_to_le16(0x0002);
-       p2pielen += 2;
-
-       /*      Value: */
-       /*      Device Capability Bitmap, 1 byte */
-       p2pie[p2pielen++] = DMP_P2P_DEVCAP_SUPPORT;
-
-       /*      Group Capability Bitmap, 1 byte */
-       if (pwdinfo->persistent_supported) {
-               p2pie[p2pielen++] = P2P_GRPCAP_CROSS_CONN |
-                       P2P_GRPCAP_PERSISTENT_GROUP;
-       } else {
-               p2pie[p2pielen++] = P2P_GRPCAP_CROSS_CONN;
-       }
-
-       /*      Operating Channel */
-       /*      Type: */
-       p2pie[p2pielen++] = P2P_ATTR_OPERATING_CH;
-
-       /*      Length: */
-       *(u16*) (p2pie + p2pielen) = cpu_to_le16(0x0005);
-       p2pielen += 2;
-
-       /*      Value: */
-       /*      Country String */
-       p2pie[p2pielen++] = 'X';
-       p2pie[p2pielen++] = 'X';
-
-       /*      The third byte should be set to 0x04. */
-       /*      Described in the "Operating Channel Attribute" section. */
-       p2pie[p2pielen++] = 0x04;
-
-       if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_CLIENT)) {
-               if (pwdinfo->peer_operating_ch <= 14) {
-                       /*      Operating Class */
-                       p2pie[p2pielen++] = 0x51;
-               } else if ((pwdinfo->peer_operating_ch >= 36) &&
-                        (pwdinfo->peer_operating_ch <= 48)) {
-                       /*      Operating Class */
-                       p2pie[p2pielen++] = 0x73;
-               } else {
-                       /*      Operating Class */
-                       p2pie[p2pielen++] = 0x7c;
-               }
-
-               p2pie[p2pielen++] = pwdinfo->peer_operating_ch;
-       } else {
-               if (pwdinfo->operating_channel <= 14) {
-                       /*      Operating Class */
-                       p2pie[p2pielen++] = 0x51;
-               }
-               else if ((pwdinfo->operating_channel >= 36) &&
-                        (pwdinfo->operating_channel <= 48)) {
-                       /*      Operating Class */
-                       p2pie[p2pielen++] = 0x73;
-               } else {
-                       /*      Operating Class */
-                       p2pie[p2pielen++] = 0x7c;
-               }
-
-               /*      Channel Number */
-               /*      Use the listen channel as the operating channel */
-               p2pie[p2pielen++] = pwdinfo->operating_channel;
-       }
-
-       /*      Channel List */
-       /*      Type: */
-       p2pie[p2pielen++] = P2P_ATTR_CH_LIST;
-
-       /*      Length: */
-       *(u16*) (p2pie + p2pielen) =
-               cpu_to_le16(pwdinfo->channel_list_attr_len);
-       p2pielen += 2;
-
-       /*      Value: */
-       memcpy(p2pie + p2pielen, pwdinfo->channel_list_attr,
-              pwdinfo->channel_list_attr_len);
-       p2pielen += pwdinfo->channel_list_attr_len;
-
-       if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) {
-               /*      Group ID Attribute */
-               /*      Type: */
-               p2pie[p2pielen++] = P2P_ATTR_GROUP_ID;
-
-               /*      Length: */
-               *(u16*) (p2pie + p2pielen) =
-                       cpu_to_le16(ETH_ALEN + pwdinfo->nego_ssidlen);
-               p2pielen += 2;
-
-               /*      Value: */
-               /*      p2P Device Address */
-               memcpy(p2pie + p2pielen, pwdinfo->device_addr, ETH_ALEN);
-               p2pielen += ETH_ALEN;
-
-               /*      SSID */
-               memcpy(p2pie + p2pielen, pwdinfo->nego_ssid,
-                      pwdinfo->nego_ssidlen);
-               p2pielen += pwdinfo->nego_ssidlen;
-       }
-
-       pframe = rtw_set_ie23a(pframe, WLAN_EID_VENDOR_SPECIFIC, p2pielen,
-                              (unsigned char *)p2pie, &pattrib->pktlen);
-
-#ifdef CONFIG_8723AU_P2P
-       wfdielen = build_nego_confirm_wfd_ie(pwdinfo, pframe);
-       pframe += wfdielen;
-       pattrib->pktlen += wfdielen;
-#endif /* CONFIG_8723AU_P2P */
-
-       pattrib->last_txcmdsz = pattrib->pktlen;
-
-       dump_mgntframe23a(padapter, pmgntframe);
-
-       return;
-}
-
-void issue_p2p_invitation_request23a(struct rtw_adapter *padapter, u8* raddr)
-{
-       unsigned char category = WLAN_CATEGORY_PUBLIC;
-       u8 action = P2P_PUB_ACTION_ACTION;
-       u32 p2poui = cpu_to_be32(P2POUI);
-       u8 oui_subtype = P2P_INVIT_REQ;
-       u8 p2pie[ 255 ] = { 0x00 };
-       u8 p2pielen = 0;
-       u8 dialogToken = 3;
-       u16 len_channellist_attr = 0;
-#ifdef CONFIG_8723AU_P2P
-       u32 wfdielen = 0;
-#endif /* CONFIG_8723AU_P2P */
-       int i, j;
-       struct xmit_frame *pmgntframe;
-       struct pkt_attrib *pattrib;
-       unsigned char *pframe;
-       struct ieee80211_hdr *pwlanhdr;
-       unsigned short *fctrl;
-       struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
-       struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
-       struct wifidirect_info *pwdinfo = &padapter->wdinfo;
-
-       if ((pmgntframe = alloc_mgtxmitframe23a(pxmitpriv)) == 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;
-
-       fctrl = &pwlanhdr->frame_control;
-       *fctrl = 0;
-
-       ether_addr_copy(pwlanhdr->addr1, raddr);
-       ether_addr_copy(pwlanhdr->addr2, myid(&padapter->eeprompriv));
-       ether_addr_copy(pwlanhdr->addr3, raddr);
-
-       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);
-
-       /*      P2P IE Section. */
-
-       /*      P2P OUI */
-       p2pielen = 0;
-       p2pie[p2pielen++] = 0x50;
-       p2pie[p2pielen++] = 0x6F;
-       p2pie[p2pielen++] = 0x9A;
-       p2pie[p2pielen++] = 0x09;       /*      WFA P2P v1.0 */
-
-       /*      Commented by Albert 20101011 */
-       /*      According to the P2P Specification, the P2P Invitation
-               request frame should contain 7 P2P attributes */
-       /*      1. Configuration Timeout */
-       /*      2. Invitation Flags */
-       /*      3. Operating Channel    (Only GO) */
-       /*      4. P2P Group BSSID      (Should be included if I am the GO) */
-       /*      5. Channel List */
-       /*      6. P2P Group ID */
-       /*      7. P2P Device Info */
-
-       /*      Configuration Timeout */
-       /*      Type: */
-       p2pie[p2pielen++] = P2P_ATTR_CONF_TIMEOUT;
-
-       /*      Length: */
-       *(u16*) (p2pie + p2pielen) = cpu_to_le16(0x0002);
-       p2pielen += 2;
-
-       /*      Value: */
-       /*      2 seconds needed to be the P2P GO */
-       p2pie[p2pielen++] = 200;
-       /*      2 seconds needed to be the P2P Client */
-       p2pie[p2pielen++] = 200;
-
-       /*      Invitation Flags */
-       /*      Type: */
-       p2pie[p2pielen++] = P2P_ATTR_INVITATION_FLAGS;
-
-       /*      Length: */
-       *(u16*) (p2pie + p2pielen) = cpu_to_le16(0x0001);
-       p2pielen += 2;
-
-       /*      Value: */
-       p2pie[p2pielen++] = P2P_INVITATION_FLAGS_PERSISTENT;
-
-       /*      Operating Channel */
-       /*      Type: */
-       p2pie[p2pielen++] = P2P_ATTR_OPERATING_CH;
-
-       /*      Length: */
-       *(u16*) (p2pie + p2pielen) = cpu_to_le16(0x0005);
-       p2pielen += 2;
-
-       /*      Value: */
-       /*      Country String */
-       p2pie[p2pielen++] = 'X';
-       p2pie[p2pielen++] = 'X';
-
-       /*      The third byte should be set to 0x04. */
-       /*      Described in the "Operating Channel Attribute" section. */
-       p2pie[p2pielen++] = 0x04;
-
-       /*      Operating Class */
-       if (pwdinfo->invitereq_info.operating_ch <= 14)
-               p2pie[p2pielen++] = 0x51;
-       else if ((pwdinfo->invitereq_info.operating_ch >= 36) &&
-                (pwdinfo->invitereq_info.operating_ch <= 48))
-               p2pie[p2pielen++] = 0x73;
-       else
-               p2pie[p2pielen++] = 0x7c;
-
-       /*      Channel Number */
-       /*      operating channel number */
-       p2pie[p2pielen++] = pwdinfo->invitereq_info.operating_ch;
-
-       if (ether_addr_equal(myid(&padapter->eeprompriv),
-                            pwdinfo->invitereq_info.go_bssid)) {
-               /*      P2P Group BSSID */
-               /*      Type: */
-               p2pie[p2pielen++] = P2P_ATTR_GROUP_BSSID;
-
-               /*      Length: */
-               *(u16*) (p2pie + p2pielen) = cpu_to_le16(ETH_ALEN);
-               p2pielen += 2;
-
-               /*      Value: */
-               /*      P2P Device Address for GO */
-               memcpy(p2pie + p2pielen, pwdinfo->invitereq_info.go_bssid,
-                      ETH_ALEN);
-               p2pielen += ETH_ALEN;
-       }
-
-       /*      Channel List */
-       /*      Type: */
-       p2pie[p2pielen++] = P2P_ATTR_CH_LIST;
-
-       /*      Length: */
-       /*  Country String(3) */
-       /*  + (Operating Class (1) + Number of Channels(1)) *
-           Operation Classes (?) */
-       /*  + number of channels in all classes */
-       len_channellist_attr = 3 +
-               (1 + 1) * (u16)pmlmeext->channel_list.reg_classes +
-               get_reg_classes_full_count(pmlmeext->channel_list);
-
-       *(u16*) (p2pie + p2pielen) = cpu_to_le16(len_channellist_attr);
-       p2pielen += 2;
-
-       /*      Value: */
-       /*      Country String */
-       p2pie[p2pielen++] = 'X';
-       p2pie[p2pielen++] = 'X';
-
-       /*      The third byte should be set to 0x04. */
-       /*      Described in the "Operating Channel Attribute" section. */
-       p2pie[p2pielen++] = 0x04;
-
-       /*      Channel Entry List */
-       for (j = 0; j < pmlmeext->channel_list.reg_classes; j++) {
-               /*      Operating Class */
-               p2pie[p2pielen++] =
-                       pmlmeext->channel_list.reg_class[j].reg_class;
-
-               /*      Number of Channels */
-               p2pie[p2pielen++] =
-                       pmlmeext->channel_list.reg_class[j].channels;
-
-               /*      Channel List */
-               for (i = 0;
-                    i < pmlmeext->channel_list.reg_class[j].channels; i++) {
-                       p2pie[p2pielen++] =
-                               pmlmeext->channel_list.reg_class[j].channel[i];
-               }
-       }
-
-       /*      P2P Group ID */
-       /*      Type: */
-       p2pie[p2pielen++] = P2P_ATTR_GROUP_ID;
-
-       /*      Length: */
-       *(u16*) (p2pie + p2pielen) =
-               cpu_to_le16(6 + pwdinfo->invitereq_info.ssidlen);
-       p2pielen += 2;
-
-       /*      Value: */
-       /*      P2P Device Address for GO */
-       memcpy(p2pie + p2pielen, pwdinfo->invitereq_info.go_bssid, ETH_ALEN);
-       p2pielen += ETH_ALEN;
-
-       /*      SSID */
-       memcpy(p2pie + p2pielen, pwdinfo->invitereq_info.go_ssid,
-              pwdinfo->invitereq_info.ssidlen);
-       p2pielen += pwdinfo->invitereq_info.ssidlen;
-
-       /*      Device Info */
-       /*      Type: */
-       p2pie[p2pielen++] = P2P_ATTR_DEVICE_INFO;
-
-       /*      Length: */
-       /*      21 -> P2P Device Address (6bytes) + Config Methods (2bytes) +
-               Primary Device Type (8bytes) */
-       /*      + NumofSecondDevType (1byte) + WPS Device Name ID field
-               (2bytes) + WPS Device Name Len field (2bytes) */
-       *(u16*) (p2pie + p2pielen) = cpu_to_le16(21 + pwdinfo->device_name_len);
-       p2pielen += 2;
-
-       /*      Value: */
-       /*      P2P Device Address */
-       memcpy(p2pie + p2pielen, myid(&padapter->eeprompriv), ETH_ALEN);
-       p2pielen += ETH_ALEN;
-
-       /*      Config Method */
-       /*      This field should be big endian. Noted by P2P specification. */
-       *(u16*) (p2pie + p2pielen) = cpu_to_be16(WPS_CONFIG_METHOD_DISPLAY);
-       p2pielen += 2;
-
-       /*      Primary Device Type */
-       /*      Category ID */
-       *(u16*) (p2pie + p2pielen) = cpu_to_be16(WPS_PDT_CID_MULIT_MEDIA);
-       p2pielen += 2;
-
-       /*      OUI */
-       *(u32*) (p2pie + p2pielen) = cpu_to_be32(WPSOUI);
-       p2pielen += 4;
-
-       /*      Sub Category ID */
-       *(u16*) (p2pie + p2pielen) = cpu_to_be16(WPS_PDT_SCID_MEDIA_SERVER);
-       p2pielen += 2;
-
-       /*      Number of Secondary Device Types */
-       p2pie[p2pielen++] = 0x00;       /*      No Secondary Device Type List */
-
-       /*      Device Name */
-       /*      Type: */
-       *(u16*) (p2pie + p2pielen) = cpu_to_be16(WPS_ATTR_DEVICE_NAME);
-       p2pielen += 2;
-
-       /*      Length: */
-       *(u16*) (p2pie + p2pielen) = cpu_to_be16(pwdinfo->device_name_len);
-       p2pielen += 2;
-
-       /*      Value: */
-       memcpy(p2pie + p2pielen, pwdinfo->device_name,
-              pwdinfo->device_name_len);
-       p2pielen += pwdinfo->device_name_len;
-
-       pframe = rtw_set_ie23a(pframe, WLAN_EID_VENDOR_SPECIFIC, p2pielen,
-                              (unsigned char *) p2pie, &pattrib->pktlen);
-
-#ifdef CONFIG_8723AU_P2P
-       wfdielen = build_invitation_req_wfd_ie(pwdinfo, pframe);
-       pframe += wfdielen;
-       pattrib->pktlen += wfdielen;
-#endif /* CONFIG_8723AU_P2P */
-
-       pattrib->last_txcmdsz = pattrib->pktlen;
-
-       dump_mgntframe23a(padapter, pmgntframe);
-
-       return;
-}
-
-void issue_p2p_invitation_response23a(struct rtw_adapter *padapter, u8 *raddr,
-                                     u8 dialogToken, u8 status_code)
-{
-       unsigned char category = WLAN_CATEGORY_PUBLIC;
-       u8 action = P2P_PUB_ACTION_ACTION;
-       u32 p2poui = cpu_to_be32(P2POUI);
-       u8 oui_subtype = P2P_INVIT_RESP;
-       u8 p2pie[ 255 ] = { 0x00 };
-       u8 p2pielen = 0;
-       u16 len_channellist_attr = 0;
-#ifdef CONFIG_8723AU_P2P
-       u32 wfdielen = 0;
-#endif /* CONFIG_8723AU_P2P */
-       int i, j;
-
-       struct xmit_frame *pmgntframe;
-       struct pkt_attrib *pattrib;
-       unsigned char *pframe;
-       struct ieee80211_hdr *pwlanhdr;
-       unsigned short *fctrl;
-       struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
-       struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
-       struct wifidirect_info *pwdinfo = &padapter->wdinfo;
-
-       if ((pmgntframe = alloc_mgtxmitframe23a(pxmitpriv)) == 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;
-
-       fctrl = &pwlanhdr->frame_control;
-       *fctrl = 0;
-
-       ether_addr_copy(pwlanhdr->addr1, raddr);
-       ether_addr_copy(pwlanhdr->addr2, myid(&padapter->eeprompriv));
-       ether_addr_copy(pwlanhdr->addr3, raddr);
-
-       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);
-
-       /*      P2P IE Section. */
-
-       /*      P2P OUI */
-       p2pielen = 0;
-       p2pie[p2pielen++] = 0x50;
-       p2pie[p2pielen++] = 0x6F;
-       p2pie[p2pielen++] = 0x9A;
-       p2pie[p2pielen++] = 0x09;       /*      WFA P2P v1.0 */
-
-       /*      Commented by Albert 20101005 */
-       /*      According to the P2P Specification, the P2P Invitation
-               response frame should contain 5 P2P attributes */
-       /*      1. Status */
-       /*      2. Configuration Timeout */
-       /*      3. Operating Channel    (Only GO) */
-       /*      4. P2P Group BSSID      (Only GO) */
-       /*      5. Channel List */
-
-       /*      P2P Status */
-       /*      Type: */
-       p2pie[p2pielen++] = P2P_ATTR_STATUS;
-
-       /*      Length: */
-       *(u16*) (p2pie + p2pielen) = cpu_to_le16(0x0001);
-       p2pielen += 2;
-
-       /*      Value: */
-       /*      When status code is P2P_STATUS_FAIL_INFO_UNAVAILABLE. */
-       /*      Sent the event receiving the P2P Invitation Req frame
-               to DMP UI. */
-       /*      DMP had to compare the MAC address to find out the profile. */
-       /*      So, the WiFi driver will send the
-               P2P_STATUS_FAIL_INFO_UNAVAILABLE to NB. */
-       /*      If the UI found the corresponding profile, the WiFi driver
-               sends the P2P Invitation Req */
-       /*      to NB to rebuild the persistent group. */
-       p2pie[p2pielen++] = status_code;
-
-       /*      Configuration Timeout */
-       /*      Type: */
-       p2pie[p2pielen++] = P2P_ATTR_CONF_TIMEOUT;
-
-       /*      Length: */
-       *(u16*) (p2pie + p2pielen) = cpu_to_le16(0x0002);
-       p2pielen += 2;
-
-       /*      Value: */
-       /*      2 seconds needed to be the P2P GO */
-       p2pie[p2pielen++] = 200;
-       /*      2 seconds needed to be the P2P Client */
-       p2pie[p2pielen++] = 200;
-
-       if (status_code == P2P_STATUS_SUCCESS) {
-               if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) {
-                       /* The P2P Invitation request frame asks this
-                          Wi-Fi device to be the P2P GO */
-                       /* In this case, the P2P Invitation response
-                          frame should carry the two more P2P attributes. */
-                       /* First one is operating channel attribute. */
-                       /* Second one is P2P Group BSSID attribute. */
-
-                       /* Operating Channel */
-                       /* Type: */
-                       p2pie[p2pielen++] = P2P_ATTR_OPERATING_CH;
-
-                       /* Length: */
-                       *(u16*) (p2pie + p2pielen) = cpu_to_le16(0x0005);
-                       p2pielen += 2;
-
-                       /* Value: */
-                       /* Country String */
-                       p2pie[p2pielen++] = 'X';
-                       p2pie[p2pielen++] = 'X';
-
-                       /* The third byte should be set to 0x04. */
-                       /* Described in the "Operating Channel Attribute"
-                          section. */
-                       p2pie[p2pielen++] = 0x04;
-
-                       /* Operating Class */
-                       /*      Copy from SD7 */
-                       p2pie[p2pielen++] = 0x51;
-
-                       /* Channel Number */
-                       /*      operating channel number */
-                       p2pie[p2pielen++] = pwdinfo->operating_channel;
-
-                       /*      P2P Group BSSID */
-                       /*      Type: */
-                       p2pie[p2pielen++] = P2P_ATTR_GROUP_BSSID;
-
-                       /*      Length: */
-                       *(u16*) (p2pie + p2pielen) = cpu_to_le16(ETH_ALEN);
-                       p2pielen += 2;
-
-                       /*      Value: */
-                       /*      P2P Device Address for GO */
-                       memcpy(p2pie + p2pielen, myid(&padapter->eeprompriv),
-                              ETH_ALEN);
-                       p2pielen += ETH_ALEN;
-               }
-
-               /*      Channel List */
-               /*      Type: */
-               p2pie[p2pielen++] = P2P_ATTR_CH_LIST;
-
-               /*      Length: */
-               /*  Country String(3) */
-               /*  + (Operating Class (1) + Number of Channels(1)) *
-                   Operation Classes (?) */
-               /*  + number of channels in all classes */
-               len_channellist_attr = 3 +
-                       (1 + 1) * (u16)pmlmeext->channel_list.reg_classes +
-                       get_reg_classes_full_count(pmlmeext->channel_list);
-
-               *(u16*) (p2pie + p2pielen) = cpu_to_le16(len_channellist_attr);
-               p2pielen += 2;
-
-               /*      Value: */
-               /*      Country String */
-               p2pie[p2pielen++] = 'X';
-               p2pie[p2pielen++] = 'X';
-
-               /* The third byte should be set to 0x04. */
-               /* Described in the "Operating Channel Attribute" section. */
-               p2pie[p2pielen++] = 0x04;
-
-               /*      Channel Entry List */
-               for (j = 0; j < pmlmeext->channel_list.reg_classes; j++) {
-                       /*      Operating Class */
-                       p2pie[p2pielen++] =
-                               pmlmeext->channel_list.reg_class[j].reg_class;
-
-                       /*      Number of Channels */
-                       p2pie[p2pielen++] =
-                               pmlmeext->channel_list.reg_class[j].channels;
-
-                       /*      Channel List */
-                       for (i = 0;
-                            i < pmlmeext->channel_list.reg_class[j].channels;
-                            i++) {
-                               p2pie[p2pielen++] = pmlmeext->channel_list.reg_class[j].channel[i];
-                       }
-               }
-       }
-
-       pframe = rtw_set_ie23a(pframe, WLAN_EID_VENDOR_SPECIFIC, p2pielen,
-                              (unsigned char *)p2pie, &pattrib->pktlen);
-
-#ifdef CONFIG_8723AU_P2P
-       wfdielen = build_invitation_resp_wfd_ie(pwdinfo, pframe);
-       pframe += wfdielen;
-       pattrib->pktlen += wfdielen;
-#endif /* CONFIG_8723AU_P2P */
-
-       pattrib->last_txcmdsz = pattrib->pktlen;
-
-       dump_mgntframe23a(padapter, pmgntframe);
-
-       return;
-}
-
-void issue_p2p_provision_request23a(struct rtw_adapter *padapter, u8 *pssid,
-                                   u8 ussidlen, u8 *pdev_raddr)
-{
-       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;
-       u8 wpsie[100] = { 0x00 };
-       u8 wpsielen = 0;
-       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;
-       unsigned short *fctrl;
-       struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
-       struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
-       struct wifidirect_info *pwdinfo = &padapter->wdinfo;
-
-       if ((pmgntframe = alloc_mgtxmitframe23a(pxmitpriv)) == NULL)
-               return;
-
-       DBG_8723A("[%s] In\n", __func__);
-       /* 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;
-
-       fctrl = &pwlanhdr->frame_control;
-       *fctrl = 0;
-
-       ether_addr_copy(pwlanhdr->addr1, pdev_raddr);
-       ether_addr_copy(pwlanhdr->addr2, myid(&padapter->eeprompriv));
-       ether_addr_copy(pwlanhdr->addr3, pdev_raddr);
-
-       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);
-
-       p2pielen = build_prov_disc_request_p2p_ie23a(pwdinfo, pframe, pssid,
-                                                    ussidlen, pdev_raddr);
-
-       pframe += p2pielen;
-       pattrib->pktlen += p2pielen;
-
-       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, WLAN_EID_VENDOR_SPECIFIC, 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);
-
-       return;
-}
-
-static u8 is_matched_in_profilelist(u8 *peermacaddr,
-                                   struct profile_info *profileinfo)
-{
-       u8 i, match_result = 0;
-
-       DBG_8723A("[%s] peermac = %.2X %.2X %.2X %.2X %.2X %.2X\n", __func__,
-                 peermacaddr[0], peermacaddr[1], peermacaddr[2],
-                 peermacaddr[3], peermacaddr[4], peermacaddr[5]);
-
-       for (i = 0; i < P2P_MAX_PERSISTENT_GROUP_NUM; i++, profileinfo++) {
-              DBG_8723A("[%s] profileinfo_mac = %.2X %.2X %.2X %.2X %.2X "
-                        "%.2X\n", __func__, profileinfo->peermac[0],
-                        profileinfo->peermac[1], profileinfo->peermac[2],
-                        profileinfo->peermac[3], profileinfo->peermac[4],
-                        profileinfo->peermac[5]);
-               if (ether_addr_equal(peermacaddr, profileinfo->peermac)) {
-                       match_result = 1;
-                       DBG_8723A("[%s] Match!\n", __func__);
-                       break;
-               }
-       }
-
-       return match_result;
-}
-
-void issue_probersp23a_p2p23a(struct rtw_adapter *padapter, unsigned char *da)
-{
-       struct xmit_frame *pmgntframe;
-       struct pkt_attrib *pattrib;
-       unsigned char *pframe;
-       struct ieee80211_hdr *pwlanhdr;
-       unsigned short *fctrl;
-       unsigned char *mac;
-       struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
-       struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
-       struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
-       u16 beacon_interval = 100;
-       u16 capInfo = 0;
-       struct wifidirect_info *pwdinfo = &padapter->wdinfo;
-       u8 wpsie[255] = { 0x00 };
-       u32 wpsielen = 0, p2pielen = 0;
-#ifdef CONFIG_8723AU_P2P
-       u32 wfdielen = 0;
-#endif /* CONFIG_8723AU_P2P */
-       struct cfg80211_wifidirect_info *pcfg80211_wdinfo =
-               &padapter->cfg80211_wdinfo;
-       struct ieee80211_channel *ieee_ch =
-               &pcfg80211_wdinfo->remain_on_ch_channel;
-       u8 listen_channel =
-               (u8)ieee80211_frequency_to_channel(ieee_ch->center_freq);
-
-       /* DBG_8723A("%s\n", __func__); */
-
-       if ((pmgntframe = alloc_mgtxmitframe23a(pxmitpriv)) == 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;
-
-       mac = myid(&padapter->eeprompriv);
-
-       fctrl = &pwlanhdr->frame_control;
-       *fctrl = 0;
-       ether_addr_copy(pwlanhdr->addr1, da);
-       ether_addr_copy(pwlanhdr->addr2, mac);
-
-       /*      Use the device address for BSSID field. */
-       ether_addr_copy(pwlanhdr->addr3, mac);
-
-       SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);
-       pmlmeext->mgnt_seq++;
-       SetFrameSubType(fctrl, WIFI_PROBERSP);
-
-       pattrib->hdrlen = sizeof(struct ieee80211_hdr_3addr);
-       pattrib->pktlen = pattrib->hdrlen;
-       pframe += pattrib->hdrlen;
-
-       /* timestamp will be inserted by hardware */
-       pframe += 8;
-       pattrib->pktlen += 8;
-
-       /*  beacon interval: 2 bytes */
-       memcpy(pframe, (unsigned char *) &beacon_interval, 2);
-       pframe += 2;
-       pattrib->pktlen += 2;
-
-       /*      capability info: 2 bytes */
-       /*      ESS and IBSS bits must be 0 (defined in the 3.1.2.1.1 of
-               WiFi Direct Spec) */
-       capInfo |= cap_ShortPremble;
-       capInfo |= cap_ShortSlot;
-
-       memcpy(pframe, (unsigned char *) &capInfo, 2);
-       pframe += 2;
-       pattrib->pktlen += 2;
-
-       /*  SSID */
-       pframe = rtw_set_ie23a(pframe, WLAN_EID_SSID, 7,
-                              pwdinfo->p2p_wildcard_ssid, &pattrib->pktlen);
-
-       /*  supported rates... */
-       /*      Use the OFDM rate in the P2P probe response frame.
-               (6(B), 9(B), 12, 18, 24, 36, 48, 54) */
-       pframe = rtw_set_ie23a(pframe, WLAN_EID_SUPP_RATES, 8,
-                              pwdinfo->support_rate, &pattrib->pktlen);
-
-       /*  DS parameter set */
-       if (wdev_to_priv(padapter->rtw_wdev)->p2p_enabled &&
-           listen_channel != 0) {
-               pframe = rtw_set_ie23a(pframe, WLAN_EID_DS_PARAMS, 1,
-                                      (unsigned char *) &listen_channel,
-                                      &pattrib->pktlen);
-       } else {
-               pframe = rtw_set_ie23a(pframe, WLAN_EID_DS_PARAMS, 1,
-                                      (unsigned char *)
-                                      &pwdinfo->listen_channel,
-                                      &pattrib->pktlen);
-       }
-
-       if (wdev_to_priv(padapter->rtw_wdev)->p2p_enabled) {
-               if (pmlmepriv->wps_probe_resp_ie &&
-                   pmlmepriv->p2p_probe_resp_ie) {
-                       /* WPS IE */
-                       memcpy(pframe, pmlmepriv->wps_probe_resp_ie,
-                              pmlmepriv->wps_probe_resp_ie_len);
-                       pattrib->pktlen += pmlmepriv->wps_probe_resp_ie_len;
-                       pframe += pmlmepriv->wps_probe_resp_ie_len;
-
-                       /* P2P IE */
-                       memcpy(pframe, pmlmepriv->p2p_probe_resp_ie,
-                              pmlmepriv->p2p_probe_resp_ie_len);
-                       pattrib->pktlen += pmlmepriv->p2p_probe_resp_ie_len;
-                       pframe += pmlmepriv->p2p_probe_resp_ie_len;
-               }
-       } else {
-
-               /*      Todo: WPS IE */
-               /*      Noted by Albert 20100907 */
-               /*      According to the WPS specification, all the WPS
-                       attribute is presented by Big Endian. */
-
-               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 */
-
-               /*      WiFi Simple Config State */
-               /*      Type: */
-               *(u16*) (wpsie + wpsielen) =
-                       cpu_to_be16(WPS_ATTR_SIMPLE_CONF_STATE);
-               wpsielen += 2;
-
-               /*      Length: */
-               *(u16*) (wpsie + wpsielen) = cpu_to_be16(0x0001);
-               wpsielen += 2;
-
-               /*      Value: */
-               wpsie[wpsielen++] = WPS_WSC_STATE_NOT_CONFIG;
-
-               /*      Response Type */
-               /*      Type: */
-               *(u16*) (wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_RESP_TYPE);
-               wpsielen += 2;
-
-               /*      Length: */
-               *(u16*) (wpsie + wpsielen) = cpu_to_be16(0x0001);
-               wpsielen += 2;
-
-               /*      Value: */
-               wpsie[wpsielen++] = WPS_RESPONSE_TYPE_8021X;
-
-               /*      UUID-E */
-               /*      Type: */
-               *(u16*) (wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_UUID_E);
-               wpsielen += 2;
-
-               /*      Length: */
-               *(u16*) (wpsie + wpsielen) = cpu_to_be16(0x0010);
-               wpsielen += 2;
-
-               /*      Value: */
-               memcpy(wpsie + wpsielen, myid(&padapter->eeprompriv), ETH_ALEN);
-               wpsielen += 0x10;
-
-               /*      Manufacturer */
-               /*      Type: */
-               *(u16*) (wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_MANUFACTURER);
-               wpsielen += 2;
-
-               /*      Length: */
-               *(u16*) (wpsie + wpsielen) = cpu_to_be16(0x0007);
-               wpsielen += 2;
-
-               /*      Value: */
-               memcpy(wpsie + wpsielen, "Realtek", 7);
-               wpsielen += 7;
-
-               /*      Model Name */
-               /*      Type: */
-               *(u16*) (wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_MODEL_NAME);
-               wpsielen += 2;
-
-               /*      Length: */
-               *(u16*) (wpsie + wpsielen) = cpu_to_be16(0x0006);
-               wpsielen += 2;
-
-               /*      Value: */
-               memcpy(wpsie + wpsielen, "8192CU", 6);
-               wpsielen += 6;
-
-               /*      Model Number */
-               /*      Type: */
-               *(u16*) (wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_MODEL_NUMBER);
-               wpsielen += 2;
-
-               /*      Length: */
-               *(u16*) (wpsie + wpsielen) = cpu_to_be16(0x0001);
-               wpsielen += 2;
-
-               /*      Value: */
-               wpsie[ wpsielen++ ] = 0x31;             /*      character 1 */
-
-               /*      Serial Number */
-               /*      Type: */
-               *(u16*) (wpsie + wpsielen) =
-                       cpu_to_be16(WPS_ATTR_SERIAL_NUMBER);
-               wpsielen += 2;
-
-               /*      Length: */
-               *(u16*) (wpsie + wpsielen) = cpu_to_be16(ETH_ALEN);
-               wpsielen += 2;
-
-               /*      Value: */
-               memcpy(wpsie + wpsielen, "123456", ETH_ALEN);
-               wpsielen += ETH_ALEN;
-
-               /*      Primary Device Type */
-               /*      Type: */
-               *(u16*) (wpsie + wpsielen) =
-                       cpu_to_be16(WPS_ATTR_PRIMARY_DEV_TYPE);
-               wpsielen += 2;
-
-               /*      Length: */
-               *(u16*) (wpsie + wpsielen) = cpu_to_be16(0x0008);
-               wpsielen += 2;
-
-               /*      Value: */
-               /*      Category ID */
-               *(u16*) (wpsie + wpsielen) =
-                       cpu_to_be16(WPS_PDT_CID_MULIT_MEDIA);
-               wpsielen += 2;
-
-               /*      OUI */
-               *(u32*) (wpsie + wpsielen) = cpu_to_be32(WPSOUI);
-               wpsielen += 4;
-
-               /*      Sub Category ID */
-               *(u16*) (wpsie + wpsielen) =
-                       cpu_to_be16(WPS_PDT_SCID_MEDIA_SERVER);
-               wpsielen += 2;
-
-               /*      Device Name */
-               /*      Type: */
-               *(u16*) (wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_DEVICE_NAME);
-               wpsielen += 2;
-
-               /*      Length: */
-               *(u16*) (wpsie + wpsielen) =
-                       cpu_to_be16(pwdinfo->device_name_len);
-               wpsielen += 2;
-
-               /*      Value: */
-               if (pwdinfo->device_name_len) {
-                       memcpy(wpsie + wpsielen, pwdinfo->device_name,
-                              pwdinfo->device_name_len);
-                       wpsielen += pwdinfo->device_name_len;
-               }
-
-               /*      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->supported_wps_cm);
-               wpsielen += 2;
-
-               pframe = rtw_set_ie23a(pframe, WLAN_EID_VENDOR_SPECIFIC,
-                                      wpsielen, (unsigned char *)wpsie,
-                                      &pattrib->pktlen);
-
-               p2pielen = build_probe_resp_p2p_ie23a(pwdinfo, pframe);
-               pframe += p2pielen;
-               pattrib->pktlen += p2pielen;
-       }
-
-#ifdef CONFIG_8723AU_P2P
-       if (pwdinfo->wfd_info->wfd_enable) {
-               wfdielen = build_probe_resp_wfd_ie(pwdinfo, pframe, 0);
-               pframe += wfdielen;
-               pattrib->pktlen += wfdielen;
-       } else if (pmlmepriv->wfd_probe_resp_ie &&
-                pmlmepriv->wfd_probe_resp_ie_len > 0) {
-               /* WFD IE */
-               memcpy(pframe, pmlmepriv->wfd_probe_resp_ie,
-                      pmlmepriv->wfd_probe_resp_ie_len);
-               pattrib->pktlen += pmlmepriv->wfd_probe_resp_ie_len;
-               pframe += pmlmepriv->wfd_probe_resp_ie_len;
-       }
-#endif /* CONFIG_8723AU_P2P */
-
-       pattrib->last_txcmdsz = pattrib->pktlen;
-
-       dump_mgntframe23a(padapter, pmgntframe);
-
-       return;
-}
-
-static int _issue23a_probereq_p2p(struct rtw_adapter *padapter, u8 *da,
-                                 int wait_ack)
-{
-       int ret = _FAIL;
-       struct xmit_frame *pmgntframe;
-       struct pkt_attrib *pattrib;
-       unsigned char *pframe;
-       struct ieee80211_hdr *pwlanhdr;
-       unsigned short *fctrl;
-       unsigned char *mac;
-       struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
-       struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
-       u8      bc_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
-       struct wifidirect_info  *pwdinfo = &padapter->wdinfo;
-       u8 wpsie[255] = {0x00}, p2pie[255] = {0x00};
-       u16 wpsielen = 0, p2pielen = 0;
-#ifdef CONFIG_8723AU_P2P
-       u32 wfdielen = 0;
-#endif /* CONFIG_8723AU_P2P */
-       struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
-
-       if ((pmgntframe = alloc_mgtxmitframe23a(pxmitpriv)) == NULL)
-               goto exit;
-
-       /* 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;
-
-       mac = myid(&padapter->eeprompriv);
-
-       fctrl = &pwlanhdr->frame_control;
-       *fctrl = 0;
-
-       if (da) {
-               ether_addr_copy(pwlanhdr->addr1, da);
-               ether_addr_copy(pwlanhdr->addr3, da);
-       } else {
-               if ((pwdinfo->p2p_info.scan_op_ch_only) ||
-                   (pwdinfo->rx_invitereq_info.scan_op_ch_only)) {
-                       /*      This two flags will be set when this is
-                               only the P2P client mode. */
-                       ether_addr_copy(pwlanhdr->addr1,
-                                       pwdinfo->p2p_peer_interface_addr);
-                       ether_addr_copy(pwlanhdr->addr3,
-                                       pwdinfo->p2p_peer_interface_addr);
-               } else {
-                       /*      broadcast probe request frame */
-                       ether_addr_copy(pwlanhdr->addr1, bc_addr);
-                       ether_addr_copy(pwlanhdr->addr3, bc_addr);
-               }
-       }
-       ether_addr_copy(pwlanhdr->addr2, mac);
-
-       SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);
-       pmlmeext->mgnt_seq++;
-       SetFrameSubType(pframe, WIFI_PROBEREQ);
-
-       pframe += sizeof (struct ieee80211_hdr_3addr);
-       pattrib->pktlen = sizeof (struct ieee80211_hdr_3addr);
-
-       if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_TX_PROVISION_DIS_REQ)) {
-               pframe = rtw_set_ie23a(pframe, WLAN_EID_SSID,
-                                   pwdinfo->tx_prov_disc_info.ssid.ssid_len,
-                                   pwdinfo->tx_prov_disc_info.ssid.ssid,
-                                   &pattrib->pktlen);
-       } else {
-               pframe = rtw_set_ie23a(pframe, WLAN_EID_SSID,
-                                      P2P_WILDCARD_SSID_LEN,
-                                      pwdinfo->p2p_wildcard_ssid,
-                                      &pattrib->pktlen);
-       }
-       /*      Use the OFDM rate in the P2P probe request frame.
-               (6(B), 9(B), 12(B), 24(B), 36, 48, 54) */
-       pframe = rtw_set_ie23a(pframe, WLAN_EID_SUPP_RATES, 8,
-                              pwdinfo->support_rate, &pattrib->pktlen);
-
-       if (wdev_to_priv(padapter->rtw_wdev)->p2p_enabled) {
-               if (pmlmepriv->wps_probe_req_ie &&
-                   pmlmepriv->p2p_probe_req_ie) {
-                       /* WPS IE */
-                       memcpy(pframe, pmlmepriv->wps_probe_req_ie,
-                              pmlmepriv->wps_probe_req_ie_len);
-                       pattrib->pktlen += pmlmepriv->wps_probe_req_ie_len;
-                       pframe += pmlmepriv->wps_probe_req_ie_len;
-
-                       /* P2P IE */
-                       memcpy(pframe, pmlmepriv->p2p_probe_req_ie,
-                              pmlmepriv->p2p_probe_req_ie_len);
-                       pattrib->pktlen += pmlmepriv->p2p_probe_req_ie_len;
-                       pframe += pmlmepriv->p2p_probe_req_ie_len;
-               }
-       } else {
-
-               /*      WPS IE */
-               /*      Noted by Albert 20110221 */
-               /*      According to the WPS specification, all the WPS
-                       attribute is presented by Big Endian. */
-
-               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 */
-
-               if (pmlmepriv->wps_probe_req_ie == NULL) {
-                       /*      UUID-E */
-                       /*      Type: */
-                       *(u16*) (wpsie + wpsielen) =
-                               cpu_to_be16(WPS_ATTR_UUID_E);
-                       wpsielen += 2;
-
-                       /*      Length: */
-                       *(u16*) (wpsie + wpsielen) = cpu_to_be16(0x0010);
-                       wpsielen += 2;
-
-                       /*      Value: */
-                       memcpy(wpsie + wpsielen, myid(&padapter->eeprompriv),
-                              ETH_ALEN);
-                       wpsielen += 0x10;
-
-                       /*      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->supported_wps_cm);
-                       wpsielen += 2;
-               }
-
-               /*      Device Name */
-               /*      Type: */
-               *(u16*) (wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_DEVICE_NAME);
-               wpsielen += 2;
-
-               /*      Length: */
-               *(u16*) (wpsie + wpsielen) =
-                       cpu_to_be16(pwdinfo->device_name_len);
-               wpsielen += 2;
-
-               /*      Value: */
-               memcpy(wpsie + wpsielen, pwdinfo->device_name,
-                      pwdinfo->device_name_len);
-               wpsielen += pwdinfo->device_name_len;
-
-               /*      Primary Device Type */
-               /*      Type: */
-               *(u16*) (wpsie + wpsielen) =
-                       cpu_to_be16(WPS_ATTR_PRIMARY_DEV_TYPE);
-               wpsielen += 2;
-
-               /*      Length: */
-               *(u16*) (wpsie + wpsielen) = cpu_to_be16(0x0008);
-               wpsielen += 2;
-
-               /*      Value: */
-               /*      Category ID */
-               *(u16*) (wpsie + wpsielen) = cpu_to_be16(WPS_PDT_CID_RTK_WIDI);
-               wpsielen += 2;
-
-               /*      OUI */
-               *(u32*) (wpsie + wpsielen) = cpu_to_be32(WPSOUI);
-               wpsielen += 4;
-
-               /*      Sub Category ID */
-               *(u16*) (wpsie + wpsielen) = cpu_to_be16(WPS_PDT_SCID_RTK_DMP);
-               wpsielen += 2;
-
-               /*      Device Password ID */
-               /*      Type: */
-               *(u16*) (wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_DEVICE_PWID);
-               wpsielen += 2;
-
-               /*      Length: */
-               *(u16*) (wpsie + wpsielen) = cpu_to_be16(0x0002);
-               wpsielen += 2;
-
-               /*      Value: */
-               /*      Registrar-specified */
-               *(u16*) (wpsie + wpsielen) =
-                       cpu_to_be16(WPS_DPID_REGISTRAR_SPEC);
-               wpsielen += 2;
-
-               pframe = rtw_set_ie23a(pframe, WLAN_EID_VENDOR_SPECIFIC,
-                                      wpsielen, (unsigned char *)wpsie,
-                                      &pattrib->pktlen);
-
-               /*      P2P OUI */
-               p2pielen = 0;
-               p2pie[p2pielen++] = 0x50;
-               p2pie[p2pielen++] = 0x6F;
-               p2pie[p2pielen++] = 0x9A;
-               p2pie[p2pielen++] = 0x09;       /*      WFA P2P v1.0 */
-
-               /*      Commented by Albert 20110221 */
-               /*      According to the P2P Specification, the probe request
-                       frame should contain 5 P2P attributes */
-               /*      1. P2P Capability */
-               /*      2. P2P Device ID if this probe request wants to
-                       find the specific P2P device */
-               /*      3. Listen Channel */
-               /*      4. Extended Listen Timing */
-               /*      5. Operating Channel if this WiFi is working as
-                       the group owner now */
-
-               /*      P2P Capability */
-               /*      Type: */
-               p2pie[p2pielen++] = P2P_ATTR_CAPABILITY;
-
-               /*      Length: */
-               *(u16*) (p2pie + p2pielen) = cpu_to_le16(0x0002);
-               p2pielen += 2;
-
-               /*      Value: */
-               /*      Device Capability Bitmap, 1 byte */
-               p2pie[p2pielen++] = DMP_P2P_DEVCAP_SUPPORT;
-
-               /*      Group Capability Bitmap, 1 byte */
-               if (pwdinfo->persistent_supported)
-                       p2pie[p2pielen++] = P2P_GRPCAP_PERSISTENT_GROUP |
-                               DMP_P2P_GRPCAP_SUPPORT;
-               else
-                       p2pie[p2pielen++] = DMP_P2P_GRPCAP_SUPPORT;
-
-               /*      Listen Channel */
-               /*      Type: */
-               p2pie[p2pielen++] = P2P_ATTR_LISTEN_CH;
-
-               /*      Length: */
-               *(u16*) (p2pie + p2pielen) = cpu_to_le16(0x0005);
-               p2pielen += 2;
-
-               /*      Value: */
-               /*      Country String */
-               p2pie[p2pielen++] = 'X';
-               p2pie[p2pielen++] = 'X';
-
-               /* The third byte should be set to 0x04. */
-               /* Described in the "Operating Channel Attribute" section. */
-               p2pie[p2pielen++] = 0x04;
-
-               /*      Operating Class */
-               p2pie[p2pielen++] = 0x51;       /*      Copy from SD7 */
-
-               /*      Channel Number */
-               /*      listen channel */
-               p2pie[p2pielen++] = pwdinfo->listen_channel;
-
-               /*      Extended Listen Timing */
-               /*      Type: */
-               p2pie[p2pielen++] = P2P_ATTR_EX_LISTEN_TIMING;
-
-               /*      Length: */
-               *(u16*) (p2pie + p2pielen) = cpu_to_le16(0x0004);
-               p2pielen += 2;
-
-               /*      Value: */
-               /*      Availability Period */
-               *(u16*) (p2pie + p2pielen) = cpu_to_le16(0xFFFF);
-               p2pielen += 2;
-
-               /*      Availability Interval */
-               *(u16*) (p2pie + p2pielen) = cpu_to_le16(0xFFFF);
-               p2pielen += 2;
-
-               if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) {
-                       /* Operating Channel (if this WiFi is working as
-                          the group owner now) */
-                       /* Type: */
-                       p2pie[p2pielen++] = P2P_ATTR_OPERATING_CH;
-
-                       /*      Length: */
-                       *(u16*) (p2pie + p2pielen) = cpu_to_le16(0x0005);
-                       p2pielen += 2;
-
-                       /*      Value: */
-                       /*      Country String */
-                       p2pie[p2pielen++] = 'X';
-                       p2pie[p2pielen++] = 'X';
-
-                       /* The third byte should be set to 0x04. */
-                       /* Described in the "Operating Channel Attribute"
-                          section. */
-                       p2pie[p2pielen++] = 0x04;
-
-                       /*      Operating Class */
-                       p2pie[p2pielen++] = 0x51;       /*      Copy from SD7 */
-
-                       /*      Channel Number */
-                       /*      operating channel number */
-                       p2pie[p2pielen++] = pwdinfo->operating_channel;
-               }
-
-               pframe = rtw_set_ie23a(pframe, WLAN_EID_VENDOR_SPECIFIC,
-                                      p2pielen, (unsigned char *)p2pie,
-                                      &pattrib->pktlen);
-
-               if (pmlmepriv->wps_probe_req_ie) {
-                       /* WPS IE */
-                       memcpy(pframe, pmlmepriv->wps_probe_req_ie,
-                              pmlmepriv->wps_probe_req_ie_len);
-                       pattrib->pktlen += pmlmepriv->wps_probe_req_ie_len;
-                       pframe += pmlmepriv->wps_probe_req_ie_len;
-               }
-       }
-
-#ifdef CONFIG_8723AU_P2P
-       if (pwdinfo->wfd_info->wfd_enable) {
-               wfdielen = build_probe_req_wfd_ie(pwdinfo, pframe);
-               pframe += wfdielen;
-               pattrib->pktlen += wfdielen;
-       } else if (pmlmepriv->wfd_probe_req_ie &&
-                  pmlmepriv->wfd_probe_req_ie_len>0) {
-               /* WFD IE */
-               memcpy(pframe, pmlmepriv->wfd_probe_req_ie,
-                      pmlmepriv->wfd_probe_req_ie_len);
-               pattrib->pktlen += pmlmepriv->wfd_probe_req_ie_len;
-               pframe += pmlmepriv->wfd_probe_req_ie_len;
-       }
-#endif /* CONFIG_8723AU_P2P */
-
-       pattrib->last_txcmdsz = pattrib->pktlen;
-
-       RT_TRACE(_module_rtl871x_mlme_c_, _drv_info_,
-                ("issuing probe_req, tx_len =%d\n", pattrib->last_txcmdsz));
-
-       if (wait_ack) {
-               ret = dump_mgntframe23a_and_wait_ack23a(padapter, pmgntframe);
-       } else {
-               dump_mgntframe23a(padapter, pmgntframe);
-               ret = _SUCCESS;
-       }
-
-exit:
-       return ret;
-}
-
-inline void issue23a_probereq_p2p(struct rtw_adapter *adapter, u8 *da)
-{
-       _issue23a_probereq_p2p(adapter, da, false);
-}
-
-int issue23a_probereq_p2p_ex(struct rtw_adapter *adapter, u8 *da,
-                            int try_cnt, int wait_ms)
-{
-       int ret;
-       int i = 0;
-       unsigned long start = jiffies;
-
-       do {
-               ret = _issue23a_probereq_p2p(adapter, da,
-                                            wait_ms > 0 ? true : false);
-
-               i++;
-
-               if (adapter->bDriverStopped || adapter->bSurpriseRemoved)
-                       break;
-
-               if (i < try_cnt && wait_ms > 0 && ret == _FAIL)
-                       msleep(wait_ms);
-
-       } while ((i < try_cnt) && ((ret == _FAIL) || (wait_ms == 0)));
+                       } else if ((frame_body[3] & BIT(3)) == BIT(3)) {
+                               tid = (frame_body[3] >> 4) & 0x0F;
 
-       if (ret != _FAIL) {
-               ret = _SUCCESS;
-               goto exit;
-       }
+                               preorder_ctrl =  &psta->recvreorder_ctrl[tid];
+                               preorder_ctrl->enable = false;
+                               preorder_ctrl->indicate_seq = 0xffff;
+                       }
 
-       if (try_cnt && wait_ms) {
-               if (da)
-                       DBG_8723A(FUNC_ADPT_FMT" to "MAC_FMT", ch:%u%s, %d/%d "
-                                 "in %u ms\n", FUNC_ADPT_ARG(adapter),
-                                 MAC_ARG(da), rtw_get_oper_ch23a(adapter),
-                                 ret == _SUCCESS?", acked":"", i, try_cnt,
-                                 jiffies_to_msecs(jiffies - start));
-               else
-                       DBG_8723A(FUNC_ADPT_FMT", ch:%u%s, %d/%d in %u ms\n",
-                                 FUNC_ADPT_ARG(adapter),
-                                 rtw_get_oper_ch23a(adapter),
-                                 ret == _SUCCESS?", acked":"", i, try_cnt,
-                                 jiffies_to_msecs(jiffies - start));
+                       DBG_8723A("%s(): DELBA: %x(%x)\n", __func__,
+                                 pmlmeinfo->agg_enable_bitmap, reason_code);
+                       /* todo: how to notify the host while receiving
+                          DELETE BA */
+                       break;
+               default:
+                       break;
+               }
        }
-exit:
-       return ret;
+       return _SUCCESS;
 }
 
-#endif /* CONFIG_8723AU_P2P */
-
 static s32 rtw_action_public_decache(struct recv_frame *recv_frame, s32 token)
 {
        struct rtw_adapter *adapter = recv_frame->adapter;
@@ -4543,15 +1995,6 @@ static unsigned int on_action_public23a_p2p(struct recv_frame *precv_frame)
        u8 *pframe = skb->data;
        u8 *frame_body;
        u8 dialogToken = 0;
-#ifdef CONFIG_8723AU_P2P
-       struct rtw_adapter *padapter = precv_frame->adapter;
-       struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
-       uint len = skb->len;
-       u8 *p2p_ie;
-       u32     p2p_ielen;
-       struct  wifidirect_info *pwdinfo = &padapter->wdinfo;
-       u8      result = P2P_STATUS_SUCCESS;
-#endif /* CONFIG_8723AU_P2P */
 
        frame_body = (unsigned char *)
                (pframe + sizeof(struct ieee80211_hdr_3addr));
@@ -4561,345 +2004,6 @@ static unsigned int on_action_public23a_p2p(struct recv_frame *precv_frame)
        if (rtw_action_public_decache(precv_frame, dialogToken) == _FAIL)
                return _FAIL;
 
-#ifdef CONFIG_8723AU_P2P
-       del_timer_sync(&pwdinfo->reset_ch_sitesurvey);
-       if (wdev_to_priv(padapter->rtw_wdev)->p2p_enabled) {
-               rtw_cfg80211_rx_p2p_action_public(padapter, pframe, len);
-       } else {
-               /*      Do nothing if the driver doesn't enable the P2P function. */
-               if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE) || rtw_p2p_chk_state(pwdinfo, P2P_STATE_IDLE))
-                       return _SUCCESS;
-
-               len -= sizeof(struct ieee80211_hdr_3addr);
-
-               switch (frame_body[ 6 ])/* OUI Subtype */
-               {
-                       case P2P_GO_NEGO_REQ:
-                               DBG_8723A("[%s] Got GO Nego Req Frame\n", __func__);
-                               memset(&pwdinfo->groupid_info, 0x00, sizeof(struct group_id_info));
-
-                               if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_RX_PROVISION_DIS_REQ))
-                               {
-                                       rtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo));
-                               }
-
-                               if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_FAIL))
-                               {
-                                       /*      Commented by Albert 20110526 */
-                                       /*      In this case, this means the previous nego fail doesn't be reset yet. */
-                                       del_timer_sync(&pwdinfo->restore_p2p_state_timer);
-                                       /*      Restore the previous p2p state */
-                                       rtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo));
-                                       DBG_8723A("[%s] Restore the previous p2p state to %d\n", __func__, rtw_p2p_state(pwdinfo));
-                               }
-
-                               /*      Commented by Kurt 20110902 */
-                               /* Add if statement to avoid receiving duplicate prov disc req. such that pre_p2p_state would be covered. */
-                               if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_ING))
-                                       rtw_p2p_set_pre_state(pwdinfo, rtw_p2p_state(pwdinfo));
-
-                               /*      Commented by Kurt 20120113 */
-                               /*      Get peer_dev_addr here if peer doesn't issue prov_disc frame. */
-                               if (is_zero_ether_addr(pwdinfo->rx_prov_disc_info.peerDevAddr))
-                                       ether_addr_copy(pwdinfo->rx_prov_disc_info.peerDevAddr, hdr->addr2);
-
-                               result = process_p2p_group_negotation_req23a(pwdinfo, frame_body, len);
-                               issue_p2p_GO_response(padapter, hdr->addr2,
-                                                     frame_body, len, result);
-
-                               /*      Commented by Albert 20110718 */
-                               /*      No matter negotiating or negotiation failure, the driver should set up the restore P2P state timer. */
-                               mod_timer(&pwdinfo->restore_p2p_state_timer,
-                                         jiffies + msecs_to_jiffies(5000));
-                               break;
-
-                       case P2P_GO_NEGO_RESP:
-                               DBG_8723A("[%s] Got GO Nego Resp Frame\n", __func__);
-
-                               if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_ING))
-                               {
-                                       /*      Commented by Albert 20110425 */
-                                       /*      The restore timer is enabled when issuing the nego request frame of rtw_p2p_connect function. */
-                                       del_timer_sync(&pwdinfo->restore_p2p_state_timer);
-                                       pwdinfo->nego_req_info.benable = false;
-                                       result = process_p2p_group_negotation_resp23a(pwdinfo, frame_body, len);
-                                       issue_p2p_GO_confirm(pwdinfo->padapter,
-                                                            hdr->addr2,
-                                                            result);
-                                       if (result == P2P_STATUS_SUCCESS) {
-                                               if (rtw_p2p_role(pwdinfo) ==
-                                                   P2P_ROLE_CLIENT) {
-                                                       pwdinfo->p2p_info.operation_ch[ 0 ] = pwdinfo->peer_operating_ch;
-                                                       pwdinfo->p2p_info.scan_op_ch_only = 1;
-                                                       mod_timer(&pwdinfo->reset_ch_sitesurvey2, jiffies + msecs_to_jiffies(P2P_RESET_SCAN_CH));
-                                               }
-                                       }
-
-                                       /*      Reset the dialog token for group negotiation frames. */
-                                       pwdinfo->negotiation_dialog_token = 1;
-
-                                       if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_FAIL))
-                                       {
-                                               mod_timer(&pwdinfo->restore_p2p_state_timer, jiffies + msecs_to_jiffies(5000));
-                                       }
-                               } else {
-                                       DBG_8723A("[%s] Skipped GO Nego Resp Frame (p2p_state != P2P_STATE_GONEGO_ING)\n", __func__);
-                               }
-
-                               break;
-
-                       case P2P_GO_NEGO_CONF:
-
-                               DBG_8723A("[%s] Got GO Nego Confirm Frame\n", __func__);
-                               result = process_p2p_group_negotation_confirm23a(pwdinfo, frame_body, len);
-                               if (P2P_STATUS_SUCCESS == result)
-                               {
-                                       if (rtw_p2p_role(pwdinfo) == P2P_ROLE_CLIENT)
-                                       {
-                                               pwdinfo->p2p_info.operation_ch[ 0 ] = pwdinfo->peer_operating_ch;
-                                               pwdinfo->p2p_info.scan_op_ch_only = 1;
-                                               mod_timer(&pwdinfo->reset_ch_sitesurvey2, jiffies + msecs_to_jiffies(P2P_RESET_SCAN_CH));
-                                       }
-                               }
-                               break;
-
-                       case P2P_INVIT_REQ:
-                               /*      Added by Albert 2010/10/05 */
-                               /*      Received the P2P Invite Request frame. */
-
-                               DBG_8723A("[%s] Got invite request frame!\n", __func__);
-                               if ((p2p_ie = rtw_get_p2p_ie23a(frame_body + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, NULL, &p2p_ielen)))
-                               {
-                                       /*      Parse the necessary information from the P2P Invitation Request frame. */
-                                       /*      For example: The MAC address of sending this P2P Invitation Request frame. */
-                                       u32     attr_contentlen = 0;
-                                       u8      status_code = P2P_STATUS_FAIL_INFO_UNAVAILABLE;
-                                       struct group_id_info group_id;
-                                       u8      invitation_flag = 0;
-
-                                       rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen, P2P_ATTR_INVITATION_FLAGS, &invitation_flag, &attr_contentlen);
-                                       if (attr_contentlen)
-                                       {
-
-                                               rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen, P2P_ATTR_GROUP_BSSID, pwdinfo->p2p_peer_interface_addr, &attr_contentlen);
-                                               /*      Commented by Albert 20120510 */
-                                               /*      Copy to the pwdinfo->p2p_peer_interface_addr. */
-                                               /*      So that the WFD UI (or Sigma) can get the peer interface address by using the following command. */
-                                               /*      #> iwpriv wlan0 p2p_get peer_ifa */
-                                               /*      After having the peer interface address, the sigma can find the correct conf file for wpa_supplicant. */
-
-                                               if (attr_contentlen)
-                                               {
-                                                       DBG_8723A("[%s] GO's BSSID = %.2X %.2X %.2X %.2X %.2X %.2X\n", __func__,
-                                                                       pwdinfo->p2p_peer_interface_addr[0], pwdinfo->p2p_peer_interface_addr[1],
-                                                                       pwdinfo->p2p_peer_interface_addr[2], pwdinfo->p2p_peer_interface_addr[3],
-                                                                       pwdinfo->p2p_peer_interface_addr[4], pwdinfo->p2p_peer_interface_addr[5]);
-                                               }
-
-                                               if (invitation_flag & P2P_INVITATION_FLAGS_PERSISTENT)
-                                               {
-                                                       /*      Re-invoke the persistent group. */
-
-                                                       memset(&group_id, 0x00, sizeof(struct group_id_info));
-                                                       rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen, P2P_ATTR_GROUP_ID, (u8*) &group_id, &attr_contentlen);
-                                                       if (attr_contentlen) {
-                                                               if (ether_addr_equal(group_id.go_device_addr, myid(&padapter->eeprompriv))) {
-                                                                       /*      The p2p device sending this p2p invitation request wants this Wi-Fi device to be the persistent GO. */
-                                                                       rtw_p2p_set_state(pwdinfo, P2P_STATE_RECV_INVITE_REQ_GO);
-                                                                       rtw_p2p_set_role(pwdinfo, P2P_ROLE_GO);
-                                                                       status_code = P2P_STATUS_SUCCESS;
-                                                               }
-                                                               else
-                                                               {
-                                                                       /*      The p2p device sending this p2p invitation request wants to be the persistent GO. */
-                                                                       if (is_matched_in_profilelist(pwdinfo->p2p_peer_interface_addr, &pwdinfo->profileinfo[ 0 ]))
-                                                                       {
-                                                                               u8 operatingch_info[5] = { 0x00 };
-                                                                               if (rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, operatingch_info, &attr_contentlen))
-                                                                               {
-                                                                                       if (rtw_ch_set_search_ch23a(padapter->mlmeextpriv.channel_set, (u32)operatingch_info[4]))
-                                                                                       {
-                                                                                               /*      The operating channel is acceptable for this device. */
-                                                                                               pwdinfo->rx_invitereq_info.operation_ch[0]= operatingch_info[4];
-                                                                                               pwdinfo->rx_invitereq_info.scan_op_ch_only = 1;
-                                                                                               mod_timer(&pwdinfo->reset_ch_sitesurvey, jiffies + msecs_to_jiffies(P2P_RESET_SCAN_CH));
-                                                                                               rtw_p2p_set_state(pwdinfo, P2P_STATE_RECV_INVITE_REQ_MATCH);
-                                                                                               rtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT);
-                                                                                               status_code = P2P_STATUS_SUCCESS;
-                                                                                               }
-                                                                                       else
-                                                                                       {
-                                                                                               /*      The operating channel isn't supported by this device. */
-                                                                                               rtw_p2p_set_state(pwdinfo, P2P_STATE_RECV_INVITE_REQ_DISMATCH);
-                                                                                               rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE);
-                                                                                               status_code = P2P_STATUS_FAIL_NO_COMMON_CH;
-                                                                                               mod_timer(&pwdinfo->restore_p2p_state_timer, jiffies + msecs_to_jiffies(3000));
-                                                                                       }
-                                                                               }
-                                                                               else {
-                                                                                       /*      Commented by Albert 20121130 */
-                                                                                       /*      Intel will use the different P2P IE to store the operating channel information */
-                                                                                       /*      Workaround for Intel WiDi 3.5 */
-                                                                                       rtw_p2p_set_state(pwdinfo, P2P_STATE_RECV_INVITE_REQ_MATCH);
-                                                                                       rtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT);
-                                                                                       status_code = P2P_STATUS_SUCCESS;
-                                                                               }
-                                                                       }
-                                                                       else
-                                                                       {
-                                                                               rtw_p2p_set_state(pwdinfo, P2P_STATE_RECV_INVITE_REQ_DISMATCH);
-
-                                                                               status_code = P2P_STATUS_FAIL_UNKNOWN_P2PGROUP;
-                                                                       }
-                                                               }
-                                                       }
-                                                       else
-                                                       {
-                                                               DBG_8723A("[%s] P2P Group ID Attribute NOT FOUND!\n", __func__);
-                                                               status_code = P2P_STATUS_FAIL_INFO_UNAVAILABLE;
-                                                       }
-                                               }
-                                               else
-                                               {
-                                                       /*      Received the invitation to join a P2P group. */
-
-                                                       memset(&group_id, 0x00, sizeof(struct group_id_info));
-                                                       rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen, P2P_ATTR_GROUP_ID, (u8*) &group_id, &attr_contentlen);
-                                                       if (attr_contentlen)
-                                                       {
-                                                               if (ether_addr_equal(group_id.go_device_addr, myid(&padapter->eeprompriv))) {
-                                                                       /*      In this case, the GO can't be myself. */
-                                                                       rtw_p2p_set_state(pwdinfo, P2P_STATE_RECV_INVITE_REQ_DISMATCH);
-                                                                       status_code = P2P_STATUS_FAIL_INFO_UNAVAILABLE;
-                                                               }
-                                                               else
-                                                               {
-                                                                       /*      The p2p device sending this p2p invitation request wants to join an existing P2P group */
-                                                                       /*      Commented by Albert 2012/06/28 */
-                                                                       /*      In this case, this Wi-Fi device should use the iwpriv command to get the peer device address. */
-                                                                       /*      The peer device address should be the destination address for the provisioning discovery request. */
-                                                                       /*      Then, this Wi-Fi device should use the iwpriv command to get the peer interface address. */
-                                                                       /*      The peer interface address should be the address for WPS mac address */
-                                                                       ether_addr_copy(pwdinfo->p2p_peer_device_addr, group_id.go_device_addr);
-                                                                       rtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT);
-                                                                       rtw_p2p_set_state(pwdinfo, P2P_STATE_RECV_INVITE_REQ_JOIN);
-                                                                       status_code = P2P_STATUS_SUCCESS;
-                                                               }
-                                                       }
-                                                       else
-                                                       {
-                                                               DBG_8723A("[%s] P2P Group ID Attribute NOT FOUND!\n", __func__);
-                                                               status_code = P2P_STATUS_FAIL_INFO_UNAVAILABLE;
-                                                       }
-                                               }
-                                       }
-                                       else
-                                       {
-                                               DBG_8723A("[%s] P2P Invitation Flags Attribute NOT FOUND!\n", __func__);
-                                               status_code = P2P_STATUS_FAIL_INFO_UNAVAILABLE;
-                                       }
-
-                                       DBG_8723A("[%s] status_code = %d\n", __func__, status_code);
-
-                                       pwdinfo->inviteresp_info.token = frame_body[ 7 ];
-                                       issue_p2p_invitation_response23a(padapter, hdr->addr2, pwdinfo->inviteresp_info.token, status_code);
-                               }
-                               break;
-
-                       case P2P_INVIT_RESP:
-                       {
-                               u8      attr_content = 0x00;
-                               u32     attr_contentlen = 0;
-
-                               DBG_8723A("[%s] Got invite response frame!\n", __func__);
-                               del_timer_sync(&pwdinfo->restore_p2p_state_timer);
-                               if ((p2p_ie = rtw_get_p2p_ie23a(frame_body + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, NULL, &p2p_ielen)))
-                               {
-                                       rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen, P2P_ATTR_STATUS, &attr_content, &attr_contentlen);
-
-                                       if (attr_contentlen == 1)
-                                       {
-                                               DBG_8723A("[%s] Status = %d\n", __func__, attr_content);
-                                               pwdinfo->invitereq_info.benable = false;
-
-                                               if (attr_content == P2P_STATUS_SUCCESS)
-                                               {
-                                                       if (ether_addr_equal(pwdinfo->invitereq_info.go_bssid, myid(&padapter->eeprompriv))) {
-                                                               rtw_p2p_set_role(pwdinfo, P2P_ROLE_GO);
-                                                       }
-                                                       else
-                                                       {
-                                                               rtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT);
-                                                       }
-                                                       rtw_p2p_set_state(pwdinfo, P2P_STATE_RX_INVITE_RESP_OK);
-                                               }
-                                               else
-                                               {
-                                                       rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE);
-                                                       rtw_p2p_set_state(pwdinfo, P2P_STATE_RX_INVITE_RESP_FAIL);
-                                               }
-                                       }
-                                       else
-                                       {
-                                               rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE);
-                                               rtw_p2p_set_state(pwdinfo, P2P_STATE_RX_INVITE_RESP_FAIL);
-                                       }
-                               }
-                               else
-                               {
-                                       rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE);
-                                       rtw_p2p_set_state(pwdinfo, P2P_STATE_RX_INVITE_RESP_FAIL);
-                               }
-
-                               if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_RX_INVITE_RESP_FAIL)) {
-                                       mod_timer(&pwdinfo->restore_p2p_state_timer, jiffies + msecs_to_jiffies(5000));
-                               }
-                               break;
-                       }
-                       case P2P_DEVDISC_REQ:
-
-                               process_p2p_devdisc_req23a(pwdinfo, pframe, len);
-
-                               break;
-
-                       case P2P_DEVDISC_RESP:
-
-                               process_p2p_devdisc_resp23a(pwdinfo, pframe, len);
-
-                               break;
-
-                       case P2P_PROVISION_DISC_REQ:
-                               DBG_8723A("[%s] Got Provisioning Discovery Request Frame\n", __func__);
-                               process_p2p_provdisc_req23a(pwdinfo, pframe, len);
-                               ether_addr_copy(pwdinfo->rx_prov_disc_info.peerDevAddr, hdr->addr2);
-
-                               /* 20110902 Kurt */
-                               /* Add the following statement to avoid receiving duplicate prov disc req. such that pre_p2p_state would be covered. */
-                               if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_RX_PROVISION_DIS_REQ))
-                                       rtw_p2p_set_pre_state(pwdinfo, rtw_p2p_state(pwdinfo));
-
-                               rtw_p2p_set_state(pwdinfo, P2P_STATE_RX_PROVISION_DIS_REQ);
-                               mod_timer(&pwdinfo->restore_p2p_state_timer,
-                                         jiffies + msecs_to_jiffies(P2P_PROVISION_TIMEOUT));
-                               break;
-
-                       case P2P_PROVISION_DISC_RESP:
-                               /*      Commented by Albert 20110707 */
-                               /*      Should we check the pwdinfo->tx_prov_disc_info.bsent flag here?? */
-                               DBG_8723A("[%s] Got Provisioning Discovery Response Frame\n", __func__);
-                               /*      Commented by Albert 20110426 */
-                               /*      The restore timer is enabled when issuing the provisioing request frame in rtw_p2p_prov_disc function. */
-                               del_timer_sync(&pwdinfo->restore_p2p_state_timer);
-                               rtw_p2p_set_state(pwdinfo, P2P_STATE_RX_PROVISION_DIS_RSP);
-                               process_p2p_provdisc_resp23a(pwdinfo, pframe);
-                               mod_timer(&pwdinfo->restore_p2p_state_timer,
-                                         jiffies + msecs_to_jiffies(P2P_PROVISION_TIMEOUT));
-                               break;
-
-               }
-       }
-#endif /* CONFIG_8723AU_P2P */
-
        return _SUCCESS;
 }
 
@@ -4992,60 +2096,6 @@ unsigned int OnAction23a_wmm(struct rtw_adapter *padapter,
 unsigned int OnAction23a_p2p(struct rtw_adapter *padapter,
                             struct recv_frame *precv_frame)
 {
-#ifdef CONFIG_8723AU_P2P
-       u8 *frame_body;
-       u8 category, OUI_Subtype, dialogToken = 0;
-       struct sk_buff *skb = precv_frame->pkt;
-       struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
-       u8 *pframe = skb->data;
-       uint len = skb->len;
-       struct wifidirect_info *pwdinfo = &padapter->wdinfo;
-
-       DBG_8723A("%s\n", __func__);
-
-       /* check RA matches or not */
-       if (!ether_addr_equal(myid(&padapter->eeprompriv), hdr->addr1))
-               return _SUCCESS;
-
-       frame_body = (unsigned char *)
-               (pframe + sizeof(struct ieee80211_hdr_3addr));
-
-       category = frame_body[0];
-       if (category != WLAN_CATEGORY_VENDOR_SPECIFIC)
-               return _SUCCESS;
-
-       if (cpu_to_be32(*((u32*) (frame_body + 1))) != P2POUI)
-               return _SUCCESS;
-
-       if (wdev_to_priv(padapter->rtw_wdev)->p2p_enabled) {
-               rtw_cfg80211_rx_action_p2p(padapter, pframe, len);
-               return _SUCCESS;
-       } else {
-               len -= sizeof(struct ieee80211_hdr_3addr);
-               OUI_Subtype = frame_body[5];
-               dialogToken = frame_body[6];
-
-               switch (OUI_Subtype)
-               {
-               case P2P_NOTICE_OF_ABSENCE:
-                       break;
-
-               case P2P_PRESENCE_REQUEST:
-                       process_p2p_presence_req23a(pwdinfo, pframe, len);
-                       break;
-
-               case P2P_PRESENCE_RESPONSE:
-                       break;
-
-               case P2P_GO_DISC_REQUEST:
-                       break;
-
-               default:
-                       break;
-               }
-       }
-#endif /* CONFIG_8723AU_P2P */
-
        return _SUCCESS;
 }
 
@@ -5275,9 +2325,6 @@ void issue_beacon23a(struct rtw_adapter *padapter, int timeout_ms)
        struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info;
        struct wlan_bssid_ex *cur_network = &pmlmeinfo->network;
        u8 bc_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
-#ifdef CONFIG_8723AU_P2P
-       struct wifidirect_info *pwdinfo = &padapter->wdinfo;
-#endif /* CONFIG_8723AU_P2P */
        u8 *wps_ie;
        u32 wps_ielen;
        u8 sr = 0;
@@ -5319,119 +2366,7 @@ void issue_beacon23a(struct rtw_adapter *padapter, int timeout_ms)
 
        if ((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE) {
                /* DBG_8723A("ie len =%d\n", cur_network->IELength); */
-#ifdef CONFIG_8723AU_P2P
-               /*  for P2P : Primary Device Type & Device Name */
-               u32 insert_len = 0;
-               wps_ie = rtw_get_wps_ie23a(cur_network->IEs + _FIXED_IE_LENGTH_,
-                                          cur_network->IELength -
-                                          _FIXED_IE_LENGTH_, NULL, &wps_ielen);
-
-               if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO) && wps_ie &&
-                   wps_ielen > 0) {
-                       uint wps_offset, remainder_ielen;
-                       u8 *premainder_ie, *pframe_wscie;
-
-                       wps_offset = (uint)(wps_ie - cur_network->IEs);
-
-                       premainder_ie = wps_ie + wps_ielen;
-
-                       remainder_ielen = cur_network->IELength - wps_offset -
-                               wps_ielen;
-
-                       if (wdev_to_priv(padapter->rtw_wdev)->p2p_enabled) {
-                               if (pmlmepriv->wps_beacon_ie &&
-                                   pmlmepriv->wps_beacon_ie_len>0) {
-                                       memcpy(pframe, cur_network->IEs,
-                                              wps_offset);
-                                       pframe += wps_offset;
-                                       pattrib->pktlen += wps_offset;
-
-                                       memcpy(pframe, pmlmepriv->wps_beacon_ie,
-                                              pmlmepriv->wps_beacon_ie_len);
-                                       pframe += pmlmepriv->wps_beacon_ie_len;
-                                       pattrib->pktlen +=
-                                               pmlmepriv->wps_beacon_ie_len;
-
-                                       /* copy remainder_ie to pframe */
-                                       memcpy(pframe, premainder_ie,
-                                              remainder_ielen);
-                                       pframe += remainder_ielen;
-                                       pattrib->pktlen += remainder_ielen;
-                               } else {
-                                       memcpy(pframe, cur_network->IEs,
-                                              cur_network->IELength);
-                                       pframe += cur_network->IELength;
-                                       pattrib->pktlen +=
-                                               cur_network->IELength;
-                               }
-                       } else {
-                               pframe_wscie = pframe + wps_offset;
-                               memcpy(pframe, cur_network->IEs,
-                                      wps_offset + wps_ielen);
-                               pframe += (wps_offset + wps_ielen);
-                               pattrib->pktlen += (wps_offset + wps_ielen);
-
-                               /* now pframe is end of wsc ie, insert Primary
-                                  Device Type & Device Name */
-                               /*      Primary Device Type */
-                               /*      Type: */
-                               *(u16*) (pframe + insert_len) =
-                                       cpu_to_be16(WPS_ATTR_PRIMARY_DEV_TYPE);
-                               insert_len += 2;
-
-                               /*      Length: */
-                               *(u16*) (pframe + insert_len) =
-                                       cpu_to_be16(0x0008);
-                               insert_len += 2;
-
-                               /*      Value: */
-                               /*      Category ID */
-                               *(u16*) (pframe + insert_len) =
-                                       cpu_to_be16(WPS_PDT_CID_MULIT_MEDIA);
-                               insert_len += 2;
-
-                               /*      OUI */
-                               *(u32*) (pframe + insert_len) =
-                                       cpu_to_be32(WPSOUI);
-                               insert_len += 4;
-
-                               /*      Sub Category ID */
-                               *(u16*) (pframe + insert_len) =
-                                       cpu_to_be16(WPS_PDT_SCID_MEDIA_SERVER);
-                               insert_len += 2;
-
-                               /*      Device Name */
-                               /*      Type: */
-                               *(u16*) (pframe + insert_len) =
-                                       cpu_to_be16(WPS_ATTR_DEVICE_NAME);
-                               insert_len += 2;
-
-                               /*      Length: */
-                               *(u16*) (pframe + insert_len) =
-                                       cpu_to_be16(pwdinfo->device_name_len);
-                               insert_len += 2;
-
-                               /*      Value: */
-                               memcpy(pframe + insert_len,
-                                      pwdinfo->device_name,
-                                      pwdinfo->device_name_len);
-                               insert_len += pwdinfo->device_name_len;
-
-                               /* update wsc ie length */
-                               *(pframe_wscie+1) = (wps_ielen -2) + insert_len;
-
-                               /* pframe move to end */
-                               pframe+= insert_len;
-                               pattrib->pktlen += insert_len;
-
-                               /* copy remainder_ie to pframe */
-                               memcpy(pframe, premainder_ie, remainder_ielen);
-                               pframe += remainder_ielen;
-                               pattrib->pktlen += remainder_ielen;
-                       }
-               } else
-#endif /* CONFIG_8723AU_P2P */
-                       memcpy(pframe, cur_network->IEs, cur_network->IELength);
+               memcpy(pframe, cur_network->IEs, cur_network->IELength);
                len_diff = update_hidden_ssid(pframe + _BEACON_IE_OFFSET_,
                                              cur_network->IELength -
                                              _BEACON_IE_OFFSET_,
@@ -5455,36 +2390,6 @@ void issue_beacon23a(struct rtw_adapter *padapter, int timeout_ms)
                else
                        _clr_fwstate_(pmlmepriv, WIFI_UNDER_WPS);
 
-#ifdef CONFIG_8723AU_P2P
-               if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) {
-                       u32 len;
-                       if (wdev_to_priv(padapter->rtw_wdev)->p2p_enabled) {
-                               len = pmlmepriv->p2p_beacon_ie_len;
-                               if (pmlmepriv->p2p_beacon_ie && len > 0)
-                                       memcpy(pframe,
-                                              pmlmepriv->p2p_beacon_ie, len);
-                       } else
-                               len = build_beacon_p2p_ie23a(pwdinfo, pframe);
-
-                       pframe += len;
-                       pattrib->pktlen += len;
-
-                       if (true == pwdinfo->wfd_info->wfd_enable) {
-                               len = build_beacon_wfd_ie(pwdinfo, pframe);
-                       } else {
-                               len = 0;
-                               if (pmlmepriv->wfd_beacon_ie &&
-                                   pmlmepriv->wfd_beacon_ie_len>0) {
-                                       len = pmlmepriv->wfd_beacon_ie_len;
-                                       memcpy(pframe,
-                                              pmlmepriv->wfd_beacon_ie, len);
-                               }
-                       }
-                       pframe += len;
-                       pattrib->pktlen += len;
-               }
-#endif /* CONFIG_8723AU_P2P */
-
                goto _issue_bcn;
        }
 
@@ -5591,17 +2496,12 @@ void issue_probersp23a(struct rtw_adapter *padapter, unsigned char *da,
        int ssid_ielen_diff;
        u8 buf[MAX_IE_SZ];
        u8 *ies;
-#endif
-#if defined(CONFIG_8723AU_AP_MODE) || defined(CONFIG_8723AU_P2P)
        struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
 #endif
        struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
        struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info;
        struct wlan_bssid_ex *cur_network = &pmlmeinfo->network;
        unsigned int rate_len;
-#ifdef CONFIG_8723AU_P2P
-       struct wifidirect_info *pwdinfo = &padapter->wdinfo;
-#endif /* CONFIG_8723AU_P2P */
 
        /* DBG_8723A("%s\n", __func__); */
 
@@ -5788,38 +2688,6 @@ void issue_probersp23a(struct rtw_adapter *padapter, unsigned char *da,
                /* todo:HT for adhoc */
        }
 
-#ifdef CONFIG_8723AU_P2P
-       if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO) && is_valid_p2p_probereq) {
-               u32 len;
-               if (wdev_to_priv(padapter->rtw_wdev)->p2p_enabled) {
-                       /* if pwdinfo->role == P2P_ROLE_DEVICE will call
-                          issue_probersp23a_p2p23a() */
-                       len = pmlmepriv->p2p_go_probe_resp_ie_len;
-                       if (pmlmepriv->p2p_go_probe_resp_ie && len>0)
-                               memcpy(pframe, pmlmepriv->p2p_go_probe_resp_ie,
-                                      len);
-               } else
-                       len = build_probe_resp_p2p_ie23a(pwdinfo, pframe);
-
-               pframe += len;
-               pattrib->pktlen += len;
-
-               if (true == pwdinfo->wfd_info->wfd_enable) {
-                       len = build_probe_resp_wfd_ie(pwdinfo, pframe, 0);
-               } else {
-                       len = 0;
-                       if (pmlmepriv->wfd_probe_resp_ie &&
-                           pmlmepriv->wfd_probe_resp_ie_len > 0) {
-                               len = pmlmepriv->wfd_probe_resp_ie_len;
-                               memcpy(pframe, pmlmepriv->wfd_probe_resp_ie,
-                                      len);
-                       }
-               }
-               pframe += len;
-               pattrib->pktlen += len;
-       }
-#endif /* CONFIG_8723AU_P2P */
-
        pattrib->last_txcmdsz = pattrib->pktlen;
 
        dump_mgntframe23a(padapter, pmgntframe);
@@ -6154,10 +3022,6 @@ void issue_asocrsp23a(struct rtw_adapter *padapter, unsigned short status,
        struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info;
        struct wlan_bssid_ex *pnetwork = &pmlmeinfo->network;
        u8 *ie = pnetwork->IEs;
-#ifdef CONFIG_8723AU_P2P
-       struct wifidirect_info *pwdinfo = &padapter->wdinfo;
-       u32 wfdielen = 0;
-#endif /* CONFIG_8723AU_P2P */
 
        DBG_8723A("%s\n", __func__);
 
@@ -6282,15 +3146,6 @@ void issue_asocrsp23a(struct rtw_adapter *padapter, unsigned short status,
                pattrib->pktlen += pmlmepriv->wps_assoc_resp_ie_len;
        }
 
-#ifdef CONFIG_8723AU_P2P
-       if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO) &&
-           pwdinfo->wfd_info->wfd_enable) {
-               wfdielen = build_assoc_resp_wfd_ie(pwdinfo, pframe);
-               pframe += wfdielen;
-               pattrib->pktlen += wfdielen;
-       }
-#endif /* CONFIG_8723AU_P2P */
-
        pattrib->last_txcmdsz = pattrib->pktlen;
 
        dump_mgntframe23a(padapter, pmgntframe);
@@ -6315,12 +3170,6 @@ void issue_assocreq23a(struct rtw_adapter *padapter)
        struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
        struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info;
        int bssrate_len = 0, sta_bssrate_len = 0;
-#ifdef CONFIG_8723AU_P2P
-       struct wifidirect_info *pwdinfo = &padapter->wdinfo;
-       u8 p2pie[255] = { 0x00 };
-       u16 p2pielen = 0;
-       u32 wfdielen = 0;
-#endif /* CONFIG_8723AU_P2P */
 
        if ((pmgntframe = alloc_mgtxmitframe23a(pxmitpriv)) == NULL)
                goto exit;
@@ -6554,191 +3403,6 @@ void issue_assocreq23a(struct rtw_adapter *padapter)
                pframe = rtw_set_ie23a(pframe, WLAN_EID_VENDOR_SPECIFIC, 6,
                                       REALTEK_96B_IE23A, &pattrib->pktlen);
 
-#ifdef CONFIG_8723AU_P2P
-
-       if (wdev_to_priv(padapter->rtw_wdev)->p2p_enabled) {
-               if (pmlmepriv->p2p_assoc_req_ie &&
-                   pmlmepriv->p2p_assoc_req_ie_len>0) {
-                       memcpy(pframe, pmlmepriv->p2p_assoc_req_ie,
-                              pmlmepriv->p2p_assoc_req_ie_len);
-                       pframe += pmlmepriv->p2p_assoc_req_ie_len;
-                       pattrib->pktlen += pmlmepriv->p2p_assoc_req_ie_len;
-               }
-       } else {
-               if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE) &&
-                   !rtw_p2p_chk_state(pwdinfo, P2P_STATE_IDLE)) {
-                       /*      Should add the P2P IE in the association
-                               request frame. */
-                       /*      P2P OUI */
-
-                       p2pielen = 0;
-                       p2pie[p2pielen++] = 0x50;
-                       p2pie[p2pielen++] = 0x6F;
-                       p2pie[p2pielen++] = 0x9A;
-                       p2pie[p2pielen++] = 0x09;       /*      WFA P2P v1.0 */
-
-                       /*      Commented by Albert 20101109 */
-                       /*      According to the P2P Specification, the
-                               association request frame should contain
-                               3 P2P attributes */
-                       /*      1. P2P Capability */
-                       /*      2. Extended Listen Timing */
-                       /*      3. Device Info */
-                       /*      Commented by Albert 20110516 */
-                       /*      4. P2P Interface */
-
-                       /*      P2P Capability */
-                       /*      Type: */
-                       p2pie[p2pielen++] = P2P_ATTR_CAPABILITY;
-
-                       /*      Length: */
-                       *(u16*) (p2pie + p2pielen) = cpu_to_le16(0x0002);
-                       p2pielen += 2;
-
-                       /*      Value: */
-                       /*      Device Capability Bitmap, 1 byte */
-                       p2pie[p2pielen++] = DMP_P2P_DEVCAP_SUPPORT;
-
-                       /*      Group Capability Bitmap, 1 byte */
-                       if (pwdinfo->persistent_supported)
-                               p2pie[p2pielen++] =
-                                       P2P_GRPCAP_PERSISTENT_GROUP |
-                                       DMP_P2P_GRPCAP_SUPPORT;
-                       else
-                               p2pie[p2pielen++] = DMP_P2P_GRPCAP_SUPPORT;
-
-                       /*      Extended Listen Timing */
-                       /*      Type: */
-                       p2pie[p2pielen++] = P2P_ATTR_EX_LISTEN_TIMING;
-
-                       /*      Length: */
-                       *(u16*) (p2pie + p2pielen) = cpu_to_le16(0x0004);
-                       p2pielen += 2;
-
-                       /*      Value: */
-                       /*      Availability Period */
-                       *(u16*) (p2pie + p2pielen) = cpu_to_le16(0xFFFF);
-                       p2pielen += 2;
-
-                       /*      Availability Interval */
-                       *(u16*) (p2pie + p2pielen) = cpu_to_le16(0xFFFF);
-                       p2pielen += 2;
-
-                       /*      Device Info */
-                       /*      Type: */
-                       p2pie[p2pielen++] = P2P_ATTR_DEVICE_INFO;
-
-                       /*      Length: */
-                       /*      21 -> P2P Device Address (6bytes) + Config
-                               Methods (2bytes) + Primary Device
-                               Type (8bytes) */
-                       /*      + NumofSecondDevType (1byte) + WPS Device
-                               Name ID field (2bytes) + WPS Device Name
-                               Len field (2bytes) */
-                       *(u16*) (p2pie + p2pielen) =
-                               cpu_to_le16(21 + pwdinfo->device_name_len);
-                       p2pielen += 2;
-
-                       /*      Value: */
-                       /*      P2P Device Address */
-                       memcpy(p2pie + p2pielen,
-                              myid(&padapter->eeprompriv), ETH_ALEN);
-                       p2pielen += ETH_ALEN;
-
-                       /*      Config Method */
-                       /*      This field should be big endian.
-                               Noted by P2P specification. */
-                       if ((pwdinfo->ui_got_wps_info ==
-                            P2P_GOT_WPSINFO_PEER_DISPLAY_PIN) ||
-                           (pwdinfo->ui_got_wps_info ==
-                            P2P_GOT_WPSINFO_SELF_DISPLAY_PIN))
-                               *(u16*) (p2pie + p2pielen) =
-                                       cpu_to_be16(WPS_CONFIG_METHOD_DISPLAY);
-                       else
-                               *(u16*) (p2pie + p2pielen) =
-                                       cpu_to_be16(WPS_CONFIG_METHOD_PBC);
-
-                       p2pielen += 2;
-
-                       /*      Primary Device Type */
-                       /*      Category ID */
-                       *(u16*) (p2pie + p2pielen) =
-                               cpu_to_be16(WPS_PDT_CID_MULIT_MEDIA);
-                       p2pielen += 2;
-
-                       /*      OUI */
-                       *(u32*) (p2pie + p2pielen) = cpu_to_be32(WPSOUI);
-                       p2pielen += 4;
-
-                       /*      Sub Category ID */
-                       *(u16*) (p2pie + p2pielen) =
-                               cpu_to_be16(WPS_PDT_SCID_MEDIA_SERVER);
-                       p2pielen += 2;
-
-                       /*      Number of Secondary Device Types */
-                       /*      No Secondary Device Type List */
-                       p2pie[p2pielen++] = 0x00;
-
-                       /*      Device Name */
-                       /*      Type: */
-                       *(u16*) (p2pie + p2pielen) =
-                               cpu_to_be16(WPS_ATTR_DEVICE_NAME);
-                       p2pielen += 2;
-
-                       /*      Length: */
-                       *(u16*) (p2pie + p2pielen) =
-                               cpu_to_be16(pwdinfo->device_name_len);
-                       p2pielen += 2;
-
-                       /*      Value: */
-                       memcpy(p2pie + p2pielen, pwdinfo->device_name,
-                              pwdinfo->device_name_len);
-                       p2pielen += pwdinfo->device_name_len;
-
-                       /*      P2P Interface */
-                       /*      Type: */
-                       p2pie[p2pielen++] = P2P_ATTR_INTERFACE;
-
-                       /*      Length: */
-                       *(u16*) (p2pie + p2pielen) = cpu_to_le16(0x000D);
-                       p2pielen += 2;
-
-                       /*      Value: */
-                       memcpy(p2pie + p2pielen, pwdinfo->device_addr,
-                              ETH_ALEN);       /* P2P Device Address */
-                       p2pielen += ETH_ALEN;
-
-                       /* P2P Interface Address Count */
-                       p2pie[p2pielen++] = 1;
-
-                       memcpy(p2pie + p2pielen, pwdinfo->device_addr,
-                              ETH_ALEN);       /* P2P Interface Address List */
-                       p2pielen += ETH_ALEN;
-
-                       pframe = rtw_set_ie23a(pframe, WLAN_EID_VENDOR_SPECIFIC,
-                                              p2pielen, (unsigned char *)p2pie,
-                                              &pattrib->pktlen);
-
-                       /* wfdielen = build_assoc_req_wfd_ie(pwdinfo, pframe);*/
-                       /* pframe += wfdielen; */
-                       /* pattrib->pktlen += wfdielen; */
-               }
-       }
-
-       if (true == pwdinfo->wfd_info->wfd_enable) {
-               wfdielen = build_assoc_req_wfd_ie(pwdinfo, pframe);
-               pframe += wfdielen;
-               pattrib->pktlen += wfdielen;
-       } else if (pmlmepriv->wfd_assoc_req_ie != NULL &&
-                  pmlmepriv->wfd_assoc_req_ie_len > 0) {
-               /* WFD IE */
-               memcpy(pframe, pmlmepriv->wfd_assoc_req_ie,
-                      pmlmepriv->wfd_assoc_req_ie_len);
-               pattrib->pktlen += pmlmepriv->wfd_assoc_req_ie_len;
-               pframe += pmlmepriv->wfd_assoc_req_ie_len;
-       }
-#endif /* CONFIG_8723AU_P2P */
-
        pattrib->last_txcmdsz = pattrib->pktlen;
        dump_mgntframe23a(padapter, pmgntframe);
 
@@ -7023,20 +3687,9 @@ static int _issue_deauth23a(struct rtw_adapter *padapter, unsigned char *da,
        struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
        struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info;
        int ret = _FAIL;
-#ifdef CONFIG_8723AU_P2P
-       struct wifidirect_info *pwdinfo = &padapter->wdinfo;
-#endif /* CONFIG_8723AU_P2P */
 
        /* DBG_8723A("%s to "MAC_FMT"\n", __func__, MAC_ARG(da)); */
 
-#ifdef CONFIG_8723AU_P2P
-       if (!(rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) &&
-           (pwdinfo->rx_invitereq_info.scan_op_ch_only)) {
-               mod_timer(&pwdinfo->reset_ch_sitesurvey,
-                         jiffies + msecs_to_jiffies(10));
-       }
-#endif /* CONFIG_8723AU_P2P */
-
        if ((pmgntframe = alloc_mgtxmitframe23a(pxmitpriv)) == NULL)
                goto exit;
 
@@ -7631,34 +4284,14 @@ void site_survey23a(struct rtw_adapter *padapter)
        enum rt_scan_type ScanType = SCAN_PASSIVE;
        struct mlme_ext_priv    *pmlmeext = &padapter->mlmeextpriv;
        struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info;
-#ifdef CONFIG_8723AU_P2P
-       struct wifidirect_info *pwdinfo = &padapter->wdinfo;
+       struct rtw_ieee80211_channel *ch;
 
-       if ((pwdinfo->rx_invitereq_info.scan_op_ch_only) ||
-           (pwdinfo->p2p_info.scan_op_ch_only)) {
-               if (pwdinfo->rx_invitereq_info.scan_op_ch_only)
-                       survey_channel = pwdinfo->rx_invitereq_info.operation_ch[pmlmeext->sitesurvey_res.channel_idx];
-               else
-                       survey_channel = pwdinfo->p2p_info.operation_ch[pmlmeext->sitesurvey_res.channel_idx];
-               ScanType = SCAN_ACTIVE;
-       } else if (rtw_p2p_findphase_ex_is_social(pwdinfo)) {
-               /* The driver is in the find phase, it should go through the social channel. */
-               int ch_set_idx;
-               survey_channel = pwdinfo->social_chan[pmlmeext->sitesurvey_res.channel_idx];
-               ch_set_idx = rtw_ch_set_search_ch23a(pmlmeext->channel_set, survey_channel);
-               if (ch_set_idx >= 0)
-                       ScanType = pmlmeext->channel_set[ch_set_idx].ScanType;
-               else
-                       ScanType = SCAN_ACTIVE;
-       } else
-#endif /* CONFIG_8723AU_P2P */
-       {
-               struct rtw_ieee80211_channel *ch;
-               if (pmlmeext->sitesurvey_res.channel_idx < pmlmeext->sitesurvey_res.ch_num) {
-                       ch = &pmlmeext->sitesurvey_res.ch[pmlmeext->sitesurvey_res.channel_idx];
-                       survey_channel = ch->hw_value;
-                       ScanType = (ch->flags & IEEE80211_CHAN_NO_IR) ? SCAN_PASSIVE : SCAN_ACTIVE;
-}
+       if (pmlmeext->sitesurvey_res.channel_idx <
+           pmlmeext->sitesurvey_res.ch_num) {
+               ch = &pmlmeext->sitesurvey_res.ch[pmlmeext->sitesurvey_res.channel_idx];
+               survey_channel = ch->hw_value;
+               ScanType = (ch->flags & IEEE80211_CHAN_NO_IR) ?
+                       SCAN_PASSIVE : SCAN_ACTIVE;
        }
 
        if (survey_channel != 0) {
@@ -7672,112 +4305,59 @@ void site_survey23a(struct rtw_adapter *padapter)
 
                if (ScanType == SCAN_ACTIVE) /* obey the channel plan setting... */
                {
-#ifdef CONFIG_8723AU_P2P
-                       if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_SCAN) ||
-                               rtw_p2p_chk_state(pwdinfo, P2P_STATE_FIND_PHASE_SEARCH)
-                       )
-                       {
-                               issue23a_probereq_p2p(padapter, NULL);
-                               issue23a_probereq_p2p(padapter, NULL);
-                               issue23a_probereq_p2p(padapter, NULL);
-                       }
-                       else
-#endif /* CONFIG_8723AU_P2P */
-                       {
-                               int i;
-                               for (i = 0;i<RTW_SSID_SCAN_AMOUNT;i++) {
-                                       if (pmlmeext->sitesurvey_res.ssid[i].ssid_len) {
-                                               /* todo: to issue two probe req??? */
-                                               issue_probereq23a(padapter, &pmlmeext->sitesurvey_res.ssid[i], NULL);
-                                               /* msleep(SURVEY_TO>>1); */
-                                               issue_probereq23a(padapter, &pmlmeext->sitesurvey_res.ssid[i], NULL);
-                                       }
-                               }
-
-                               if (pmlmeext->sitesurvey_res.scan_mode == SCAN_ACTIVE) {
+                       int i;
+                       for (i = 0;i<RTW_SSID_SCAN_AMOUNT;i++) {
+                               if (pmlmeext->sitesurvey_res.ssid[i].ssid_len) {
                                        /* todo: to issue two probe req??? */
-                                       issue_probereq23a(padapter, NULL, NULL);
+                                       issue_probereq23a(padapter, &pmlmeext->sitesurvey_res.ssid[i], NULL);
                                        /* msleep(SURVEY_TO>>1); */
-                                       issue_probereq23a(padapter, NULL, NULL);
+                                       issue_probereq23a(padapter, &pmlmeext->sitesurvey_res.ssid[i], NULL);
                                }
                        }
+
+                       if (pmlmeext->sitesurvey_res.scan_mode == SCAN_ACTIVE) {
+                               /* todo: to issue two probe req??? */
+                               issue_probereq23a(padapter, NULL, NULL);
+                               /* msleep(SURVEY_TO>>1); */
+                               issue_probereq23a(padapter, NULL, NULL);
+                       }
                }
 
                set_survey_timer(pmlmeext, pmlmeext->chan_scan_time);
        } else {
-
                /*      channel number is 0 or this channel is not valid. */
+               pmlmeext->sitesurvey_res.state = SCAN_COMPLETE;
 
+               /* switch back to the original channel */
 
-#ifdef CONFIG_8723AU_P2P
-               if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_SCAN) || rtw_p2p_chk_state(pwdinfo, P2P_STATE_FIND_PHASE_SEARCH))
-               {
-                       if ((pwdinfo->rx_invitereq_info.scan_op_ch_only) || (pwdinfo->p2p_info.scan_op_ch_only))
-                       {
-                               /*      Set the find_phase_state_exchange_cnt to P2P_FINDPHASE_EX_CNT. */
-                               /*      This will let the following flow to run the scanning end. */
-                               rtw_p2p_findphase_ex_set(pwdinfo, P2P_FINDPHASE_EX_MAX);
-                       }
-               }
-
-               if (rtw_p2p_findphase_ex_is_needed(pwdinfo))
-               {
-                       /*      Set the P2P State to the listen state of find phase and set the current channel to the listen channel */
-                       set_channel_bwmode23a(padapter, pwdinfo->listen_channel, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20);
-                       rtw_p2p_set_state(pwdinfo, P2P_STATE_FIND_PHASE_LISTEN);
-                       pmlmeext->sitesurvey_res.state = SCAN_DISABLE;
-
-                       /* restore RX GAIN */
-                       rtl8723a_set_initial_gain(padapter, 0xff);
-                       /* turn on dynamic functions */
-                       rtl8723a_odm_support_ability_restore(padapter);
-
-                       mod_timer(&pwdinfo->find_phase_timer, jiffies +
-                                 msecs_to_jiffies(pwdinfo->listen_dwell * 100));
-               } else
-#endif /* CONFIG_8723AU_P2P */
-               {
-#ifdef CONFIG_8723AU_P2P
-                       if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_SCAN) || rtw_p2p_chk_state(pwdinfo, P2P_STATE_FIND_PHASE_SEARCH))
-                               rtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo));
-                       rtw_p2p_findphase_ex_set(pwdinfo, P2P_FINDPHASE_EX_NONE);
-#endif /* CONFIG_8723AU_P2P */
-
-                       pmlmeext->sitesurvey_res.state = SCAN_COMPLETE;
-
-                       /* switch back to the original channel */
-
-                       set_channel_bwmode23a(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode);
-
-                       /* flush 4-AC Queue after site_survey23a */
-                       /* val8 = 0; */
+               set_channel_bwmode23a(padapter, pmlmeext->cur_channel,
+                                     pmlmeext->cur_ch_offset,
+                                     pmlmeext->cur_bwmode);
 
-                       /* config MSR */
-                       Set_MSR23a(padapter, (pmlmeinfo->state & 0x3));
+               /* flush 4-AC Queue after site_survey23a */
+               /* val8 = 0; */
 
-                       /* restore RX GAIN */
-                       rtl8723a_set_initial_gain(padapter, 0xff);
-                       /* turn on dynamic functions */
-                       rtl8723a_odm_support_ability_restore(padapter);
-
-                       if (is_client_associated_to_ap23a(padapter) == true)
-                       {
-                               issue_nulldata23a(padapter, NULL, 0, 3, 500);
+               /* config MSR */
+               Set_MSR23a(padapter, (pmlmeinfo->state & 0x3));
 
-                       }
+               /* restore RX GAIN */
+               rtl8723a_set_initial_gain(padapter, 0xff);
+               /* turn on dynamic functions */
+               rtl8723a_odm_support_ability_restore(padapter);
 
-                       rtl8723a_mlme_sitesurvey(padapter, 0);
+               if (is_client_associated_to_ap23a(padapter) == true)
+                       issue_nulldata23a(padapter, NULL, 0, 3, 500);
 
-                       report_surveydone_event23a(padapter);
+               rtl8723a_mlme_sitesurvey(padapter, 0);
 
-                       pmlmeext->chan_scan_time = SURVEY_TO;
-                       pmlmeext->sitesurvey_res.state = SCAN_DISABLE;
+               report_surveydone_event23a(padapter);
 
-                       issue_action_BSSCoexistPacket(padapter);
-                       issue_action_BSSCoexistPacket(padapter);
-                       issue_action_BSSCoexistPacket(padapter);
+               pmlmeext->chan_scan_time = SURVEY_TO;
+               pmlmeext->sitesurvey_res.state = SCAN_DISABLE;
 
-               }
+               issue_action_BSSCoexistPacket(padapter);
+               issue_action_BSSCoexistPacket(padapter);
+               issue_action_BSSCoexistPacket(padapter);
        }
 
        return;
@@ -8915,9 +5495,6 @@ void linked_status_chk23a(struct rtw_adapter *padapter)
                if ((psta = rtw_get_stainfo23a(pstapriv, pmlmeinfo->network.MacAddress)) != NULL)
                {
                        bool is_p2p_enable = false;
-#ifdef CONFIG_8723AU_P2P
-                       is_p2p_enable = !rtw_p2p_chk_state(&padapter->wdinfo, P2P_STATE_NONE);
-#endif
 
                        if (chk_ap_is_alive(padapter, psta) == false)
                                rx_chk = _FAIL;
@@ -9031,32 +5608,17 @@ static void survey_timer_hdl(unsigned long data)
        struct sitesurvey_parm *psurveyPara;
        struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
        struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
-#ifdef CONFIG_8723AU_P2P
-       struct wifidirect_info *pwdinfo = &padapter->wdinfo;
-#endif
 
        /* issue rtw_sitesurvey_cmd23a */
        if (pmlmeext->sitesurvey_res.state > SCAN_START) {
                if (pmlmeext->sitesurvey_res.state ==  SCAN_PROCESS)
                        pmlmeext->sitesurvey_res.channel_idx++;
 
-               if (pmlmeext->scan_abort == true)
-               {
-#ifdef CONFIG_8723AU_P2P
-                       if (!rtw_p2p_chk_state(&padapter->wdinfo, P2P_STATE_NONE))
-                       {
-                               rtw_p2p_findphase_ex_set(pwdinfo, P2P_FINDPHASE_EX_MAX);
-                               pmlmeext->sitesurvey_res.channel_idx = 3;
-                               DBG_8723A("%s idx:%d, cnt:%u\n", __func__,
-                                         pmlmeext->sitesurvey_res.channel_idx,
-                                         pwdinfo->find_phase_state_exchange_cnt);
-                       } else
-                       #endif
-                       {
-                               pmlmeext->sitesurvey_res.channel_idx = pmlmeext->sitesurvey_res.ch_num;
-                               DBG_8723A("%s idx:%d\n", __func__,
-                                         pmlmeext->sitesurvey_res.channel_idx);
-                       }
+               if (pmlmeext->scan_abort == true) {
+                       pmlmeext->sitesurvey_res.channel_idx =
+                               pmlmeext->sitesurvey_res.ch_num;
+                       DBG_8723A("%s idx:%d\n", __func__,
+                                 pmlmeext->sitesurvey_res.channel_idx);
 
                        pmlmeext->scan_abort = false;/* reset */
                }
diff --git a/drivers/staging/rtl8723au/core/rtw_p2p.c b/drivers/staging/rtl8723au/core/rtw_p2p.c
deleted file mode 100644 (file)
index 49c0908..0000000
+++ /dev/null
@@ -1,4016 +0,0 @@
-/******************************************************************************
- *
- * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of version 2 of the GNU General Public License as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- ******************************************************************************/
-#define _RTW_P2P_C_
-
-#include <drv_types.h>
-#include <rtw_p2p.h>
-#include <rtl8723a_cmd.h>
-#include <wifi.h>
-
-#ifdef CONFIG_8723AU_P2P
-
-static int rtw_p2p_is_channel_list_ok(u8 desired_ch, u8* ch_list, u8 ch_cnt)
-{
-       int found = 0, i = 0;
-
-       for (i = 0; i < ch_cnt; i++)
-       {
-               if (ch_list[ i ] == desired_ch)
-               {
-                       found = 1;
-                       break;
-               }
-       }
-       return found;
-}
-
-static int is_any_client_associated(struct rtw_adapter *padapter)
-{
-       return padapter->stapriv.asoc_list_cnt ? true : false;
-}
-
-static u32 go_add_group_info_attr(struct wifidirect_info *pwdinfo, u8 *pbuf)
-{
-       struct list_head *phead, *plist;
-       u32 len = 0;
-       u16 attr_len = 0;
-       u8 tmplen, *pdata_attr, *pstart, *pcur;
-       struct sta_info *psta;
-       struct rtw_adapter *padapter = pwdinfo->padapter;
-       struct sta_priv *pstapriv = &padapter->stapriv;
-
-       DBG_8723A("%s\n", __func__);
-
-       pdata_attr = kzalloc(MAX_P2P_IE_LEN, GFP_ATOMIC);
-
-       pstart = pdata_attr;
-       pcur = pdata_attr;
-
-       spin_lock_bh(&pstapriv->asoc_list_lock);
-       phead = &pstapriv->asoc_list;
-
-       list_for_each(plist, phead) {
-               psta = container_of(plist, struct sta_info, asoc_list);
-
-               if (psta->is_p2p_device)
-               {
-                       tmplen = 0;
-
-                       pcur++;
-
-                       /* P2P device address */
-                       memcpy(pcur, psta->dev_addr, ETH_ALEN);
-                       pcur += ETH_ALEN;
-
-                       /* P2P interface address */
-                       memcpy(pcur, psta->hwaddr, ETH_ALEN);
-                       pcur += ETH_ALEN;
-
-                       *pcur = psta->dev_cap;
-                       pcur++;
-
-                       /* u16*)(pcur) = cpu_to_be16(psta->config_methods); */
-                       put_unaligned_be16(psta->config_methods, pcur);
-                       pcur += 2;
-
-                       memcpy(pcur, psta->primary_dev_type, 8);
-                       pcur += 8;
-
-                       *pcur = psta->num_of_secdev_type;
-                       pcur++;
-
-                       memcpy(pcur, psta->secdev_types_list, psta->num_of_secdev_type*8);
-                       pcur += psta->num_of_secdev_type*8;
-
-                       if (psta->dev_name_len>0)
-                       {
-                               /* u16*)(pcur) = cpu_to_be16(WPS_ATTR_DEVICE_NAME); */
-                               put_unaligned_be16(WPS_ATTR_DEVICE_NAME, pcur);
-                               pcur += 2;
-
-                               /* u16*)(pcur) = cpu_to_be16(psta->dev_name_len); */
-                               put_unaligned_be16(psta->dev_name_len, pcur);
-                               pcur += 2;
-
-                               memcpy(pcur, psta->dev_name, psta->dev_name_len);
-                               pcur += psta->dev_name_len;
-                       }
-
-                       tmplen = (u8)(pcur-pstart);
-
-                       *pstart = (tmplen-1);
-
-                       attr_len += tmplen;
-
-                       /* pstart += tmplen; */
-                       pstart = pcur;
-
-               }
-
-       }
-       spin_unlock_bh(&pstapriv->asoc_list_lock);
-
-       if (attr_len>0)
-       {
-               len = rtw_set_p2p_attr_content23a(pbuf, P2P_ATTR_GROUP_INFO, attr_len, pdata_attr);
-       }
-
-       kfree(pdata_attr);
-
-       return len;
-}
-
-static void issue_group_disc_req(struct wifidirect_info *pwdinfo, u8 *da)
-{
-       struct xmit_frame                       *pmgntframe;
-       struct pkt_attrib                       *pattrib;
-       unsigned char                                   *pframe;
-       struct ieee80211_hdr    *pwlanhdr;
-       unsigned short                          *fctrl;
-       struct rtw_adapter *padapter = pwdinfo->padapter;
-       struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
-       struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
-       unsigned char category = WLAN_CATEGORY_VENDOR_SPECIFIC;/* P2P action frame */
-       u32     p2poui = cpu_to_be32(P2POUI);
-       u8      oui_subtype = P2P_GO_DISC_REQUEST;
-       u8      dialogToken = 0;
-
-       DBG_8723A("[%s]\n", __func__);
-
-       if ((pmgntframe = alloc_mgtxmitframe23a(pxmitpriv)) == 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;
-
-       fctrl = &pwlanhdr->frame_control;
-       *fctrl = 0;
-
-       memcpy(pwlanhdr->addr1, da, ETH_ALEN);
-       memcpy(pwlanhdr->addr2, pwdinfo->interface_addr, ETH_ALEN);
-       memcpy(pwlanhdr->addr3, pwdinfo->interface_addr, 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);
-
-       /* Build P2P action frame header */
-       pframe = rtw_set_fixed_ie23a(pframe, 1, &category, &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);
-
-       /* there is no IE in this P2P action frame */
-
-       pattrib->last_txcmdsz = pattrib->pktlen;
-
-       dump_mgntframe23a(padapter, pmgntframe);
-}
-
-static void issue_p2p_devdisc_resp(struct wifidirect_info *pwdinfo, u8 *da, u8 status, u8 dialogToken)
-{
-       struct xmit_frame                       *pmgntframe;
-       struct pkt_attrib                       *pattrib;
-       unsigned char                                   *pframe;
-       struct ieee80211_hdr    *pwlanhdr;
-       unsigned short                          *fctrl;
-       struct rtw_adapter *padapter = pwdinfo->padapter;
-       struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
-       struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
-       unsigned char category = WLAN_CATEGORY_PUBLIC;
-       u8                      action = P2P_PUB_ACTION_ACTION;
-       u32                     p2poui = cpu_to_be32(P2POUI);
-       u8                      oui_subtype = P2P_DEVDISC_RESP;
-       u8 p2pie[8] = { 0x00 };
-       u32 p2pielen = 0;
-
-       DBG_8723A("[%s]\n", __func__);
-
-       if ((pmgntframe = alloc_mgtxmitframe23a(pxmitpriv)) == 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;
-
-       fctrl = &pwlanhdr->frame_control;
-       *fctrl = 0;
-
-       memcpy(pwlanhdr->addr1, da, ETH_ALEN);
-       memcpy(pwlanhdr->addr2, pwdinfo->device_addr, ETH_ALEN);
-       memcpy(pwlanhdr->addr3, pwdinfo->device_addr, 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);
-
-       /* Build P2P public action frame header */
-       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 P2P IE */
-       /*      P2P OUI */
-       p2pielen = 0;
-       p2pie[ p2pielen++ ] = 0x50;
-       p2pie[ p2pielen++ ] = 0x6F;
-       p2pie[ p2pielen++ ] = 0x9A;
-       p2pie[ p2pielen++ ] = 0x09;     /*      WFA P2P v1.0 */
-
-       /*  P2P_ATTR_STATUS */
-       p2pielen += rtw_set_p2p_attr_content23a(&p2pie[p2pielen], P2P_ATTR_STATUS, 1, &status);
-
-       pframe = rtw_set_ie23a(pframe, WLAN_EID_VENDOR_SPECIFIC, p2pielen,
-                              p2pie, &pattrib->pktlen);
-
-       pattrib->last_txcmdsz = pattrib->pktlen;
-
-       dump_mgntframe23a(padapter, pmgntframe);
-}
-
-static void issue_p2p_provision_resp(struct wifidirect_info *pwdinfo, u8* raddr, u8* frame_body, u16 config_method)
-{
-       struct rtw_adapter *padapter = pwdinfo->padapter;
-       unsigned char category = WLAN_CATEGORY_PUBLIC;
-       u8                      action = P2P_PUB_ACTION_ACTION;
-       u8                      dialogToken = frame_body[7];    /*      The Dialog Token of provisioning discovery request frame. */
-       u32                     p2poui = cpu_to_be32(P2POUI);
-       u8                      oui_subtype = P2P_PROVISION_DISC_RESP;
-       u8                      wpsie[ 100 ] = { 0x00 };
-       u8                      wpsielen = 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;
-       unsigned short                          *fctrl;
-       struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
-       struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
-
-       if ((pmgntframe = alloc_mgtxmitframe23a(pxmitpriv)) == 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;
-
-       fctrl = &pwlanhdr->frame_control;
-       *fctrl = 0;
-
-       memcpy(pwlanhdr->addr1, raddr, ETH_ALEN);
-       memcpy(pwlanhdr->addr2, myid(&padapter->eeprompriv), ETH_ALEN);
-       memcpy(pwlanhdr->addr3, myid(&padapter->eeprompriv), 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);
-
-       wpsielen = 0;
-       /*      WPS OUI */
-       /* u32*) (wpsie) = cpu_to_be32(WPSOUI); */
-       put_unaligned_be32(WPSOUI, wpsie);
-       wpsielen += 4;
-
-       /*      Config Method */
-       /*      Type: */
-       /* u16*) (wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_CONF_METHOD); */
-       put_unaligned_be16(WPS_ATTR_CONF_METHOD, wpsie + wpsielen);
-       wpsielen += 2;
-
-       /*      Length: */
-       /* u16*) (wpsie + wpsielen) = cpu_to_be16(0x0002); */
-       put_unaligned_be16(0x0002, wpsie + wpsielen);
-       wpsielen += 2;
-
-       /*      Value: */
-       /* u16*) (wpsie + wpsielen) = cpu_to_be16(config_method); */
-       put_unaligned_be16(config_method, wpsie + wpsielen);
-       wpsielen += 2;
-
-       pframe = rtw_set_ie23a(pframe, WLAN_EID_VENDOR_SPECIFIC, wpsielen,
-                              (unsigned char *) wpsie, &pattrib->pktlen);
-
-#ifdef CONFIG_8723AU_P2P
-       wfdielen = build_provdisc_resp_wfd_ie(pwdinfo, pframe);
-       pframe += wfdielen;
-       pattrib->pktlen += wfdielen;
-#endif /* CONFIG_8723AU_P2P */
-
-       pattrib->last_txcmdsz = pattrib->pktlen;
-
-       dump_mgntframe23a(padapter, pmgntframe);
-
-       return;
-}
-
-static void issue_p2p_presence_resp(struct wifidirect_info *pwdinfo, u8 *da, u8 status, u8 dialogToken)
-{
-       struct xmit_frame                       *pmgntframe;
-       struct pkt_attrib                       *pattrib;
-       unsigned char                                   *pframe;
-       struct ieee80211_hdr    *pwlanhdr;
-       unsigned short                          *fctrl;
-       struct rtw_adapter *padapter = pwdinfo->padapter;
-       struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
-       struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
-       unsigned char category = WLAN_CATEGORY_VENDOR_SPECIFIC;/* P2P action frame */
-       u32     p2poui = cpu_to_be32(P2POUI);
-       u8      oui_subtype = P2P_PRESENCE_RESPONSE;
-       u8 p2pie[ MAX_P2P_IE_LEN] = { 0x00 };
-       u8 noa_attr_content[32] = { 0x00 };
-       u32 p2pielen = 0;
-
-       DBG_8723A("[%s]\n", __func__);
-
-       if ((pmgntframe = alloc_mgtxmitframe23a(pxmitpriv)) == 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;
-
-       fctrl = &pwlanhdr->frame_control;
-       *fctrl = 0;
-
-       memcpy(pwlanhdr->addr1, da, ETH_ALEN);
-       memcpy(pwlanhdr->addr2, pwdinfo->interface_addr, ETH_ALEN);
-       memcpy(pwlanhdr->addr3, pwdinfo->interface_addr, 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);
-
-       /* Build P2P action frame header */
-       pframe = rtw_set_fixed_ie23a(pframe, 1, &category, &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);
-
-       /* Add P2P IE header */
-       /*      P2P OUI */
-       p2pielen = 0;
-       p2pie[ p2pielen++ ] = 0x50;
-       p2pie[ p2pielen++ ] = 0x6F;
-       p2pie[ p2pielen++ ] = 0x9A;
-       p2pie[ p2pielen++ ] = 0x09;     /*      WFA P2P v1.0 */
-
-       /* Add Status attribute in P2P IE */
-       p2pielen += rtw_set_p2p_attr_content23a(&p2pie[p2pielen], P2P_ATTR_STATUS, 1, &status);
-
-       /* Add NoA attribute in P2P IE */
-       noa_attr_content[0] = 0x1;/* index */
-       noa_attr_content[1] = 0x0;/* CTWindow and OppPS Parameters */
-
-       /* todo: Notice of Absence Descriptor(s) */
-
-       p2pielen += rtw_set_p2p_attr_content23a(&p2pie[p2pielen], P2P_ATTR_NOA, 2, noa_attr_content);
-
-       pframe = rtw_set_ie23a(pframe, WLAN_EID_VENDOR_SPECIFIC, p2pielen,
-                              p2pie, &pattrib->pktlen);
-
-       pattrib->last_txcmdsz = pattrib->pktlen;
-
-       dump_mgntframe23a(padapter, pmgntframe);
-}
-
-u32 build_beacon_p2p_ie23a(struct wifidirect_info *pwdinfo, u8 *pbuf)
-{
-       u8 p2pie[ MAX_P2P_IE_LEN] = { 0x00 };
-       u16 capability = 0;
-       u32 len = 0, p2pielen = 0;
-
-       /*      P2P OUI */
-       p2pielen = 0;
-       p2pie[ p2pielen++ ] = 0x50;
-       p2pie[ p2pielen++ ] = 0x6F;
-       p2pie[ p2pielen++ ] = 0x9A;
-       p2pie[ p2pielen++ ] = 0x09;     /*      WFA P2P v1.0 */
-
-       /*      According to the P2P Specification, the beacon frame should contain 3 P2P attributes */
-       /*      1. P2P Capability */
-       /*      2. P2P Device ID */
-       /*      3. Notice of Absence (NOA) */
-
-       /*      P2P Capability ATTR */
-       /*      Type: */
-       /*      Length: */
-       /*      Value: */
-       /*      Device Capability Bitmap, 1 byte */
-       /*      Be able to participate in additional P2P Groups and */
-       /*      support the P2P Invitation Procedure */
-       /*      Group Capability Bitmap, 1 byte */
-       capability = P2P_DEVCAP_INVITATION_PROC|P2P_DEVCAP_CLIENT_DISCOVERABILITY;
-       capability |=  ((P2P_GRPCAP_GO | P2P_GRPCAP_INTRABSS) << 8);
-       if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_PROVISIONING_ING))
-               capability |= (P2P_GRPCAP_GROUP_FORMATION<<8);
-
-       capability = cpu_to_le16(capability);
-
-       p2pielen += rtw_set_p2p_attr_content23a(&p2pie[p2pielen], P2P_ATTR_CAPABILITY, 2, (u8*)&capability);
-
-       /*  P2P Device ID ATTR */
-       p2pielen += rtw_set_p2p_attr_content23a(&p2pie[p2pielen], P2P_ATTR_DEVICE_ID, ETH_ALEN, pwdinfo->device_addr);
-
-       /*  Notice of Absence ATTR */
-       /*      Type: */
-       /*      Length: */
-       /*      Value: */
-
-       /* go_add_noa_attr(pwdinfo); */
-
-       pbuf = rtw_set_ie23a(pbuf, WLAN_EID_VENDOR_SPECIFIC, p2pielen,
-                            (unsigned char *) p2pie, &len);
-
-       return len;
-}
-
-#ifdef CONFIG_8723AU_P2P
-u32 build_beacon_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)
-{
-       u8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 };
-       u32 len = 0, wfdielen = 0;
-       struct rtw_adapter *padapter = pwdinfo->padapter;
-       struct mlme_priv                *pmlmepriv = &padapter->mlmepriv;
-       struct wifi_display_info*       pwfd_info = padapter->wdinfo.wfd_info;
-
-       /*      WFD OUI */
-       wfdielen = 0;
-       wfdie[ wfdielen++ ] = 0x50;
-       wfdie[ wfdielen++ ] = 0x6F;
-       wfdie[ wfdielen++ ] = 0x9A;
-       wfdie[ wfdielen++ ] = 0x0A;     /*      WFA WFD v1.0 */
-
-       /*      Commented by Albert 20110812 */
-       /*      According to the WFD Specification, the beacon frame should contain 4 WFD attributes */
-       /*      1. WFD Device Information */
-       /*      2. Associated BSSID */
-       /*      3. Coupled Sink Information */
-
-       /*      WFD Device Information ATTR */
-       /*      Type: */
-       wfdie[ wfdielen++ ] = WFD_ATTR_DEVICE_INFO;
-
-       /*      Length: */
-       /*      Note: In the WFD specification, the size of length field is 2. */
-       put_unaligned_be16(0x0006, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value1: */
-       /*      WFD device information */
-
-       if (P2P_ROLE_GO == pwdinfo->role)
-       {
-               if (is_any_client_associated(pwdinfo->padapter))
-               {
-                       /*      WFD primary sink + WiFi Direct mode + WSD (WFD Service Discovery) */
-                       put_unaligned_be16(pwfd_info->wfd_device_type |
-                                          WFD_DEVINFO_WSD, wfdie + wfdielen);
-               }
-               else
-               {
-                       /*      WFD primary sink + available for WFD session + WiFi Direct mode + WSD (WFD Service Discovery) */
-                       put_unaligned_be16(pwfd_info->wfd_device_type |
-                                          WFD_DEVINFO_SESSION_AVAIL |
-                                          WFD_DEVINFO_WSD, wfdie + wfdielen);
-               }
-
-       }
-       else
-       {
-               /*      WFD primary sink + available for WFD session + WiFi Direct mode + WSD (WFD Service Discovery) */
-               put_unaligned_be16(pwfd_info->wfd_device_type |
-                                  WFD_DEVINFO_SESSION_AVAIL |
-                                  WFD_DEVINFO_WSD, wfdie + wfdielen);
-       }
-
-       wfdielen += 2;
-
-       /*      Value2: */
-       /*      Session Management Control Port */
-       /*      Default TCP port for RTSP messages is 554 */
-       put_unaligned_be16(pwfd_info->rtsp_ctrlport, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value3: */
-       /*      WFD Device Maximum Throughput */
-       /*      300Mbps is the maximum throughput */
-       put_unaligned_be16(300, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Associated BSSID ATTR */
-       /*      Type: */
-       wfdie[ wfdielen++ ] = WFD_ATTR_ASSOC_BSSID;
-
-       /*      Length: */
-       /*      Note: In the WFD specification, the size of length field is 2. */
-       put_unaligned_be16(0x0006, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value: */
-       /*      Associated BSSID */
-       if (check_fwstate(pmlmepriv, _FW_LINKED) == true)
-       {
-               memcpy(wfdie + wfdielen, &pmlmepriv->assoc_bssid[ 0 ], ETH_ALEN);
-       }
-       else
-       {
-               memset(wfdie + wfdielen, 0x00, ETH_ALEN);
-       }
-
-       wfdielen += ETH_ALEN;
-
-       /*      Coupled Sink Information ATTR */
-       /*      Type: */
-       wfdie[ wfdielen++ ] = WFD_ATTR_COUPLED_SINK_INFO;
-
-       /*      Length: */
-       /*      Note: In the WFD specification, the size of length field is 2. */
-       put_unaligned_be16(0x0007, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value: */
-       /*      Coupled Sink Status bitmap */
-       /*      Not coupled/available for Coupling */
-       wfdie[ wfdielen++ ] = 0;
-       /*   MAC Addr. */
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-
-       pbuf = rtw_set_ie23a(pbuf, WLAN_EID_VENDOR_SPECIFIC, wfdielen,
-                            (unsigned char *) wfdie, &len);
-
-       return len;
-}
-
-u32 build_probe_req_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)
-{
-       u8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 };
-       u32 len = 0, wfdielen = 0;
-       struct rtw_adapter *padapter = pwdinfo->padapter;
-       struct mlme_priv                *pmlmepriv = &padapter->mlmepriv;
-       struct wifi_display_info*       pwfd_info = padapter->wdinfo.wfd_info;
-
-       /*      WFD OUI */
-       wfdielen = 0;
-       wfdie[ wfdielen++ ] = 0x50;
-       wfdie[ wfdielen++ ] = 0x6F;
-       wfdie[ wfdielen++ ] = 0x9A;
-       wfdie[ wfdielen++ ] = 0x0A;     /*      WFA WFD v1.0 */
-
-       /*      Commented by Albert 20110812 */
-       /*      According to the WFD Specification, the probe request frame should contain 4 WFD attributes */
-       /*      1. WFD Device Information */
-       /*      2. Associated BSSID */
-       /*      3. Coupled Sink Information */
-
-       /*      WFD Device Information ATTR */
-       /*      Type: */
-       wfdie[ wfdielen++ ] = WFD_ATTR_DEVICE_INFO;
-
-       /*      Length: */
-       /*      Note: In the WFD specification, the size of length field is 2. */
-       put_unaligned_be16(0x0006, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value1: */
-       /*      WFD device information */
-
-       if (1 == pwdinfo->wfd_tdls_enable)
-       {
-               /*      WFD primary sink + available for WFD session + WiFi TDLS mode + WSC (WFD Service Discovery) */
-               put_unaligned_be16(pwfd_info->wfd_device_type |
-                                  WFD_DEVINFO_SESSION_AVAIL |
-                                  WFD_DEVINFO_WSD |
-                                  WFD_DEVINFO_PC_TDLS, wfdie + wfdielen);
-       }
-       else
-       {
-               /*      WFD primary sink + available for WFD session + WiFi Direct mode + WSC (WFD Service Discovery) */
-               put_unaligned_be16(pwfd_info->wfd_device_type |
-                                  WFD_DEVINFO_SESSION_AVAIL |
-                                  WFD_DEVINFO_WSD, wfdie + wfdielen);
-       }
-
-       wfdielen += 2;
-
-       /*      Value2: */
-       /*      Session Management Control Port */
-       /*      Default TCP port for RTSP messages is 554 */
-       put_unaligned_be16(pwfd_info->rtsp_ctrlport, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value3: */
-       /*      WFD Device Maximum Throughput */
-       /*      300Mbps is the maximum throughput */
-       put_unaligned_be16(300, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Associated BSSID ATTR */
-       /*      Type: */
-       wfdie[ wfdielen++ ] = WFD_ATTR_ASSOC_BSSID;
-
-       /*      Length: */
-       /*      Note: In the WFD specification, the size of length field is 2. */
-       put_unaligned_be16(0x0006, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value: */
-       /*      Associated BSSID */
-       if (check_fwstate(pmlmepriv, _FW_LINKED) == true)
-       {
-               memcpy(wfdie + wfdielen, &pmlmepriv->assoc_bssid[ 0 ], ETH_ALEN);
-       }
-       else
-       {
-               memset(wfdie + wfdielen, 0x00, ETH_ALEN);
-       }
-
-       wfdielen += ETH_ALEN;
-
-       /*      Coupled Sink Information ATTR */
-       /*      Type: */
-       wfdie[ wfdielen++ ] = WFD_ATTR_COUPLED_SINK_INFO;
-
-       /*      Length: */
-       /*      Note: In the WFD specification, the size of length field is 2. */
-       put_unaligned_be16(0x0007, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value: */
-       /*      Coupled Sink Status bitmap */
-       /*      Not coupled/available for Coupling */
-       wfdie[ wfdielen++ ] = 0;
-       /*   MAC Addr. */
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-
-       pbuf = rtw_set_ie23a(pbuf, WLAN_EID_VENDOR_SPECIFIC, wfdielen,
-                            (unsigned char *) wfdie, &len);
-
-       return len;
-}
-
-u32 build_probe_resp_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf, u8 tunneled)
-{
-       u8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 };
-       u32 len = 0, wfdielen = 0;
-       struct rtw_adapter *padapter = pwdinfo->padapter;
-       struct mlme_priv                *pmlmepriv = &padapter->mlmepriv;
-       struct wifi_display_info*       pwfd_info = padapter->wdinfo.wfd_info;
-
-       /*      WFD OUI */
-       wfdielen = 0;
-       wfdie[ wfdielen++ ] = 0x50;
-       wfdie[ wfdielen++ ] = 0x6F;
-       wfdie[ wfdielen++ ] = 0x9A;
-       wfdie[ wfdielen++ ] = 0x0A;     /*      WFA WFD v1.0 */
-
-       /*      Commented by Albert 20110812 */
-       /*      According to the WFD Specification, the probe response frame should contain 4 WFD attributes */
-       /*      1. WFD Device Information */
-       /*      2. Associated BSSID */
-       /*      3. Coupled Sink Information */
-       /*      4. WFD Session Information */
-
-       /*      WFD Device Information ATTR */
-       /*      Type: */
-       wfdie[ wfdielen++ ] = WFD_ATTR_DEVICE_INFO;
-
-       /*      Length: */
-       /*      Note: In the WFD specification, the size of length field is 2. */
-       put_unaligned_be16(0x0006, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value1: */
-       /*      WFD device information */
-       /*      WFD primary sink + available for WFD session + WiFi Direct mode */
-
-       if (true == pwdinfo->session_available)
-       {
-               if (P2P_ROLE_GO == pwdinfo->role)
-               {
-                       if (is_any_client_associated(pwdinfo->padapter))
-                       {
-                               if (pwdinfo->wfd_tdls_enable)
-                               {
-                                       /*      TDLS mode + WSD (WFD Service Discovery) */
-                                       put_unaligned_be16(pwfd_info->wfd_device_type | WFD_DEVINFO_WSD | WFD_DEVINFO_PC_TDLS | WFD_DEVINFO_HDCP_SUPPORT, wfdie + wfdielen);
-                               }
-                               else
-                               {
-                                       /*      WiFi Direct mode + WSD (WFD Service Discovery) */
-                                       put_unaligned_be16(pwfd_info->wfd_device_type | WFD_DEVINFO_WSD | WFD_DEVINFO_HDCP_SUPPORT, wfdie + wfdielen);
-                               }
-                       }
-                       else
-                       {
-                               if (pwdinfo->wfd_tdls_enable)
-                               {
-                                       /*      available for WFD session + TDLS mode + WSD (WFD Service Discovery) */
-                                       put_unaligned_be16(pwfd_info->wfd_device_type | WFD_DEVINFO_SESSION_AVAIL | WFD_DEVINFO_WSD | WFD_DEVINFO_PC_TDLS | WFD_DEVINFO_HDCP_SUPPORT, wfdie + wfdielen);
-                               }
-                               else
-                               {
-                                       /*      available for WFD session + WiFi Direct mode + WSD (WFD Service Discovery) */
-                                       put_unaligned_be16(pwfd_info->wfd_device_type | WFD_DEVINFO_SESSION_AVAIL | WFD_DEVINFO_WSD | WFD_DEVINFO_HDCP_SUPPORT, wfdie + wfdielen);
-                               }
-                       }
-               }
-               else
-               {
-                       if (pwdinfo->wfd_tdls_enable)
-                       {
-                               /*      available for WFD session + WiFi Direct mode + WSD (WFD Service Discovery) */
-                               put_unaligned_be16(pwfd_info->wfd_device_type |
-                                                  WFD_DEVINFO_SESSION_AVAIL |
-                                                  WFD_DEVINFO_WSD |
-                                                  WFD_DEVINFO_PC_TDLS |
-                                                  WFD_DEVINFO_HDCP_SUPPORT,
-                                                  wfdie + wfdielen);
-                       }
-                       else
-                       {
-
-                               /*      available for WFD session + WiFi Direct mode + WSD (WFD Service Discovery) */
-                               put_unaligned_be16(pwfd_info->wfd_device_type |
-                                                  WFD_DEVINFO_SESSION_AVAIL |
-                                                  WFD_DEVINFO_WSD |
-                                                  WFD_DEVINFO_HDCP_SUPPORT,
-                                                  wfdie + wfdielen);
-                       }
-               }
-       }
-       else
-       {
-               if (pwdinfo->wfd_tdls_enable)
-               {
-                       put_unaligned_be16(pwfd_info->wfd_device_type |
-                                          WFD_DEVINFO_WSD |
-                                          WFD_DEVINFO_PC_TDLS |
-                                          WFD_DEVINFO_HDCP_SUPPORT,
-                                          wfdie + wfdielen);
-               }
-               else
-               {
-                       put_unaligned_be16(pwfd_info->wfd_device_type |
-                                          WFD_DEVINFO_WSD |
-                                          WFD_DEVINFO_HDCP_SUPPORT,
-                                          wfdie + wfdielen);
-               }
-
-       }
-
-       wfdielen += 2;
-
-       /*      Value2: */
-       /*      Session Management Control Port */
-       /*      Default TCP port for RTSP messages is 554 */
-       put_unaligned_be16(pwfd_info->rtsp_ctrlport, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value3: */
-       /*      WFD Device Maximum Throughput */
-       /*      300Mbps is the maximum throughput */
-       put_unaligned_be16(300, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Associated BSSID ATTR */
-       /*      Type: */
-       wfdie[ wfdielen++ ] = WFD_ATTR_ASSOC_BSSID;
-
-       /*      Length: */
-       /*      Note: In the WFD specification, the size of length field is 2. */
-       put_unaligned_be16(0x0006, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value: */
-       /*      Associated BSSID */
-       if (check_fwstate(pmlmepriv, _FW_LINKED) == true)
-       {
-               memcpy(wfdie + wfdielen, &pmlmepriv->assoc_bssid[ 0 ], ETH_ALEN);
-       }
-       else
-       {
-               memset(wfdie + wfdielen, 0x00, ETH_ALEN);
-       }
-
-       wfdielen += ETH_ALEN;
-
-       /*      Coupled Sink Information ATTR */
-       /*      Type: */
-       wfdie[ wfdielen++ ] = WFD_ATTR_COUPLED_SINK_INFO;
-
-       /*      Length: */
-       /*      Note: In the WFD specification, the size of length field is 2. */
-       put_unaligned_be16(0x0007, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value: */
-       /*      Coupled Sink Status bitmap */
-       /*      Not coupled/available for Coupling */
-       wfdie[ wfdielen++ ] = 0;
-       /*   MAC Addr. */
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-
-       if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO))
-       {
-               /*      WFD Session Information ATTR */
-               /*      Type: */
-               wfdie[ wfdielen++ ] = WFD_ATTR_SESSION_INFO;
-
-               /*      Length: */
-               /*      Note: In the WFD specification, the size of length field is 2. */
-               put_unaligned_be16(0x0000, wfdie + wfdielen);
-               wfdielen += 2;
-
-               /*      Todo: to add the list of WFD device info descriptor in WFD group. */
-
-       }
-
-       pbuf = rtw_set_ie23a(pbuf, WLAN_EID_VENDOR_SPECIFIC, wfdielen,
-                            (unsigned char *) wfdie, &len);
-
-       return len;
-}
-
-u32 build_assoc_req_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)
-{
-       u8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 };
-       u32 len = 0, wfdielen = 0;
-       struct rtw_adapter                                      *padapter = NULL;
-       struct mlme_priv                        *pmlmepriv = NULL;
-       struct wifi_display_info                *pwfd_info = NULL;
-
-       /*      WFD OUI */
-       if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE) || rtw_p2p_chk_state(pwdinfo, P2P_STATE_IDLE))
-       {
-               return 0;
-       }
-
-       padapter = pwdinfo->padapter;
-       pmlmepriv = &padapter->mlmepriv;
-       pwfd_info = padapter->wdinfo.wfd_info;
-
-       wfdielen = 0;
-       wfdie[ wfdielen++ ] = 0x50;
-       wfdie[ wfdielen++ ] = 0x6F;
-       wfdie[ wfdielen++ ] = 0x9A;
-       wfdie[ wfdielen++ ] = 0x0A;     /*      WFA WFD v1.0 */
-
-       /*      Commented by Albert 20110812 */
-       /*      According to the WFD Specification, the probe request frame should contain 4 WFD attributes */
-       /*      1. WFD Device Information */
-       /*      2. Associated BSSID */
-       /*      3. Coupled Sink Information */
-
-       /*      WFD Device Information ATTR */
-       /*      Type: */
-       wfdie[ wfdielen++ ] = WFD_ATTR_DEVICE_INFO;
-
-       /*      Length: */
-       /*      Note: In the WFD specification, the size of length field is 2. */
-       put_unaligned_be16(0x0006, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value1: */
-       /*      WFD device information */
-       /*      WFD primary sink + available for WFD session + WiFi Direct mode + WSD (WFD Service Discovery) */
-       put_unaligned_be16(pwfd_info->wfd_device_type |
-                          WFD_DEVINFO_SESSION_AVAIL |
-                          WFD_DEVINFO_WSD, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value2: */
-       /*      Session Management Control Port */
-       /*      Default TCP port for RTSP messages is 554 */
-       put_unaligned_be16(pwfd_info->rtsp_ctrlport, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value3: */
-       /*      WFD Device Maximum Throughput */
-       /*      300Mbps is the maximum throughput */
-       put_unaligned_be16(300, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Associated BSSID ATTR */
-       /*      Type: */
-       wfdie[ wfdielen++ ] = WFD_ATTR_ASSOC_BSSID;
-
-       /*      Length: */
-       /*      Note: In the WFD specification, the size of length field is 2. */
-       put_unaligned_be16(0x0006, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value: */
-       /*      Associated BSSID */
-       if (check_fwstate(pmlmepriv, _FW_LINKED) == true)
-       {
-               memcpy(wfdie + wfdielen, &pmlmepriv->assoc_bssid[ 0 ], ETH_ALEN);
-       }
-       else
-       {
-               memset(wfdie + wfdielen, 0x00, ETH_ALEN);
-       }
-
-       wfdielen += ETH_ALEN;
-
-       /*      Coupled Sink Information ATTR */
-       /*      Type: */
-       wfdie[ wfdielen++ ] = WFD_ATTR_COUPLED_SINK_INFO;
-
-       /*      Length: */
-       /*      Note: In the WFD specification, the size of length field is 2. */
-       put_unaligned_be16(0x0007, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value: */
-       /*      Coupled Sink Status bitmap */
-       /*      Not coupled/available for Coupling */
-       wfdie[ wfdielen++ ] = 0;
-       /*   MAC Addr. */
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-
-       pbuf = rtw_set_ie23a(pbuf, WLAN_EID_VENDOR_SPECIFIC, wfdielen,
-                            (unsigned char *) wfdie, &len);
-
-       return len;
-}
-
-u32 build_assoc_resp_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)
-{
-       u8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 };
-       u32 len = 0, wfdielen = 0;
-       struct rtw_adapter *padapter = pwdinfo->padapter;
-       struct mlme_priv                *pmlmepriv = &padapter->mlmepriv;
-       struct wifi_display_info*       pwfd_info = padapter->wdinfo.wfd_info;
-
-       /*      WFD OUI */
-       wfdielen = 0;
-       wfdie[ wfdielen++ ] = 0x50;
-       wfdie[ wfdielen++ ] = 0x6F;
-       wfdie[ wfdielen++ ] = 0x9A;
-       wfdie[ wfdielen++ ] = 0x0A;     /*      WFA WFD v1.0 */
-
-       /*      Commented by Albert 20110812 */
-       /*      According to the WFD Specification, the probe request frame should contain 4 WFD attributes */
-       /*      1. WFD Device Information */
-       /*      2. Associated BSSID */
-       /*      3. Coupled Sink Information */
-
-       /*      WFD Device Information ATTR */
-       /*      Type: */
-       wfdie[ wfdielen++ ] = WFD_ATTR_DEVICE_INFO;
-
-       /*      Length: */
-       /*      Note: In the WFD specification, the size of length field is 2. */
-       put_unaligned_be16(0x0006, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value1: */
-       /*      WFD device information */
-       /*      WFD primary sink + available for WFD session + WiFi Direct mode + WSD (WFD Service Discovery) */
-       put_unaligned_be16(pwfd_info->wfd_device_type |
-                          WFD_DEVINFO_SESSION_AVAIL |
-                          WFD_DEVINFO_WSD, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value2: */
-       /*      Session Management Control Port */
-       /*      Default TCP port for RTSP messages is 554 */
-       put_unaligned_be16(pwfd_info->rtsp_ctrlport, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value3: */
-       /*      WFD Device Maximum Throughput */
-       /*      300Mbps is the maximum throughput */
-       put_unaligned_be16(300, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Associated BSSID ATTR */
-       /*      Type: */
-       wfdie[ wfdielen++ ] = WFD_ATTR_ASSOC_BSSID;
-
-       /*      Length: */
-       /*      Note: In the WFD specification, the size of length field is 2. */
-       put_unaligned_be16(0x0006, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value: */
-       /*      Associated BSSID */
-       if (check_fwstate(pmlmepriv, _FW_LINKED) == true)
-       {
-               memcpy(wfdie + wfdielen, &pmlmepriv->assoc_bssid[ 0 ], ETH_ALEN);
-       }
-       else
-       {
-               memset(wfdie + wfdielen, 0x00, ETH_ALEN);
-       }
-
-       wfdielen += ETH_ALEN;
-
-       /*      Coupled Sink Information ATTR */
-       /*      Type: */
-       wfdie[ wfdielen++ ] = WFD_ATTR_COUPLED_SINK_INFO;
-
-       /*      Length: */
-       /*      Note: In the WFD specification, the size of length field is 2. */
-       put_unaligned_be16(0x0007, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value: */
-       /*      Coupled Sink Status bitmap */
-       /*      Not coupled/available for Coupling */
-       wfdie[ wfdielen++ ] = 0;
-       /*   MAC Addr. */
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-
-       pbuf = rtw_set_ie23a(pbuf, WLAN_EID_VENDOR_SPECIFIC, wfdielen,
-                            (unsigned char *) wfdie, &len);
-
-       return len;
-}
-
-u32 build_nego_req_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)
-{
-       u8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 };
-       u32 len = 0, wfdielen = 0;
-       struct rtw_adapter *padapter = pwdinfo->padapter;
-       struct mlme_priv                *pmlmepriv = &padapter->mlmepriv;
-       struct wifi_display_info*       pwfd_info = padapter->wdinfo.wfd_info;
-
-       /*      WFD OUI */
-       wfdielen = 0;
-       wfdie[ wfdielen++ ] = 0x50;
-       wfdie[ wfdielen++ ] = 0x6F;
-       wfdie[ wfdielen++ ] = 0x9A;
-       wfdie[ wfdielen++ ] = 0x0A;     /*      WFA WFD v1.0 */
-
-       /*      Commented by Albert 20110825 */
-       /*      According to the WFD Specification, the negotiation request frame should contain 3 WFD attributes */
-       /*      1. WFD Device Information */
-       /*      2. Associated BSSID (Optional) */
-       /*      3. Local IP Adress (Optional) */
-
-       /*      WFD Device Information ATTR */
-       /*      Type: */
-       wfdie[ wfdielen++ ] = WFD_ATTR_DEVICE_INFO;
-
-       /*      Length: */
-       /*      Note: In the WFD specification, the size of length field is 2. */
-       put_unaligned_be16(0x0006, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value1: */
-       /*      WFD device information */
-       /*      WFD primary sink + WiFi Direct mode + WSD (WFD Service Discovery) + WFD Session Available */
-       put_unaligned_be16(pwfd_info->wfd_device_type |
-                          WFD_DEVINFO_WSD | WFD_DEVINFO_SESSION_AVAIL,
-                          wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value2: */
-       /*      Session Management Control Port */
-       /*      Default TCP port for RTSP messages is 554 */
-       put_unaligned_be16(pwfd_info->rtsp_ctrlport, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value3: */
-       /*      WFD Device Maximum Throughput */
-       /*      300Mbps is the maximum throughput */
-       put_unaligned_be16(300, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Associated BSSID ATTR */
-       /*      Type: */
-       wfdie[ wfdielen++ ] = WFD_ATTR_ASSOC_BSSID;
-
-       /*      Length: */
-       /*      Note: In the WFD specification, the size of length field is 2. */
-       put_unaligned_be16(0x0006, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value: */
-       /*      Associated BSSID */
-       if (check_fwstate(pmlmepriv, _FW_LINKED) == true)
-       {
-               memcpy(wfdie + wfdielen, &pmlmepriv->assoc_bssid[ 0 ], ETH_ALEN);
-       }
-       else
-       {
-               memset(wfdie + wfdielen, 0x00, ETH_ALEN);
-       }
-
-       wfdielen += ETH_ALEN;
-
-       /*      Coupled Sink Information ATTR */
-       /*      Type: */
-       wfdie[ wfdielen++ ] = WFD_ATTR_COUPLED_SINK_INFO;
-
-       /*      Length: */
-       /*      Note: In the WFD specification, the size of length field is 2. */
-       put_unaligned_be16(0x0007, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value: */
-       /*      Coupled Sink Status bitmap */
-       /*      Not coupled/available for Coupling */
-       wfdie[ wfdielen++ ] = 0;
-       /*   MAC Addr. */
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-
-       pbuf = rtw_set_ie23a(pbuf, WLAN_EID_VENDOR_SPECIFIC, wfdielen,
-                            (unsigned char *) wfdie, &len);
-
-       return len;
-}
-
-u32 build_nego_resp_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)
-{
-       u8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 };
-       u32 len = 0, wfdielen = 0;
-       struct rtw_adapter *padapter = pwdinfo->padapter;
-       struct mlme_priv                *pmlmepriv = &padapter->mlmepriv;
-       struct wifi_display_info*       pwfd_info = padapter->wdinfo.wfd_info;
-
-       /*      WFD OUI */
-       wfdielen = 0;
-       wfdie[ wfdielen++ ] = 0x50;
-       wfdie[ wfdielen++ ] = 0x6F;
-       wfdie[ wfdielen++ ] = 0x9A;
-       wfdie[ wfdielen++ ] = 0x0A;     /*      WFA WFD v1.0 */
-
-       /*      Commented by Albert 20110825 */
-       /*      According to the WFD Specification, the negotiation request frame should contain 3 WFD attributes */
-       /*      1. WFD Device Information */
-       /*      2. Associated BSSID (Optional) */
-       /*      3. Local IP Adress (Optional) */
-
-       /*      WFD Device Information ATTR */
-       /*      Type: */
-       wfdie[ wfdielen++ ] = WFD_ATTR_DEVICE_INFO;
-
-       /*      Length: */
-       /*      Note: In the WFD specification, the size of length field is 2. */
-       put_unaligned_be16(0x0006, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value1: */
-       /*      WFD device information */
-       /*      WFD primary sink + WiFi Direct mode + WSD (WFD Service Discovery) + WFD Session Available */
-       put_unaligned_be16(pwfd_info->wfd_device_type |
-                          WFD_DEVINFO_WSD | WFD_DEVINFO_SESSION_AVAIL,
-                          wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value2: */
-       /*      Session Management Control Port */
-       /*      Default TCP port for RTSP messages is 554 */
-       put_unaligned_be16(pwfd_info->rtsp_ctrlport, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value3: */
-       /*      WFD Device Maximum Throughput */
-       /*      300Mbps is the maximum throughput */
-       put_unaligned_be16(300, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Associated BSSID ATTR */
-       /*      Type: */
-       wfdie[ wfdielen++ ] = WFD_ATTR_ASSOC_BSSID;
-
-       /*      Length: */
-       /*      Note: In the WFD specification, the size of length field is 2. */
-       put_unaligned_be16(0x0006, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value: */
-       /*      Associated BSSID */
-       if (check_fwstate(pmlmepriv, _FW_LINKED) == true)
-       {
-               memcpy(wfdie + wfdielen, &pmlmepriv->assoc_bssid[ 0 ], ETH_ALEN);
-       }
-       else
-       {
-               memset(wfdie + wfdielen, 0x00, ETH_ALEN);
-       }
-
-       wfdielen += ETH_ALEN;
-
-       /*      Coupled Sink Information ATTR */
-       /*      Type: */
-       wfdie[ wfdielen++ ] = WFD_ATTR_COUPLED_SINK_INFO;
-
-       /*      Length: */
-       /*      Note: In the WFD specification, the size of length field is 2. */
-       put_unaligned_be16(0x0007, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value: */
-       /*      Coupled Sink Status bitmap */
-       /*      Not coupled/available for Coupling */
-       wfdie[ wfdielen++ ] = 0;
-       /*   MAC Addr. */
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-
-       pbuf = rtw_set_ie23a(pbuf, WLAN_EID_VENDOR_SPECIFIC, wfdielen,
-                            (unsigned char *) wfdie, &len);
-
-       return len;
-}
-
-u32 build_nego_confirm_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)
-{
-       u8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 };
-       u32 len = 0, wfdielen = 0;
-       struct rtw_adapter *padapter = pwdinfo->padapter;
-       struct mlme_priv                *pmlmepriv = &padapter->mlmepriv;
-       struct wifi_display_info*       pwfd_info = padapter->wdinfo.wfd_info;
-
-       /*      WFD OUI */
-       wfdielen = 0;
-       wfdie[ wfdielen++ ] = 0x50;
-       wfdie[ wfdielen++ ] = 0x6F;
-       wfdie[ wfdielen++ ] = 0x9A;
-       wfdie[ wfdielen++ ] = 0x0A;     /*      WFA WFD v1.0 */
-
-       /*      Commented by Albert 20110825 */
-       /*      According to the WFD Specification, the negotiation request frame should contain 3 WFD attributes */
-       /*      1. WFD Device Information */
-       /*      2. Associated BSSID (Optional) */
-       /*      3. Local IP Adress (Optional) */
-
-       /*      WFD Device Information ATTR */
-       /*      Type: */
-       wfdie[ wfdielen++ ] = WFD_ATTR_DEVICE_INFO;
-
-       /*      Length: */
-       /*      Note: In the WFD specification, the size of length field is 2. */
-       put_unaligned_be16(0x0006, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value1: */
-       /*      WFD device information */
-       /*      WFD primary sink + WiFi Direct mode + WSD (WFD Service Discovery) + WFD Session Available */
-       put_unaligned_be16(pwfd_info->wfd_device_type | WFD_DEVINFO_WSD |
-                          WFD_DEVINFO_SESSION_AVAIL, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value2: */
-       /*      Session Management Control Port */
-       /*      Default TCP port for RTSP messages is 554 */
-       put_unaligned_be16(pwfd_info->rtsp_ctrlport, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value3: */
-       /*      WFD Device Maximum Throughput */
-       /*      300Mbps is the maximum throughput */
-       put_unaligned_be16(300, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Associated BSSID ATTR */
-       /*      Type: */
-       wfdie[ wfdielen++ ] = WFD_ATTR_ASSOC_BSSID;
-
-       /*      Length: */
-       /*      Note: In the WFD specification, the size of length field is 2. */
-       put_unaligned_be16(0x0006, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value: */
-       /*      Associated BSSID */
-       if (check_fwstate(pmlmepriv, _FW_LINKED) == true)
-       {
-               memcpy(wfdie + wfdielen, &pmlmepriv->assoc_bssid[ 0 ], ETH_ALEN);
-       }
-       else
-       {
-               memset(wfdie + wfdielen, 0x00, ETH_ALEN);
-       }
-
-       wfdielen += ETH_ALEN;
-
-       /*      Coupled Sink Information ATTR */
-       /*      Type: */
-       wfdie[ wfdielen++ ] = WFD_ATTR_COUPLED_SINK_INFO;
-
-       /*      Length: */
-       /*      Note: In the WFD specification, the size of length field is 2. */
-       put_unaligned_be16(0x0007, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value: */
-       /*      Coupled Sink Status bitmap */
-       /*      Not coupled/available for Coupling */
-       wfdie[ wfdielen++ ] = 0;
-       /*   MAC Addr. */
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-
-       pbuf = rtw_set_ie23a(pbuf, WLAN_EID_VENDOR_SPECIFIC, wfdielen,
-                            (unsigned char *) wfdie, &len);
-
-       return len;
-}
-
-u32 build_invitation_req_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)
-{
-       u8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 };
-       u32 len = 0, wfdielen = 0;
-       struct rtw_adapter *padapter = pwdinfo->padapter;
-       struct mlme_priv                *pmlmepriv = &padapter->mlmepriv;
-       struct wifi_display_info*       pwfd_info = padapter->wdinfo.wfd_info;
-
-       /*      WFD OUI */
-       wfdielen = 0;
-       wfdie[ wfdielen++ ] = 0x50;
-       wfdie[ wfdielen++ ] = 0x6F;
-       wfdie[ wfdielen++ ] = 0x9A;
-       wfdie[ wfdielen++ ] = 0x0A;     /*      WFA WFD v1.0 */
-
-       /*      Commented by Albert 20110825 */
-       /*      According to the WFD Specification, the provision discovery request frame should contain 3 WFD attributes */
-       /*      1. WFD Device Information */
-       /*      2. Associated BSSID (Optional) */
-       /*      3. Local IP Adress (Optional) */
-
-       /*      WFD Device Information ATTR */
-       /*      Type: */
-       wfdie[ wfdielen++ ] = WFD_ATTR_DEVICE_INFO;
-
-       /*      Length: */
-       /*      Note: In the WFD specification, the size of length field is 2. */
-       put_unaligned_be16(0x0006, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value1: */
-       /*      WFD device information */
-       /*      WFD primary sink + available for WFD session + WiFi Direct mode + WSD (WFD Service Discovery) */
-       put_unaligned_be16(pwfd_info->wfd_device_type |
-                          WFD_DEVINFO_SESSION_AVAIL | WFD_DEVINFO_WSD,
-                          wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value2: */
-       /*      Session Management Control Port */
-       /*      Default TCP port for RTSP messages is 554 */
-       put_unaligned_be16(pwfd_info->rtsp_ctrlport, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value3: */
-       /*      WFD Device Maximum Throughput */
-       /*      300Mbps is the maximum throughput */
-       put_unaligned_be16(300, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Associated BSSID ATTR */
-       /*      Type: */
-       wfdie[ wfdielen++ ] = WFD_ATTR_ASSOC_BSSID;
-
-       /*      Length: */
-       /*      Note: In the WFD specification, the size of length field is 2. */
-       put_unaligned_be16(0x0006, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value: */
-       /*      Associated BSSID */
-       if (check_fwstate(pmlmepriv, _FW_LINKED) == true)
-       {
-               memcpy(wfdie + wfdielen, &pmlmepriv->assoc_bssid[ 0 ], ETH_ALEN);
-       }
-       else
-       {
-               memset(wfdie + wfdielen, 0x00, ETH_ALEN);
-       }
-
-       wfdielen += ETH_ALEN;
-
-       /*      Coupled Sink Information ATTR */
-       /*      Type: */
-       wfdie[ wfdielen++ ] = WFD_ATTR_COUPLED_SINK_INFO;
-
-       /*      Length: */
-       /*      Note: In the WFD specification, the size of length field is 2. */
-       put_unaligned_be16(0x0007, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value: */
-       /*      Coupled Sink Status bitmap */
-       /*      Not coupled/available for Coupling */
-       wfdie[ wfdielen++ ] = 0;
-       /*   MAC Addr. */
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-
-       if (P2P_ROLE_GO == pwdinfo->role)
-       {
-               /*      WFD Session Information ATTR */
-               /*      Type: */
-               wfdie[ wfdielen++ ] = WFD_ATTR_SESSION_INFO;
-
-               /*      Length: */
-               /*      Note: In the WFD specification, the size of length field is 2. */
-               put_unaligned_be16(0x0000, wfdie + wfdielen);
-               wfdielen += 2;
-
-               /*      Todo: to add the list of WFD device info descriptor in WFD group. */
-
-       }
-
-       pbuf = rtw_set_ie23a(pbuf, WLAN_EID_VENDOR_SPECIFIC, wfdielen,
-                            (unsigned char *) wfdie, &len);
-
-       return len;
-}
-
-u32 build_invitation_resp_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)
-{
-       u8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 };
-       u32 len = 0, wfdielen = 0;
-       struct rtw_adapter *padapter = pwdinfo->padapter;
-       struct mlme_priv                *pmlmepriv = &padapter->mlmepriv;
-       struct wifi_display_info*       pwfd_info = padapter->wdinfo.wfd_info;
-
-       /*      WFD OUI */
-       wfdielen = 0;
-       wfdie[ wfdielen++ ] = 0x50;
-       wfdie[ wfdielen++ ] = 0x6F;
-       wfdie[ wfdielen++ ] = 0x9A;
-       wfdie[ wfdielen++ ] = 0x0A;     /*      WFA WFD v1.0 */
-
-       /*      Commented by Albert 20110825 */
-       /*      According to the WFD Specification, the provision discovery request frame should contain 3 WFD attributes */
-       /*      1. WFD Device Information */
-       /*      2. Associated BSSID (Optional) */
-       /*      3. Local IP Adress (Optional) */
-
-       /*      WFD Device Information ATTR */
-       /*      Type: */
-       wfdie[ wfdielen++ ] = WFD_ATTR_DEVICE_INFO;
-
-       /*      Length: */
-       /*      Note: In the WFD specification, the size of length field is 2. */
-       put_unaligned_be16(0x0006, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value1: */
-       /*      WFD device information */
-       /*      WFD primary sink + available for WFD session + WiFi Direct mode + WSD (WFD Service Discovery) */
-       put_unaligned_be16(pwfd_info->wfd_device_type |
-                          WFD_DEVINFO_SESSION_AVAIL | WFD_DEVINFO_WSD,
-                          wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value2: */
-       /*      Session Management Control Port */
-       /*      Default TCP port for RTSP messages is 554 */
-       put_unaligned_be16(pwfd_info->rtsp_ctrlport, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value3: */
-       /*      WFD Device Maximum Throughput */
-       /*      300Mbps is the maximum throughput */
-       put_unaligned_be16(300, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Associated BSSID ATTR */
-       /*      Type: */
-       wfdie[ wfdielen++ ] = WFD_ATTR_ASSOC_BSSID;
-
-       /*      Length: */
-       /*      Note: In the WFD specification, the size of length field is 2. */
-       put_unaligned_be16(0x0006, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value: */
-       /*      Associated BSSID */
-       if (check_fwstate(pmlmepriv, _FW_LINKED) == true)
-       {
-               memcpy(wfdie + wfdielen, &pmlmepriv->assoc_bssid[ 0 ], ETH_ALEN);
-       }
-       else
-       {
-               memset(wfdie + wfdielen, 0x00, ETH_ALEN);
-       }
-
-       wfdielen += ETH_ALEN;
-
-       /*      Coupled Sink Information ATTR */
-       /*      Type: */
-       wfdie[ wfdielen++ ] = WFD_ATTR_COUPLED_SINK_INFO;
-
-       /*      Length: */
-       /*      Note: In the WFD specification, the size of length field is 2. */
-       put_unaligned_be16(0x0007, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value: */
-       /*      Coupled Sink Status bitmap */
-       /*      Not coupled/available for Coupling */
-       wfdie[ wfdielen++ ] = 0;
-       /*   MAC Addr. */
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-
-       if (P2P_ROLE_GO == pwdinfo->role)
-       {
-               /*      WFD Session Information ATTR */
-               /*      Type: */
-               wfdie[ wfdielen++ ] = WFD_ATTR_SESSION_INFO;
-
-               /*      Length: */
-               /*      Note: In the WFD specification, the size of length field is 2. */
-               put_unaligned_be16(0x0000, wfdie + wfdielen);
-               wfdielen += 2;
-
-               /*      Todo: to add the list of WFD device info descriptor in WFD group. */
-
-       }
-
-       pbuf = rtw_set_ie23a(pbuf, WLAN_EID_VENDOR_SPECIFIC, wfdielen,
-                            (unsigned char *) wfdie, &len);
-
-       return len;
-}
-
-u32 build_provdisc_req_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)
-{
-       u8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 };
-       u32 len = 0, wfdielen = 0;
-       struct rtw_adapter *padapter = pwdinfo->padapter;
-       struct mlme_priv                *pmlmepriv = &padapter->mlmepriv;
-       struct wifi_display_info*       pwfd_info = padapter->wdinfo.wfd_info;
-
-       /*      WFD OUI */
-       wfdielen = 0;
-       wfdie[ wfdielen++ ] = 0x50;
-       wfdie[ wfdielen++ ] = 0x6F;
-       wfdie[ wfdielen++ ] = 0x9A;
-       wfdie[ wfdielen++ ] = 0x0A;     /*      WFA WFD v1.0 */
-
-       /*      Commented by Albert 20110825 */
-       /*      According to the WFD Specification, the provision discovery request frame should contain 3 WFD attributes */
-       /*      1. WFD Device Information */
-       /*      2. Associated BSSID (Optional) */
-       /*      3. Local IP Adress (Optional) */
-
-       /*      WFD Device Information ATTR */
-       /*      Type: */
-       wfdie[ wfdielen++ ] = WFD_ATTR_DEVICE_INFO;
-
-       /*      Length: */
-       /*      Note: In the WFD specification, the size of length field is 2. */
-       put_unaligned_be16(0x0006, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value1: */
-       /*      WFD device information */
-       /*      WFD primary sink + available for WFD session + WiFi Direct mode + WSD (WFD Service Discovery) */
-       put_unaligned_be16(pwfd_info->wfd_device_type |
-                          WFD_DEVINFO_SESSION_AVAIL | WFD_DEVINFO_WSD,
-                          wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value2: */
-       /*      Session Management Control Port */
-       /*      Default TCP port for RTSP messages is 554 */
-       put_unaligned_be16(pwfd_info->rtsp_ctrlport, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value3: */
-       /*      WFD Device Maximum Throughput */
-       /*      300Mbps is the maximum throughput */
-       put_unaligned_be16(300, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Associated BSSID ATTR */
-       /*      Type: */
-       wfdie[ wfdielen++ ] = WFD_ATTR_ASSOC_BSSID;
-
-       /*      Length: */
-       /*      Note: In the WFD specification, the size of length field is 2. */
-       put_unaligned_be16(0x0006, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value: */
-       /*      Associated BSSID */
-       if (check_fwstate(pmlmepriv, _FW_LINKED) == true)
-       {
-               memcpy(wfdie + wfdielen, &pmlmepriv->assoc_bssid[ 0 ], ETH_ALEN);
-       }
-       else
-       {
-               memset(wfdie + wfdielen, 0x00, ETH_ALEN);
-       }
-
-       wfdielen += ETH_ALEN;
-
-       /*      Coupled Sink Information ATTR */
-       /*      Type: */
-       wfdie[ wfdielen++ ] = WFD_ATTR_COUPLED_SINK_INFO;
-
-       /*      Length: */
-       /*      Note: In the WFD specification, the size of length field is 2. */
-       put_unaligned_be16(0x0007, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value: */
-       /*      Coupled Sink Status bitmap */
-       /*      Not coupled/available for Coupling */
-       wfdie[ wfdielen++ ] = 0;
-       /*   MAC Addr. */
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-
-       pbuf = rtw_set_ie23a(pbuf, WLAN_EID_VENDOR_SPECIFIC, wfdielen,
-                            (unsigned char *) wfdie, &len);
-
-       return len;
-}
-
-u32 build_provdisc_resp_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf)
-{
-       u8 wfdie[ MAX_WFD_IE_LEN] = { 0x00 };
-       u32 len = 0, wfdielen = 0;
-       struct rtw_adapter *padapter = pwdinfo->padapter;
-       struct mlme_priv                *pmlmepriv = &padapter->mlmepriv;
-       struct wifi_display_info*       pwfd_info = padapter->wdinfo.wfd_info;
-
-       /*      WFD OUI */
-       wfdielen = 0;
-       wfdie[ wfdielen++ ] = 0x50;
-       wfdie[ wfdielen++ ] = 0x6F;
-       wfdie[ wfdielen++ ] = 0x9A;
-       wfdie[ wfdielen++ ] = 0x0A;     /*      WFA WFD v1.0 */
-
-       /*      Commented by Albert 20110825 */
-       /*      According to the WFD Specification, the provision discovery response frame should contain 3 WFD attributes */
-       /*      1. WFD Device Information */
-       /*      2. Associated BSSID (Optional) */
-       /*      3. Local IP Adress (Optional) */
-
-       /*      WFD Device Information ATTR */
-       /*      Type: */
-       wfdie[ wfdielen++ ] = WFD_ATTR_DEVICE_INFO;
-
-       /*      Length: */
-       /*      Note: In the WFD specification, the size of length field is 2. */
-       put_unaligned_be16(0x0006, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value1: */
-       /*      WFD device information */
-       /*      WFD primary sink + available for WFD session + WiFi Direct mode + WSD (WFD Service Discovery) */
-       put_unaligned_be16(pwfd_info->wfd_device_type |
-                          WFD_DEVINFO_SESSION_AVAIL | WFD_DEVINFO_WSD,
-                          wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value2: */
-       /*      Session Management Control Port */
-       /*      Default TCP port for RTSP messages is 554 */
-       put_unaligned_be16(pwfd_info->rtsp_ctrlport, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value3: */
-       /*      WFD Device Maximum Throughput */
-       /*      300Mbps is the maximum throughput */
-       put_unaligned_be16(300, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Associated BSSID ATTR */
-       /*      Type: */
-       wfdie[ wfdielen++ ] = WFD_ATTR_ASSOC_BSSID;
-
-       /*      Length: */
-       /*      Note: In the WFD specification, the size of length field is 2. */
-       put_unaligned_be16(0x0006, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value: */
-       /*      Associated BSSID */
-       if (check_fwstate(pmlmepriv, _FW_LINKED) == true)
-       {
-               memcpy(wfdie + wfdielen, &pmlmepriv->assoc_bssid[ 0 ], ETH_ALEN);
-       }
-       else
-       {
-               memset(wfdie + wfdielen, 0x00, ETH_ALEN);
-       }
-
-       wfdielen += ETH_ALEN;
-
-       /*      Coupled Sink Information ATTR */
-       /*      Type: */
-       wfdie[ wfdielen++ ] = WFD_ATTR_COUPLED_SINK_INFO;
-
-       /*      Length: */
-       /*      Note: In the WFD specification, the size of length field is 2. */
-       put_unaligned_be16(0x0007, wfdie + wfdielen);
-       wfdielen += 2;
-
-       /*      Value: */
-       /*      Coupled Sink Status bitmap */
-       /*      Not coupled/available for Coupling */
-       wfdie[ wfdielen++ ] = 0;
-       /*   MAC Addr. */
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-       wfdie[ wfdielen++ ] = 0;
-
-       pbuf = rtw_set_ie23a(pbuf, WLAN_EID_VENDOR_SPECIFIC, wfdielen,
-                            (unsigned char *) wfdie, &len);
-
-       return len;
-}
-
-#endif /* CONFIG_8723AU_P2P */
-
-u32 build_probe_resp_p2p_ie23a(struct wifidirect_info *pwdinfo, u8 *pbuf)
-{
-       u8 p2pie[ MAX_P2P_IE_LEN] = { 0x00 };
-       u32 len = 0, p2pielen = 0;
-
-       /*      P2P OUI */
-       p2pielen = 0;
-       p2pie[ p2pielen++ ] = 0x50;
-       p2pie[ p2pielen++ ] = 0x6F;
-       p2pie[ p2pielen++ ] = 0x9A;
-       p2pie[ p2pielen++ ] = 0x09;     /*      WFA P2P v1.0 */
-
-       /*      Commented by Albert 20100907 */
-       /*      According to the P2P Specification, the probe response frame should contain 5 P2P attributes */
-       /*      1. P2P Capability */
-       /*      2. Extended Listen Timing */
-       /*      3. Notice of Absence (NOA)      (Only GO needs this) */
-       /*      4. Device Info */
-       /*      5. Group Info   (Only GO need this) */
-
-       /*      P2P Capability ATTR */
-       /*      Type: */
-       p2pie[ p2pielen++ ] = P2P_ATTR_CAPABILITY;
-
-       /*      Length: */
-       /* u16*) (p2pie + p2pielen) = cpu_to_le16(0x0002); */
-       put_unaligned_le16(0x0002, p2pie + p2pielen);
-       p2pielen += 2;
-
-       /*      Value: */
-       /*      Device Capability Bitmap, 1 byte */
-       p2pie[ p2pielen++ ] = DMP_P2P_DEVCAP_SUPPORT;
-
-       /*      Group Capability Bitmap, 1 byte */
-       if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO))
-       {
-               p2pie[ p2pielen ] = (P2P_GRPCAP_GO | P2P_GRPCAP_INTRABSS);
-
-               if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_PROVISIONING_ING))
-                       p2pie[ p2pielen ] |= P2P_GRPCAP_GROUP_FORMATION;
-
-               p2pielen++;
-       }
-       else if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_DEVICE))
-       {
-               /*      Group Capability Bitmap, 1 byte */
-               if (pwdinfo->persistent_supported)
-                       p2pie[ p2pielen++ ] = P2P_GRPCAP_PERSISTENT_GROUP | DMP_P2P_GRPCAP_SUPPORT;
-               else
-                       p2pie[ p2pielen++ ] = DMP_P2P_GRPCAP_SUPPORT;
-       }
-
-       /*      Extended Listen Timing ATTR */
-       /*      Type: */
-       p2pie[ p2pielen++ ] = P2P_ATTR_EX_LISTEN_TIMING;
-
-       /*      Length: */
-       /* u16*) (p2pie + p2pielen) = cpu_to_le16(0x0004); */
-       put_unaligned_le16(0x0004, p2pie + p2pielen);
-       p2pielen += 2;
-
-       /*      Value: */
-       /*      Availability Period */
-       /* u16*) (p2pie + p2pielen) = cpu_to_le16(0xFFFF); */
-       put_unaligned_le16(0xFFFF, p2pie + p2pielen);
-       p2pielen += 2;
-
-       /*      Availability Interval */
-       /* u16*) (p2pie + p2pielen) = cpu_to_le16(0xFFFF); */
-       put_unaligned_le16(0xFFFF, p2pie + p2pielen);
-       p2pielen += 2;
-
-       /*  Notice of Absence ATTR */
-       /*      Type: */
-       /*      Length: */
-       /*      Value: */
-       if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO))
-       {
-               /* go_add_noa_attr(pwdinfo); */
-       }
-
-       /*      Device Info ATTR */
-       /*      Type: */
-       p2pie[ p2pielen++ ] = P2P_ATTR_DEVICE_INFO;
-
-       /*      Length: */
-       /*      21 -> P2P Device Address (6bytes) + Config Methods (2bytes) + Primary Device Type (8bytes) */
-       /*      + NumofSecondDevType (1byte) + WPS Device Name ID field (2bytes) + WPS Device Name Len field (2bytes) */
-       /* u16*) (p2pie + p2pielen) = cpu_to_le16(21 + pwdinfo->device_name_len); */
-       put_unaligned_le16(21 + pwdinfo->device_name_len, p2pie + p2pielen);
-       p2pielen += 2;
-
-       /*      Value: */
-       /*      P2P Device Address */
-       memcpy(p2pie + p2pielen, pwdinfo->device_addr, ETH_ALEN);
-       p2pielen += ETH_ALEN;
-
-       /*      Config Method */
-       /*      This field should be big endian. Noted by P2P specification. */
-       /* u16*) (p2pie + p2pielen) = cpu_to_be16(pwdinfo->supported_wps_cm); */
-       put_unaligned_be16(pwdinfo->supported_wps_cm, p2pie + p2pielen);
-       p2pielen += 2;
-
-       /*      Primary Device Type */
-       /*      Category ID */
-       /* u16*) (p2pie + p2pielen) = cpu_to_be16(WPS_PDT_CID_MULIT_MEDIA); */
-       put_unaligned_be16(WPS_PDT_CID_MULIT_MEDIA, p2pie + p2pielen);
-       p2pielen += 2;
-
-       /*      OUI */
-       /* u32*) (p2pie + p2pielen) = cpu_to_be32(WPSOUI); */
-       put_unaligned_be32(WPSOUI, p2pie + p2pielen);
-       p2pielen += 4;
-
-       /*      Sub Category ID */
-       /* u16*) (p2pie + p2pielen) = cpu_to_be16(WPS_PDT_SCID_MEDIA_SERVER); */
-       put_unaligned_be16(WPS_PDT_SCID_MEDIA_SERVER, p2pie + p2pielen);
-       p2pielen += 2;
-
-       /*      Number of Secondary Device Types */
-       p2pie[ p2pielen++ ] = 0x00;     /*      No Secondary Device Type List */
-
-       /*      Device Name */
-       /*      Type: */
-       /* u16*) (p2pie + p2pielen) = cpu_to_be16(WPS_ATTR_DEVICE_NAME); */
-       put_unaligned_be16(WPS_ATTR_DEVICE_NAME, p2pie + p2pielen);
-       p2pielen += 2;
-
-       /*      Length: */
-       /* u16*) (p2pie + p2pielen) = cpu_to_be16(pwdinfo->device_name_len); */
-       put_unaligned_be16(pwdinfo->device_name_len, p2pie + p2pielen);
-       p2pielen += 2;
-
-       /*      Value: */
-       memcpy(p2pie + p2pielen, pwdinfo->device_name, pwdinfo->device_name_len);
-       p2pielen += pwdinfo->device_name_len;
-
-       /*  Group Info ATTR */
-       /*      Type: */
-       /*      Length: */
-       /*      Value: */
-       if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO))
-       {
-               p2pielen += go_add_group_info_attr(pwdinfo, p2pie + p2pielen);
-       }
-
-       pbuf = rtw_set_ie23a(pbuf, WLAN_EID_VENDOR_SPECIFIC, p2pielen,
-                            (unsigned char *) p2pie, &len);
-
-       return len;
-}
-
-u32 build_prov_disc_request_p2p_ie23a(struct wifidirect_info *pwdinfo, u8 *pbuf, u8* pssid, u8 ussidlen, u8* pdev_raddr)
-{
-       u8 p2pie[ MAX_P2P_IE_LEN] = { 0x00 };
-       u32 len = 0, p2pielen = 0;
-
-       /*      P2P OUI */
-       p2pielen = 0;
-       p2pie[ p2pielen++ ] = 0x50;
-       p2pie[ p2pielen++ ] = 0x6F;
-       p2pie[ p2pielen++ ] = 0x9A;
-       p2pie[ 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: */
-       p2pie[ p2pielen++ ] = P2P_ATTR_CAPABILITY;
-
-       /*      Length: */
-       /* u16*) (p2pie + p2pielen) = cpu_to_le16(0x0002); */
-       put_unaligned_le16(0x0002, p2pie + p2pielen);
-       p2pielen += 2;
-
-       /*      Value: */
-       /*      Device Capability Bitmap, 1 byte */
-       p2pie[ p2pielen++ ] = DMP_P2P_DEVCAP_SUPPORT;
-
-       /*      Group Capability Bitmap, 1 byte */
-       if (pwdinfo->persistent_supported)
-               p2pie[ p2pielen++ ] = P2P_GRPCAP_PERSISTENT_GROUP | DMP_P2P_GRPCAP_SUPPORT;
-       else
-               p2pie[ p2pielen++ ] = DMP_P2P_GRPCAP_SUPPORT;
-
-       /*      Device Info ATTR */
-       /*      Type: */
-       p2pie[ p2pielen++ ] = P2P_ATTR_DEVICE_INFO;
-
-       /*      Length: */
-       /*      21 -> P2P Device Address (6bytes) + Config Methods (2bytes) + Primary Device Type (8bytes) */
-       /*      + NumofSecondDevType (1byte) + WPS Device Name ID field (2bytes) + WPS Device Name Len field (2bytes) */
-       /* u16*) (p2pie + p2pielen) = cpu_to_le16(21 + pwdinfo->device_name_len); */
-       put_unaligned_le16(21 + pwdinfo->device_name_len, p2pie + p2pielen);
-       p2pielen += 2;
-
-       /*      Value: */
-       /*      P2P Device Address */
-       memcpy(p2pie + p2pielen, pwdinfo->device_addr, ETH_ALEN);
-       p2pielen += ETH_ALEN;
-
-       /*      Config Method */
-       /*      This field should be big endian. Noted by P2P specification. */
-       if (pwdinfo->ui_got_wps_info == P2P_GOT_WPSINFO_PBC)
-       {
-               /* u16*) (p2pie + p2pielen) = cpu_to_be16(WPS_CONFIG_METHOD_PBC); */
-               put_unaligned_be16(WPS_CONFIG_METHOD_PBC, p2pie + p2pielen);
-       }
-       else
-       {
-               /* u16*) (p2pie + p2pielen) = cpu_to_be16(WPS_CONFIG_METHOD_DISPLAY); */
-               put_unaligned_be16(WPS_CONFIG_METHOD_DISPLAY, p2pie + p2pielen);
-       }
-
-       p2pielen += 2;
-
-       /*      Primary Device Type */
-       /*      Category ID */
-       /* u16*) (p2pie + p2pielen) = cpu_to_be16(WPS_PDT_CID_MULIT_MEDIA); */
-       put_unaligned_be16(WPS_PDT_CID_MULIT_MEDIA, p2pie + p2pielen);
-       p2pielen += 2;
-
-       /*      OUI */
-       /* u32*) (p2pie + p2pielen) = cpu_to_be32(WPSOUI); */
-       put_unaligned_be32(WPSOUI, p2pie + p2pielen);
-       p2pielen += 4;
-
-       /*      Sub Category ID */
-       /* u16*) (p2pie + p2pielen) = cpu_to_be16(WPS_PDT_SCID_MEDIA_SERVER); */
-       put_unaligned_be16(WPS_PDT_SCID_MEDIA_SERVER, p2pie + p2pielen);
-       p2pielen += 2;
-
-       /*      Number of Secondary Device Types */
-       p2pie[ p2pielen++ ] = 0x00;     /*      No Secondary Device Type List */
-
-       /*      Device Name */
-       /*      Type: */
-       /* u16*) (p2pie + p2pielen) = cpu_to_be16(WPS_ATTR_DEVICE_NAME); */
-       put_unaligned_be16(WPS_ATTR_DEVICE_NAME, p2pie + p2pielen);
-       p2pielen += 2;
-
-       /*      Length: */
-       /* u16*) (p2pie + p2pielen) = cpu_to_be16(pwdinfo->device_name_len); */
-       put_unaligned_be16(pwdinfo->device_name_len, p2pie + p2pielen);
-       p2pielen += 2;
-
-       /*      Value: */
-       memcpy(p2pie + p2pielen, pwdinfo->device_name, pwdinfo->device_name_len);
-       p2pielen += pwdinfo->device_name_len;
-
-       if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_CLIENT))
-       {
-               /*      Added by Albert 2011/05/19 */
-               /*      In this case, the pdev_raddr is the device address of the group owner. */
-
-               /*      P2P Group ID ATTR */
-               /*      Type: */
-               p2pie[ p2pielen++ ] = P2P_ATTR_GROUP_ID;
-
-               /*      Length: */
-               /* u16*) (p2pie + p2pielen) = cpu_to_le16(ETH_ALEN + ussidlen); */
-               put_unaligned_le16(ETH_ALEN + ussidlen, p2pie + p2pielen);
-               p2pielen += 2;
-
-               /*      Value: */
-               memcpy(p2pie + p2pielen, pdev_raddr, ETH_ALEN);
-               p2pielen += ETH_ALEN;
-
-               memcpy(p2pie + p2pielen, pssid, ussidlen);
-               p2pielen += ussidlen;
-
-       }
-
-       pbuf = rtw_set_ie23a(pbuf, WLAN_EID_VENDOR_SPECIFIC, p2pielen,
-                            (unsigned char *) p2pie, &len);
-
-       return len;
-}
-
-u32 build_assoc_resp_p2p_ie23a(struct wifidirect_info *pwdinfo, u8 *pbuf, u8 status_code)
-{
-       u8 p2pie[ MAX_P2P_IE_LEN] = { 0x00 };
-       u32 len = 0, p2pielen = 0;
-
-       /*      P2P OUI */
-       p2pielen = 0;
-       p2pie[ p2pielen++ ] = 0x50;
-       p2pie[ p2pielen++ ] = 0x6F;
-       p2pie[ p2pielen++ ] = 0x9A;
-       p2pie[ p2pielen++ ] = 0x09;     /*      WFA P2P v1.0 */
-
-       /*  According to the P2P Specification, the Association response frame should contain 2 P2P attributes */
-       /*      1. Status */
-       /*      2. Extended Listen Timing (optional) */
-
-       /*      Status ATTR */
-       p2pielen += rtw_set_p2p_attr_content23a(&p2pie[p2pielen], P2P_ATTR_STATUS, 1, &status_code);
-
-       /*  Extended Listen Timing ATTR */
-       /*      Type: */
-       /*      Length: */
-       /*      Value: */
-
-       pbuf = rtw_set_ie23a(pbuf, WLAN_EID_VENDOR_SPECIFIC, p2pielen,
-                            (unsigned char *) p2pie, &len);
-
-       return len;
-}
-
-u32 build_deauth_p2p_ie23a(struct wifidirect_info *pwdinfo, u8 *pbuf)
-{
-       u32 len = 0;
-
-       return len;
-}
-
-u32 process_probe_req_p2p_ie23a(struct wifidirect_info *pwdinfo, u8 *pframe, uint len)
-{
-       u8 *p;
-       u32 ret = false;
-       u8 *p2pie;
-       u32     p2pielen = 0;
-       int ssid_len = 0, rate_cnt = 0;
-
-       p = rtw_get_ie23a(pframe + sizeof(struct ieee80211_hdr_3addr) +
-                         _PROBEREQ_IE_OFFSET_, WLAN_EID_SUPP_RATES,
-                         (int *)&rate_cnt,
-                         len - sizeof(struct ieee80211_hdr_3addr) -
-                         _PROBEREQ_IE_OFFSET_);
-
-       if (rate_cnt <= 4)
-       {
-               int i, g_rate = 0;
-
-               for (i = 0; i < rate_cnt; i++)
-               {
-                       if (((*(p + 2 + i) & 0xff) != 0x02) &&
-                               ((*(p + 2 + i) & 0xff) != 0x04) &&
-                               ((*(p + 2 + i) & 0xff) != 0x0B) &&
-                               ((*(p + 2 + i) & 0xff) != 0x16))
-                       {
-                               g_rate = 1;
-                       }
-               }
-
-               if (g_rate == 0)
-               {
-                       /*      There is no OFDM rate included in SupportedRates IE of this probe request frame */
-                       /*      The driver should response this probe request. */
-                       return ret;
-               }
-       }
-       else
-       {
-               /*      rate_cnt > 4 means the SupportRates IE contains the OFDM rate because the count of CCK rates are 4. */
-               /*      We should proceed the following check for this probe request. */
-       }
-
-       /*      Added comments by Albert 20100906 */
-       /*      There are several items we should check here. */
-       /*      1. This probe request frame must contain the P2P IE. (Done) */
-       /*      2. This probe request frame must contain the wildcard SSID. (Done) */
-       /*      3. Wildcard BSSID. (Todo) */
-       /*      4. Destination Address. (Done in mgt_dispatcher23a function) */
-       /*      5. Requested Device Type in WSC IE. (Todo) */
-       /*      6. Device ID attribute in P2P IE. (Todo) */
-
-       p = rtw_get_ie23a(pframe + sizeof(struct ieee80211_hdr_3addr) +
-                         _PROBEREQ_IE_OFFSET_, WLAN_EID_SSID, (int *)&ssid_len,
-                         len - sizeof(struct ieee80211_hdr_3addr) -
-                         _PROBEREQ_IE_OFFSET_);
-
-       ssid_len &= 0xff;       /*      Just last 1 byte is valid for ssid len of the probe request */
-       if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_DEVICE) || rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO))
-       {
-               if ((p2pie = rtw_get_p2p_ie23a(pframe + sizeof(struct ieee80211_hdr_3addr) + _PROBEREQ_IE_OFFSET_, len - sizeof(struct ieee80211_hdr_3addr) - _PROBEREQ_IE_OFFSET_, NULL, &p2pielen)))
-               {
-                       if ((p) && !memcmp((void *)(p+2), (void *)pwdinfo->p2p_wildcard_ssid, 7))
-                       {
-                               /* todo: */
-                               /* Check Requested Device Type attributes in WSC IE. */
-                               /* Check Device ID attribute in P2P IE */
-
-                               ret = true;
-                       }
-                       else if ((p != NULL) && (ssid_len == 0))
-                       {
-                               ret = true;
-                       }
-               }
-               else
-               {
-                       /* non -p2p device */
-               }
-
-       }
-
-       return ret;
-}
-
-u32 process_assoc_req_p2p_ie23a(struct wifidirect_info *pwdinfo, u8 *pframe, uint len, struct sta_info *psta)
-{
-       u8 status_code = P2P_STATUS_SUCCESS;
-       u8 *pbuf, *pattr_content = NULL;
-       u32 attr_contentlen = 0;
-       u16 cap_attr = 0;
-       unsigned short ie_offset;
-       u8 * ies;
-       u32 ies_len;
-       u8 * p2p_ie;
-       u32     p2p_ielen = 0;
-       struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)pframe;
-
-       if (!rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO))
-               return P2P_STATUS_FAIL_REQUEST_UNABLE;
-
-       if (ieee80211_is_assoc_req(hdr->frame_control))
-               ie_offset = _ASOCREQ_IE_OFFSET_;
-       else /*  WIFI_REASSOCREQ */
-               ie_offset = _REASOCREQ_IE_OFFSET_;
-
-       ies = pframe + sizeof(struct ieee80211_hdr_3addr) + ie_offset;
-       ies_len = len - sizeof(struct ieee80211_hdr_3addr) - ie_offset;
-
-       p2p_ie = rtw_get_p2p_ie23a(ies, ies_len, NULL, &p2p_ielen);
-
-       if (!p2p_ie)
-       {
-               DBG_8723A("[%s] P2P IE not Found!!\n", __func__);
-               status_code =  P2P_STATUS_FAIL_INVALID_PARAM;
-       }
-       else
-       {
-               DBG_8723A("[%s] P2P IE Found!!\n", __func__);
-       }
-
-       while (p2p_ie)
-       {
-               /* Check P2P Capability ATTR */
-               if (rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen, P2P_ATTR_CAPABILITY, (u8*)&cap_attr, (uint*) &attr_contentlen))
-               {
-                       DBG_8723A("[%s] Got P2P Capability Attr!!\n", __func__);
-                       cap_attr = le16_to_cpu(cap_attr);
-                       psta->dev_cap = cap_attr&0xff;
-               }
-
-               /* Check Extended Listen Timing ATTR */
-
-               /* Check P2P Device Info ATTR */
-               if (rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen, P2P_ATTR_DEVICE_INFO, NULL, (uint*)&attr_contentlen))
-               {
-                       DBG_8723A("[%s] Got P2P DEVICE INFO Attr!!\n", __func__);
-                       pattr_content = pbuf = kzalloc(attr_contentlen,
-                                                      GFP_ATOMIC);
-                       if (pattr_content) {
-                               u8 num_of_secdev_type;
-                               u16 dev_name_len;
-
-                               rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen, P2P_ATTR_DEVICE_INFO, pattr_content, (uint*)&attr_contentlen);
-
-                               memcpy(psta->dev_addr,  pattr_content, ETH_ALEN);/* P2P Device Address */
-
-                               pattr_content += ETH_ALEN;
-
-                               memcpy(&psta->config_methods, pattr_content, 2);/* Config Methods */
-                               psta->config_methods = be16_to_cpu(psta->config_methods);
-
-                               pattr_content += 2;
-
-                               memcpy(psta->primary_dev_type, pattr_content, 8);
-
-                               pattr_content += 8;
-
-                               num_of_secdev_type = *pattr_content;
-                               pattr_content += 1;
-
-                               if (num_of_secdev_type == 0)
-                               {
-                                       psta->num_of_secdev_type = 0;
-                               }
-                               else
-                               {
-                                       u32 len;
-
-                                       psta->num_of_secdev_type = num_of_secdev_type;
-
-                                       len = (sizeof(psta->secdev_types_list)<(num_of_secdev_type*8)) ? (sizeof(psta->secdev_types_list)) : (num_of_secdev_type*8);
-
-                                       memcpy(psta->secdev_types_list, pattr_content, len);
-
-                                       pattr_content += (num_of_secdev_type*8);
-                               }
-
-                               /* dev_name_len = attr_contentlen - ETH_ALEN - 2 - 8 - 1 - (num_of_secdev_type*8); */
-                               psta->dev_name_len = 0;
-                               if (WPS_ATTR_DEVICE_NAME == be16_to_cpu(*(u16*)pattr_content))
-                               {
-                                       dev_name_len = be16_to_cpu(*(u16*)(pattr_content+2));
-
-                                       psta->dev_name_len = (sizeof(psta->dev_name)<dev_name_len) ? sizeof(psta->dev_name):dev_name_len;
-
-                                       memcpy(psta->dev_name, pattr_content+4, psta->dev_name_len);
-                               }
-
-                               kfree(pbuf);
-
-                       }
-
-               }
-
-               /* Get the next P2P IE */
-               p2p_ie = rtw_get_p2p_ie23a(p2p_ie+p2p_ielen, ies_len -(p2p_ie -ies + p2p_ielen), NULL, &p2p_ielen);
-
-       }
-
-       return status_code;
-}
-
-u32 process_p2p_devdisc_req23a(struct wifidirect_info *pwdinfo, u8 *pframe,
-                           uint len)
-{
-       u8 *frame_body;
-       u8 status, dialogToken;
-       struct sta_info *psta = NULL;
-       struct rtw_adapter *padapter = pwdinfo->padapter;
-       struct sta_priv *pstapriv = &padapter->stapriv;
-       u8 *p2p_ie;
-       u32     p2p_ielen = 0;
-       struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) pframe;
-
-       frame_body = (unsigned char *)
-               (pframe + sizeof(struct ieee80211_hdr_3addr));
-
-       dialogToken = frame_body[7];
-       status = P2P_STATUS_FAIL_UNKNOWN_P2PGROUP;
-
-       if ((p2p_ie = rtw_get_p2p_ie23a(frame_body + _PUBLIC_ACTION_IE_OFFSET_,
-                                    len - _PUBLIC_ACTION_IE_OFFSET_, NULL,
-                                    &p2p_ielen))) {
-               u8 groupid[38] = { 0x00 };
-               u8 dev_addr[ETH_ALEN] = { 0x00 };
-               u32 attr_contentlen = 0;
-
-               if (rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen,
-                                            P2P_ATTR_GROUP_ID, groupid,
-                                            &attr_contentlen)) {
-                       if (!memcmp(pwdinfo->device_addr, groupid, ETH_ALEN) &&
-                           !memcmp(pwdinfo->p2p_group_ssid, groupid + ETH_ALEN,
-                                   pwdinfo->p2p_group_ssid_len)) {
-                               attr_contentlen = 0;
-
-                               if (rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen,
-                                                            P2P_ATTR_DEVICE_ID,
-                                                            dev_addr,
-                                                            &attr_contentlen)) {
-                                       struct list_head *phead, *plist, *ptmp;
-
-                                       spin_lock_bh(&pstapriv->asoc_list_lock);
-                                       phead = &pstapriv->asoc_list;
-
-                                       list_for_each_safe(plist, ptmp, phead) {
-                                               psta = container_of(plist, struct sta_info, asoc_list);
-
-                                               if (psta->is_p2p_device && (psta->dev_cap&P2P_DEVCAP_CLIENT_DISCOVERABILITY) &&
-                                                  !memcmp(psta->dev_addr, dev_addr, ETH_ALEN))
-                                               {
-                                                       /* spin_unlock_bh(&pstapriv->asoc_list_lock); */
-                                                       /* issue GO Discoverability Request */
-                                                       issue_group_disc_req(pwdinfo, psta->hwaddr);
-                                                       /* spin_lock_bh(&pstapriv->asoc_list_lock); */
-                                                       status = P2P_STATUS_SUCCESS;
-                                                       break;
-                                               } else {
-                                                       status = P2P_STATUS_FAIL_INFO_UNAVAILABLE;
-                                               }
-                                       }
-                                       spin_unlock_bh(&pstapriv->asoc_list_lock);
-                               } else {
-                                       status = P2P_STATUS_FAIL_INVALID_PARAM;
-                               }
-                       } else {
-                               status = P2P_STATUS_FAIL_INVALID_PARAM;
-                       }
-               }
-       }
-
-       /* issue Device Discoverability Response */
-       issue_p2p_devdisc_resp(pwdinfo, hdr->addr2, status, dialogToken);
-
-       return (status == P2P_STATUS_SUCCESS) ? true:false;
-}
-
-u32 process_p2p_devdisc_resp23a(struct wifidirect_info *pwdinfo, u8 *pframe, uint len)
-{
-       return true;
-}
-
-u8 process_p2p_provdisc_req23a(struct wifidirect_info *pwdinfo,
-                           u8 *pframe, uint len)
-{
-       u8 *frame_body;
-       u8 *wpsie;
-       u8 *ptr = NULL;
-       uint    wps_ielen = 0, attr_contentlen = 0;
-       u16     uconfig_method = 0;
-       struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)pframe;
-
-       frame_body = (pframe + sizeof(struct ieee80211_hdr_3addr));
-
-       wpsie = rtw_get_wps_ie23a(frame_body + _PUBLIC_ACTION_IE_OFFSET_,
-                              len - _PUBLIC_ACTION_IE_OFFSET_, NULL,
-                              &wps_ielen);
-       if (!wpsie)
-               goto out;
-
-       if (!rtw_get_wps_attr_content23a(wpsie, wps_ielen, WPS_ATTR_CONF_METHOD,
-                                    (u8 *)&uconfig_method, &attr_contentlen))
-               goto out;
-
-       uconfig_method = be16_to_cpu(uconfig_method);
-       ptr = pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req;
-
-       switch (uconfig_method)
-       {
-       case WPS_CM_DISPLYA:
-               memcpy(ptr, "dis", 3);
-               break;
-
-       case WPS_CM_LABEL:
-               memcpy(ptr, "lab", 3);
-               break;
-
-       case WPS_CM_PUSH_BUTTON:
-               memcpy(ptr, "pbc", 3);
-               break;
-
-       case WPS_CM_KEYPAD:
-               memcpy(ptr, "pad", 3);
-               break;
-       }
-       issue_p2p_provision_resp(pwdinfo, hdr->addr2, frame_body,
-                                uconfig_method);
-
-out:
-       DBG_8723A("[%s] config method = %s\n", __func__, ptr);
-
-       return true;
-}
-
-u8 process_p2p_provdisc_resp23a(struct wifidirect_info *pwdinfo,  u8 *pframe)
-{
-
-       return true;
-}
-
-static u8 rtw_p2p_get_peer_ch_list(struct wifidirect_info *pwdinfo, u8 *ch_content, u8 ch_cnt, u8 *peer_ch_list)
-{
-       u8 i = 0, j = 0;
-       u8 temp = 0;
-       u8 ch_no = 0;
-       ch_content += 3;
-       ch_cnt -= 3;
-
-       while(ch_cnt > 0)
-       {
-               ch_content += 1;
-               ch_cnt -= 1;
-               temp = *ch_content;
-               for (i = 0 ; i < temp ; i++, j++)
-               {
-                       peer_ch_list[j] = *(ch_content + 1 + i);
-               }
-               ch_content += (temp + 1);
-               ch_cnt -= (temp + 1);
-               ch_no += temp ;
-       }
-
-       return ch_no;
-}
-
-static u8 rtw_p2p_ch_inclusion(struct mlme_ext_priv *pmlmeext, u8 *peer_ch_list, u8 peer_ch_num, u8 *ch_list_inclusioned)
-{
-       int     i = 0, j = 0, temp = 0;
-       u8 ch_no = 0;
-
-       for (i = 0; i < peer_ch_num; i++)
-       {
-               for (j = temp; j < pmlmeext->max_chan_nums; j++)
-               {
-                       if (*(peer_ch_list + i) == pmlmeext->channel_set[ j ].ChannelNum)
-                       {
-                               ch_list_inclusioned[ ch_no++ ] = *(peer_ch_list + i);
-                               temp = j;
-                               break;
-                       }
-               }
-       }
-
-       return ch_no;
-}
-
-u8 process_p2p_group_negotation_req23a(struct wifidirect_info *pwdinfo, u8 *pframe, uint len)
-{
-       struct rtw_adapter *padapter = pwdinfo->padapter;
-       u8      result = P2P_STATUS_SUCCESS;
-       u32     p2p_ielen = 0, wps_ielen = 0;
-       u8 * ies;
-       u32 ies_len;
-       u8 *p2p_ie;
-       u8 *wpsie;
-       u16             wps_devicepassword_id = 0x0000;
-       uint    wps_devicepassword_id_len = 0;
-#ifdef CONFIG_8723AU_P2P
-       u8      wfd_ie[MAX_WFD_IE_LEN] = { 0x00 };
-       u32     wfd_ielen = 0;
-#endif /*  CONFIG_8723AU_P2P */
-
-       if ((wpsie = rtw_get_wps_ie23a(pframe + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, NULL, &wps_ielen)))
-       {
-               /*      Commented by Kurt 20120113 */
-               /*      If some device wants to do p2p handshake without sending prov_disc_req */
-               /*      We have to get peer_req_cm from here. */
-               if (!memcmp(pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "000", 3))
-               {
-                       rtw_get_wps_attr_content23a(wpsie, wps_ielen, WPS_ATTR_DEVICE_PWID, (u8*) &wps_devicepassword_id, &wps_devicepassword_id_len);
-                       wps_devicepassword_id = be16_to_cpu(wps_devicepassword_id);
-
-                       if (wps_devicepassword_id == WPS_DPID_USER_SPEC)
-                       {
-                               memcpy(pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "dis", 3);
-                       }
-                       else if (wps_devicepassword_id == WPS_DPID_REGISTRAR_SPEC)
-                       {
-                               memcpy(pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "pad", 3);
-                       }
-                       else
-                       {
-                               memcpy(pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, "pbc", 3);
-                       }
-               }
-       }
-       else
-       {
-               DBG_8723A("[%s] WPS IE not Found!!\n", __func__);
-               result = P2P_STATUS_FAIL_INCOMPATIBLE_PARAM;
-               rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_FAIL);
-               return result;
-       }
-
-       if (pwdinfo->ui_got_wps_info == P2P_NO_WPSINFO)
-       {
-               result = P2P_STATUS_FAIL_INFO_UNAVAILABLE;
-               rtw_p2p_set_state(pwdinfo, P2P_STATE_TX_INFOR_NOREADY);
-               return result;
-       }
-
-       ies = pframe + _PUBLIC_ACTION_IE_OFFSET_;
-       ies_len = len - _PUBLIC_ACTION_IE_OFFSET_;
-
-       p2p_ie = rtw_get_p2p_ie23a(ies, ies_len, NULL, &p2p_ielen);
-
-       if (!p2p_ie)
-       {
-               DBG_8723A("[%s] P2P IE not Found!!\n", __func__);
-               result = P2P_STATUS_FAIL_INCOMPATIBLE_PARAM;
-               rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_FAIL);
-       }
-
-       while (p2p_ie)
-       {
-               u8      attr_content = 0x00;
-               u32     attr_contentlen = 0;
-               u8      ch_content[50] = { 0x00 };
-               uint    ch_cnt = 0;
-               u8      peer_ch_list[50] = { 0x00 };
-               u8      peer_ch_num = 0;
-               u8      ch_list_inclusioned[50] = { 0x00 };
-               u8      ch_num_inclusioned = 0;
-               u16     cap_attr;
-
-               rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_ING);
-
-               /* Check P2P Capability ATTR */
-               if (rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen, P2P_ATTR_CAPABILITY, (u8*)&cap_attr, (uint*)&attr_contentlen))
-                       cap_attr = le16_to_cpu(cap_attr);
-
-               if (rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen, P2P_ATTR_GO_INTENT, &attr_content, &attr_contentlen))
-               {
-                       DBG_8723A("[%s] GO Intent = %d, tie = %d\n", __func__, attr_content >> 1, attr_content & 0x01);
-                       pwdinfo->peer_intent = attr_content;    /*      include both intent and tie breaker values. */
-
-                       if (pwdinfo->intent == (pwdinfo->peer_intent >> 1))
-                       {
-                               /*      Try to match the tie breaker value */
-                               if (pwdinfo->intent == P2P_MAX_INTENT)
-                               {
-                                       rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE);
-                                       result = P2P_STATUS_FAIL_BOTH_GOINTENT_15;
-                               }
-                               else
-                               {
-                                       if (attr_content & 0x01)
-                                       {
-                                               rtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT);
-                                       }
-                                       else
-                                       {
-                                               rtw_p2p_set_role(pwdinfo, P2P_ROLE_GO);
-                                       }
-                               }
-                       }
-                       else if (pwdinfo->intent > (pwdinfo->peer_intent >> 1))
-                       {
-                               rtw_p2p_set_role(pwdinfo, P2P_ROLE_GO);
-                       }
-                       else
-                       {
-                               rtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT);
-                       }
-
-                       if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO))
-                       {
-                               /*      Store the group id information. */
-                               memcpy(pwdinfo->groupid_info.go_device_addr, pwdinfo->device_addr, ETH_ALEN);
-                               memcpy(pwdinfo->groupid_info.ssid, pwdinfo->nego_ssid, pwdinfo->nego_ssidlen);
-                       }
-               }
-
-               attr_contentlen = 0;
-               if (rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen, P2P_ATTR_INTENTED_IF_ADDR, pwdinfo->p2p_peer_interface_addr, &attr_contentlen))
-               {
-                       if (attr_contentlen != ETH_ALEN)
-                       {
-                               memset(pwdinfo->p2p_peer_interface_addr, 0x00, ETH_ALEN);
-                       }
-               }
-
-               if (rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen, P2P_ATTR_CH_LIST, ch_content, &ch_cnt))
-               {
-                       peer_ch_num = rtw_p2p_get_peer_ch_list(pwdinfo, ch_content, ch_cnt, peer_ch_list);
-                       ch_num_inclusioned = rtw_p2p_ch_inclusion(&padapter->mlmeextpriv, peer_ch_list, peer_ch_num, ch_list_inclusioned);
-
-                       if (ch_num_inclusioned == 0)
-                       {
-                               DBG_8723A("[%s] No common channel in channel list!\n", __func__);
-                               result = P2P_STATUS_FAIL_NO_COMMON_CH;
-                               rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_FAIL);
-                               break;
-                       }
-
-                       if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO))
-                       {
-                               if (!rtw_p2p_is_channel_list_ok(pwdinfo->operating_channel,
-                                                                                               ch_list_inclusioned, ch_num_inclusioned))
-                               {
-                                       {
-                                               u8 operatingch_info[5] = { 0x00 }, peer_operating_ch = 0;
-                                               attr_contentlen = 0;
-
-                                               if (rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, operatingch_info, &attr_contentlen))
-                                               {
-                                                       peer_operating_ch = operatingch_info[4];
-                                               }
-
-                                               if (rtw_p2p_is_channel_list_ok(peer_operating_ch,
-                                                                                                               ch_list_inclusioned, ch_num_inclusioned))
-                                               {
-                                                       /**
-                                                        *      Change our operating channel as peer's for compatibility.
-                                                        */
-                                                       pwdinfo->operating_channel = peer_operating_ch;
-                                                       DBG_8723A("[%s] Change op ch to %02x as peer's\n", __func__, pwdinfo->operating_channel);
-                                               }
-                                               else
-                                               {
-                                                       /*  Take first channel of ch_list_inclusioned as operating channel */
-                                                       pwdinfo->operating_channel = ch_list_inclusioned[0];
-                                                       DBG_8723A("[%s] Change op ch to %02x\n", __func__, pwdinfo->operating_channel);
-                                               }
-                                       }
-
-                               }
-                       }
-               }
-
-               /* Get the next P2P IE */
-               p2p_ie = rtw_get_p2p_ie23a(p2p_ie+p2p_ielen, ies_len -(p2p_ie -ies + p2p_ielen), NULL, &p2p_ielen);
-       }
-
-#ifdef CONFIG_8723AU_P2P
-       /*      Added by Albert 20110823 */
-       /*      Try to get the TCP port information when receiving the negotiation request. */
-       if (rtw_get_wfd_ie(pframe + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, wfd_ie, &wfd_ielen))
-       {
-               u8      attr_content[ 10 ] = { 0x00 };
-               u32     attr_contentlen = 0;
-
-               DBG_8723A("[%s] WFD IE Found!!\n", __func__);
-               rtw_get_wfd_attr_content(wfd_ie, wfd_ielen, WFD_ATTR_DEVICE_INFO, attr_content, &attr_contentlen);
-               if (attr_contentlen)
-               {
-                       pwdinfo->wfd_info->peer_rtsp_ctrlport = get_unaligned_be16(attr_content + 2);
-                       DBG_8723A("[%s] Peer PORT NUM = %d\n", __func__, pwdinfo->wfd_info->peer_rtsp_ctrlport);
-               }
-       }
-#endif /*  CONFIG_8723AU_P2P */
-
-       return result;
-}
-
-u8 process_p2p_group_negotation_resp23a(struct wifidirect_info *pwdinfo, u8 *pframe, uint len)
-{
-       struct rtw_adapter *padapter = pwdinfo->padapter;
-       u8      result = P2P_STATUS_SUCCESS;
-       u32     p2p_ielen, wps_ielen;
-       u8 * ies;
-       u32 ies_len;
-       u8 * p2p_ie;
-#ifdef CONFIG_8723AU_P2P
-       u8      wfd_ie[MAX_WFD_IE_LEN] = { 0x00 };
-       u32     wfd_ielen = 0;
-#endif /*  CONFIG_8723AU_P2P */
-
-       ies = pframe + _PUBLIC_ACTION_IE_OFFSET_;
-       ies_len = len - _PUBLIC_ACTION_IE_OFFSET_;
-
-       /*      Be able to know which one is the P2P GO and which one is P2P client. */
-
-       if (rtw_get_wps_ie23a(ies, ies_len, NULL, &wps_ielen))
-       {
-
-       }
-       else
-       {
-               DBG_8723A("[%s] WPS IE not Found!!\n", __func__);
-               result = P2P_STATUS_FAIL_INCOMPATIBLE_PARAM;
-               rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_FAIL);
-       }
-
-       p2p_ie = rtw_get_p2p_ie23a(ies, ies_len, NULL, &p2p_ielen);
-       if (!p2p_ie)
-       {
-               rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE);
-               rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_FAIL);
-               result = P2P_STATUS_FAIL_INCOMPATIBLE_PARAM;
-       }
-       else
-       {
-
-               u8      attr_content = 0x00;
-               u32     attr_contentlen = 0;
-               u8      operatingch_info[5] = { 0x00 };
-               u8      groupid[ 38 ];
-               u16     cap_attr;
-               u8      peer_ch_list[50] = { 0x00 };
-               u8      peer_ch_num = 0;
-               u8      ch_list_inclusioned[50] = { 0x00 };
-               u8      ch_num_inclusioned = 0;
-
-               while (p2p_ie)  /*      Found the P2P IE. */
-               {
-
-                       /* Check P2P Capability ATTR */
-                       if (rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen, P2P_ATTR_CAPABILITY, (u8*)&cap_attr, (uint*)&attr_contentlen))
-                               cap_attr = le16_to_cpu(cap_attr);
-
-                       rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen, P2P_ATTR_STATUS, &attr_content, &attr_contentlen);
-                       if (attr_contentlen == 1)
-                       {
-                               DBG_8723A("[%s] Status = %d\n", __func__, attr_content);
-                               if (attr_content == P2P_STATUS_SUCCESS)
-                               {
-                                       /*      Do nothing. */
-                               }
-                               else
-                               {
-                                       if (P2P_STATUS_FAIL_INFO_UNAVAILABLE == attr_content) {
-                                               rtw_p2p_set_state(pwdinfo, P2P_STATE_RX_INFOR_NOREADY);
-                                       } else {
-                                               rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_FAIL);
-                                       }
-                                       rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE);
-                                       result = attr_content;
-                                       break;
-                               }
-                       }
-
-                       /*      Try to get the peer's interface address */
-                       attr_contentlen = 0;
-                       if (rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen, P2P_ATTR_INTENTED_IF_ADDR, pwdinfo->p2p_peer_interface_addr, &attr_contentlen))
-                       {
-                               if (attr_contentlen != ETH_ALEN)
-                               {
-                                       memset(pwdinfo->p2p_peer_interface_addr, 0x00, ETH_ALEN);
-                               }
-                       }
-
-                       /*      Try to get the peer's intent and tie breaker value. */
-                       attr_content = 0x00;
-                       attr_contentlen = 0;
-                       if (rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen, P2P_ATTR_GO_INTENT, &attr_content, &attr_contentlen))
-                       {
-                               DBG_8723A("[%s] GO Intent = %d, tie = %d\n", __func__, attr_content >> 1, attr_content & 0x01);
-                               pwdinfo->peer_intent = attr_content;    /*      include both intent and tie breaker values. */
-
-                               if (pwdinfo->intent == (pwdinfo->peer_intent >> 1))
-                               {
-                                       /*      Try to match the tie breaker value */
-                                       if (pwdinfo->intent == P2P_MAX_INTENT)
-                                       {
-                                               rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE);
-                                               result = P2P_STATUS_FAIL_BOTH_GOINTENT_15;
-                                               rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_FAIL);
-                                       }
-                                       else
-                                       {
-                                               rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_OK);
-                                               rtw_p2p_set_pre_state(pwdinfo, P2P_STATE_GONEGO_OK);
-                                               if (attr_content & 0x01)
-                                               {
-                                                       rtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT);
-                                               }
-                                               else
-                                               {
-                                                       rtw_p2p_set_role(pwdinfo, P2P_ROLE_GO);
-                                               }
-                                       }
-                               }
-                               else if (pwdinfo->intent > (pwdinfo->peer_intent >> 1))
-                               {
-                                       rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_OK);
-                                       rtw_p2p_set_pre_state(pwdinfo, P2P_STATE_GONEGO_OK);
-                                       rtw_p2p_set_role(pwdinfo, P2P_ROLE_GO);
-                               }
-                               else
-                               {
-                                       rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_OK);
-                                       rtw_p2p_set_pre_state(pwdinfo, P2P_STATE_GONEGO_OK);
-                                       rtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT);
-                               }
-
-                               if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO))
-                               {
-                                       /*      Store the group id information. */
-                                       memcpy(pwdinfo->groupid_info.go_device_addr, pwdinfo->device_addr, ETH_ALEN);
-                                       memcpy(pwdinfo->groupid_info.ssid, pwdinfo->nego_ssid, pwdinfo->nego_ssidlen);
-
-                               }
-                       }
-
-                       /*      Try to get the operation channel information */
-
-                       attr_contentlen = 0;
-                       if (rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, operatingch_info, &attr_contentlen))
-                       {
-                               DBG_8723A("[%s] Peer's operating channel = %d\n", __func__, operatingch_info[4]);
-                               pwdinfo->peer_operating_ch = operatingch_info[4];
-                       }
-
-                       /*      Try to get the channel list information */
-                       if (rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen, P2P_ATTR_CH_LIST, pwdinfo->channel_list_attr, &pwdinfo->channel_list_attr_len))
-                       {
-                               DBG_8723A("[%s] channel list attribute found, len = %d\n", __func__,  pwdinfo->channel_list_attr_len);
-
-                               peer_ch_num = rtw_p2p_get_peer_ch_list(pwdinfo, pwdinfo->channel_list_attr, pwdinfo->channel_list_attr_len, peer_ch_list);
-                               ch_num_inclusioned = rtw_p2p_ch_inclusion(&padapter->mlmeextpriv, peer_ch_list, peer_ch_num, ch_list_inclusioned);
-
-                               if (ch_num_inclusioned == 0)
-                               {
-                                       DBG_8723A("[%s] No common channel in channel list!\n", __func__);
-                                       result = P2P_STATUS_FAIL_NO_COMMON_CH;
-                                       rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_FAIL);
-                                       break;
-                               }
-
-                               if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO))
-                               {
-                                       if (!rtw_p2p_is_channel_list_ok(pwdinfo->operating_channel,
-                                                                                                       ch_list_inclusioned, ch_num_inclusioned))
-                                       {
-                                               {
-                                                       u8 operatingch_info[5] = { 0x00 }, peer_operating_ch = 0;
-                                                       attr_contentlen = 0;
-
-                                                       if (rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, operatingch_info, &attr_contentlen))
-                                                       {
-                                                               peer_operating_ch = operatingch_info[4];
-                                                       }
-
-                                                       if (rtw_p2p_is_channel_list_ok(peer_operating_ch,
-                                                                                                                       ch_list_inclusioned, ch_num_inclusioned))
-                                                       {
-                                                               /**
-                                                                *      Change our operating channel as peer's for compatibility.
-                                                                */
-                                                               pwdinfo->operating_channel = peer_operating_ch;
-                                                               DBG_8723A("[%s] Change op ch to %02x as peer's\n", __func__, pwdinfo->operating_channel);
-                                                       }
-                                                       else
-                                                       {
-                                                               /*  Take first channel of ch_list_inclusioned as operating channel */
-                                                               pwdinfo->operating_channel = ch_list_inclusioned[0];
-                                                               DBG_8723A("[%s] Change op ch to %02x\n", __func__, pwdinfo->operating_channel);
-                                                       }
-                                               }
-
-                                       }
-                               }
-
-                       }
-                       else
-                       {
-                               DBG_8723A("[%s] channel list attribute not found!\n", __func__);
-                       }
-
-                       /*      Try to get the group id information if peer is GO */
-                       attr_contentlen = 0;
-                       memset(groupid, 0x00, 38);
-                       if (rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen, P2P_ATTR_GROUP_ID, groupid, &attr_contentlen))
-                       {
-                               memcpy(pwdinfo->groupid_info.go_device_addr, &groupid[0], ETH_ALEN);
-                               memcpy(pwdinfo->groupid_info.ssid, &groupid[6], attr_contentlen - ETH_ALEN);
-                       }
-
-                       /* Get the next P2P IE */
-                       p2p_ie = rtw_get_p2p_ie23a(p2p_ie+p2p_ielen, ies_len -(p2p_ie -ies + p2p_ielen), NULL, &p2p_ielen);
-               }
-
-       }
-
-#ifdef CONFIG_8723AU_P2P
-       /*      Added by Albert 20111122 */
-       /*      Try to get the TCP port information when receiving the negotiation response. */
-       if (rtw_get_wfd_ie(pframe + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, wfd_ie, &wfd_ielen))
-       {
-               u8      attr_content[ 10 ] = { 0x00 };
-               u32     attr_contentlen = 0;
-
-               DBG_8723A("[%s] WFD IE Found!!\n", __func__);
-               rtw_get_wfd_attr_content(wfd_ie, wfd_ielen, WFD_ATTR_DEVICE_INFO, attr_content, &attr_contentlen);
-               if (attr_contentlen)
-               {
-                       pwdinfo->wfd_info->peer_rtsp_ctrlport = get_unaligned_be16(attr_content + 2);
-                       DBG_8723A("[%s] Peer PORT NUM = %d\n", __func__, pwdinfo->wfd_info->peer_rtsp_ctrlport);
-               }
-       }
-#endif /*  CONFIG_8723AU_P2P */
-
-       return result;
-}
-
-u8 process_p2p_group_negotation_confirm23a(struct wifidirect_info *pwdinfo, u8 *pframe, uint len)
-{
-       u8 * ies;
-       u32 ies_len;
-       u8 * p2p_ie;
-       u32     p2p_ielen = 0;
-       u8      result = P2P_STATUS_SUCCESS;
-       ies = pframe + _PUBLIC_ACTION_IE_OFFSET_;
-       ies_len = len - _PUBLIC_ACTION_IE_OFFSET_;
-
-       p2p_ie = rtw_get_p2p_ie23a(ies, ies_len, NULL, &p2p_ielen);
-       while (p2p_ie)  /*      Found the P2P IE. */
-       {
-               u8      attr_content = 0x00, operatingch_info[5] = { 0x00 };
-               u8      groupid[ 38 ] = { 0x00 };
-               u32     attr_contentlen = 0;
-
-               pwdinfo->negotiation_dialog_token = 1;
-               rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen, P2P_ATTR_STATUS, &attr_content, &attr_contentlen);
-               if (attr_contentlen == 1)
-               {
-                       DBG_8723A("[%s] Status = %d\n", __func__, attr_content);
-                       result = attr_content;
-
-                       if (attr_content == P2P_STATUS_SUCCESS)
-                       {
-                               del_timer_sync(&pwdinfo->restore_p2p_state_timer);
-
-                               /*      Commented by Albert 20100911 */
-                               /*      Todo: Need to handle the case which both Intents are the same. */
-                               rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_OK);
-                               rtw_p2p_set_pre_state(pwdinfo, P2P_STATE_GONEGO_OK);
-                               if ((pwdinfo->intent) > (pwdinfo->peer_intent >> 1))
-                               {
-                                       rtw_p2p_set_role(pwdinfo, P2P_ROLE_GO);
-                               }
-                               else if ((pwdinfo->intent) < (pwdinfo->peer_intent >> 1))
-                               {
-                                       rtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT);
-                               }
-                               else
-                               {
-                                       /*      Have to compare the Tie Breaker */
-                                       if (pwdinfo->peer_intent & 0x01)
-                                       {
-                                               rtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT);
-                                       }
-                                       else
-                                       {
-                                               rtw_p2p_set_role(pwdinfo, P2P_ROLE_GO);
-                                       }
-                               }
-                       }
-                       else
-                       {
-                               rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE);
-                               rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_FAIL);
-                               break;
-                       }
-               }
-
-               /*      Try to get the group id information */
-               attr_contentlen = 0;
-               memset(groupid, 0x00, 38);
-               if (rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen, P2P_ATTR_GROUP_ID, groupid, &attr_contentlen))
-               {
-                       DBG_8723A("[%s] Ssid = %s, ssidlen = %zu\n", __func__, &groupid[ETH_ALEN], strlen(&groupid[ETH_ALEN]));
-                       memcpy(pwdinfo->groupid_info.go_device_addr, &groupid[0], ETH_ALEN);
-                       memcpy(pwdinfo->groupid_info.ssid, &groupid[6], attr_contentlen - ETH_ALEN);
-               }
-
-               attr_contentlen = 0;
-               if (rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, operatingch_info, &attr_contentlen))
-               {
-                       DBG_8723A("[%s] Peer's operating channel = %d\n", __func__, operatingch_info[4]);
-                       pwdinfo->peer_operating_ch = operatingch_info[4];
-               }
-
-               /* Get the next P2P IE */
-               p2p_ie = rtw_get_p2p_ie23a(p2p_ie+p2p_ielen, ies_len -(p2p_ie -ies + p2p_ielen), NULL, &p2p_ielen);
-
-       }
-
-       return result;
-}
-
-u8 process_p2p_presence_req23a(struct wifidirect_info *pwdinfo, u8 *pframe, uint len)
-{
-       u8 *frame_body;
-       u8 dialogToken = 0;
-       u8 status = P2P_STATUS_SUCCESS;
-       struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) pframe;
-
-       frame_body = (unsigned char *)(pframe + sizeof(struct ieee80211_hdr_3addr));
-
-       dialogToken = frame_body[6];
-
-       /* todo: check NoA attribute */
-
-       issue_p2p_presence_resp(pwdinfo, hdr->addr2, status, dialogToken);
-
-       return true;
-}
-
-static void find_phase_handler(struct rtw_adapter *padapter)
-{
-       struct wifidirect_info  *pwdinfo = &padapter->wdinfo;
-       struct mlme_priv                *pmlmepriv = &padapter->mlmepriv;
-       struct cfg80211_ssid ssid;
-       u8                                      _status = 0;
-
-
-
-       memset((unsigned char*)&ssid, 0, sizeof(struct cfg80211_ssid));
-       memcpy(ssid.ssid, pwdinfo->p2p_wildcard_ssid, P2P_WILDCARD_SSID_LEN);
-       ssid.ssid_len = P2P_WILDCARD_SSID_LEN;
-
-       rtw_p2p_set_state(pwdinfo, P2P_STATE_FIND_PHASE_SEARCH);
-
-       spin_lock_bh(&pmlmepriv->lock);
-       _status = rtw_sitesurvey_cmd23a(padapter, &ssid, 1, NULL, 0);
-       spin_unlock_bh(&pmlmepriv->lock);
-
-
-}
-
-void p2p_concurrent_handler(struct rtw_adapter* padapter);
-
-static void restore_p2p_state_handler(struct rtw_adapter *padapter)
-{
-       struct wifidirect_info  *pwdinfo = &padapter->wdinfo;
-
-       if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_ING) || rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_FAIL))
-               rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE);
-
-       rtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo));
-
-       if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_DEVICE)) {
-               /*      In the P2P client mode, the driver should not switch back to its listen channel */
-               /*      because this P2P client should stay at the operating channel of P2P GO. */
-               set_channel_bwmode23a(padapter, pwdinfo->listen_channel, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20);
-       }
-}
-
-static void pre_tx_invitereq_handler(struct rtw_adapter *padapter)
-{
-       struct wifidirect_info  *pwdinfo = &padapter->wdinfo;
-
-       set_channel_bwmode23a(padapter, pwdinfo->invitereq_info.peer_ch, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20);
-       rtl8723a_mlme_sitesurvey(padapter, 1);
-       issue23a_probereq_p2p(padapter, NULL);
-       mod_timer(&pwdinfo->pre_tx_scan_timer,
-                 jiffies + msecs_to_jiffies(P2P_TX_PRESCAN_TIMEOUT));
-}
-
-static void pre_tx_provdisc_handler(struct rtw_adapter *padapter)
-{
-       struct wifidirect_info  *pwdinfo = &padapter->wdinfo;
-
-       set_channel_bwmode23a(padapter,
-                             pwdinfo->tx_prov_disc_info.peer_channel_num[0],
-                             HAL_PRIME_CHNL_OFFSET_DONT_CARE,
-                             HT_CHANNEL_WIDTH_20);
-       rtl8723a_mlme_sitesurvey(padapter, 1);
-       issue23a_probereq_p2p(padapter, NULL);
-       mod_timer(&pwdinfo->pre_tx_scan_timer,
-                 jiffies + msecs_to_jiffies(P2P_TX_PRESCAN_TIMEOUT));
-}
-
-static void pre_tx_negoreq_handler(struct rtw_adapter *padapter)
-{
-       struct wifidirect_info  *pwdinfo = &padapter->wdinfo;
-
-       set_channel_bwmode23a(padapter,
-                             pwdinfo->nego_req_info.peer_channel_num[0],
-                             HAL_PRIME_CHNL_OFFSET_DONT_CARE,
-                             HT_CHANNEL_WIDTH_20);
-       rtl8723a_mlme_sitesurvey(padapter, 1);
-       issue23a_probereq_p2p(padapter, NULL);
-       mod_timer(&pwdinfo->pre_tx_scan_timer,
-                 jiffies + msecs_to_jiffies(P2P_TX_PRESCAN_TIMEOUT));
-}
-
-static void ro_ch_handler(struct rtw_adapter *padapter)
-{
-       struct cfg80211_wifidirect_info *pcfg80211_wdinfo = &padapter->cfg80211_wdinfo;
-       struct wifidirect_info *pwdinfo = &padapter->wdinfo;
-       struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
-
-       if (pcfg80211_wdinfo->restore_channel != pmlmeext->cur_channel) {
-               if (!check_fwstate(&padapter->mlmepriv, _FW_LINKED))
-                       pmlmeext->cur_channel = pcfg80211_wdinfo->restore_channel;
-
-               set_channel_bwmode23a(padapter, pmlmeext->cur_channel,
-                                     HAL_PRIME_CHNL_OFFSET_DONT_CARE,
-                                     HT_CHANNEL_WIDTH_20);
-       }
-
-       rtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo));
-
-       pcfg80211_wdinfo->is_ro_ch = false;
-
-       DBG_8723A("cfg80211_remain_on_channel_expired\n");
-
-       rtw_cfg80211_remain_on_channel_expired(padapter,
-               pcfg80211_wdinfo->remain_on_ch_cookie,
-               &pcfg80211_wdinfo->remain_on_ch_channel,
-               pcfg80211_wdinfo->remain_on_ch_type, GFP_KERNEL);
-}
-
-static void ro_ch_timer_process (unsigned long data)
-{
-       struct rtw_adapter *adapter = (struct rtw_adapter *)data;
-
-       p2p_protocol_wk_cmd23a(adapter, P2P_RO_CH_WK);
-}
-
-#ifdef CONFIG_8723AU_P2P
-void rtw_append_wfd_ie(struct rtw_adapter *padapter, u8 *buf, u32* len)
-{
-       unsigned char   *frame_body;
-       u8 category, action, OUI_Subtype, dialogToken = 0;
-       u32     wfdielen = 0;
-
-       frame_body = (unsigned char *)(buf + sizeof(struct ieee80211_hdr_3addr));
-       category = frame_body[0];
-
-       if (category == WLAN_CATEGORY_PUBLIC) {
-               action = frame_body[1];
-               if (action == ACT_PUBLIC_VENDOR &&
-                   !memcmp(frame_body+2, P2P_OUI23A, 4)) {
-                       OUI_Subtype = frame_body[6];
-                       dialogToken = frame_body[7];
-                       switch (OUI_Subtype)/* OUI Subtype */ {
-                       case P2P_GO_NEGO_REQ:
-                               wfdielen = build_nego_req_wfd_ie(&padapter->wdinfo, buf + (*len));
-                               (*len) += wfdielen;
-                               break;
-                       case P2P_GO_NEGO_RESP:
-                               wfdielen = build_nego_resp_wfd_ie(&padapter->wdinfo, buf + (*len));
-                               (*len) += wfdielen;
-                               break;
-                       case P2P_GO_NEGO_CONF:
-                               wfdielen = build_nego_confirm_wfd_ie(&padapter->wdinfo, buf + (*len));
-                               (*len) += wfdielen;
-                               break;
-                       case P2P_INVIT_REQ:
-                               wfdielen = build_invitation_req_wfd_ie(&padapter->wdinfo, buf + (*len));
-                               (*len) += wfdielen;
-                               break;
-                       case P2P_INVIT_RESP:
-                               wfdielen = build_invitation_resp_wfd_ie(&padapter->wdinfo, buf + (*len));
-                               (*len) += wfdielen;
-                               break;
-                       case P2P_DEVDISC_REQ:
-                               break;
-                       case P2P_DEVDISC_RESP:
-                               break;
-                       case P2P_PROVISION_DISC_REQ:
-                               wfdielen = build_provdisc_req_wfd_ie(&padapter->wdinfo, buf + (*len));
-                               (*len) += wfdielen;
-                               break;
-                       case P2P_PROVISION_DISC_RESP:
-                               wfdielen = build_provdisc_resp_wfd_ie(&padapter->wdinfo, buf + (*len));
-                               (*len) += wfdielen;
-                               break;
-                       default:
-                               break;
-                       }
-               }
-       } else if (category == WLAN_CATEGORY_VENDOR_SPECIFIC) {
-               OUI_Subtype = frame_body[5];
-               dialogToken = frame_body[6];
-       } else {
-               DBG_8723A("%s, action frame category =%d\n", __func__, category);
-       }
-}
-#endif
-
-int rtw_p2p_check_frames(struct rtw_adapter *padapter, const u8 *buf, u32 len, u8 tx)
-{
-       int is_p2p_frame = (-1);
-       unsigned char   *frame_body;
-       u8 category, action, OUI_Subtype, dialogToken = 0;
-       u8 *p2p_ie = NULL;
-       uint p2p_ielen = 0;
-       struct rtw_wdev_priv *pwdev_priv = wdev_to_priv(padapter->rtw_wdev);
-
-       frame_body = (unsigned char *)(buf + sizeof(struct ieee80211_hdr_3addr));
-       category = frame_body[0];
-       /* just for check */
-       if (category == WLAN_CATEGORY_PUBLIC)
-       {
-               action = frame_body[1];
-               if (action == ACT_PUBLIC_VENDOR &&
-                   !memcmp(frame_body+2, P2P_OUI23A, 4)) {
-                       OUI_Subtype = frame_body[6];
-                       dialogToken = frame_body[7];
-                       is_p2p_frame = OUI_Subtype;
-                       p2p_ie = rtw_get_p2p_ie23a(
-                               (u8 *)buf+sizeof(struct ieee80211_hdr_3addr)+_PUBLIC_ACTION_IE_OFFSET_,
-                               len-sizeof(struct ieee80211_hdr_3addr)-_PUBLIC_ACTION_IE_OFFSET_,
-                               NULL, &p2p_ielen);
-
-                       switch (OUI_Subtype) {/* OUI Subtype */
-                       u8 *cont;
-                       uint cont_len;
-                       case P2P_GO_NEGO_REQ:
-                               DBG_8723A("RTW_%s:P2P_GO_NEGO_REQ, dialogToken =%d\n", (tx == true)?"Tx":"Rx", dialogToken);
-                               break;
-                       case P2P_GO_NEGO_RESP:
-                               cont = rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen, P2P_ATTR_STATUS, NULL, &cont_len);
-                               DBG_8723A("RTW_%s:P2P_GO_NEGO_RESP, dialogToken =%d, status:%d\n", (tx == true)?"Tx":"Rx", dialogToken, cont?*cont:-1);
-
-                               if (!tx)
-                                       pwdev_priv->provdisc_req_issued = false;
-                               break;
-                       case P2P_GO_NEGO_CONF:
-                               cont = rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen, P2P_ATTR_STATUS, NULL, &cont_len);
-                               DBG_8723A("RTW_%s:P2P_GO_NEGO_CONF, dialogToken =%d, status:%d\n",
-                                         (tx == true)?"Tx":"Rx", dialogToken, cont?*cont:-1);
-                               break;
-                       case P2P_INVIT_REQ:
-                       {
-                               struct rtw_wdev_invit_info* invit_info = &pwdev_priv->invit_info;
-                               int flags = -1;
-                               int op_ch = 0;
-
-                               if ((cont = rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen, P2P_ATTR_INVITATION_FLAGS, NULL, &cont_len)))
-                                       flags = *cont;
-                               if ((cont = rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, NULL, &cont_len)))
-                                       op_ch = *(cont+4);
-
-                               if (invit_info->token != dialogToken)
-                                       rtw_wdev_invit_info_init(invit_info);
-
-                               invit_info->token = dialogToken;
-                               invit_info->flags = (flags ==-1) ? 0x0 : flags;
-                               invit_info->req_op_ch = op_ch;
-
-                               DBG_8723A("RTW_%s:P2P_INVIT_REQ, dialogToken =%d, flags:0x%02x, op_ch:%d\n",
-                                         (tx) ? "Tx" : "Rx", dialogToken, flags, op_ch);
-                               break;
-                       }
-                       case P2P_INVIT_RESP:
-                       {
-                               struct rtw_wdev_invit_info* invit_info = &pwdev_priv->invit_info;
-                               int status = -1;
-                               int op_ch = 0;
-
-                               if ((cont = rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen, P2P_ATTR_STATUS, NULL, &cont_len)))
-                                       status = *cont;
-                               if ((cont = rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen, P2P_ATTR_OPERATING_CH, NULL, &cont_len)))
-                                       op_ch = *(cont+4);
-
-                               if (invit_info->token != dialogToken) {
-                                       rtw_wdev_invit_info_init(invit_info);
-                               } else {
-                                       invit_info->token = 0;
-                                       invit_info->status = (status ==-1) ? 0xff : status;
-                                       invit_info->rsp_op_ch = op_ch;
-                               }
-
-                               DBG_8723A("RTW_%s:P2P_INVIT_RESP, dialogToken =%d, status:%d, op_ch:%d\n",
-                                         (tx == true)?"Tx":"Rx", dialogToken, status, op_ch);
-                               break;
-                       }
-                       case P2P_DEVDISC_REQ:
-                               DBG_8723A("RTW_%s:P2P_DEVDISC_REQ, dialogToken =%d\n", (tx == true)?"Tx":"Rx", dialogToken);
-                               break;
-                       case P2P_DEVDISC_RESP:
-                               cont = rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen, P2P_ATTR_STATUS, NULL, &cont_len);
-                               DBG_8723A("RTW_%s:P2P_DEVDISC_RESP, dialogToken =%d, status:%d\n", (tx == true)?"Tx":"Rx", dialogToken, cont?*cont:-1);
-                               break;
-                       case P2P_PROVISION_DISC_REQ:
-                       {
-                               size_t frame_body_len = len - sizeof(struct ieee80211_hdr_3addr);
-                               u8 *p2p_ie;
-                               uint p2p_ielen = 0;
-                               uint contentlen = 0;
-
-                               DBG_8723A("RTW_%s:P2P_PROVISION_DISC_REQ, dialogToken =%d\n", (tx == true)?"Tx":"Rx", dialogToken);
-
-                               pwdev_priv->provdisc_req_issued = false;
-
-                               p2p_ie = rtw_get_p2p_ie23a(frame_body + _PUBLIC_ACTION_IE_OFFSET_,
-                                                          frame_body_len - _PUBLIC_ACTION_IE_OFFSET_,
-                                                          NULL, &p2p_ielen);
-                               if (p2p_ie) {
-                                       if (rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen, P2P_ATTR_GROUP_ID, NULL, &contentlen))
-                                               pwdev_priv->provdisc_req_issued = false;/* case: p2p_client join p2p GO */
-                                       else
-                                               pwdev_priv->provdisc_req_issued = true;/* case: p2p_devices connection before Nego req. */
-                               }
-                       }
-                               break;
-                       case P2P_PROVISION_DISC_RESP:
-                               DBG_8723A("RTW_%s:P2P_PROVISION_DISC_RESP, dialogToken =%d\n", (tx == true)?"Tx":"Rx", dialogToken);
-                               break;
-                       default:
-                               DBG_8723A("RTW_%s:OUI_Subtype =%d, dialogToken =%d\n", (tx == true)?"Tx":"Rx", OUI_Subtype, dialogToken);
-                               break;
-                       }
-
-               }
-
-       }
-       else if (category == WLAN_CATEGORY_VENDOR_SPECIFIC)
-       {
-               OUI_Subtype = frame_body[5];
-               dialogToken = frame_body[6];
-
-               is_p2p_frame = OUI_Subtype;
-
-               switch (OUI_Subtype) {
-               case P2P_NOTICE_OF_ABSENCE:
-                       DBG_8723A("RTW_%s:P2P_NOTICE_OF_ABSENCE, dialogToken =%d\n", (tx == true)?"TX":"RX", dialogToken);
-                       break;
-               case P2P_PRESENCE_REQUEST:
-                       DBG_8723A("RTW_%s:P2P_PRESENCE_REQUEST, dialogToken =%d\n", (tx == true)?"TX":"RX", dialogToken);
-                       break;
-               case P2P_PRESENCE_RESPONSE:
-                       DBG_8723A("RTW_%s:P2P_PRESENCE_RESPONSE, dialogToken =%d\n", (tx == true)?"TX":"RX", dialogToken);
-                       break;
-               case P2P_GO_DISC_REQUEST:
-                       DBG_8723A("RTW_%s:P2P_GO_DISC_REQUEST, dialogToken =%d\n", (tx == true)?"TX":"RX", dialogToken);
-                       break;
-               default:
-                       DBG_8723A("RTW_%s:OUI_Subtype =%d, dialogToken =%d\n", (tx == true)?"TX":"RX", OUI_Subtype, dialogToken);
-                       break;
-               }
-
-       } else {
-               DBG_8723A("RTW_%s:action frame category =%d\n", (tx == true)?"TX":"RX", category);
-       }
-       return is_p2p_frame;
-}
-
-void rtw_init_cfg80211_wifidirect_info(struct rtw_adapter *padapter)
-{
-       struct cfg80211_wifidirect_info *pcfg80211_wdinfo = &padapter->cfg80211_wdinfo;
-
-       memset(pcfg80211_wdinfo, 0x00, sizeof(struct cfg80211_wifidirect_info));
-
-       setup_timer(&pcfg80211_wdinfo->remain_on_ch_timer,
-                   ro_ch_timer_process, (unsigned long)padapter);
-}
-
-void p2p_protocol_wk_hdl23a(struct rtw_adapter *padapter, int intCmdType)
-{
-       switch (intCmdType) {
-       case P2P_FIND_PHASE_WK:
-               find_phase_handler(padapter);
-               break;
-       case P2P_RESTORE_STATE_WK:
-               restore_p2p_state_handler(padapter);
-               break;
-       case P2P_PRE_TX_PROVDISC_PROCESS_WK:
-               pre_tx_provdisc_handler(padapter);
-               break;
-       case P2P_PRE_TX_INVITEREQ_PROCESS_WK:
-               pre_tx_invitereq_handler(padapter);
-               break;
-       case P2P_PRE_TX_NEGOREQ_PROCESS_WK:
-               pre_tx_negoreq_handler(padapter);
-               break;
-       case P2P_RO_CH_WK:
-               ro_ch_handler(padapter);
-               break;
-       }
-}
-
-#ifdef CONFIG_8723AU_P2P
-void process_p2p_ps_ie23a(struct rtw_adapter *padapter, u8 *IEs, u32 IELength)
-{
-       u8 * ies;
-       u32 ies_len;
-       u8 * p2p_ie;
-       u32     p2p_ielen = 0;
-       u8      noa_attr[MAX_P2P_IE_LEN] = { 0x00 };/*  NoA length should be n*(13) + 2 */
-       u32     attr_contentlen = 0;
-
-       struct wifidirect_info  *pwdinfo = &padapter->wdinfo;
-       u8      find_p2p = false, find_p2p_ps = false;
-       u8      noa_offset, noa_num, noa_index;
-
-
-
-       if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))
-       {
-               return;
-       }
-       if (IELength <= _BEACON_IE_OFFSET_)
-               return;
-
-       ies = IEs + _BEACON_IE_OFFSET_;
-       ies_len = IELength - _BEACON_IE_OFFSET_;
-
-       p2p_ie = rtw_get_p2p_ie23a(ies, ies_len, NULL, &p2p_ielen);
-
-       while(p2p_ie)
-       {
-               find_p2p = true;
-               /*  Get Notice of Absence IE. */
-               if (rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen, P2P_ATTR_NOA, noa_attr, &attr_contentlen))
-               {
-                       find_p2p_ps = true;
-                       noa_index = noa_attr[0];
-
-                       if ((pwdinfo->p2p_ps_mode == P2P_PS_NONE) ||
-                               (noa_index != pwdinfo->noa_index))/*  if index change, driver should reconfigure related setting. */
-                       {
-                               pwdinfo->noa_index = noa_index;
-                               pwdinfo->opp_ps = noa_attr[1] >> 7;
-                               pwdinfo->ctwindow = noa_attr[1] & 0x7F;
-
-                               noa_offset = 2;
-                               noa_num = 0;
-                               /*  NoA length should be n*(13) + 2 */
-                               if (attr_contentlen > 2)
-                               {
-                                       while(noa_offset < attr_contentlen)
-                                       {
-                                               /* memcpy(&wifidirect_info->noa_count[noa_num], &noa_attr[noa_offset], 1); */
-                                               pwdinfo->noa_count[noa_num] = noa_attr[noa_offset];
-                                               noa_offset += 1;
-
-                                               memcpy(&pwdinfo->noa_duration[noa_num], &noa_attr[noa_offset], 4);
-                                               noa_offset += 4;
-
-                                               memcpy(&pwdinfo->noa_interval[noa_num], &noa_attr[noa_offset], 4);
-                                               noa_offset += 4;
-
-                                               memcpy(&pwdinfo->noa_start_time[noa_num], &noa_attr[noa_offset], 4);
-                                               noa_offset += 4;
-
-                                               noa_num++;
-                                       }
-                               }
-                               pwdinfo->noa_num = noa_num;
-
-                               if (pwdinfo->opp_ps == 1)
-                               {
-                                       pwdinfo->p2p_ps_mode = P2P_PS_CTWINDOW;
-                                       /*  driver should wait LPS for entering CTWindow */
-                                       if (padapter->pwrctrlpriv.bFwCurrentInPSMode == true)
-                                       {
-                                               p2p_ps_wk_cmd23a(padapter, P2P_PS_ENABLE, 1);
-                                       }
-                               }
-                               else if (pwdinfo->noa_num > 0)
-                               {
-                                       pwdinfo->p2p_ps_mode = P2P_PS_NOA;
-                                       p2p_ps_wk_cmd23a(padapter, P2P_PS_ENABLE, 1);
-                               }
-                               else if (pwdinfo->p2p_ps_mode > P2P_PS_NONE)
-                               {
-                                       p2p_ps_wk_cmd23a(padapter, P2P_PS_DISABLE, 1);
-                               }
-                       }
-
-                       break; /*  find target, just break. */
-               }
-
-               /* Get the next P2P IE */
-               p2p_ie = rtw_get_p2p_ie23a(p2p_ie+p2p_ielen, ies_len -(p2p_ie -ies + p2p_ielen), NULL, &p2p_ielen);
-
-       }
-
-       if (find_p2p == true)
-       {
-               if ((pwdinfo->p2p_ps_mode > P2P_PS_NONE) && (find_p2p_ps == false))
-               {
-                       p2p_ps_wk_cmd23a(padapter, P2P_PS_DISABLE, 1);
-               }
-       }
-
-
-}
-
-void p2p_ps_wk_hdl23a(struct rtw_adapter *padapter, u8 p2p_ps_state)
-{
-       struct pwrctrl_priv             *pwrpriv = &padapter->pwrctrlpriv;
-       struct wifidirect_info *pwdinfo = &padapter->wdinfo;
-
-
-
-       /*  Pre action for p2p state */
-       switch (p2p_ps_state)
-       {
-       case P2P_PS_DISABLE:
-               pwdinfo->p2p_ps_state = p2p_ps_state;
-
-               rtl8723a_set_p2p_ps_offload_cmd(padapter, p2p_ps_state);
-
-               pwdinfo->noa_index = 0;
-               pwdinfo->ctwindow = 0;
-               pwdinfo->opp_ps = 0;
-               pwdinfo->noa_num = 0;
-               pwdinfo->p2p_ps_mode = P2P_PS_NONE;
-               if (padapter->pwrctrlpriv.bFwCurrentInPSMode == true) {
-                       if (pwrpriv->smart_ps == 0) {
-                               pwrpriv->smart_ps = 2;
-                               rtl8723a_set_FwPwrMode_cmd(padapter, padapter->pwrctrlpriv.pwr_mode);
-                       }
-               }
-               break;
-       case P2P_PS_ENABLE:
-               if (pwdinfo->p2p_ps_mode > P2P_PS_NONE) {
-                       pwdinfo->p2p_ps_state = p2p_ps_state;
-
-                       if (pwdinfo->ctwindow > 0) {
-                               if (pwrpriv->smart_ps != 0) {
-                                       pwrpriv->smart_ps = 0;
-                                       DBG_8723A("%s(): Enter CTW, change "
-                                                 "SmartPS\n", __func__);
-                                       rtl8723a_set_FwPwrMode_cmd(padapter, padapter->pwrctrlpriv.pwr_mode);
-                               }
-                       }
-                       rtl8723a_set_p2p_ps_offload_cmd(padapter,
-                                                       p2p_ps_state);
-               }
-               break;
-       case P2P_PS_SCAN:
-       case P2P_PS_SCAN_DONE:
-       case P2P_PS_ALLSTASLEEP:
-               if (pwdinfo->p2p_ps_mode > P2P_PS_NONE) {
-                       pwdinfo->p2p_ps_state = p2p_ps_state;
-                       rtl8723a_set_p2p_ps_offload_cmd(padapter, p2p_ps_state);
-               }
-               break;
-       default:
-               break;
-       }
-}
-
-u8 p2p_ps_wk_cmd23a(struct rtw_adapter*padapter, u8 p2p_ps_state, u8 enqueue)
-{
-       struct cmd_obj  *ph2c;
-       struct drvextra_cmd_parm        *pdrvextra_cmd_parm;
-       struct wifidirect_info *pwdinfo = &padapter->wdinfo;
-       struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
-       u8      res = _SUCCESS;
-
-
-
-       if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))
-               return res;
-
-       if (enqueue) {
-               ph2c = (struct cmd_obj *)kzalloc(sizeof(struct cmd_obj),
-                                                GFP_ATOMIC);
-               if (!ph2c) {
-                       res = _FAIL;
-                       goto exit;
-               }
-
-               pdrvextra_cmd_parm = (struct drvextra_cmd_parm *)
-                       kzalloc(sizeof(struct drvextra_cmd_parm), GFP_ATOMIC);
-               if (pdrvextra_cmd_parm == NULL) {
-                       kfree(ph2c);
-                       res = _FAIL;
-                       goto exit;
-               }
-
-               pdrvextra_cmd_parm->ec_id = P2P_PS_WK_CID;
-               pdrvextra_cmd_parm->type_size = p2p_ps_state;
-               pdrvextra_cmd_parm->pbuf = NULL;
-
-               init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra));
-
-               res = rtw_enqueue_cmd23a(pcmdpriv, ph2c);
-       }
-       else
-       {
-               p2p_ps_wk_hdl23a(padapter, p2p_ps_state);
-       }
-
-exit:
-
-
-
-       return res;
-}
-#endif /*  CONFIG_8723AU_P2P */
-
-static void reset_ch_sitesurvey_timer_process(unsigned long data)
-{
-       struct rtw_adapter *adapter = (struct rtw_adapter *)data;
-       struct  wifidirect_info *pwdinfo = &adapter->wdinfo;
-
-       if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))
-               return;
-
-       DBG_8723A("[%s] In\n", __func__);
-       /*      Reset the operation channel information */
-       pwdinfo->rx_invitereq_info.operation_ch[0] = 0;
-       pwdinfo->rx_invitereq_info.scan_op_ch_only = 0;
-}
-
-static void reset_ch_sitesurvey_timer_process2(unsigned long data)
-{
-       struct rtw_adapter *adapter = (struct rtw_adapter *)data;
-       struct wifidirect_info *pwdinfo = &adapter->wdinfo;
-
-       if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))
-               return;
-
-       DBG_8723A("[%s] In\n", __func__);
-       /*      Reset the operation channel information */
-       pwdinfo->p2p_info.operation_ch[0] = 0;
-       pwdinfo->p2p_info.scan_op_ch_only = 0;
-}
-
-static void restore_p2p_state_timer_process (unsigned long data)
-{
-       struct rtw_adapter *adapter = (struct rtw_adapter *)data;
-       struct  wifidirect_info         *pwdinfo = &adapter->wdinfo;
-
-       if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))
-               return;
-
-       p2p_protocol_wk_cmd23a(adapter, P2P_RESTORE_STATE_WK);
-}
-
-static void pre_tx_scan_timer_process (unsigned long data)
-{
-       struct rtw_adapter *adapter = (struct rtw_adapter *)data;
-       struct wifidirect_info *pwdinfo = &adapter->wdinfo;
-       struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
-
-       if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))
-               return;
-
-       spin_lock_bh(&pmlmepriv->lock);
-
-       if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_TX_PROVISION_DIS_REQ))
-       {
-               if (true == pwdinfo->tx_prov_disc_info.benable) /*      the provision discovery request frame is trigger to send or not */
-               {
-                       p2p_protocol_wk_cmd23a(adapter, P2P_PRE_TX_PROVDISC_PROCESS_WK);
-                       /* issue23a_probereq_p2p(adapter, NULL); */
-                       /* _set_timer(&pwdinfo->pre_tx_scan_timer, P2P_TX_PRESCAN_TIMEOUT); */
-               }
-       }
-       else if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_GONEGO_ING))
-       {
-               if (true == pwdinfo->nego_req_info.benable)
-               {
-                       p2p_protocol_wk_cmd23a(adapter, P2P_PRE_TX_NEGOREQ_PROCESS_WK);
-               }
-       }
-       else if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_TX_INVITE_REQ))
-       {
-               if (true == pwdinfo->invitereq_info.benable)
-               {
-                       p2p_protocol_wk_cmd23a(adapter, P2P_PRE_TX_INVITEREQ_PROCESS_WK);
-               }
-       }
-       else
-       {
-               DBG_8723A("[%s] p2p_state is %d, ignore!!\n", __func__, rtw_p2p_state(pwdinfo));
-       }
-
-       spin_unlock_bh(&pmlmepriv->lock);
-}
-
-static void find_phase_timer_process (unsigned long data)
-{
-       struct rtw_adapter *adapter = (struct rtw_adapter *)data;
-       struct  wifidirect_info         *pwdinfo = &adapter->wdinfo;
-
-       if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))
-               return;
-
-       adapter->wdinfo.find_phase_state_exchange_cnt++;
-
-       p2p_protocol_wk_cmd23a(adapter, P2P_FIND_PHASE_WK);
-}
-
-void reset_global_wifidirect_info23a(struct rtw_adapter *padapter)
-{
-       struct wifidirect_info  *pwdinfo;
-
-       pwdinfo = &padapter->wdinfo;
-       pwdinfo->persistent_supported = 0;
-       pwdinfo->session_available = true;
-       pwdinfo->wfd_tdls_enable = 0;
-       pwdinfo->wfd_tdls_weaksec = 0;
-}
-
-#ifdef CONFIG_8723AU_P2P
-int rtw_init_wifi_display_info(struct rtw_adapter* padapter)
-{
-       int     res = _SUCCESS;
-       struct wifi_display_info *pwfd_info = &padapter->wfd_info;
-
-       /*  Used in P2P and TDLS */
-       pwfd_info->rtsp_ctrlport = 554;
-       pwfd_info->peer_rtsp_ctrlport = 0;      /*      Reset to 0 */
-       pwfd_info->wfd_enable = false;
-       pwfd_info->wfd_device_type = WFD_DEVINFO_PSINK;
-       pwfd_info->scan_result_type = SCAN_RESULT_P2P_ONLY;
-
-       /*  Used in P2P */
-       pwfd_info->peer_session_avail = true;
-       pwfd_info->wfd_pc = false;
-
-       /*  Used in TDLS */
-       memset(pwfd_info->ip_address, 0x00, 4);
-       memset(pwfd_info->peer_ip_address, 0x00, 4);
-       return res;
-}
-#endif /* CONFIG_8723AU_P2P */
-
-void rtw_init_wifidirect_timers23a(struct rtw_adapter* padapter)
-{
-       struct wifidirect_info *pwdinfo = &padapter->wdinfo;
-
-       setup_timer(&pwdinfo->find_phase_timer, find_phase_timer_process,
-                   (unsigned long)padapter);
-       setup_timer(&pwdinfo->restore_p2p_state_timer,
-                   restore_p2p_state_timer_process, (unsigned long)padapter);
-       setup_timer(&pwdinfo->pre_tx_scan_timer, pre_tx_scan_timer_process,
-                   (unsigned long)padapter);
-       setup_timer(&pwdinfo->reset_ch_sitesurvey,
-                   reset_ch_sitesurvey_timer_process, (unsigned long)padapter);
-       setup_timer(&pwdinfo->reset_ch_sitesurvey2,
-                   reset_ch_sitesurvey_timer_process2,
-                   (unsigned long)padapter);
-}
-
-void rtw_init_wifidirect_addrs23a(struct rtw_adapter* padapter, u8 *dev_addr, u8 *iface_addr)
-{
-#ifdef CONFIG_8723AU_P2P
-       struct wifidirect_info *pwdinfo = &padapter->wdinfo;
-
-       /*init device&interface address */
-       if (dev_addr) {
-               memcpy(pwdinfo->device_addr, dev_addr, ETH_ALEN);
-       }
-       if (iface_addr) {
-               memcpy(pwdinfo->interface_addr, iface_addr, ETH_ALEN);
-       }
-#endif
-}
-
-void init_wifidirect_info23a(struct rtw_adapter *padapter, enum P2P_ROLE role)
-{
-       struct wifidirect_info  *pwdinfo;
-#ifdef CONFIG_8723AU_P2P
-       struct wifi_display_info        *pwfd_info = &padapter->wfd_info;
-#endif
-
-       pwdinfo = &padapter->wdinfo;
-
-       pwdinfo->padapter = padapter;
-
-       /*      1, 6, 11 are the social channel defined in the WiFi Direct specification. */
-       pwdinfo->social_chan[0] = 1;
-       pwdinfo->social_chan[1] = 6;
-       pwdinfo->social_chan[2] = 11;
-       pwdinfo->social_chan[3] = 0;    /*      channel 0 for scanning ending in site survey function. */
-
-       /*      Use the channel 11 as the listen channel */
-       pwdinfo->listen_channel = 11;
-
-       if (role == P2P_ROLE_DEVICE)
-       {
-               rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE);
-               rtw_p2p_set_state(pwdinfo, P2P_STATE_LISTEN);
-               pwdinfo->intent = 1;
-               rtw_p2p_set_pre_state(pwdinfo, P2P_STATE_LISTEN);
-       }
-       else if (role == P2P_ROLE_CLIENT)
-       {
-               rtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT);
-               rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_OK);
-               pwdinfo->intent = 1;
-               rtw_p2p_set_pre_state(pwdinfo, P2P_STATE_GONEGO_OK);
-       }
-       else if (role == P2P_ROLE_GO)
-       {
-               rtw_p2p_set_role(pwdinfo, P2P_ROLE_GO);
-               rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_OK);
-               pwdinfo->intent = 15;
-               rtw_p2p_set_pre_state(pwdinfo, P2P_STATE_GONEGO_OK);
-       }
-
-/*     Use the OFDM rate in the P2P probe response frame. (6(B), 9(B), 12, 18, 24, 36, 48, 54) */
-       pwdinfo->support_rate[0] = 0x8c;        /*      6(B) */
-       pwdinfo->support_rate[1] = 0x92;        /*      9(B) */
-       pwdinfo->support_rate[2] = 0x18;        /*      12 */
-       pwdinfo->support_rate[3] = 0x24;        /*      18 */
-       pwdinfo->support_rate[4] = 0x30;        /*      24 */
-       pwdinfo->support_rate[5] = 0x48;        /*      36 */
-       pwdinfo->support_rate[6] = 0x60;        /*      48 */
-       pwdinfo->support_rate[7] = 0x6c;        /*      54 */
-
-       memcpy((void*) pwdinfo->p2p_wildcard_ssid, "DIRECT-", 7);
-
-       memset(pwdinfo->device_name, 0x00, WPS_MAX_DEVICE_NAME_LEN);
-       pwdinfo->device_name_len = 0;
-
-       memset(&pwdinfo->invitereq_info, 0x00, sizeof(struct tx_invite_req_info));
-       pwdinfo->invitereq_info.token = 3;      /*      Token used for P2P invitation request frame. */
-
-       memset(&pwdinfo->inviteresp_info, 0x00, sizeof(struct tx_invite_resp_info));
-       pwdinfo->inviteresp_info.token = 0;
-
-       pwdinfo->profileindex = 0;
-       memset(&pwdinfo->profileinfo[ 0 ], 0x00, sizeof(struct profile_info) * P2P_MAX_PERSISTENT_GROUP_NUM);
-
-       rtw_p2p_findphase_ex_set(pwdinfo, P2P_FINDPHASE_EX_NONE);
-
-       pwdinfo->listen_dwell = (u8) ((jiffies % 3) + 1);
-       /* DBG_8723A("[%s] listen_dwell time is %d00ms\n", __func__, pwdinfo->listen_dwell); */
-
-       memset(&pwdinfo->tx_prov_disc_info, 0x00, sizeof(struct tx_provdisc_req_info));
-       pwdinfo->tx_prov_disc_info.wps_config_method_request = WPS_CM_NONE;
-
-       memset(&pwdinfo->nego_req_info, 0x00, sizeof(struct tx_nego_req_info));
-
-       pwdinfo->device_password_id_for_nego = WPS_DPID_PBC;
-       pwdinfo->negotiation_dialog_token = 1;
-
-       memset(pwdinfo->nego_ssid, 0x00, IEEE80211_MAX_SSID_LEN);
-       pwdinfo->nego_ssidlen = 0;
-
-       pwdinfo->ui_got_wps_info = P2P_NO_WPSINFO;
-#ifdef CONFIG_8723AU_P2P
-       pwdinfo->supported_wps_cm = WPS_CONFIG_METHOD_DISPLAY  | WPS_CONFIG_METHOD_PBC;
-       pwdinfo->wfd_info = pwfd_info;
-#else
-       pwdinfo->supported_wps_cm = WPS_CONFIG_METHOD_DISPLAY | WPS_CONFIG_METHOD_PBC | WPS_CONFIG_METHOD_KEYPAD;
-#endif /* CONFIG_8723AU_P2P */
-       pwdinfo->channel_list_attr_len = 0;
-       memset(pwdinfo->channel_list_attr, 0x00, 100);
-
-       memset(pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, 0x00, 4);
-       memset(pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req, '0', 3);
-       memset(&pwdinfo->groupid_info, 0x00, sizeof(struct group_id_info));
-       pwdinfo->wfd_tdls_enable = 0;
-       memset(pwdinfo->p2p_peer_interface_addr, 0x00, ETH_ALEN);
-       memset(pwdinfo->p2p_peer_device_addr, 0x00, ETH_ALEN);
-
-       pwdinfo->rx_invitereq_info.operation_ch[0] = 0;
-       pwdinfo->rx_invitereq_info.operation_ch[1] = 0; /*      Used to indicate the scan end in site survey function */
-       pwdinfo->rx_invitereq_info.scan_op_ch_only = 0;
-       pwdinfo->p2p_info.operation_ch[0] = 0;
-       pwdinfo->p2p_info.operation_ch[1] = 0;                  /*      Used to indicate the scan end in site survey function */
-       pwdinfo->p2p_info.scan_op_ch_only = 0;
-}
-
-int rtw_p2p_enable23a(struct rtw_adapter *padapter, enum P2P_ROLE role)
-{
-       struct wifidirect_info *pwdinfo = &padapter->wdinfo;
-       int ret = _SUCCESS;
-
-       if (role == P2P_ROLE_DEVICE || role == P2P_ROLE_CLIENT ||
-           role == P2P_ROLE_GO) {
-               /* leave IPS/Autosuspend */
-               if (_FAIL == rtw_pwr_wakeup(padapter)) {
-                       ret = _FAIL;
-                       goto exit;
-               }
-
-               /*      Added by Albert 2011/03/22 */
-               /*      In the P2P mode, the driver should not support the b mode. */
-               /*      So, the Tx packet shouldn't use the CCK rate */
-               update_tx_basic_rate23a(padapter, WIRELESS_11AGN);
-
-               /* Enable P2P function */
-               init_wifidirect_info23a(padapter, role);
-
-               rtw_hal_set_odm_var23a(padapter, HAL_ODM_P2P_STATE, NULL, true);
-               #ifdef CONFIG_8723AU_P2P
-               rtw_hal_set_odm_var23a(padapter, HAL_ODM_WIFI_DISPLAY_STATE, NULL, true);
-               #endif
-
-       }
-       else if (role == P2P_ROLE_DISABLE)
-       {
-               if (_FAIL == rtw_pwr_wakeup(padapter)) {
-                       ret = _FAIL;
-                       goto exit;
-               }
-
-               /* Disable P2P function */
-               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);
-                       del_timer_sync(&pwdinfo->reset_ch_sitesurvey);
-                       del_timer_sync(&pwdinfo->reset_ch_sitesurvey2);
-                       reset_ch_sitesurvey_timer_process((unsigned long)padapter);
-                       reset_ch_sitesurvey_timer_process2((unsigned long)padapter);
-                       rtw_p2p_set_state(pwdinfo, P2P_STATE_NONE);
-                       rtw_p2p_set_role(pwdinfo, P2P_ROLE_DISABLE);
-                       memset(&pwdinfo->rx_prov_disc_info, 0x00, sizeof(struct rx_provdisc_req_info));
-               }
-
-               rtw_hal_set_odm_var23a(padapter, HAL_ODM_P2P_STATE, NULL, false);
-               #ifdef CONFIG_8723AU_P2P
-               rtw_hal_set_odm_var23a(padapter, HAL_ODM_WIFI_DISPLAY_STATE, NULL, false);
-               #endif
-
-               /* Restore to initial setting. */
-               update_tx_basic_rate23a(padapter, padapter->registrypriv.wireless_mode);
-       }
-
-exit:
-       return ret;
-}
-
-#endif /* CONFIG_8723AU_P2P */
index c14b8193ce02e8e2d5c903f1f7f8a39c8acdc5aa..77880547e80f4599db8c9eb83f7c2af3425b0826 100644 (file)
@@ -109,33 +109,30 @@ static bool rtw_pwr_unassociated_idle(struct rtw_adapter *adapter)
        struct rtw_adapter *buddy = adapter->pbuddy_adapter;
        struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
        struct xmit_priv *pxmit_priv = &adapter->xmitpriv;
-       struct wifidirect_info *pwdinfo = &adapter->wdinfo;
 
        bool ret = false;
 
        if (time_after_eq(adapter->pwrctrlpriv.ips_deny_time, jiffies))
                goto exit;
 
-       if (check_fwstate(pmlmepriv, WIFI_ASOC_STATE|WIFI_SITE_MONITOR)
-               || check_fwstate(pmlmepriv, WIFI_UNDER_LINKING|WIFI_UNDER_WPS)
-               || check_fwstate(pmlmepriv, WIFI_AP_STATE)
-               || check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE|WIFI_ADHOC_STATE)
-               || !rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)
-       ) {
+       if (check_fwstate(pmlmepriv, WIFI_ASOC_STATE|WIFI_SITE_MONITOR) ||
+           check_fwstate(pmlmepriv, WIFI_UNDER_LINKING|WIFI_UNDER_WPS) ||
+           check_fwstate(pmlmepriv, WIFI_AP_STATE) ||
+           check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE|WIFI_ADHOC_STATE)){
                goto exit;
        }
 
        /* consider buddy, if exist */
        if (buddy) {
                struct mlme_priv *b_pmlmepriv = &buddy->mlmepriv;
-               struct wifidirect_info *b_pwdinfo = &buddy->wdinfo;
-
-               if (check_fwstate(b_pmlmepriv, WIFI_ASOC_STATE|WIFI_SITE_MONITOR)
-                       || check_fwstate(b_pmlmepriv, WIFI_UNDER_LINKING|WIFI_UNDER_WPS)
-                       || check_fwstate(b_pmlmepriv, WIFI_AP_STATE)
-                       || check_fwstate(b_pmlmepriv, WIFI_ADHOC_MASTER_STATE|WIFI_ADHOC_STATE)
-                       || !rtw_p2p_chk_state(b_pwdinfo, P2P_STATE_NONE)
-               ) {
+
+               if (check_fwstate(b_pmlmepriv,
+                                 WIFI_ASOC_STATE|WIFI_SITE_MONITOR) ||
+                   check_fwstate(b_pmlmepriv,
+                                 WIFI_UNDER_LINKING|WIFI_UNDER_WPS) ||
+                   check_fwstate(b_pmlmepriv, WIFI_AP_STATE) ||
+                   check_fwstate(b_pmlmepriv,
+                                 WIFI_ADHOC_MASTER_STATE|WIFI_ADHOC_STATE)) {
                        goto exit;
                }
        }
@@ -307,11 +304,6 @@ u8 PS_RDY_CHECK(struct rtw_adapter * padapter)
 void rtw_set_ps_mode23a(struct rtw_adapter *padapter, u8 ps_mode, u8 smart_ps, u8 bcn_ant_mode)
 {
        struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv;
-#ifdef CONFIG_8723AU_P2P
-       struct wifidirect_info *pwdinfo = &padapter->wdinfo;
-#endif /* CONFIG_8723AU_P2P */
-
-
 
        RT_TRACE(_module_rtl871x_pwrctrl_c_, _drv_notice_,
                         ("%s: PowerMode =%d Smart_PS =%d\n",
@@ -334,17 +326,12 @@ void rtw_set_ps_mode23a(struct rtw_adapter *padapter, u8 ps_mode, u8 smart_ps, u
        }
 
        if (ps_mode == PS_MODE_ACTIVE) {
-#ifdef CONFIG_8723AU_P2P
-               if (pwdinfo->opp_ps == 0)
-#endif /* CONFIG_8723AU_P2P */
-               {
-                       DBG_8723A("rtw_set_ps_mode23a: Leave 802.11 power save\n");
+               DBG_8723A("rtw_set_ps_mode23a: Leave 802.11 power save\n");
 
-                       pwrpriv->pwr_mode = ps_mode;
-                       rtw_set_rpwm23a(padapter, PS_STATE_S4);
-                       rtl8723a_set_FwPwrMode_cmd(padapter, ps_mode);
-                       pwrpriv->bFwCurrentInPSMode = false;
-               }
+               pwrpriv->pwr_mode = ps_mode;
+               rtw_set_rpwm23a(padapter, PS_STATE_S4);
+               rtl8723a_set_FwPwrMode_cmd(padapter, ps_mode);
+               pwrpriv->bFwCurrentInPSMode = false;
        } else {
                if (PS_RDY_CHECK(padapter)
 #ifdef CONFIG_8723AU_BT_COEXIST
@@ -359,12 +346,6 @@ void rtw_set_ps_mode23a(struct rtw_adapter *padapter, u8 ps_mode, u8 smart_ps, u
                        pwrpriv->bcn_ant_mode = bcn_ant_mode;
                        rtl8723a_set_FwPwrMode_cmd(padapter, ps_mode);
 
-#ifdef CONFIG_8723AU_P2P
-                       /*  Set CTWindow after LPS */
-                       if (pwdinfo->opp_ps == 1)
-                               p2p_ps_wk_cmd23a(padapter, P2P_PS_ENABLE, 0);
-#endif /* CONFIG_8723AU_P2P */
-
                        rtw_set_rpwm23a(padapter, PS_STATE_S2);
                }
        }
@@ -464,10 +445,6 @@ void LeaveAllPowerSaveMode23a(struct rtw_adapter *Adapter)
        /* DBG_8723A("%s.....\n", __func__); */
        if (check_fwstate(pmlmepriv, _FW_LINKED) == true)
        { /* connect */
-#ifdef CONFIG_8723AU_P2P
-               p2p_ps_wk_cmd23a(Adapter, P2P_PS_DISABLE, enqueue);
-#endif /* CONFIG_8723AU_P2P */
-
                rtw_lps_ctrl_wk_cmd23a(Adapter, LPS_CTRL_LEAVE, enqueue);
        }
 
index f774b03f23d91225b882de8348caf959038d326c..17e32071b51404e842252e6897dff92bf4fede1f 100644 (file)
@@ -498,32 +498,6 @@ void flush_all_cam_entry23a(struct rtw_adapter *padapter)
        memset((u8 *)(pmlmeinfo->FW_sta_info), 0, sizeof(pmlmeinfo->FW_sta_info));
 }
 
-#if defined(CONFIG_8723AU_P2P) && defined(CONFIG_8723AU_P2P)
-int WFD_info_handler(struct rtw_adapter *padapter, struct ndis_802_11_var_ies *        pIE)
-{
-       struct wifidirect_info  *pwdinfo;
-       u8      wfd_ie[MAX_WFD_IE_LEN] = {0x00};
-       u32     wfd_ielen = 0;
-
-       pwdinfo = &padapter->wdinfo;
-       if (rtw_get_wfd_ie((u8 *) pIE, pIE->Length, wfd_ie, &wfd_ielen)) {
-               u8      attr_content[ 10 ] = { 0x00 };
-               u32     attr_contentlen = 0;
-
-               DBG_8723A("[%s] Found WFD IE\n", __func__);
-               rtw_get_wfd_attr_content(wfd_ie, wfd_ielen, WFD_ATTR_DEVICE_INFO, attr_content, &attr_contentlen);
-               if (attr_contentlen) {
-                       pwdinfo->wfd_info->peer_rtsp_ctrlport = get_unaligned_be16(attr_content + 2);
-                       DBG_8723A("[%s] Peer PORT NUM = %d\n", __func__, pwdinfo->wfd_info->peer_rtsp_ctrlport);
-                       return true;
-               }
-       } else {
-               DBG_8723A("[%s] NO WFD IE\n", __func__);
-       }
-       return _FAIL;
-}
-#endif
-
 int WMM_param_handler23a(struct rtw_adapter *padapter, struct ndis_802_11_var_ies *    pIE)
 {
        /* struct registry_priv *pregpriv = &padapter->registrypriv; */
@@ -1371,15 +1345,6 @@ void set_sta_rate23a(struct rtw_adapter *padapter, struct sta_info *psta)
 void update_tx_basic_rate23a(struct rtw_adapter *padapter, u8 wirelessmode)
 {
        unsigned char supported_rates[NDIS_802_11_LENGTH_RATES_EX];
-#ifdef CONFIG_8723AU_P2P
-       struct wifidirect_info* pwdinfo = &padapter->wdinfo;
-
-       /*      Added by Albert 2011/03/22 */
-       /*      In the P2P mode, the driver should not support the b mode. */
-       /*      So, the Tx packet shouldn't use the CCK rate */
-       if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))
-               return;
-#endif /* CONFIG_8723AU_P2P */
 
        memset(supported_rates, 0, NDIS_802_11_LENGTH_RATES_EX);
 
index 7a2284d96f4a2c8e7d075514de0b8ccdaf9a5cce..307963d9e7d0cbd4163ac2c65cb1b64609db71bd 100644 (file)
@@ -776,76 +776,3 @@ void rtl8723a_set_BTCoex_AP_mode_FwRsvdPkt_cmd(struct rtw_adapter *padapter)
        }
 }
 #endif
-
-#ifdef CONFIG_8723AU_P2P
-void rtl8723a_set_p2p_ps_offload_cmd(struct rtw_adapter *padapter, u8 p2p_ps_state)
-{
-       struct hal_data_8723a   *pHalData = GET_HAL_DATA(padapter);
-       struct wifidirect_info *pwdinfo = &padapter->wdinfo;
-       struct P2P_PS_Offload_t *p2p_ps_offload = &pHalData->p2p_ps_offload;
-       u8 i;
-
-       switch (p2p_ps_state) {
-       case P2P_PS_DISABLE:
-               DBG_8723A("P2P_PS_DISABLE \n");
-               memset(p2p_ps_offload, 0, 1);
-               break;
-       case P2P_PS_ENABLE:
-               DBG_8723A("P2P_PS_ENABLE \n");
-               /*  update CTWindow value. */
-               if (pwdinfo->ctwindow > 0) {
-                       p2p_ps_offload->CTWindow_En = 1;
-                       rtw_write8(padapter, REG_P2P_CTWIN, pwdinfo->ctwindow);
-               }
-
-               /*  hw only support 2 set of NoA */
-               for (i = 0; i < pwdinfo->noa_num; i++) {
-                       /*  To control the register setting for which NOA */
-                       rtw_write8(padapter, REG_NOA_DESC_SEL, (i << 4));
-                       if (i == 0)
-                               p2p_ps_offload->NoA0_En = 1;
-                       else
-                               p2p_ps_offload->NoA1_En = 1;
-
-                       /*  config P2P NoA Descriptor Register */
-                       rtw_write32(padapter, REG_NOA_DESC_DURATION, pwdinfo->noa_duration[i]);
-
-                       rtw_write32(padapter, REG_NOA_DESC_INTERVAL, pwdinfo->noa_interval[i]);
-
-                       rtw_write32(padapter, REG_NOA_DESC_START, pwdinfo->noa_start_time[i]);
-
-                       rtw_write8(padapter, REG_NOA_DESC_COUNT, pwdinfo->noa_count[i]);
-               }
-
-               if ((pwdinfo->opp_ps == 1) || (pwdinfo->noa_num > 0)) {
-                       /*  rst p2p circuit */
-                       rtw_write8(padapter, REG_DUAL_TSF_RST, BIT(4));
-
-                       p2p_ps_offload->Offload_En = 1;
-
-                       if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) {
-                               p2p_ps_offload->role = 1;
-                               p2p_ps_offload->AllStaSleep = 0;
-                       } else {
-                               p2p_ps_offload->role = 0;
-                       }
-
-                       p2p_ps_offload->discovery = 0;
-               }
-               break;
-       case P2P_PS_SCAN:
-               DBG_8723A("P2P_PS_SCAN \n");
-               p2p_ps_offload->discovery = 1;
-               break;
-       case P2P_PS_SCAN_DONE:
-               DBG_8723A("P2P_PS_SCAN_DONE \n");
-               p2p_ps_offload->discovery = 0;
-               pwdinfo->p2p_ps_state = P2P_PS_ENABLE;
-               break;
-       default:
-               break;
-       }
-
-       FillH2CCmd(padapter, P2P_PS_OFFLOAD_EID, 1, (u8 *)p2p_ps_offload);
-}
-#endif /* CONFIG_8723AU_P2P */
index 71ee47abcace0b063b5b5be68aad71b2f379eb14..4ca7b8ec7b38606210df706fc5c02fac59ce9176 100644 (file)
@@ -219,13 +219,6 @@ rtl8723a_HalDmWatchDog(
        bFwCurrentInPSMode = Adapter->pwrctrlpriv.bFwCurrentInPSMode;
        bFwPSAwake = rtl8723a_get_fwlps_rf_on(Adapter);
 
-#ifdef CONFIG_8723AU_P2P
-       /*  Fw is under p2p powersaving mode, driver should stop dynamic mechanism. */
-       /*  modifed by thomas. 2011.06.11. */
-       if (Adapter->wdinfo.p2p_ps_mode)
-               bFwPSAwake = false;
-#endif /* CONFIG_8723AU_P2P */
-
        if ((hw_init_completed) && ((!bFwCurrentInPSMode) && bFwPSAwake)) {
                /*  Calculate Tx/Rx statistics. */
                dm_CheckStatistics(Adapter);
index 14c7f2e915e08051f5ec51dec7b88094b06843bf..de25e1a5eee86ccc2b30e667dffeedd0367538dc 100644 (file)
@@ -55,7 +55,6 @@ enum _NIC_VERSION {
 #include <rtw_event.h>
 #include <rtw_led.h>
 #include <rtw_mlme_ext.h>
-#include <rtw_p2p.h>
 #include <rtw_ap.h>
 
 #include "ioctl_cfg80211.h"
@@ -258,13 +257,7 @@ struct rtw_adapter {
        struct  hostapd_priv    *phostapdpriv;
 #endif
 
-       struct cfg80211_wifidirect_info cfg80211_wdinfo;
        u32     setband;
-       struct wifidirect_info  wdinfo;
-
-#ifdef CONFIG_8723AU_P2P
-       struct wifi_display_info wfd_info;
-#endif /* CONFIG_8723AU_P2P */
 
        void *HalData;
        u32 hal_data_sz;
@@ -316,10 +309,6 @@ struct rtw_adapter {
        u8 bRxRSSIDisplay;
        /* The driver will show the desired chan nor when this flag is 1. */
        u8 bNotifyChannelChange;
-#ifdef CONFIG_8723AU_P2P
-       /* driver will show current P2P status when the  application reads it*/
-       u8 bShowGetP2PState;
-#endif
        struct rtw_adapter *pbuddy_adapter;
 
        /* extend to support multi interface */
index 61326e5e089c96486219ab604be9128dd3d5380b..f2824c3c2f9c5314334c24602e9f115154a97309 100644 (file)
@@ -563,20 +563,6 @@ u8 *rtw_get_wps_attr_content23a(u8 *wps_ie, uint wps_ielen, u16 target_attr_id ,
 void dump_ies23a(u8 *buf, u32 buf_len);
 void dump_wps_ie23a(u8 *ie, u32 ie_len);
 
-#ifdef CONFIG_8723AU_P2P
-void dump_p2p_ie23a(u8 *ie, u32 ie_len);
-u8 *rtw_get_p2p_ie23a(u8 *in_ie, int in_len, u8 *p2p_ie, uint *p2p_ielen);
-u8 *rtw_get_p2p_attr23a(u8 *p2p_ie, uint p2p_ielen, u8 target_attr_id ,u8 *buf_attr, u32 *len_attr);
-u8 *rtw_get_p2p_attr23a_content(u8 *p2p_ie, uint p2p_ielen, u8 target_attr_id ,u8 *buf_content, uint *len_content);
-u32 rtw_set_p2p_attr_content23a(u8 *pbuf, u8 attr_id, u16 attr_len, u8 *pdata_attr);
-void rtw_wlan_bssid_ex_remove_p2p_attr23a(struct wlan_bssid_ex *bss_ex, u8 attr_id);
-#endif
-
-#ifdef CONFIG_8723AU_P2P
-int rtw_get_wfd_ie(u8 *in_ie, int in_len, u8 *wfd_ie, uint *wfd_ielen);
-int rtw_get_wfd_attr_content(u8 *wfd_ie, uint wfd_ielen, u8 target_attr_id ,u8 *attr_content, uint *attr_contentlen);
-#endif /*  CONFIG_8723AU_P2P */
-
 uint   rtw_get_rateset_len23a(u8       *rateset);
 
 struct registry_priv;
index 8fccbfc3a45c65dd92873cb41f37b8899b800d93..09fa72340302582b3954f56be9a454fef146c447 100644 (file)
@@ -151,10 +151,6 @@ u8 rtl8723a_set_rssi_cmd(struct rtw_adapter * padapter, u8 *param);
 u8 rtl8723a_set_raid_cmd(struct rtw_adapter * padapter, u32 mask, u8 arg);
 void rtl8723a_add_rateatid(struct rtw_adapter * padapter, u32 bitmap, u8 arg, u8 rssi_level);
 
-#ifdef CONFIG_8723AU_P2P
-void rtl8723a_set_p2p_ps_offload_cmd(struct rtw_adapter * padapter, u8 p2p_ps_state);
-#endif /* CONFIG_8723AU_P2P */
-
 void CheckFwRsvdPageContent23a(struct rtw_adapter *padapter);
 
 #endif
index ce11245fefd76247e71eae84e013e20048cbb5f0..f6b4b7c7c22dc983c77fbf7be59b676f77311777 100644 (file)
@@ -424,11 +424,6 @@ struct hal_data_8723a {
 
        bool                            bMACFuncEnable;
 
-#ifdef CONFIG_8723AU_P2P
-       struct P2P_PS_Offload_t p2p_ps_offload;
-#endif
-
-
        /*  */
        /*  For USB Interface HAL related */
        /*  */
index f9caa3e35f57d3288c07294747b173cb927f9794..ba6d572b81b3fb0b6c6db728bd917b9305d5d3cb 100644 (file)
@@ -106,9 +106,6 @@ u32 rtw_init_evt_priv23a (struct evt_priv *pevtpriv);
 void rtw_free_evt_priv23a (struct evt_priv *pevtpriv);
 void rtw_cmd_clr_isr23a(struct cmd_priv *pcmdpriv);
 void rtw_evt_notify_isr(struct evt_priv *pevtpriv);
-#ifdef CONFIG_8723AU_P2P
-u8 p2p_protocol_wk_cmd23a(struct rtw_adapter*padapter, int intCmdType );
-#endif /* CONFIG_8723AU_P2P */
 
 enum rtw_drvextra_cmd_id
 {
index 2d4f61b919430665668b9a7a8e0bd9122dd60c30..0b48b05fc1ad8e512e24f3d5f8163bac7ccc0b56 100644 (file)
@@ -148,30 +148,6 @@ struct tx_invite_resp_info {
        u8      token;  /*      Used to record the dialog token of p2p invitation request frame. */
 };
 
-#ifdef CONFIG_8723AU_P2P
-
-struct wifi_display_info {
-       u16     wfd_enable;             /* Enable/Disable the WFD function. */
-       u16     rtsp_ctrlport;          /* TCP port number at which the this WFD device listens for RTSP messages */
-       u16     peer_rtsp_ctrlport;     /* TCP port number at which the peer WFD device listens for RTSP messages */
-                                       /* This filed should be filled when receiving the gropu negotiation request */
-
-       u8      peer_session_avail;     /* WFD session is available or not for the peer wfd device. */
-                                       /* This variable will be set when sending the provisioning discovery request to peer WFD device. */
-                                       /* And this variable will be reset when it is read by using the iwpriv p2p_get wfd_sa command. */
-       u8      ip_address[4];
-       u8      peer_ip_address[4];
-       u8      wfd_pc;         /* WFD preferred connection */
-                               /* 0 -> Prefer to use the P2P for WFD connection on peer side. */
-                               /* 1 -> Prefer to use the TDLS for WFD connection on peer side. */
-
-       u8      wfd_device_type;/* WFD Device Type */
-                               /* 0 -> WFD Source Device */
-                               /* 1 -> WFD Primary Sink Device */
-       enum    SCAN_RESULT_TYPE scan_result_type;      /* Used when P2P is enable. This parameter will impact the scan result. */
-};
-#endif /* CONFIG_8723AU_P2P */
-
 struct tx_provdisc_req_info {
        u16     wps_config_method_request;      /* Used when sending the provisioning request frame */
        u16     peer_channel_num[2];            /* The channel number which the receiver stands. */
@@ -203,102 +179,6 @@ struct scan_limit_info {
        u8      operation_ch[2];        /* Store the operation channel of invitation request frame */
 };
 
-struct cfg80211_wifidirect_info {
-       struct timer_list               remain_on_ch_timer;
-       u8              restore_channel;
-       struct ieee80211_channel        remain_on_ch_channel;
-       enum nl80211_channel_type       remain_on_ch_type;
-       u64     remain_on_ch_cookie;
-       bool is_ro_ch;
-};
-
-struct wifidirect_info {
-       struct rtw_adapter      *padapter;
-       struct timer_list       find_phase_timer;
-       struct timer_list       restore_p2p_state_timer;
-
-       /*      Used to do the scanning. After confirming the peer is availalble, the driver transmits the P2P frame to peer. */
-       struct timer_list       pre_tx_scan_timer;
-       struct timer_list       reset_ch_sitesurvey;
-       struct timer_list       reset_ch_sitesurvey2;   /*      Just for resetting the scan limit function by using p2p nego */
-       struct tx_provdisc_req_info     tx_prov_disc_info;
-       struct rx_provdisc_req_info rx_prov_disc_info;
-       struct tx_invite_req_info       invitereq_info;
-       struct profile_info     profileinfo[P2P_MAX_PERSISTENT_GROUP_NUM];      /*      Store the profile information of persistent group */
-       struct tx_invite_resp_info      inviteresp_info;
-       struct tx_nego_req_info nego_req_info;
-       struct group_id_info    groupid_info;   /*      Store the group id information when doing the group negotiation handshake. */
-       struct scan_limit_info  rx_invitereq_info;      /*      Used for get the limit scan channel from the Invitation procedure */
-       struct scan_limit_info  p2p_info;               /*      Used for get the limit scan channel from the P2P negotiation handshake */
-#ifdef CONFIG_8723AU_P2P
-       struct wifi_display_info        *wfd_info;
-#endif
-       enum P2P_ROLE   role;
-       enum P2P_STATE  pre_p2p_state;
-       enum P2P_STATE  p2p_state;
-       u8      device_addr[ETH_ALEN];  /*      The device address should be the mac address of this device. */
-       u8      interface_addr[ETH_ALEN];
-       u8      social_chan[4];
-       u8      listen_channel;
-       u8      operating_channel;
-       u8      listen_dwell;           /*      This value should be between 1 and 3 */
-       u8      support_rate[8];
-       u8      p2p_wildcard_ssid[P2P_WILDCARD_SSID_LEN];
-       u8      intent;         /*      should only include the intent value. */
-       u8      p2p_peer_interface_addr[ETH_ALEN];
-       u8      p2p_peer_device_addr[ETH_ALEN];
-       u8      peer_intent;    /*      Included the intent value and tie breaker value. */
-       u8      device_name[WPS_MAX_DEVICE_NAME_LEN];   /*      Device name for displaying on searching device screen */
-       u8      device_name_len;
-       u8      profileindex;   /*      Used to point to the index of profileinfo array */
-       u8      peer_operating_ch;
-       u8      find_phase_state_exchange_cnt;
-       u16     device_password_id_for_nego;    /*      The device password ID for group negotation */
-       u8      negotiation_dialog_token;
-       /*      SSID information for group negotitation */
-       u8 nego_ssid[IEEE80211_MAX_SSID_LEN];
-       u8 nego_ssidlen;
-       u8 p2p_group_ssid[IEEE80211_MAX_SSID_LEN];
-       u8 p2p_group_ssid_len;
-       u8      persistent_supported;   /*      Flag to know the persistent function should be supported or not. */
-                                       /*      In the Sigma test, the Sigma will provide this enable from the sta_set_p2p CAPI. */
-                                       /*      0: disable */
-                                       /*      1: enable */
-       u8      session_available;      /*      Flag to set the WFD session available to enable or disable "by Sigma" */
-                                       /*      In the Sigma test, the Sigma will disable the session available by using the sta_preset CAPI. */
-                                       /*      0: disable */
-                                       /*      1: enable */
-
-       u8      wfd_tdls_enable;        /*      Flag to enable or disable the TDLS by WFD Sigma */
-                                       /*      0: disable */
-                                       /*      1: enable */
-       u8      wfd_tdls_weaksec;       /*      Flag to enable or disable the weak security function for TDLS by WFD Sigma */
-                               /*      0: disable */
-                               /*      In this case, the driver can't issue the tdsl setup request frame. */
-                               /*      1: enable */
-                               /*      In this case, the driver can issue the tdls setup request frame */
-                               /*      even the current security is weak security. */
-
-       enum    P2P_WPSINFO             ui_got_wps_info;                        /*      This field will store the WPS value (PIN value or PBC) that UI had got from the user. */
-       u16     supported_wps_cm;                       /*      This field describes the WPS config method which this driver supported. */
-                                                                                                               /*      The value should be the combination of config method defined in page104 of WPS v2.0 spec. */
-       uint    channel_list_attr_len;          /*      This field will contain the length of body of P2P Channel List attribute of group negotitation response frame. */
-       u8      channel_list_attr[100];         /*      This field will contain the body of P2P Channel List attribute of group negotitation response frame. */
-                                                                                                               /*      We will use the channel_cnt and channel_list fields when constructing the group negotitation confirm frame. */
-#ifdef CONFIG_8723AU_P2P
-       enum P2P_PS_MODE        p2p_ps_mode; /*  indicate p2p ps mode */
-       enum P2P_PS_STATE       p2p_ps_state; /*  indicate p2p ps state */
-       u8      noa_index; /*  Identifies and instance of Notice of Absence timing. */
-       u8      ctwindow; /*  Client traffic window. A period of time in TU after TBTT. */
-       u8      opp_ps; /*  opportunistic power save. */
-       u8      noa_num; /*  number of NoA descriptor in P2P IE. */
-       u8      noa_count[P2P_MAX_NOA_NUM]; /*  Count for owner, Type of client. */
-       u32     noa_duration[P2P_MAX_NOA_NUM]; /*  Max duration for owner, preferred or min acceptable duration for client. */
-       u32     noa_interval[P2P_MAX_NOA_NUM]; /*  Length of interval for owner, preferred or max acceptable interval of client. */
-       u32     noa_start_time[P2P_MAX_NOA_NUM]; /*  schedule expressed in terms of the lower 4 bytes of the TSF timer. */
-#endif /*  CONFIG_8723AU_P2P */
-};
-
 struct tdls_ss_record {        /* signal strength record */
        u8      macaddr[ETH_ALEN];
        u8      RxPWDBAll;
@@ -324,9 +204,6 @@ struct tdls_info {
        u8      watchdog_count;
        u8      dev_discovered;         /* WFD_TDLS: for sigma test */
        u8      enable;
-#ifdef CONFIG_8723AU_P2P
-       struct wifi_display_info                *wfd_info;
-#endif
 };
 
 struct mlme_priv {
index 7729b2be25ae0eb1cec14a624b06e7d6e4df7a3b..9d9815dd6941140dc95b6b09892f2b8e3f28ec3f 100644 (file)
@@ -519,10 +519,6 @@ unsigned char check_assoc_AP23a(u8 *pframe, uint len);
 
 int WMM_param_handler23a(struct rtw_adapter *padapter,
                      struct ndis_802_11_var_ies *pIE);
-#ifdef CONFIG_8723AU_P2P
-int WFD_info_handler(struct rtw_adapter *padapter,
-                    struct ndis_802_11_var_ies *pIE);
-#endif
 void WMMOnAssocRsp23a(struct rtw_adapter *padapter);
 
 void HT_caps_handler23a(struct rtw_adapter *padapter,
@@ -587,18 +583,6 @@ s32 dump_mgntframe23a_and_wait(struct rtw_adapter *padapter,
 s32 dump_mgntframe23a_and_wait_ack23a(struct rtw_adapter *padapter,
                                struct xmit_frame *pmgntframe);
 
-#ifdef CONFIG_8723AU_P2P
-void issue_probersp23a_p2p23a(struct rtw_adapter *padapter, unsigned char *da);
-void issue_p2p_provision_request23a(struct rtw_adapter *padapter, u8 *pssid,
-                                u8 ussidlen, u8* pdev_raddr);
-void issue_p2p_GO_request23a(struct rtw_adapter *padapter, u8* raddr);
-void issue23a_probereq_p2p(struct rtw_adapter *padapter, u8 *da);
-int issue23a_probereq_p2p_ex(struct rtw_adapter *adapter, u8 *da, int try_cnt,
-                         int wait_ms);
-void issue_p2p_invitation_response23a(struct rtw_adapter *padapter, u8* raddr,
-                                  u8 dialogToken, u8 success);
-void issue_p2p_invitation_request23a(struct rtw_adapter *padapter, u8* raddr);
-#endif /* CONFIG_8723AU_P2P */
 void issue_beacon23a(struct rtw_adapter *padapter, int timeout_ms);
 void issue_probersp23a(struct rtw_adapter *padapter, unsigned char *da,
                    u8 is_valid_p2p_probereq);
diff --git a/drivers/staging/rtl8723au/include/rtw_p2p.h b/drivers/staging/rtl8723au/include/rtw_p2p.h
deleted file mode 100644 (file)
index 93fdc65..0000000
+++ /dev/null
@@ -1,158 +0,0 @@
-/******************************************************************************
- *
- * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of version 2 of the GNU General Public License as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- ******************************************************************************/
-#ifndef __RTW_P2P_H_
-#define __RTW_P2P_H_
-
-#include <drv_types.h>
-
-u32 build_beacon_p2p_ie23a(struct wifidirect_info *pwdinfo, u8 *pbuf);
-u32 build_probe_resp_p2p_ie23a(struct wifidirect_info *pwdinfo, u8 *pbuf);
-u32 build_prov_disc_request_p2p_ie23a(struct wifidirect_info *pwdinfo, u8 *pbuf,
-                                  u8 *pssid, u8 ussidlen, u8 *pdev_raddr);
-u32 build_assoc_resp_p2p_ie23a(struct wifidirect_info *pwdinfo, u8 *pbuf,
-                           u8 status_code);
-u32 build_deauth_p2p_ie23a(struct wifidirect_info *pwdinfo, u8 *pbuf);
-#ifdef CONFIG_8723AU_P2P
-u32 build_probe_req_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf);
-u32 build_probe_resp_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf,
-                           u8 tunneled);
-u32 build_beacon_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf);
-u32 build_nego_req_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf);
-u32 build_nego_resp_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf);
-u32 build_nego_confirm_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf);
-u32 build_invitation_req_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf);
-u32 build_invitation_resp_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf);
-u32 build_assoc_req_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf);
-u32 build_assoc_resp_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf);
-u32 build_provdisc_req_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf);
-u32 build_provdisc_resp_wfd_ie(struct wifidirect_info *pwdinfo, u8 *pbuf);
-#endif /* CONFIG_8723AU_P2P */
-
-u32 process_probe_req_p2p_ie23a(struct wifidirect_info *pwdinfo, u8 *pframe,
-                            uint len);
-u32 process_assoc_req_p2p_ie23a(struct wifidirect_info *pwdinfo, u8 *pframe,
-                            uint len, struct sta_info *psta);
-u32 process_p2p_devdisc_req23a(struct wifidirect_info *pwdinfo, u8 *pframe,
-                           uint len);
-u32 process_p2p_devdisc_resp23a(struct wifidirect_info *pwdinfo, u8 *pframe,
-                            uint len);
-u8 process_p2p_provdisc_req23a(struct wifidirect_info *pwdinfo, u8 *pframe,
-                           uint len);
-u8 process_p2p_provdisc_resp23a(struct wifidirect_info *pwdinfo, u8 *pframe);
-u8 process_p2p_group_negotation_req23a(struct wifidirect_info *pwdinfo,
-                                   u8 *pframe, uint len);
-u8 process_p2p_group_negotation_resp23a(struct wifidirect_info *pwdinfo,
-                                    u8 *pframe, uint len);
-u8 process_p2p_group_negotation_confirm23a(struct wifidirect_info *pwdinfo,
-                                       u8 *pframe, uint len);
-u8 process_p2p_presence_req23a(struct wifidirect_info *pwdinfo,
-                           u8 *pframe, uint len);
-
-void p2p_protocol_wk_hdl23a(struct rtw_adapter *padapter, int cmdtype);
-
-#ifdef CONFIG_8723AU_P2P
-void   process_p2p_ps_ie23a(struct rtw_adapter *padapter, u8 *IEs, u32 IELength);
-void   p2p_ps_wk_hdl23a(struct rtw_adapter *padapter, u8 p2p_ps_state);
-u8 p2p_ps_wk_cmd23a(struct rtw_adapter *padapter, u8 p2p_ps_state, u8 enqueue);
-#endif /*  CONFIG_8723AU_P2P */
-
-void rtw_init_cfg80211_wifidirect_info(struct rtw_adapter *padapter);
-int rtw_p2p_check_frames(struct rtw_adapter *padapter, const u8 *buf,
-                        u32 len, u8 tx);
-void rtw_append_wfd_ie(struct rtw_adapter *padapter, u8 *buf, u32 *len);
-
-void reset_global_wifidirect_info23a(struct rtw_adapter *padapter);
-int rtw_init_wifi_display_info(struct rtw_adapter *padapter);
-void rtw_init_wifidirect_timers23a(struct rtw_adapter *padapter);
-void rtw_init_wifidirect_addrs23a(struct rtw_adapter *padapter, u8 *dev_addr,
-                              u8 *iface_addr);
-void init_wifidirect_info23a(struct rtw_adapter *padapter, enum P2P_ROLE role);
-int rtw_p2p_enable23a(struct rtw_adapter *padapter, enum P2P_ROLE role);
-
-static inline void _rtw_p2p_set_state(struct wifidirect_info *wdinfo,
-                                     enum P2P_STATE state)
-{
-       if (wdinfo->p2p_state != state) {
-               /* wdinfo->pre_p2p_state = wdinfo->p2p_state; */
-               wdinfo->p2p_state = state;
-       }
-}
-
-static inline void _rtw_p2p_set_pre_state(struct wifidirect_info *wdinfo,
-                                         enum P2P_STATE state)
-{
-       if (wdinfo->pre_p2p_state != state)
-               wdinfo->pre_p2p_state = state;
-}
-
-static inline void _rtw_p2p_set_role(struct wifidirect_info *wdinfo,
-                                    enum P2P_ROLE role)
-{
-       if (wdinfo->role != role)
-               wdinfo->role = role;
-}
-
-static inline int _rtw_p2p_state(struct wifidirect_info *wdinfo)
-{
-       return wdinfo->p2p_state;
-}
-
-static inline int _rtw_p2p_pre_state(struct wifidirect_info *wdinfo)
-{
-       return wdinfo->pre_p2p_state;
-}
-
-static inline int _rtw_p2p_role(struct wifidirect_info *wdinfo)
-{
-       return wdinfo->role;
-}
-
-static inline bool _rtw_p2p_chk_state(struct wifidirect_info *wdinfo,
-                                     enum P2P_STATE state)
-{
-       return wdinfo->p2p_state == state;
-}
-
-static inline bool _rtw_p2p_chk_role(struct wifidirect_info *wdinfo,
-                                    enum P2P_ROLE role)
-{
-       return wdinfo->role == role;
-}
-
-#define rtw_p2p_set_state(wdinfo, state) _rtw_p2p_set_state(wdinfo, state)
-#define rtw_p2p_set_pre_state(wdinfo, state)                   \
-       _rtw_p2p_set_pre_state(wdinfo, state)
-#define rtw_p2p_set_role(wdinfo, role) _rtw_p2p_set_role(wdinfo, role)
-
-#define rtw_p2p_state(wdinfo) _rtw_p2p_state(wdinfo)
-#define rtw_p2p_pre_state(wdinfo) _rtw_p2p_pre_state(wdinfo)
-#define rtw_p2p_role(wdinfo) _rtw_p2p_role(wdinfo)
-#define rtw_p2p_chk_state(wdinfo, state) _rtw_p2p_chk_state(wdinfo, state)
-#define rtw_p2p_chk_role(wdinfo, role) _rtw_p2p_chk_role(wdinfo, role)
-
-#define rtw_p2p_findphase_ex_set(wdinfo, value) \
-       ((wdinfo)->find_phase_state_exchange_cnt = (value))
-
-/* is this find phase exchange for social channel scan? */
-#define rtw_p2p_findphase_ex_is_social(wdinfo)                 \
-       ((wdinfo)->find_phase_state_exchange_cnt >=             \
-        P2P_FINDPHASE_EX_SOCIAL_FIRST)
-
-/* should we need find phase exchange anymore? */
-#define rtw_p2p_findphase_ex_is_needed(wdinfo) \
-       ((wdinfo)->find_phase_state_exchange_cnt < P2P_FINDPHASE_EX_MAX && \
-       (wdinfo)->find_phase_state_exchange_cnt != P2P_FINDPHASE_EX_NONE)
-
-#endif
index 57e394543ec1d184cee39b942e486ad64c7317d4..41af702121c4ec5a30be6188d768b13fe30d92bd 100644 (file)
@@ -636,23 +636,6 @@ enum P2P_PROTO_WK_ID {
        P2P_RO_CH_WK = 6,
 };
 
-#ifdef CONFIG_8723AU_P2P
-enum P2P_PS_STATE {
-       P2P_PS_DISABLE = 0,
-       P2P_PS_ENABLE = 1,
-       P2P_PS_SCAN = 2,
-       P2P_PS_SCAN_DONE = 3,
-       P2P_PS_ALLSTASLEEP = 4, /*  for P2P GO */
-};
-
-enum P2P_PS_MODE {
-       P2P_PS_NONE = 0,
-       P2P_PS_CTWINDOW = 1,
-       P2P_PS_NOA       = 2,
-       P2P_PS_MIX = 3, /*  CTWindow and NoA */
-};
-#endif /*  CONFIG_8723AU_P2P */
-
 /*     =====================WFD Section===================== */
 /*     For Wi-Fi Display */
 #define        WFD_ATTR_DEVICE_INFO                    0x00
index a0d59c7963d184d35cc5525d9816e671b038d2ee..a3e17f99a2787d64b96f709acd8c90e33a51cd2a 100644 (file)
@@ -357,9 +357,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,17 +367,6 @@ 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) {
                struct wiphy *wiphy = pwdev->wiphy;
                struct ieee80211_channel *notify_channel;
@@ -429,9 +415,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 +425,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,
@@ -921,11 +889,6 @@ static int rtw_cfg80211_set_encryption(struct net_device *dev,
        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__);
 
@@ -1080,15 +1043,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 */
-
                                }
                        }
 
@@ -1350,9 +1304,6 @@ static int cfg80211_rtw_change_iface(struct wiphy *wiphy,
        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;
 
@@ -1384,34 +1335,10 @@ static int cfg80211_rtw_change_iface(struct wiphy *wiphy,
        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 */
                break;
        default:
                return -EOPNOTSUPP;
@@ -1486,11 +1413,6 @@ 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;
 
        DBG_8723A("%s, ielen =%d\n", __func__, len);
@@ -1516,56 +1438,6 @@ static int rtw_cfg80211_set_probe_req_wpsp2pie(struct rtw_adapter *padapter,
                        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) {
-                       DBG_8723A("probe_req_p2p_ielen =%d\n", p2p_ielen);
-
-                       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)) {
-                       DBG_8723A("probe_req_wfd_ielen =%d\n", wfd_ielen);
-
-                       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;
@@ -1583,10 +1455,6 @@ 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;
 
        DBG_8723A(FUNC_ADPT_FMT "\n", FUNC_ADPT_ARG(padapter));
@@ -1605,27 +1473,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));
-                       DBG_8723A("%s, role =%d, p2p_state =%d\n", __func__,
-                                 rtw_p2p_role(pwdinfo),
-                                 rtw_p2p_state(pwdinfo));
-               }
-               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,
@@ -1651,20 +1498,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 (!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 */
@@ -2001,64 +1834,6 @@ 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) {
-                       DBG_8723A("%s p2p_assoc_req_ielen =%d\n", __func__,
-                                 p2p_ielen);
-
-                       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)) {
-                       DBG_8723A("%s wfd_assoc_req_ielen =%d\n", __func__,
-                                 wfd_ielen);
-
-                       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_ ||
@@ -2707,9 +2482,6 @@ 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) {
@@ -2721,19 +2493,12 @@ static int rtw_cfg80211_monitor_if_xmit_entry(struct sk_buff *skb,
 
                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:%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)
@@ -2749,16 +2514,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 */
@@ -2944,10 +2699,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; */
 
@@ -2975,16 +2726,6 @@ 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_,
                             WLAN_EID_VENDOR_SPECIFIC, P2P_OUI23A, 4);
@@ -2992,38 +2733,7 @@ static int rtw_add_beacon(struct rtw_adapter *adapter, const u8 *head,
                             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;
        }
@@ -3220,9 +2930,6 @@ static int cfg80211_rtw_change_bss(struct wiphy *wiphy, struct net_device *ndev,
 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;
@@ -3230,17 +2937,9 @@ void rtw_cfg80211_rx_action_p2p(struct rtw_adapter *padapter, u8 *pmgmt_frame,
        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);
@@ -3255,9 +2954,6 @@ indicate:
 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;
@@ -3265,23 +2961,9 @@ void rtw_cfg80211_rx_p2p_action_public(struct rtw_adapter *padapter,
        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);
@@ -3321,346 +3003,6 @@ void rtw_cfg80211_rx_action(struct rtw_adapter *adapter, u8 *frame,
        rtw_cfg80211_rx_mgmt(adapter, freq, 0, frame, frame_len, GFP_ATOMIC);
 }
 
-#ifdef CONFIG_8723AU_P2P
-void rtw_cfg80211_issue_p2p_provision_request23a(struct rtw_adapter *padapter,
-                                             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;
-       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, WLAN_EID_VENDOR_SPECIFIC, 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, WLAN_EID_VENDOR_SPECIFIC, 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));
-               DBG_8723A("%s, role =%d, p2p_state =%d\n", __func__,
-                         rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo));
-       }
-
-       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));
-       DBG_8723A("%s, role =%d, p2p_state =%d\n", __func__,
-                 rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo));
-       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)
 {
@@ -3672,7 +3014,6 @@ static int _cfg80211_rtw_mgmt_tx(struct rtw_adapter *padapter, u8 tx_ch,
        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;
@@ -3717,18 +3058,6 @@ 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) {
@@ -3798,20 +3127,12 @@ static int cfg80211_rtw_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
 
        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
        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);
@@ -3861,11 +3182,6 @@ static int rtw_cfg80211_set_beacon_wpsp2pie(struct net_device *ndev, char *buf,
        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
@@ -3901,55 +3217,6 @@ static int rtw_cfg80211_set_beacon_wpsp2pie(struct net_device *ndev, char *buf,
                                         wps_oui, true);
 #endif
                }
-#ifdef CONFIG_8723AU_P2P
-               p2p_ie = rtw_get_p2p_ie23a(buf, len, NULL, &p2p_ielen);
-               if (p2p_ie) {
-                       DBG_8723A("bcn_p2p_ielen =%d\n", p2p_ielen);
-
-                       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)) {
-                       DBG_8723A("bcn_wfd_ielen =%d\n", wfd_ielen);
-
-                       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;
 
@@ -3963,11 +3230,6 @@ static int rtw_cfg80211_set_probe_resp_wpsp2pie(struct net_device *net,
 {
        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;
@@ -4011,100 +3273,6 @@ static int rtw_cfg80211_set_probe_resp_wpsp2pie(struct net_device *net,
 
                }
 
-               /* 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;
-
-                       DBG_8723A("probe_resp_p2p_ielen =%d\n", p2p_ielen);
-
-                       /* 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)) {
-                       DBG_8723A("probe_resp_wfd_ielen =%d\n", wfd_ielen);
-
-                       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;
@@ -4145,17 +3313,10 @@ int rtw_cfg80211_set_mgnt_wpsp2pie(struct net_device *net, char *buf, int len,
 {
        int ret = 0;
        uint wps_ielen = 0;
-#ifdef CONFIG_8723AU_P2P
-       u32 p2p_ielen = 0;
-#endif
 
        DBG_8723A("%s, ielen =%d\n", __func__, len);
 
-       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 (rtw_get_wps_ie23a(buf, len, NULL, &wps_ielen) && (wps_ielen > 0)) {
                if (net) {
                        switch (type) {
                        case 0x1:       /* BEACON */
@@ -4218,11 +3379,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,
 };
@@ -4325,9 +3481,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;
 
index 7c7c2c93e413e2bef934950c90782fbddbb4bf9b..49da7dd18171158a98f079413b1afa190e3faf2a 100644 (file)
@@ -455,9 +455,6 @@ static u8 rtw_init_default_value(struct rtw_adapter *padapter)
        padapter->bWritePortCancel = false;
        padapter->bRxRSSIDisplay = 0;
        padapter->bNotifyChannelChange = 0;
-#ifdef CONFIG_8723AU_P2P
-       padapter->bShowGetP2PState = 1;
-#endif
        return ret;
 }
 
@@ -520,17 +517,6 @@ u8 rtw_init_drv_sw23a(struct rtw_adapter *padapter)
                goto exit;
        }
 
-#ifdef CONFIG_8723AU_P2P
-       rtw_init_wifidirect_timers23a(padapter);
-       init_wifidirect_info23a(padapter, P2P_ROLE_DISABLE);
-       reset_global_wifidirect_info23a(padapter);
-       rtw_init_cfg80211_wifidirect_info(padapter);
-#ifdef CONFIG_8723AU_P2P
-       if (rtw_init_wifi_display_info(padapter) == _FAIL)
-               RT_TRACE(_module_os_intfs_c_, _drv_err_,
-                        ("\n Can't init init_wifi_display_info\n"));
-#endif
-#endif /* CONFIG_8723AU_P2P */
 
        if (init_mlme_ext_priv23a(padapter) == _FAIL) {
                RT_TRACE(_module_os_intfs_c_, _drv_err_,
@@ -599,10 +585,6 @@ void rtw_cancel_all_timer23a(struct rtw_adapter *padapter)
 
        del_timer_sync(&padapter->pwrctrlpriv.pwr_state_check_timer);
 
-#ifdef CONFIG_8723AU_P2P
-       del_timer_sync(&padapter->cfg80211_wdinfo.remain_on_ch_timer);
-#endif /* CONFIG_8723AU_P2P */
-
        del_timer_sync(&padapter->mlmepriv.set_scan_deny_timer);
        rtw_clear_scan_deny(padapter);
        RT_TRACE(_module_os_intfs_c_, _drv_info_,
@@ -615,26 +597,8 @@ void rtw_cancel_all_timer23a(struct rtw_adapter *padapter)
 
 u8 rtw_free_drv_sw23a(struct rtw_adapter *padapter)
 {
-#ifdef CONFIG_8723AU_P2P
-       struct wifidirect_info *pwdinfo;
-#endif
-
        RT_TRACE(_module_os_intfs_c_, _drv_info_, ("==>rtw_free_drv_sw23a"));
 
-       /* we can call rtw_p2p_enable23a here, but:
-        *  1. rtw_p2p_enable23a may have IO operation
-        *  2. rtw_p2p_enable23a is bundled with wext interface
-        */
-#ifdef CONFIG_8723AU_P2P
-       pwdinfo = &padapter->wdinfo;
-       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, P2P_STATE_NONE);
-       }
-#endif
-
        free_mlme_ext_priv23a(&padapter->mlmeextpriv);
 
        rtw_free_cmd_priv23a(&padapter->cmdpriv);
@@ -945,12 +909,6 @@ static int netdev_close(struct net_device *pnetdev)
                rtw_led_control(padapter, LED_CTL_POWER_OFF);
        }
 
-#ifdef CONFIG_8723AU_P2P
-       if (wdev_to_priv(padapter->rtw_wdev)->p2p_enabled)
-               wdev_to_priv(padapter->rtw_wdev)->p2p_enabled = false;
-       rtw_p2p_enable23a(padapter, P2P_ROLE_DISABLE);
-#endif /* CONFIG_8723AU_P2P */
-
        rtw_scan_abort23a(padapter);
         /* set this at the end */
        padapter->rtw_wdev->iftype = NL80211_IFTYPE_MONITOR;
index dd5899f2138802d25f52c69cf56e3d3ab094873a..31ab34601bab99546a551c1cd70a93b87a25cffc 100644 (file)
@@ -662,10 +662,6 @@ static struct rtw_adapter *rtw_usb_if1_init(struct dvobj_priv *dvobj,
 
        /*  set mac addr */
        rtw_macaddr_cfg23a(padapter->eeprompriv.mac_addr);
-#ifdef CONFIG_8723AU_P2P
-       rtw_init_wifidirect_addrs23a(padapter, padapter->eeprompriv.mac_addr,
-                                 padapter->eeprompriv.mac_addr);
-#endif
 
        DBG_8723A("bDriverStopped:%d, bSurpriseRemoved:%d, bup:%d, hw_init_completed:%d\n",
                  padapter->bDriverStopped, padapter->bSurpriseRemoved,