Commit 98fb8129 authored by Jes Sorensen's avatar Jes Sorensen Committed by Greg Kroah-Hartman

staging: rtl8723au: Remove P2P/WiFiDirect/WiFiDisplay code

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: default avatarJes Sorensen <Jes.Sorensen@redhat.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 91624933
......@@ -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
......
......@@ -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 \
......
......@@ -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);
......
......@@ -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);
......
......@@ -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)
......
......@@ -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,
......
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -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);
}
......
......@@ -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);
......
......@@ -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 */
......@@ -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);
......
......@@ -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 */
......
......@@ -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;
......
......@@ -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
......@@ -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 */
/* */
......
......@@ -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
{
......
......@@ -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 {
......
......@@ -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);
......
/******************************************************************************
*
* 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
......@@ -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
......
......@@ -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 @@ static int rtw_cfg80211_monitor_if_xmit_entry(struct sk_buff *skb,
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 @@ void rtw_cfg80211_rx_action_p2p(struct rtw_adapter *padapter, u8 *pmgmt_frame,
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;
......
......@@ -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;
......
......@@ -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,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment