summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJianzheng Zhou <jianzheng.zhou@freescale.com>2013-12-04 15:38:52 +0800
committerJianzheng Zhou <jianzheng.zhou@freescale.com>2013-12-04 15:38:52 +0800
commitedbd3280a178b47cd611dd6e858b71b0fac4ac1b (patch)
treeadf0be323e4a59074b63c0940d6ba66e940ac2ac
parent1dd004b95cd001496fa8260d0dc9e84c5151006d (diff)
ENGR00290615 Wifi:Update rtl8723as wifi driver
Update rtl8723as driver from realtek. New version is 20131126_RTL8723A_WiFi_linux_v4.1.8_9660_BT_V2.15_P17. Signed-off-by: Jianzheng Zhou <jianzheng.zhou@freescale.com>
-rwxr-xr-xdrivers/net/wireless/rtl8723as/core/rtw_ap.c29
-rwxr-xr-xdrivers/net/wireless/rtl8723as/core/rtw_mlme.c18
-rwxr-xr-xdrivers/net/wireless/rtl8723as/core/rtw_mlme_ext.c130
-rwxr-xr-xdrivers/net/wireless/rtl8723as/core/rtw_p2p.c30
-rwxr-xr-xdrivers/net/wireless/rtl8723as/core/rtw_pwrctrl.c10
-rwxr-xr-xdrivers/net/wireless/rtl8723as/core/rtw_recv.c31
-rwxr-xr-xdrivers/net/wireless/rtl8723as/core/rtw_security.c35
-rwxr-xr-xdrivers/net/wireless/rtl8723as/core/rtw_sta_mgt.c11
-rwxr-xr-xdrivers/net/wireless/rtl8723as/core/rtw_wlan_util.c1
-rwxr-xr-xdrivers/net/wireless/rtl8723as/hal/OUTSRC/odm.c10
-rwxr-xr-xdrivers/net/wireless/rtl8723as/hal/OUTSRC/odm.h2
-rwxr-xr-xdrivers/net/wireless/rtl8723as/hal/OUTSRC/odm_HWConfig.c27
-rwxr-xr-xdrivers/net/wireless/rtl8723as/hal/hal_intf.c5
-rwxr-xr-xdrivers/net/wireless/rtl8723as/hal/rtl8723a/rtl8723a_bt-coexist.c8
-rwxr-xr-xdrivers/net/wireless/rtl8723as/hal/rtl8723a/rtl8723a_dm.c13
-rwxr-xr-xdrivers/net/wireless/rtl8723as/hal/rtl8723a/rtl8723a_hal_init.c15
-rwxr-xr-xdrivers/net/wireless/rtl8723as/hal/rtl8723a/sdio/rtl8723as_recv.c48
-rwxr-xr-xdrivers/net/wireless/rtl8723as/hal/rtl8723a/sdio/sdio_halinit.c5
-rwxr-xr-xdrivers/net/wireless/rtl8723as/hal/rtl8723a/usb/usb_ops_linux.c14
-rwxr-xr-xdrivers/net/wireless/rtl8723as/include/Hal8188EPhyReg.h1
-rwxr-xr-xdrivers/net/wireless/rtl8723as/include/Hal8188EPwrSeq.h1
-rwxr-xr-xdrivers/net/wireless/rtl8723as/include/HalVerDef.h1
-rwxr-xr-xdrivers/net/wireless/rtl8723as/include/hal_intf.h3
-rwxr-xr-xdrivers/net/wireless/rtl8723as/include/ioctl_cfg80211.h1
-rwxr-xr-xdrivers/net/wireless/rtl8723as/include/osdep_service.h2
-rwxr-xr-xdrivers/net/wireless/rtl8723as/include/rtw_mlme.h1
-rwxr-xr-xdrivers/net/wireless/rtl8723as/include/rtw_mlme_ext.h4
-rwxr-xr-xdrivers/net/wireless/rtl8723as/include/rtw_mp_phy_regdef.h1
-rwxr-xr-xdrivers/net/wireless/rtl8723as/include/rtw_version.h2
-rwxr-xr-xdrivers/net/wireless/rtl8723as/include/rtw_xmit.h2
-rwxr-xr-xdrivers/net/wireless/rtl8723as/include/sta_info.h8
-rwxr-xr-xdrivers/net/wireless/rtl8723as/os_dep/linux/ioctl_cfg80211.c322
-rwxr-xr-xdrivers/net/wireless/rtl8723as/os_dep/linux/ioctl_linux.c30
-rwxr-xr-xdrivers/net/wireless/rtl8723as/os_dep/linux/mlme_linux.c14
-rwxr-xr-xdrivers/net/wireless/rtl8723as/os_dep/linux/os_intfs.c17
-rwxr-xr-xdrivers/net/wireless/rtl8723as/os_dep/linux/rtw_android.c21
-rwxr-xr-xdrivers/net/wireless/rtl8723as/os_dep/linux/sdio_intf.c129
-rwxr-xr-xdrivers/net/wireless/rtl8723as/os_dep/linux/usb_intf.c43
38 files changed, 728 insertions, 317 deletions
diff --git a/drivers/net/wireless/rtl8723as/core/rtw_ap.c b/drivers/net/wireless/rtl8723as/core/rtw_ap.c
index adebe11f32c7..70df9b1ad22a 100755
--- a/drivers/net/wireless/rtl8723as/core/rtw_ap.c
+++ b/drivers/net/wireless/rtl8723as/core/rtw_ap.c
@@ -379,6 +379,13 @@ void expire_timeout_chk(_adapter *padapter)
psta = LIST_CONTAINOR(plist, struct sta_info, auth_list);
plist = get_next(plist);
+
+#ifdef CONFIG_ATMEL_RC_PATCH
+ if (_TRUE == _rtw_memcmp((void *)(pstapriv->atmel_rc_pattern), (void *)(psta->hwaddr), ETH_ALEN))
+ continue;
+ if (psta->flag_atmel_rc)
+ continue;
+#endif
if(psta->expire_to>0)
{
psta->expire_to--;
@@ -423,7 +430,15 @@ void expire_timeout_chk(_adapter *padapter)
{
psta = LIST_CONTAINOR(plist, struct sta_info, asoc_list);
plist = get_next(plist);
-
+#ifdef CONFIG_ATMEL_RC_PATCH
+ DBG_871X("%s:%d psta=%p, %02x,%02x||%02x,%02x \n\n", __func__, __LINE__,
+ psta,pstapriv->atmel_rc_pattern[0], pstapriv->atmel_rc_pattern[5], psta->hwaddr[0], psta->hwaddr[5]);
+ if (_TRUE == _rtw_memcmp((void *)pstapriv->atmel_rc_pattern, (void *)(psta->hwaddr), ETH_ALEN))
+ continue;
+ if (psta->flag_atmel_rc)
+ continue;
+ DBG_871X("%s: debug line:%d \n", __func__, __LINE__);
+#endif
if (chk_sta_is_alive(psta) || !psta->expire_to) {
psta->expire_to = pstapriv->expire_to;
psta->keep_alive_trycnt = 0;
@@ -538,6 +553,12 @@ if (chk_alive_num) {
int ret = _FAIL;
psta = rtw_get_stainfo_by_offset(pstapriv, chk_alive_list[i]);
+#ifdef CONFIG_ATMEL_RC_PATCH
+ if (_TRUE == _rtw_memcmp( pstapriv->atmel_rc_pattern, psta->hwaddr, ETH_ALEN))
+ continue;
+ if (psta->flag_atmel_rc)
+ continue;
+#endif
if(!(psta->state &_FW_LINKED))
continue;
@@ -1315,15 +1336,15 @@ static void start_bss_network(_adapter *padapter, u8 *pbuf)
#endif //CONFIG_DUALMAC_CONCURRENT
pmlmeext->cur_wireless_mode = pmlmepriv->cur_network.network_type;
+ //let pnetwork_mlmeext == pnetwork_mlme.
+ _rtw_memcpy(pnetwork_mlmeext, pnetwork, pnetwork->Length);
+
//update cur_wireless_mode
update_wireless_mode(padapter);
//udpate capability after cur_wireless_mode updated
update_capinfo(padapter, rtw_get_capability((WLAN_BSSID_EX *)pnetwork));
- //let pnetwork_mlmeext == pnetwork_mlme.
- _rtw_memcpy(pnetwork_mlmeext, pnetwork, pnetwork->Length);
-
#ifdef CONFIG_P2P
_rtw_memcpy(pwdinfo->p2p_group_ssid, pnetwork->Ssid.Ssid, pnetwork->Ssid.SsidLength);
pwdinfo->p2p_group_ssid_len = pnetwork->Ssid.SsidLength;
diff --git a/drivers/net/wireless/rtl8723as/core/rtw_mlme.c b/drivers/net/wireless/rtl8723as/core/rtw_mlme.c
index b5e1807c69d7..5d800f884dad 100755
--- a/drivers/net/wireless/rtl8723as/core/rtw_mlme.c
+++ b/drivers/net/wireless/rtl8723as/core/rtw_mlme.c
@@ -1310,7 +1310,11 @@ _func_enter_;
pmlmepriv->to_join = _TRUE;
}
}
+ else
#endif
+ {
+ rtw_indicate_disconnect(adapter);
+ }
_clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING);
}
}
@@ -2256,6 +2260,7 @@ _func_enter_;
{
_enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
ptarget_wlan = rtw_find_network(&pmlmepriv->scanned_queue, cur_network->network.MacAddress);
+ pmlmepriv->cur_network_scanned = ptarget_wlan;
if(ptarget_wlan) ptarget_wlan->fixed = _TRUE;
_exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
// a sta + bc/mc_stainfo (not Ibss_stainfo)
@@ -3077,7 +3082,7 @@ _func_enter_;
} else if (rtw_to_roaming(adapter) > 0) {
if( (roaming_candidate == NULL ||roaming_candidate->network.Rssi<pnetwork->network.Rssi )
- && is_same_ess(&pnetwork->network, &pmlmepriv->cur_network.network)
+ && is_same_ess(&pnetwork->network, &pmlmepriv->cur_network.network)
//&&(!is_same_network(&pnetwork->network, &pmlmepriv->cur_network.network, 0))
&& rtw_get_time_interval_ms((u32)pnetwork->last_scanned,cur_time) < 5000
) {
@@ -4132,5 +4137,16 @@ sint check_buddy_fwstate(_adapter *padapter, sint state)
return _FALSE;
}
+u8 rtw_get_buddy_bBusyTraffic(_adapter *padapter)
+{
+ if(padapter == NULL)
+ return _FALSE;
+
+ if(padapter->pbuddy_adapter == NULL)
+ return _FALSE;
+
+ return padapter->pbuddy_adapter->mlmepriv.LinkDetectInfo.bBusyTraffic;
+}
+
#endif //CONFIG_CONCURRENT_MODE
diff --git a/drivers/net/wireless/rtl8723as/core/rtw_mlme_ext.c b/drivers/net/wireless/rtl8723as/core/rtw_mlme_ext.c
index 79961ad7df62..887c6cee0fc8 100755
--- a/drivers/net/wireless/rtl8723as/core/rtw_mlme_ext.c
+++ b/drivers/net/wireless/rtl8723as/core/rtw_mlme_ext.c
@@ -779,15 +779,23 @@ u32 p2p_listen_state_process(_adapter *padapter, unsigned char *da)
#ifdef CONFIG_IOCTL_CFG80211
if( padapter->wdinfo.driver_interface == DRIVER_CFG80211 )
{
- if (wdev_to_priv(padapter->rtw_wdev)->p2p_enabled == _FALSE
+ if(padapter->cfg80211_wdinfo.is_ro_ch == _FALSE
+ || rtw_get_oper_ch(padapter) != padapter->wdinfo.listen_channel
+ || wdev_to_priv(padapter->rtw_wdev)->p2p_enabled == _FALSE
|| padapter->mlmepriv.wps_probe_resp_ie == NULL
|| padapter->mlmepriv.p2p_probe_resp_ie == NULL
)
{
- DBG_871X("DON'T issue_probersp_p2p: p2p_enabled:%d, wps_probe_resp_ie:%p, p2p_probe_resp_ie:%p\n",
+#ifdef CONFIG_DEBUG_CFG80211
+ DBG_871X("DON'T issue_probersp_p2p: p2p_enabled:%d, wps_probe_resp_ie:%p, p2p_probe_resp_ie:%p, ",
wdev_to_priv(padapter->rtw_wdev)->p2p_enabled,
padapter->mlmepriv.wps_probe_resp_ie,
padapter->mlmepriv.p2p_probe_resp_ie);
+ DBG_871X("is_ro_ch:%d, op_ch:%d, p2p_listen_channel:%d\n",
+ padapter->cfg80211_wdinfo.is_ro_ch,
+ rtw_get_oper_ch(padapter),
+ padapter->wdinfo.listen_channel);
+#endif
response = _FALSE;
}
}
@@ -828,6 +836,15 @@ unsigned int OnProbeReq(_adapter *padapter, union recv_frame *precv_frame)
uint len = precv_frame->u.hdr.len;
u8 is_valid_p2p_probereq = _FALSE;
+#ifdef CONFIG_ATMEL_RC_PATCH
+ u8 *target_ie=NULL, *wps_ie=NULL;
+ u8 *start;
+ uint search_len = 0, wps_ielen = 0, target_ielen = 0;
+ struct sta_info *psta;
+ struct sta_priv *pstapriv = &padapter->stapriv;
+#endif
+
+
#ifdef CONFIG_P2P
struct wifidirect_info *pwdinfo = &(padapter->wdinfo);
struct rx_pkt_attrib *pattrib = &precv_frame->u.hdr.attrib;
@@ -896,6 +913,23 @@ _continue:
//DBG_871X("+OnProbeReq\n");
+
+#ifdef CONFIG_ATMEL_RC_PATCH
+ if ((wps_ie = rtw_get_wps_ie(
+ pframe + WLAN_HDR_A3_LEN + _PROBEREQ_IE_OFFSET_,
+ len - WLAN_HDR_A3_LEN - _PROBEREQ_IE_OFFSET_,
+ NULL, &wps_ielen))) {
+
+ target_ie = rtw_get_wps_attr_content( wps_ie, wps_ielen, WPS_ATTR_MANUFACTURER, NULL, &target_ielen);
+ }
+ if ((target_ie && (target_ielen == 4)) && (_TRUE ==_rtw_memcmp((void *)target_ie, "Ozmo",4 ))) {
+ //psta->flag_atmel_rc = 1;
+ unsigned char *sa_addr = get_sa(pframe);
+ DBG_871X("%s: Find Ozmo RC -- %02x:%02x:%02x:%02x:%02x:%02x \n\n",
+ __func__, *sa_addr, *(sa_addr+1), *(sa_addr+2), *(sa_addr+3), *(sa_addr+4), *(sa_addr+5));
+ _rtw_memcpy( pstapriv->atmel_rc_pattern, get_sa(pframe), ETH_ALEN);
+ }
+#endif
#ifdef CONFIG_CONCURRENT_MODE
if(((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE) &&
check_buddy_fwstate(padapter, _FW_UNDER_LINKING|_FW_UNDER_SURVEY))
@@ -5658,7 +5692,7 @@ unsigned int on_action_public_p2p(union recv_frame *precv_frame)
merged_p2p_ielen = rtw_get_p2p_merged_ies_len(frame_body + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_);
- merged_p2pie = rtw_malloc(merged_p2p_ielen);
+ merged_p2pie = rtw_zmalloc(merged_p2p_ielen + 2); // 2 is for EID and Length
if (merged_p2pie == NULL)
{
DBG_871X( "[%s] Malloc p2p ie fail\n", __FUNCTION__);
@@ -5926,7 +5960,7 @@ exit:
if(merged_p2pie)
{
- rtw_mfree(merged_p2pie, merged_p2p_ielen);
+ rtw_mfree(merged_p2pie, merged_p2p_ielen + 2);
}
return _SUCCESS;
@@ -9091,14 +9125,38 @@ void site_survey(_adapter *padapter)
}
}
}
-
+#ifdef CONFIG_ATMEL_RC_PATCH
+ #ifdef CONFIG_P2P
+ if( !rtw_p2p_chk_state(pwdinfo, P2P_STATE_SCAN) &&
+ !rtw_p2p_chk_state(pwdinfo, P2P_STATE_FIND_PHASE_SEARCH)
+ )
+ #endif//CONFIG_P2P
+ {
+ if(ScanType == SCAN_ACTIVE){
+ if( check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE){
+ if(survey_channel == pmlmeext->cur_channel )
+ set_survey_timer(pmlmeext, 200);
+ else
+ set_survey_timer(pmlmeext, 20);
+ }
+ else{
+ set_survey_timer(pmlmeext, 40);
+ }
+ }
+ else{//SCAN_PASSIVE
+ set_survey_timer(pmlmeext, pmlmeext->chan_scan_time);
+ }
+ }
+ else
+#endif //CONFIG_ATMEL_RC_PATCH
+ {
#ifdef CONFIG_STA_MODE_SCAN_UNDER_AP_MODE
if( stay_buddy_ch == 1 )
set_survey_timer(pmlmeext, pmlmeext->chan_scan_time * RTW_STAY_AP_CH_MILLISECOND );
else
#endif //CONFIG_STA_MODE_SCAN_UNDER_AP_MODE
set_survey_timer(pmlmeext, pmlmeext->chan_scan_time);
-
+ }
}
else
{
@@ -9611,6 +9669,7 @@ void start_create_ibss(_adapter* padapter)
report_join_res(padapter, 1);
pmlmeinfo->state |= WIFI_FW_ASSOC_SUCCESS;
+ rtw_indicate_connect(padapter);
}
}
else
@@ -11308,6 +11367,7 @@ u8 join_cmd_hdl(_adapter *padapter, u8 *pbuf)
u32 i;
//u32 initialgain;
//u32 acparm;
+ u8 ch, bw, offset;
//check already connecting to AP or not
if (pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS)
@@ -11411,6 +11471,7 @@ u8 join_cmd_hdl(_adapter *padapter, u8 *pbuf)
break;
default:
+ pmlmeext->cur_bwmode = HT_CHANNEL_WIDTH_20;
pmlmeext->cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;
break;
}
@@ -11456,31 +11517,33 @@ u8 join_cmd_hdl(_adapter *padapter, u8 *pbuf)
rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_BK, (u8 *)(&acparm));
}
#endif
- //disable dynamic functions, such as high power, DIG
- //Switch_DM_Func(padapter, DYNAMIC_FUNC_DISABLE, _FALSE);
-
- //config the initial gain under linking, need to write the BB registers
- //initialgain = 0x1E;
- //rtw_hal_set_hwreg(padapter, HW_VAR_INITIAL_GAIN, (u8 *)(&initialgain));
/* check channel, bandwidth, offset and switch */
#ifdef CONFIG_DUALMAC_CONCURRENT
- if(dc_handle_join_request(padapter) == _FAIL) {
+ if(dc_handle_join_request(padapter, &ch, &bw, &offset) == _FAIL) {
DBG_871X("dc_handle_join_request fail !!!\n");
return H2C_SUCCESS;
}
- set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode);
#else //NON CONFIG_DUALMAC_CONCURRENT
- if(rtw_chk_start_clnt_join(padapter) == _FAIL) {
+ if(rtw_chk_start_clnt_join(padapter, &ch, &bw, &offset) == _FAIL) {
report_join_res(padapter, (-4));
return H2C_SUCCESS;
}
#endif
+ //disable dynamic functions, such as high power, DIG
+ //Switch_DM_Func(padapter, DYNAMIC_FUNC_DISABLE, _FALSE);
+
+ //config the initial gain under linking, need to write the BB registers
+ //initialgain = 0x1E;
+ //rtw_hal_set_hwreg(padapter, HW_VAR_INITIAL_GAIN, (u8 *)(&initialgain));
+
rtw_hal_set_hwreg(padapter, HW_VAR_BSSID, pmlmeinfo->network.MacAddress);
join_type = 0;
rtw_hal_set_hwreg(padapter, HW_VAR_MLME_JOIN, (u8 *)(&join_type));
+ set_channel_bwmode(padapter, ch, offset, bw);
+
//cancel link timer
_cancel_timer_ex(&pmlmeext->link_timer);
@@ -11576,7 +11639,7 @@ int rtw_scan_ch_decision(_adapter *padapter, struct rtw_ieee80211_channel *out,
_rtw_memcpy(&out[j], &in[i], sizeof(struct rtw_ieee80211_channel));
if(pmlmeext->channel_set[set_idx].ScanType == SCAN_PASSIVE)
- out[j].flags &= RTW_IEEE80211_CHAN_PASSIVE_SCAN;
+ out[j].flags |= RTW_IEEE80211_CHAN_PASSIVE_SCAN;
j++;
}
@@ -11590,7 +11653,7 @@ int rtw_scan_ch_decision(_adapter *padapter, struct rtw_ieee80211_channel *out,
out[i].hw_value = pmlmeext->channel_set[i].ChannelNum;
if(pmlmeext->channel_set[i].ScanType == SCAN_PASSIVE)
- out[i].flags &= RTW_IEEE80211_CHAN_PASSIVE_SCAN;
+ out[i].flags |= RTW_IEEE80211_CHAN_PASSIVE_SCAN;
j++;
}
@@ -12295,7 +12358,7 @@ void dc_set_channel_bwmode_disconnect(_adapter *padapter)
}
}
-u8 dc_handle_join_request(_adapter *padapter)
+u8 dc_handle_join_request(_adapter *padapter, u8 *ch, u8 *bw, u8 *offset)
{
struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
@@ -12348,6 +12411,18 @@ u8 dc_handle_join_request(_adapter *padapter)
}
}
+ if (!ch || !bw || !offset) {
+ rtw_warn_on(1);
+ ret = _FAIL;
+ }
+
+ if (ret == _SUCCESS) {
+ *ch = pmlmeext->cur_channel;
+ *bw = pmlmeext->cur_bwmode;
+ *offset = pmlmeext->cur_ch_offset;
+ }
+
+exit:
return ret;
}
@@ -13009,7 +13084,7 @@ void concurrent_chk_joinbss_done(_adapter *padapter, int join_res)
}
#endif //CONFIG_CONCURRENT_MODE
-int rtw_chk_start_clnt_join(_adapter *padapter)
+int rtw_chk_start_clnt_join(_adapter *padapter, u8 *ch, u8 *bw, u8 *offset)
{
struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
unsigned char cur_ch = pmlmeext->cur_channel;
@@ -13019,13 +13094,13 @@ int rtw_chk_start_clnt_join(_adapter *padapter)
bool connect_allow = _TRUE;
#ifdef CONFIG_CONCURRENT_MODE
- PADAPTER pbuddy_adapter;
+ PADAPTER pbuddy_adapter;
struct mlme_ext_priv *pbuddy_mlmeext;
struct mlme_ext_info *pbuddy_pmlmeinfo;
struct mlme_priv *pbuddy_mlmepriv;
if (!rtw_buddy_adapter_up(padapter)) {
- goto start_join_set_ch_bw;
+ goto exit;
}
pbuddy_adapter = padapter->pbuddy_adapter;
@@ -13099,7 +13174,7 @@ int rtw_chk_start_clnt_join(_adapter *padapter)
connect_allow = chbw_allow;
- #if defined(CONFIG_P2P) && defined(CONFIG_IOCTL_CFG80211)
+ #if defined(CONFIG_P2P) && defined(CONFIG_IOCTL_CFG80211)
/* wlan0-sta mode has higher priority than p2p0-p2p client */
if (!rtw_p2p_chk_state(&(pbuddy_adapter->wdinfo), P2P_STATE_NONE)
&& pbuddy_adapter->wdinfo.driver_interface == DRIVER_CFG80211)
@@ -13117,12 +13192,19 @@ int rtw_chk_start_clnt_join(_adapter *padapter)
}
}
-start_join_set_ch_bw:
+exit:
#endif /* CONFIG_CONCURRENT_MODE */
+ if (!ch || !bw || !offset) {
+ rtw_warn_on(1);
+ connect_allow = _FALSE;
+ }
+
if (connect_allow == _TRUE) {
DBG_871X("start_join_set_ch_bw: ch=%d, bwmode=%d, ch_offset=%d\n", cur_ch, cur_bw, cur_ch_offset);
- set_channel_bwmode(padapter, cur_ch, cur_ch_offset, cur_bw);
+ *ch = cur_ch;
+ *bw = cur_bw;
+ *offset = cur_ch_offset;
}
return connect_allow == _TRUE ? _SUCCESS : _FAIL;
diff --git a/drivers/net/wireless/rtl8723as/core/rtw_p2p.c b/drivers/net/wireless/rtl8723as/core/rtw_p2p.c
index 348bdb88357c..b9b205ab1d2d 100755
--- a/drivers/net/wireless/rtl8723as/core/rtw_p2p.c
+++ b/drivers/net/wireless/rtl8723as/core/rtw_p2p.c
@@ -4057,7 +4057,8 @@ int rtw_p2p_check_frames(_adapter *padapter, const u8 *buf, u32 len, u8 tx)
//pwdev_priv->provdisc_req_issued = _FALSE;
#ifdef CONFIG_CONCURRENT_MODE
- if(check_buddy_fwstate(padapter, _FW_LINKED))
+ if(check_buddy_fwstate(padapter, _FW_LINKED)
+ || check_buddy_fwstate(padapter, WIFI_AP_STATE))
rtw_cfg80211_adjust_p2pie_channel(padapter, frame_body, len-sizeof(struct rtw_ieee80211_hdr_3addr));
#endif
}
@@ -4086,7 +4087,8 @@ int rtw_p2p_check_frames(_adapter *padapter, const u8 *buf, u32 len, u8 tx)
if (!tx) {
#ifdef CONFIG_CONCURRENT_MODE
- if(check_buddy_fwstate(padapter, _FW_LINKED)
+ if((check_buddy_fwstate(padapter, _FW_LINKED)
+ || check_buddy_fwstate(padapter, WIFI_AP_STATE))
&& rtw_chk_p2pie_ch_list_with_buddy(padapter, frame_body, len-sizeof(struct rtw_ieee80211_hdr_3addr)) == _FALSE)
{
DBG_871X(FUNC_ADPT_FMT" ch_list has no intersect with buddy\n", FUNC_ADPT_ARG(padapter));
@@ -4103,7 +4105,8 @@ int rtw_p2p_check_frames(_adapter *padapter, const u8 *buf, u32 len, u8 tx)
if (tx) {
#ifdef CONFIG_CONCURRENT_MODE
- if(check_buddy_fwstate(padapter, _FW_LINKED))
+ if(check_buddy_fwstate(padapter, _FW_LINKED)
+ || check_buddy_fwstate(padapter, WIFI_AP_STATE))
rtw_cfg80211_adjust_p2pie_channel(padapter, frame_body, len-sizeof(struct rtw_ieee80211_hdr_3addr));
#endif
}
@@ -4133,7 +4136,8 @@ int rtw_p2p_check_frames(_adapter *padapter, const u8 *buf, u32 len, u8 tx)
if (!tx) {
pwdev_priv->provdisc_req_issued = _FALSE;
#ifdef CONFIG_CONCURRENT_MODE
- if(check_buddy_fwstate(padapter, _FW_LINKED)
+ if((check_buddy_fwstate(padapter, _FW_LINKED)
+ || check_buddy_fwstate(padapter, WIFI_AP_STATE))
&& rtw_chk_p2pie_ch_list_with_buddy(padapter, frame_body, len-sizeof(struct rtw_ieee80211_hdr_3addr)) == _FALSE)
{
DBG_871X(FUNC_ADPT_FMT" ch_list has no intersect with buddy\n", FUNC_ADPT_ARG(padapter));
@@ -4151,7 +4155,8 @@ int rtw_p2p_check_frames(_adapter *padapter, const u8 *buf, u32 len, u8 tx)
if (tx) {
#ifdef CONFIG_CONCURRENT_MODE
- if(check_buddy_fwstate(padapter, _FW_LINKED))
+ if(check_buddy_fwstate(padapter, _FW_LINKED)
+ || check_buddy_fwstate(padapter, WIFI_AP_STATE))
rtw_cfg80211_adjust_p2pie_channel(padapter, frame_body, len-sizeof(struct rtw_ieee80211_hdr_3addr));
#endif
}
@@ -4192,7 +4197,8 @@ int rtw_p2p_check_frames(_adapter *padapter, const u8 *buf, u32 len, u8 tx)
if (tx) {
#ifdef CONFIG_CONCURRENT_MODE
- if(check_buddy_fwstate(padapter, _FW_LINKED))
+ if(check_buddy_fwstate(padapter, _FW_LINKED)
+ || check_buddy_fwstate(padapter, WIFI_AP_STATE))
rtw_cfg80211_adjust_p2pie_channel(padapter, frame_body, len-sizeof(struct rtw_ieee80211_hdr_3addr));
#endif
}
@@ -4218,7 +4224,8 @@ int rtw_p2p_check_frames(_adapter *padapter, const u8 *buf, u32 len, u8 tx)
if (!tx) {
#ifdef CONFIG_CONCURRENT_MODE
- if(check_buddy_fwstate(padapter, _FW_LINKED)) {
+ if(check_buddy_fwstate(padapter, _FW_LINKED)
+ || check_buddy_fwstate(padapter, WIFI_AP_STATE)) {
if (op_ch != -1 && rtw_chk_p2pie_op_ch_with_buddy(padapter, frame_body, len-sizeof(struct rtw_ieee80211_hdr_3addr)) == _FALSE) {
DBG_871X(FUNC_ADPT_FMT" op_ch:%u has no intersect with buddy\n", FUNC_ADPT_ARG(padapter), op_ch);
rtw_change_p2pie_ch_list(padapter, frame_body, len-sizeof(struct rtw_ieee80211_hdr_3addr), 0);
@@ -4238,7 +4245,8 @@ int rtw_p2p_check_frames(_adapter *padapter, const u8 *buf, u32 len, u8 tx)
if (tx) {
#ifdef CONFIG_CONCURRENT_MODE
- if(check_buddy_fwstate(padapter, _FW_LINKED))
+ if(check_buddy_fwstate(padapter, _FW_LINKED)
+ || check_buddy_fwstate(padapter, WIFI_AP_STATE))
rtw_cfg80211_adjust_p2pie_channel(padapter, frame_body, len-sizeof(struct rtw_ieee80211_hdr_3addr));
#endif
}
@@ -5246,6 +5254,11 @@ int rtw_p2p_enable(_adapter *padapter, enum P2P_ROLE role)
return ret;
#endif //CONFIG_INTEL_WIDI
+#ifdef CONFIG_IOCTL_CFG80211
+ if( padapter->wdinfo.driver_interface == DRIVER_CFG80211 )
+ wdev_to_priv(padapter->rtw_wdev)->p2p_enabled = _FALSE;
+#endif //CONFIG_IOCTL_CFG80211
+
if (_FAIL == rtw_pwr_wakeup(padapter)) {
ret = _FAIL;
goto exit;
@@ -5265,6 +5278,7 @@ int rtw_p2p_enable(_adapter *padapter, enum P2P_ROLE role)
_cancel_timer_ex( &pwdinfo->ap_p2p_switch_timer);
#endif
rtw_p2p_set_state(pwdinfo, P2P_STATE_NONE);
+ rtw_p2p_set_pre_state(pwdinfo, P2P_STATE_NONE);
rtw_p2p_set_role(pwdinfo, P2P_ROLE_DISABLE);
_rtw_memset(&pwdinfo->rx_prov_disc_info, 0x00, sizeof(struct rx_provdisc_req_info));
}
diff --git a/drivers/net/wireless/rtl8723as/core/rtw_pwrctrl.c b/drivers/net/wireless/rtl8723as/core/rtw_pwrctrl.c
index 77b86f344dca..3ccfbfec9818 100755
--- a/drivers/net/wireless/rtl8723as/core/rtw_pwrctrl.c
+++ b/drivers/net/wireless/rtl8723as/core/rtw_pwrctrl.c
@@ -620,16 +620,18 @@ _func_enter_;
delay_ms = 20;
start_time = rtw_get_current_time();
do {
- val8 = rtw_read8(padapter, 0x90);
- if (!(val8 & BIT(0))) break;
+ rtw_hal_get_hwreg(padapter, HW_VAR_SYS_CLKR, &val8);
+ if (!(val8 & BIT(4))){ //0x08 bit4 =1 --> in 32k, bit4 = 0 --> leave 32k
+ pwrpriv->cpwm = PS_STATE_S4;
+ break;
+ }
if (rtw_get_passing_time_ms(start_time) > delay_ms)
{
DBG_871X("%s: Wait for FW 32K leave more than %u ms!!!\n", __FUNCTION__, delay_ms);
break;
}
- rtw_usleep_os(100);
+ rtw_usleep_os(100);
} while (1);
- pwrpriv->cpwm = PS_STATE_S4;
}
#endif
rtw_hal_set_hwreg(padapter, HW_VAR_H2C_FW_PWRMODE, (u8 *)(&ps_mode));
diff --git a/drivers/net/wireless/rtl8723as/core/rtw_recv.c b/drivers/net/wireless/rtl8723as/core/rtw_recv.c
index 05a514ea6926..322ee4ea158f 100755
--- a/drivers/net/wireless/rtl8723as/core/rtw_recv.c
+++ b/drivers/net/wireless/rtl8723as/core/rtw_recv.c
@@ -404,10 +404,12 @@ u32 rtw_free_uc_swdec_pending_queue(_adapter *adapter)
union recv_frame *pending_frame;
while((pending_frame=rtw_alloc_recvframe(&adapter->recvpriv.uc_swdec_pending_queue))) {
rtw_free_recvframe(pending_frame, &adapter->recvpriv.free_recv_queue);
- DBG_871X("%s: dequeue uc_swdec_pending_queue\n", __func__);
cnt++;
}
+ if (cnt)
+ DBG_871X(FUNC_ADPT_FMT" dequeue %d\n", FUNC_ADPT_ARG(adapter), cnt);
+
return cnt;
}
@@ -4215,12 +4217,16 @@ int recv_func(_adapter *padapter, union recv_frame *rframe)
if (check_fwstate(mlmepriv, WIFI_STATION_STATE) && psecuritypriv->busetkipkey)
{
union recv_frame *pending_frame;
- _irqL irqL;
+ int cnt = 0;
while((pending_frame=rtw_alloc_recvframe(&padapter->recvpriv.uc_swdec_pending_queue))) {
- if (recv_func_posthandle(padapter, pending_frame) == _SUCCESS)
- DBG_871X("%s: dequeue uc_swdec_pending_queue\n", __func__);
+ cnt++;
+ recv_func_posthandle(padapter, pending_frame);
}
+
+ if (cnt)
+ DBG_871X(FUNC_ADPT_FMT" dequeue %d from uc_swdec_pending_queue\n",
+ FUNC_ADPT_ARG(padapter), cnt);
}
ret = recv_func_prehandle(padapter, rframe);
@@ -4231,13 +4237,22 @@ int recv_func(_adapter *padapter, union recv_frame *rframe)
if (check_fwstate(mlmepriv, WIFI_STATION_STATE) &&
!IS_MCAST(prxattrib->ra) && prxattrib->encrypt>0 &&
(prxattrib->bdecrypted == 0 ||psecuritypriv->sw_decrypt == _TRUE) &&
- !is_wep_enc(psecuritypriv->dot11PrivacyAlgrthm) &&
- !psecuritypriv->busetkipkey) {
+ psecuritypriv->ndisauthtype == Ndis802_11AuthModeWPAPSK &&
+ !psecuritypriv->busetkipkey)
+ {
rtw_enqueue_recvframe(rframe, &padapter->recvpriv.uc_swdec_pending_queue);
- DBG_871X("%s: no key, enqueue uc_swdec_pending_queue\n", __func__);
+ //DBG_871X("%s: no key, enqueue uc_swdec_pending_queue\n", __func__);
+
+ if (recvpriv->free_recvframe_cnt < NR_RECVFRAME/4) {
+ /* to prevent from recvframe starvation, get recvframe from uc_swdec_pending_queue to free_recvframe_cnt */
+ rframe = rtw_alloc_recvframe(&padapter->recvpriv.uc_swdec_pending_queue);
+ if (rframe)
+ goto do_posthandle;
+ }
goto exit;
}
-
+
+do_posthandle:
ret = recv_func_posthandle(padapter, rframe);
}
diff --git a/drivers/net/wireless/rtl8723as/core/rtw_security.c b/drivers/net/wireless/rtl8723as/core/rtw_security.c
index 68dfafb18de5..66df244eeaf7 100755
--- a/drivers/net/wireless/rtl8723as/core/rtw_security.c
+++ b/drivers/net/wireless/rtl8723as/core/rtw_security.c
@@ -2000,15 +2000,46 @@ _func_enter_;
if(IS_MCAST(prxattrib->ra))
{
+ static u32 start = 0;
+ static u32 no_gkey_bc_cnt = 0;
+ static u32 no_gkey_mc_cnt = 0;
+
//in concurrent we should use sw descrypt in group key, so we remove this message
//DBG_871X("rx bc/mc packets, to perform sw rtw_aes_decrypt\n");
//prwskey = psecuritypriv->dot118021XGrpKey[psecuritypriv->dot118021XGrpKeyid].skey;
if(psecuritypriv->binstallGrpkey==_FALSE)
{
- res=_FAIL;
- DBG_8192C("%s:rx bc/mc packets,but didn't install group key!!!!!!!!!!\n",__FUNCTION__);
+ res=_FAIL;
+
+ if (start == 0)
+ start = rtw_get_current_time();
+
+ if (is_broadcast_mac_addr(prxattrib->ra))
+ no_gkey_bc_cnt++;
+ else
+ no_gkey_mc_cnt++;
+
+ if (rtw_get_passing_time_ms(start) > 1000) {
+ if (no_gkey_bc_cnt || no_gkey_mc_cnt) {
+ DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" no_gkey_bc_cnt:%u, no_gkey_mc_cnt:%u\n",
+ FUNC_ADPT_ARG(padapter), no_gkey_bc_cnt, no_gkey_mc_cnt);
+ }
+ start = rtw_get_current_time();
+ no_gkey_bc_cnt = 0;
+ no_gkey_mc_cnt = 0;
+ }
+
goto exit;
}
+
+ if (no_gkey_bc_cnt || no_gkey_mc_cnt) {
+ DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" gkey installed. no_gkey_bc_cnt:%u, no_gkey_mc_cnt:%u\n",
+ FUNC_ADPT_ARG(padapter), no_gkey_bc_cnt, no_gkey_mc_cnt);
+ }
+ start = 0;
+ no_gkey_bc_cnt = 0;
+ no_gkey_mc_cnt = 0;
+
prwskey = psecuritypriv->dot118021XGrpKey[prxattrib->key_index].skey;
if(psecuritypriv->dot118021XGrpKeyid != prxattrib->key_index)
{
diff --git a/drivers/net/wireless/rtl8723as/core/rtw_sta_mgt.c b/drivers/net/wireless/rtl8723as/core/rtw_sta_mgt.c
index 3ba598f87371..084b5002ed04 100755
--- a/drivers/net/wireless/rtl8723as/core/rtw_sta_mgt.c
+++ b/drivers/net/wireless/rtl8723as/core/rtw_sta_mgt.c
@@ -164,6 +164,9 @@ _func_enter_;
#else
pstapriv->expire_to = 60;// 60*2 = 120 sec = 2 min, expire after no any traffic.
#endif
+#ifdef CONFIG_ATMEL_RC_PATCH
+ _rtw_memset( pstapriv->atmel_rc_pattern, 0, ETH_ALEN);
+#endif
pstapriv->max_num_sta = NUM_STA;
#endif
@@ -444,7 +447,9 @@ _func_enter_;
//init for DM
psta->rssi_stat.UndecoratedSmoothedPWDB = (-1);
psta->rssi_stat.UndecoratedSmoothedCCK = (-1);
-
+#ifdef CONFIG_ATMEL_RC_PATCH
+ psta->flag_atmel_rc = 0;
+#endif
/* init for the sequence number of received management frame */
psta->RxMgmtFrameSeqNum = 0xffff;
}
@@ -610,7 +615,9 @@ _func_enter_;
_exit_critical_bh(&pstapriv->auth_list_lock, &irqL0);
psta->expire_to = 0;
-
+#ifdef CONFIG_ATMEL_RC_PATCH
+ psta->flag_atmel_rc = 0;
+#endif
psta->sleepq_ac_len = 0;
psta->qos_info = 0;
diff --git a/drivers/net/wireless/rtl8723as/core/rtw_wlan_util.c b/drivers/net/wireless/rtl8723as/core/rtw_wlan_util.c
index 8615468f2648..8bac6dc537ef 100755
--- a/drivers/net/wireless/rtl8723as/core/rtw_wlan_util.c
+++ b/drivers/net/wireless/rtl8723as/core/rtw_wlan_util.c
@@ -1079,6 +1079,7 @@ static void bwmode_update_check(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pI
break;
default:
+ new_bwmode = HT_CHANNEL_WIDTH_20;
new_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;
break;
}
diff --git a/drivers/net/wireless/rtl8723as/hal/OUTSRC/odm.c b/drivers/net/wireless/rtl8723as/hal/OUTSRC/odm.c
index a6353905bad0..d01bf269d64c 100755
--- a/drivers/net/wireless/rtl8723as/hal/OUTSRC/odm.c
+++ b/drivers/net/wireless/rtl8723as/hal/OUTSRC/odm.c
@@ -1193,7 +1193,9 @@ ODM_CmnInfoUpdate(
case ODM_CMNINFO_LINK:
pDM_Odm->bLinked = (BOOLEAN)Value;
break;
-
+ case ODM_CMNINFO_STATION_STATE:
+ pDM_Odm->bsta_state = (BOOLEAN)Value;
+ break;
case ODM_CMNINFO_RSSI_MIN:
pDM_Odm->RSSI_Min= (u1Byte)Value;
break;
@@ -2390,7 +2392,7 @@ odm_DIG(
}
ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): pDM_DigTable->LargeFAHit=%d\n",pDM_DigTable->LargeFAHit));
- if((pDM_Odm->SupportPlatform&(ODM_MP|ODM_CE))&&(pDM_Odm->PhyDbgInfo.NumQryBeaconPkt < 10))
+ if((pDM_Odm->SupportPlatform&(ODM_MP|ODM_CE))&&(pDM_Odm->PhyDbgInfo.NumQryBeaconPkt < 10) && (pDM_Odm->bsta_state))
pDM_DigTable->rx_gain_range_min = dm_dig_min;
if(pDM_DigTable->rx_gain_range_min > pDM_DigTable->rx_gain_range_max)
@@ -2456,8 +2458,8 @@ odm_DIG(
CurrentIGI = CurrentIGI - 2;//pDM_DigTable->CurIGValue =pDM_DigTable->PreIGValue-1;
if((pDM_Odm->SupportPlatform&(ODM_MP|ODM_CE))&&(pDM_Odm->PhyDbgInfo.NumQryBeaconPkt < 10)
- &&(pFalseAlmCnt->Cnt_all < DM_DIG_FA_TH1))
- {
+ &&(pFalseAlmCnt->Cnt_all < DM_DIG_FA_TH1) && (pDM_Odm->bsta_state))
+ {
CurrentIGI = pDM_DigTable->rx_gain_range_min;
ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Beacon is less than 10 and FA is less than 768, IGI GOES TO 0x1E!!!!!!!!!!!!\n"));
}
diff --git a/drivers/net/wireless/rtl8723as/hal/OUTSRC/odm.h b/drivers/net/wireless/rtl8723as/hal/OUTSRC/odm.h
index 4ceb6afbfdd0..f5add6515311 100755
--- a/drivers/net/wireless/rtl8723as/hal/OUTSRC/odm.h
+++ b/drivers/net/wireless/rtl8723as/hal/OUTSRC/odm.h
@@ -643,6 +643,7 @@ typedef enum _ODM_Common_Info_Definition
ODM_CMNINFO_BT_DIG,
ODM_CMNINFO_BT_BUSY, //Check Bt is using or not//neil
ODM_CMNINFO_BT_DISABLE_EDCA,
+ ODM_CMNINFO_STATION_STATE,
//------------CALL BY VALUE-------------//
//
@@ -1238,6 +1239,7 @@ typedef struct DM_Out_Source_Dynamic_Mechanism_Structure
BOOLEAN bWIFI_Direct;
BOOLEAN bWIFI_Display;
BOOLEAN bLinked;
+ BOOLEAN bsta_state;
u1Byte RSSI_Min;
u1Byte InterfaceIndex; // Add for 92D dual MAC: 0--Mac0 1--Mac1
BOOLEAN bIsMPChip;
diff --git a/drivers/net/wireless/rtl8723as/hal/OUTSRC/odm_HWConfig.c b/drivers/net/wireless/rtl8723as/hal/OUTSRC/odm_HWConfig.c
index 745cad1956ef..a11a8154448f 100755
--- a/drivers/net/wireless/rtl8723as/hal/OUTSRC/odm_HWConfig.c
+++ b/drivers/net/wireless/rtl8723as/hal/OUTSRC/odm_HWConfig.c
@@ -1099,10 +1099,12 @@ ODM_ConfigRFWithHeaderFile(
#if (RTL8188E_SUPPORT == 1)
if (pDM_Odm->SupportICType == ODM_RTL8188E)
{
- if(eRFPath == ODM_RF_PATH_A)
+ if(IS_VENDOR_8188E_I_CUT_SERIES(pDM_Odm->Adapter))
+ READ_AND_CONFIG(8188E,_RadioA_1T_ICUT_);
+ else
READ_AND_CONFIG(8188E,_RadioA_1T_);
- //else if(eRFPath == ODM_RF_PATH_B)
- // READ_AND_CONFIG(8188E,_RadioB_1T_);
+
+
ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, (" ===> ODM_ConfigRFWithHeaderFile() Radio_A:Rtl8188ERadioA_1TArray\n"));
ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, (" ===> ODM_ConfigRFWithHeaderFile() Radio_B:Rtl8188ERadioB_1TArray\n"));
}
@@ -1143,15 +1145,17 @@ ODM_ConfigBBWithHeaderFile(
if(ConfigType == CONFIG_BB_PHY_REG)
{
- READ_AND_CONFIG(8188E,_PHY_REG_1T_);
+ if(IS_VENDOR_8188E_I_CUT_SERIES(pDM_Odm->Adapter))
+ READ_AND_CONFIG(8188E,_PHY_REG_1T_ICUT_);
+ else
+ READ_AND_CONFIG(8188E,_PHY_REG_1T_);
}
-// else if(ConfigType == ODM_BaseBand_Config_PHY_REG_MP)
-// {
- //READ_AND_CONFIG(8188E,_PHY_REG_MP_);
-// }
else if(ConfigType == CONFIG_BB_AGC_TAB)
{
- READ_AND_CONFIG(8188E,_AGC_TAB_1T_);
+ if(IS_VENDOR_8188E_I_CUT_SERIES(pDM_Odm->Adapter))
+ READ_AND_CONFIG(8188E,_AGC_TAB_1T_ICUT_);
+ else
+ READ_AND_CONFIG(8188E,_AGC_TAB_1T_);
}
else if(ConfigType == CONFIG_BB_PHY_REG_PG)
{
@@ -1179,7 +1183,10 @@ ODM_ConfigMACWithHeaderFile(
#if (RTL8188E_SUPPORT == 1)
if (pDM_Odm->SupportICType == ODM_RTL8188E)
{
- result = READ_AND_CONFIG(8188E,_MAC_REG_);
+ if(IS_VENDOR_8188E_I_CUT_SERIES(pDM_Odm->Adapter))
+ READ_AND_CONFIG(8188E,_MAC_REG_ICUT_);
+ else
+ result =READ_AND_CONFIG(8188E,_MAC_REG_);
}
#endif
diff --git a/drivers/net/wireless/rtl8723as/hal/hal_intf.c b/drivers/net/wireless/rtl8723as/hal/hal_intf.c
index c7950c48f3b3..8b785532f5f3 100755
--- a/drivers/net/wireless/rtl8723as/hal/hal_intf.c
+++ b/drivers/net/wireless/rtl8723as/hal/hal_intf.c
@@ -95,6 +95,11 @@ u32 rtw_hal_power_on(_adapter *padapter)
return padapter->HalFunc.hal_power_on(padapter);
return _FAIL;
}
+void rtw_hal_power_off(_adapter *padapter)
+{
+ if(padapter->HalFunc.hal_power_off)
+ padapter->HalFunc.hal_power_off(padapter);
+}
uint rtw_hal_init(_adapter *padapter)
diff --git a/drivers/net/wireless/rtl8723as/hal/rtl8723a/rtl8723a_bt-coexist.c b/drivers/net/wireless/rtl8723as/hal/rtl8723a/rtl8723a_bt-coexist.c
index 4ac0a4a6bd64..84715c0ed76f 100755
--- a/drivers/net/wireless/rtl8723as/hal/rtl8723a/rtl8723a_bt-coexist.c
+++ b/drivers/net/wireless/rtl8723as/hal/rtl8723a/rtl8723a_bt-coexist.c
@@ -8262,7 +8262,7 @@ btdm_1AntPsTdma(
if (btdm_Is1AntPsTdmaStateChange(padapter))
{
// protect 3 beacons in 3-beacon period & no Tx pause at BT slot
- BTDM_SetFw3a(padapter, 0x93, 0x15, 0x03, 0x14, 0x0);
+ BTDM_SetFw3a(padapter, 0x93, 0x15, 0x03, 0x10, 0x0);
btdm_1AntSetBTCoexTable(padapter, 1);
}
break;
@@ -8278,7 +8278,7 @@ btdm_1AntPsTdma(
if (btdm_Is1AntPsTdmaStateChange(padapter))
{
// narrow duration for WiFi
- BTDM_SetFw3a(padapter, 0xd3, 0xa, 0xa, 0x0, 0x58); //narrow duration for WiFi
+ BTDM_SetFw3a(padapter, 0xd3, 0xa, 0xa, 0x0, 0x50); //narrow duration for WiFi
btdm_1AntSetBTCoexTable(padapter, 6);
}
break;
@@ -8329,7 +8329,7 @@ btdm_1AntPsTdma(
case 29: // WiFi DHCP/Site Survey & BT ACL busy
if (btdm_Is1AntPsTdmaStateChange(padapter))
{
- BTDM_SetFw3a(padapter, 0xeb, 0x1a, 0x1a, 0x01, 0x18);
+ BTDM_SetFw3a(padapter, 0xeb, 0x25, 0x03, 0x11, 0x00);
btdm_1AntSetBTCoexTable(padapter, 1);
}
break;
@@ -8350,7 +8350,7 @@ btdm_1AntPsTdma(
case 32: // BT SCO & Inquiry
if (btdm_Is1AntPsTdmaStateChange(padapter))
{
- BTDM_SetFw3a(padapter, 0xa3, 0x0a, 0x03, 0x14, 0x00);
+ BTDM_SetFw3a(padapter, 0xa3, 0x0a, 0x03, 0x10, 0x00);
btdm_1AntSetBTCoexTable(padapter, 0);
}
break;
diff --git a/drivers/net/wireless/rtl8723as/hal/rtl8723a/rtl8723a_dm.c b/drivers/net/wireless/rtl8723as/hal/rtl8723a/rtl8723a_dm.c
index bab4925b0959..83cf91aace8e 100755
--- a/drivers/net/wireless/rtl8723as/hal/rtl8723a/rtl8723a_dm.c
+++ b/drivers/net/wireless/rtl8723as/hal/rtl8723a/rtl8723a_dm.c
@@ -524,6 +524,7 @@ _record_initrate:
if (hw_init_completed == _TRUE)
{
u8 bLinked=_FALSE;
+ u8 bsta_state=_FALSE;
#ifdef CONFIG_DISABLE_ODM
pHalData->odmpriv.SupportAbility = 0;
@@ -537,7 +538,17 @@ _record_initrate:
bLinked = _TRUE;
#endif //CONFIG_CONCURRENT_MODE
- ODM_CmnInfoUpdate(&pHalData->odmpriv ,ODM_CMNINFO_LINK, bLinked);
+ ODM_CmnInfoUpdate(&pHalData->odmpriv ,ODM_CMNINFO_LINK, bLinked);
+
+ if (check_fwstate(&Adapter->mlmepriv, WIFI_STATION_STATE))
+ bsta_state = _TRUE;
+#ifdef CONFIG_CONCURRENT_MODE
+ if(pbuddy_adapter && check_fwstate(&pbuddy_adapter->mlmepriv, WIFI_STATION_STATE))
+ bsta_state = _TRUE;
+#endif //CONFIG_CONCURRENT_MODE
+ ODM_CmnInfoUpdate(&pHalData->odmpriv ,ODM_CMNINFO_STATION_STATE, bsta_state);
+
+
ODM_DMWatchdog(&pHalData->odmpriv);
}
diff --git a/drivers/net/wireless/rtl8723as/hal/rtl8723a/rtl8723a_hal_init.c b/drivers/net/wireless/rtl8723as/hal/rtl8723a/rtl8723a_hal_init.c
index aef17c95853c..6eceae029a63 100755
--- a/drivers/net/wireless/rtl8723as/hal/rtl8723a/rtl8723a_hal_init.c
+++ b/drivers/net/wireless/rtl8723as/hal/rtl8723a/rtl8723a_hal_init.c
@@ -952,17 +952,18 @@ s32 rtl8723a_FirmwareDownload(PADAPTER padapter)
rtStatus = _WriteFW(padapter, pFirmwareBuf, FirmwareLen);
- if(rtStatus == _SUCCESS
- ||(rtw_get_passing_time_ms(fwdl_start_time) > 500 && writeFW_retry++ >= 3)
+ if(rtStatus == _SUCCESS || padapter->bDriverStopped || padapter->bSurpriseRemoved
+ ||(writeFW_retry++ >= 3 && rtw_get_passing_time_ms(fwdl_start_time) > 500)
)
break;
-
- DBG_871X("%s writeFW_retry:%u, time after fwdl_start_time:%ums\n", __FUNCTION__
- , writeFW_retry
- , rtw_get_passing_time_ms(fwdl_start_time)
- );
}
_FWDownloadEnable(padapter, _FALSE);
+
+ DBG_871X("%s writeFW_retry:%u, time after fwdl_start_time:%ums\n", __FUNCTION__
+ , writeFW_retry
+ , rtw_get_passing_time_ms(fwdl_start_time)
+ );
+
if(_SUCCESS != rtStatus){
DBG_871X("DL Firmware failed!\n");
goto Exit;
diff --git a/drivers/net/wireless/rtl8723as/hal/rtl8723a/sdio/rtl8723as_recv.c b/drivers/net/wireless/rtl8723as/hal/rtl8723a/sdio/rtl8723as_recv.c
index ad2066fe9610..d9923679de72 100755
--- a/drivers/net/wireless/rtl8723as/hal/rtl8723a/sdio/rtl8723as_recv.c
+++ b/drivers/net/wireless/rtl8723as/hal/rtl8723a/sdio/rtl8723as_recv.c
@@ -325,10 +325,7 @@ void rtl8723as_recv(PADAPTER padapter, struct recv_buf *precvbuf)
// fix Hardware RX data error, drop whole recv_buffer
if ((!(pHalData->ReceiveConfig & RCR_ACRC32)) && pattrib->crc_err)
{
- if (padapter->registrypriv.mp_mode == 1)
- padapter->mppriv.rx_crcerrpktcount++;
- else
- DBG_8192C("%s()-%d: RX Warning! rx CRC ERROR !!\n", __FUNCTION__, __LINE__);
+ DBG_8192C("%s()-%d: RX Warning! rx CRC ERROR !!\n", __FUNCTION__, __LINE__);
rtw_free_recvframe(precvframe, &precvpriv->free_recv_queue);
break;
@@ -349,7 +346,16 @@ void rtl8723as_recv(PADAPTER padapter, struct recv_buf *precvbuf)
if ((pattrib->crc_err) || (pattrib->icv_err))
{
- if (padapter->registrypriv.mp_mode == 0)
+ #ifdef CONFIG_MP_INCLUDED
+ if (padapter->registrypriv.mp_mode == 1)
+ {
+ if ((check_fwstate(&padapter->mlmepriv, WIFI_MP_STATE) == _TRUE))//&&(padapter->mppriv.check_mp_pkt == 0))
+ {
+ if (pattrib->crc_err == 1)
+ padapter->mppriv.rx_crcerrpktcount++;
+ }
+ }
+ #endif
DBG_8192C("%s: crc_err=%d icv_err=%d, skip!\n", __FUNCTION__, pattrib->crc_err, pattrib->icv_err);
rtw_free_recvframe(precvframe, &precvpriv->free_recv_queue);
}
@@ -526,10 +532,7 @@ static void rtl8723as_recv_tasklet(void *priv)
// fix Hardware RX data error, drop whole recv_buffer
if ((!(pHalData->ReceiveConfig & RCR_ACRC32)) && pattrib->crc_err)
{
- if (padapter->registrypriv.mp_mode == 1)
- padapter->mppriv.rx_crcerrpktcount++;
- else
- DBG_8192C("%s()-%d: RX Warning! rx CRC ERROR !!\n", __FUNCTION__, __LINE__);
+ DBG_8192C("%s()-%d: RX Warning! rx CRC ERROR !!\n", __FUNCTION__, __LINE__);
rtw_free_recvframe(precvframe, &precvpriv->free_recv_queue);
break;
@@ -550,7 +553,16 @@ static void rtl8723as_recv_tasklet(void *priv)
if ((pattrib->crc_err) || (pattrib->icv_err))
{
- if (padapter->registrypriv.mp_mode == 0)
+ #ifdef CONFIG_MP_INCLUDED
+ if (padapter->registrypriv.mp_mode == 1)
+ {
+ if ((check_fwstate(&padapter->mlmepriv, WIFI_MP_STATE) == _TRUE))//&&(padapter->mppriv.check_mp_pkt == 0))
+ {
+ if (pattrib->crc_err == 1)
+ padapter->mppriv.rx_crcerrpktcount++;
+ }
+ }
+ #endif
DBG_8192C("%s: crc_err=%d icv_err=%d, skip!\n", __FUNCTION__, pattrib->crc_err, pattrib->icv_err);
rtw_free_recvframe(precvframe, &precvpriv->free_recv_queue);
}
@@ -725,10 +737,7 @@ static void rtl8723as_recv_tasklet(void *priv)
// fix Hardware RX data error, drop whole recv_buffer
if ((!(pHalData->ReceiveConfig & RCR_ACRC32)) && pattrib->crc_err)
{
- if (padapter->registrypriv.mp_mode == 1)
- padapter->mppriv.rx_crcerrpktcount++;
- else
- DBG_8192C("%s()-%d: RX Warning! rx CRC ERROR !!\n", __FUNCTION__, __LINE__);
+ DBG_8192C("%s()-%d: RX Warning! rx CRC ERROR !!\n", __FUNCTION__, __LINE__);
rtw_free_recvframe(precvframe, &precvpriv->free_recv_queue);
break;
}
@@ -746,7 +755,16 @@ static void rtl8723as_recv_tasklet(void *priv)
if ((pattrib->crc_err) || (pattrib->icv_err))
{
- if (padapter->registrypriv.mp_mode == 0)
+ #ifdef CONFIG_MP_INCLUDED
+ if (padapter->registrypriv.mp_mode == 1)
+ {
+ if ((check_fwstate(&padapter->mlmepriv, WIFI_MP_STATE) == _TRUE))//&&(padapter->mppriv.check_mp_pkt == 0))
+ {
+ if (pattrib->crc_err == 1)
+ padapter->mppriv.rx_crcerrpktcount++;
+ }
+ }
+ #endif
DBG_8192C("%s: crc_err=%d icv_err=%d, skip!\n", __FUNCTION__, pattrib->crc_err, pattrib->icv_err);
rtw_free_recvframe(precvframe, &precvpriv->free_recv_queue);
}
diff --git a/drivers/net/wireless/rtl8723as/hal/rtl8723a/sdio/sdio_halinit.c b/drivers/net/wireless/rtl8723as/hal/rtl8723a/sdio/sdio_halinit.c
index bd4429d3e11c..95dba454ccb9 100755
--- a/drivers/net/wireless/rtl8723as/hal/rtl8723a/sdio/sdio_halinit.c
+++ b/drivers/net/wireless/rtl8723as/hal/rtl8723a/sdio/sdio_halinit.c
@@ -2109,7 +2109,10 @@ _func_enter_;
{
case HW_VAR_GET_CPWM:
*val = rtw_read8(padapter, SDIO_LOCAL_BASE | SDIO_REG_HCPWM1);
- break;
+ break;
+ case HW_VAR_SYS_CLKR:
+ *val = rtw_read8(padapter, REG_SYS_CLKR);
+ break;
default:
GetHwReg8723A(padapter, variable, val);
break;
diff --git a/drivers/net/wireless/rtl8723as/hal/rtl8723a/usb/usb_ops_linux.c b/drivers/net/wireless/rtl8723as/hal/rtl8723a/usb/usb_ops_linux.c
index 375e87f9b618..eb6a5bfaf33e 100755
--- a/drivers/net/wireless/rtl8723as/hal/rtl8723a/usb/usb_ops_linux.c
+++ b/drivers/net/wireless/rtl8723as/hal/rtl8723a/usb/usb_ops_linux.c
@@ -709,11 +709,8 @@ static int recvbuf2recvframe(_adapter *padapter, struct recv_buf *precvbuf)
pattrib = &precvframe->u.hdr.attrib;
- if(pattrib->crc_err){
- if (padapter->registrypriv.mp_mode == 1)
- padapter->mppriv.rx_crcerrpktcount++;
- else
- DBG_8192C("%s()-%d: RX Warning! rx CRC ERROR !!\n", __FUNCTION__, __LINE__);
+ if(padapter->registrypriv.mp_mode == 0) && (pattrib->crc_err)){
+ DBG_8192C("%s()-%d: RX Warning! rx CRC ERROR !!\n", __FUNCTION__, __LINE__);
rtw_free_recvframe(precvframe, pfree_recv_queue);
goto _exit_recvbuf2recvframe;
}
@@ -1256,11 +1253,8 @@ static int recvbuf2recvframe(_adapter *padapter, _pkt *pskb)
pattrib = &precvframe->u.hdr.attrib;
- if(pattrib->crc_err){
- if (padapter->registrypriv.mp_mode == 1)
- padapter->mppriv.rx_crcerrpktcount++;
- else
- DBG_8192C("%s()-%d: RX Warning! rx CRC ERROR !!\n", __FUNCTION__, __LINE__);
+ if ((padapter->registrypriv.mp_mode == 0) && (pattrib->crc_err)){
+ DBG_8192C("%s()-%d: RX Warning! rx CRC ERROR !!\n", __FUNCTION__, __LINE__);
rtw_free_recvframe(precvframe, pfree_recv_queue);
goto _exit_recvbuf2recvframe;
}
diff --git a/drivers/net/wireless/rtl8723as/include/Hal8188EPhyReg.h b/drivers/net/wireless/rtl8723as/include/Hal8188EPhyReg.h
index 1eddfe754e1a..f83e609689f2 100755
--- a/drivers/net/wireless/rtl8723as/include/Hal8188EPhyReg.h
+++ b/drivers/net/wireless/rtl8723as/include/Hal8188EPhyReg.h
@@ -249,6 +249,7 @@
#define rOFDM1_CFOTracking 0xd2c
#define rOFDM1_TRxMesaure1 0xd34
#define rOFDM1_IntfDet 0xd3c
+#define rOFDM1_csi_fix_mask 0xd40
#define rOFDM1_PseudoNoiseStateAB 0xd50
#define rOFDM1_PseudoNoiseStateCD 0xd54
#define rOFDM1_RxPseudoNoiseWgt 0xd58
diff --git a/drivers/net/wireless/rtl8723as/include/Hal8188EPwrSeq.h b/drivers/net/wireless/rtl8723as/include/Hal8188EPwrSeq.h
index 915da60456f4..41f852f22402 100755
--- a/drivers/net/wireless/rtl8723as/include/Hal8188EPwrSeq.h
+++ b/drivers/net/wireless/rtl8723as/include/Hal8188EPwrSeq.h
@@ -69,7 +69,6 @@
{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT0, BIT0}, /*0x04[8] = 1 polling until return 0*/ \
{0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_POLLING, BIT0, 0}, /*wait till 0x04[8] = 0*/ \
{0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, 0}, /*LDO normal mode*/ \
- {0x0074, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,PWR_BASEADDR_MAC,PWR_CMD_WRITE, BIT4, BIT4}, /*SDIO Driving*/ \
#define RTL8188E_TRANS_ACT_TO_CARDEMU \
/* format */ \
diff --git a/drivers/net/wireless/rtl8723as/include/HalVerDef.h b/drivers/net/wireless/rtl8723as/include/HalVerDef.h
index 9de5d7a161f5..204c3ac858a0 100755
--- a/drivers/net/wireless/rtl8723as/include/HalVerDef.h
+++ b/drivers/net/wireless/rtl8723as/include/HalVerDef.h
@@ -128,6 +128,7 @@ typedef struct tag_HAL_VERSION
#define IS_J_CUT(version) ((GET_CVID_CUT_VERSION(version) == J_CUT_VERSION) ? TRUE : FALSE)
#define IS_K_CUT(version) ((GET_CVID_CUT_VERSION(version) == K_CUT_VERSION) ? TRUE : FALSE)
+#define IS_VENDOR_8188E_I_CUT_SERIES(_Adapter) ((IS_8188E(GET_HAL_DATA(_Adapter)->VersionID)) ? ((GET_CVID_CUT_VERSION(GET_HAL_DATA(_Adapter)->VersionID) >= I_CUT_VERSION) ? TRUE : FALSE) : FALSE)
//HAL_VENDOR_E
#define IS_CHIP_VENDOR_TSMC(version) ((GET_CVID_MANUFACTUER(version) == CHIP_VENDOR_TSMC)? TRUE: FALSE)
diff --git a/drivers/net/wireless/rtl8723as/include/hal_intf.h b/drivers/net/wireless/rtl8723as/include/hal_intf.h
index da9d42b4c723..2048321a5225 100755
--- a/drivers/net/wireless/rtl8723as/include/hal_intf.h
+++ b/drivers/net/wireless/rtl8723as/include/hal_intf.h
@@ -118,6 +118,7 @@ typedef enum _HW_VARIABLES{
#ifdef CONFIG_WOWLAN
HW_VAR_WOWLAN,
#endif
+ HW_VAR_SYS_CLKR,
HW_VAR_NAV_UPPER,
HW_VAR_RPT_TIMER_SETTING,
HW_VAR_TX_RPT_MAX_MACID,
@@ -163,6 +164,7 @@ typedef s32 (*c2h_id_filter)(u8 id);
struct hal_ops {
u32 (*hal_power_on)(_adapter *padapter);
+ void (*hal_power_off)(_adapter *padapter);
u32 (*hal_init)(_adapter *padapter);
u32 (*hal_deinit)(_adapter *padapter);
@@ -394,6 +396,7 @@ void rtw_hal_sw_led_init(_adapter *padapter);
void rtw_hal_sw_led_deinit(_adapter *padapter);
u32 rtw_hal_power_on(_adapter *padapter);
+void rtw_hal_power_off(_adapter *padapter);
uint rtw_hal_init(_adapter *padapter);
uint rtw_hal_deinit(_adapter *padapter);
void rtw_hal_stop(_adapter *padapter);
diff --git a/drivers/net/wireless/rtl8723as/include/ioctl_cfg80211.h b/drivers/net/wireless/rtl8723as/include/ioctl_cfg80211.h
index b529b538dcd7..88647e8465a8 100755
--- a/drivers/net/wireless/rtl8723as/include/ioctl_cfg80211.h
+++ b/drivers/net/wireless/rtl8723as/include/ioctl_cfg80211.h
@@ -122,6 +122,7 @@ void rtw_cfg80211_init_wiphy(_adapter *padapter);
void rtw_cfg80211_surveydone_event_callback(_adapter *padapter);
struct cfg80211_bss *rtw_cfg80211_inform_bss(_adapter *padapter, struct wlan_network *pnetwork);
int rtw_cfg80211_check_bss(_adapter *padapter);
+void rtw_cfg80211_ibss_indicate_connect(_adapter *padapter);
void rtw_cfg80211_indicate_connect(_adapter *padapter);
void rtw_cfg80211_indicate_disconnect(_adapter *padapter);
void rtw_cfg80211_indicate_scan_done(struct rtw_wdev_priv *pwdev_priv, bool aborted);
diff --git a/drivers/net/wireless/rtl8723as/include/osdep_service.h b/drivers/net/wireless/rtl8723as/include/osdep_service.h
index 36e8abe456fc..683a2808019b 100755
--- a/drivers/net/wireless/rtl8723as/include/osdep_service.h
+++ b/drivers/net/wireless/rtl8723as/include/osdep_service.h
@@ -1276,7 +1276,7 @@ __inline static void _set_workitem(_workitem *pwork)
extern int RTW_STATUS_CODE(int error_code);
-#define CONFIG_USE_VMALLOC
+//#define CONFIG_USE_VMALLOC
/* flags used for rtw_mstat_update() */
enum mstat_f {
diff --git a/drivers/net/wireless/rtl8723as/include/rtw_mlme.h b/drivers/net/wireless/rtl8723as/include/rtw_mlme.h
index bdb47cb88130..98738c8d62dc 100755
--- a/drivers/net/wireless/rtl8723as/include/rtw_mlme.h
+++ b/drivers/net/wireless/rtl8723as/include/rtw_mlme.h
@@ -744,6 +744,7 @@ __inline static void up_scanned_network(struct mlme_priv *pmlmepriv)
#ifdef CONFIG_CONCURRENT_MODE
sint rtw_buddy_adapter_up(_adapter *padapter);
sint check_buddy_fwstate(_adapter *padapter, sint state);
+u8 rtw_get_buddy_bBusyTraffic(_adapter *padapter);
#endif //CONFIG_CONCURRENT_MODE
__inline static void down_scanned_network(struct mlme_priv *pmlmepriv)
diff --git a/drivers/net/wireless/rtl8723as/include/rtw_mlme_ext.h b/drivers/net/wireless/rtl8723as/include/rtw_mlme_ext.h
index 284e99c27b68..a47577328bd2 100755
--- a/drivers/net/wireless/rtl8723as/include/rtw_mlme_ext.h
+++ b/drivers/net/wireless/rtl8723as/include/rtw_mlme_ext.h
@@ -796,7 +796,7 @@ void concurrent_chk_joinbss_done(_adapter *padapter, int join_res);
void dc_SelectChannel(_adapter *padapter, unsigned char channel);
void dc_SetBWMode(_adapter *padapter, unsigned short bwmode, unsigned char channel_offset);
void dc_set_channel_bwmode_disconnect(_adapter *padapter);
-u8 dc_handle_join_request(_adapter *padapter);
+u8 dc_handle_join_request(_adapter *padapter, u8 *ch, u8 *bw, u8 *offset);
void dc_handle_join_done(_adapter *padapter, u8 join_res);
sint dc_check_fwstate(_adapter *padapter, sint fw_state);
u8 dc_handle_site_survey(_adapter *padapter);
@@ -807,7 +807,7 @@ void dc_resume_xmit(_adapter *padapter);
u8 dc_check_xmit(_adapter *padapter);
#endif
-int rtw_chk_start_clnt_join(_adapter *padapter);
+int rtw_chk_start_clnt_join(_adapter *padapter, u8 *ch, u8 *bw, u8 *offset);
int rtw_get_ch_setting_union(_adapter *adapter, u8 *ch, u8 *bw, u8 *offset);
struct cmd_hdl {
diff --git a/drivers/net/wireless/rtl8723as/include/rtw_mp_phy_regdef.h b/drivers/net/wireless/rtl8723as/include/rtw_mp_phy_regdef.h
index 5632f7cfefbd..0f8df41279b6 100755
--- a/drivers/net/wireless/rtl8723as/include/rtw_mp_phy_regdef.h
+++ b/drivers/net/wireless/rtl8723as/include/rtw_mp_phy_regdef.h
@@ -270,6 +270,7 @@
#define rOFDM1_CFOTracking 0xd2c
#define rOFDM1_TRxMesaure1 0xd34
#define rOFDM1_IntfDet 0xd3c
+#define rOFDM1_csi_fix_mask 0xd40
#define rOFDM1_PseudoNoiseStateAB 0xd50
#define rOFDM1_PseudoNoiseStateCD 0xd54
#define rOFDM1_RxPseudoNoiseWgt 0xd58
diff --git a/drivers/net/wireless/rtl8723as/include/rtw_version.h b/drivers/net/wireless/rtl8723as/include/rtw_version.h
index de07ed041ffd..364af6ed124a 100755
--- a/drivers/net/wireless/rtl8723as/include/rtw_version.h
+++ b/drivers/net/wireless/rtl8723as/include/rtw_version.h
@@ -1 +1 @@
-#define DRIVERVERSION "v4.1.8_9180.20130927_BTCOEX20130528_ver3.3_beta"
+#define DRIVERVERSION "v4.1.8_9660.20131126_BTCOEX20130528_ver3.3"
diff --git a/drivers/net/wireless/rtl8723as/include/rtw_xmit.h b/drivers/net/wireless/rtl8723as/include/rtw_xmit.h
index df1cef62e06f..67be0188c6c1 100755
--- a/drivers/net/wireless/rtl8723as/include/rtw_xmit.h
+++ b/drivers/net/wireless/rtl8723as/include/rtw_xmit.h
@@ -45,7 +45,7 @@
#elif defined (CONFIG_USB_HCI)
#ifdef CONFIG_USB_TX_AGGREGATION
- #if defined(CONFIG_PLATFORM_ARM_SUNxI) || defined(CONFIG_PLATFORM_ARM_SUN6I)
+ #if defined(CONFIG_PLATFORM_ARM_SUNxI) || defined(CONFIG_PLATFORM_ARM_SUN6I) || defined(CONFIG_PLATFORM_ARM_SUN7I)
#define MAX_XMITBUF_SZ (12288) //12k 1536*8
#elif defined (CONFIG_PLATFORM_MSTAR)
#define MAX_XMITBUF_SZ 7680 // 7.5k
diff --git a/drivers/net/wireless/rtl8723as/include/sta_info.h b/drivers/net/wireless/rtl8723as/include/sta_info.h
index 5f2fca33b4f6..3b8ed7870edd 100755
--- a/drivers/net/wireless/rtl8723as/include/sta_info.h
+++ b/drivers/net/wireless/rtl8723as/include/sta_info.h
@@ -222,6 +222,10 @@ struct sta_info {
u8 ht_20mhz_set;
#endif // CONFIG_NATIVEAP_MLME
+#ifdef CONFIG_ATMEL_RC_PATCH
+ u8 flag_atmel_rc;
+#endif
+
unsigned int tx_ra_bitmap;
u8 qos_info;
@@ -431,6 +435,10 @@ struct sta_priv {
struct wlan_acl_pool acl_list;
#endif
+#ifdef CONFIG_ATMEL_RC_PATCH
+ u8 atmel_rc_pattern [6];
+#endif
+
};
diff --git a/drivers/net/wireless/rtl8723as/os_dep/linux/ioctl_cfg80211.c b/drivers/net/wireless/rtl8723as/os_dep/linux/ioctl_cfg80211.c
index 1e64c2de06a4..1d1d32b01d62 100755
--- a/drivers/net/wireless/rtl8723as/os_dep/linux/ioctl_cfg80211.c
+++ b/drivers/net/wireless/rtl8723as/os_dep/linux/ioctl_cfg80211.c
@@ -39,6 +39,30 @@
#define RTW_CH_MAX_2G_CHANNEL 14 /* Max channel in 2G band */
+
+
+#ifdef CONFIG_WAPI_SUPPORT
+
+#ifndef WLAN_CIPHER_SUITE_SMS4
+#define WLAN_CIPHER_SUITE_SMS4 0x00147201
+#endif
+
+#ifndef WLAN_AKM_SUITE_WAPI_PSK
+#define WLAN_AKM_SUITE_WAPI_PSK 0x000FAC04
+#endif
+
+#ifndef WLAN_AKM_SUITE_WAPI_CERT
+#define WLAN_AKM_SUITE_WAPI_CERT 0x000FAC12
+#endif
+
+#ifndef NL80211_WAPI_VERSION_1
+#define NL80211_WAPI_VERSION_1 (1 << 2)
+#endif
+
+#endif
+
+
+
static const u32 rtw_cipher_suites[] = {
WLAN_CIPHER_SUITE_WEP40,
WLAN_CIPHER_SUITE_WEP104,
@@ -367,11 +391,13 @@ struct cfg80211_bss *rtw_cfg80211_inform_bss(_adapter *padapter, struct wlan_net
if (sr != 0)
{
- if(request->n_ssids == 1 && request->n_channels == 1) // it means under processing WPS
+ if(request->n_ssids == 1 && request->n_channels == 1) // it means under processing WPS
{
DBG_8192C("ssid=%s, len=%d\n", pssid->Ssid, pssid->SsidLength);
-
- if(pssid->SsidLength == ssids[0].ssid_len &&
+
+ if (ssids[0].ssid_len == 0) {
+ }
+ else if(pssid->SsidLength == ssids[0].ssid_len &&
_rtw_memcmp(pssid->Ssid, ssids[0].ssid, ssids[0].ssid_len))
{
DBG_871X("%s, got sr and ssid match!\n", __func__);
@@ -579,6 +605,66 @@ int rtw_cfg80211_check_bss(_adapter *padapter)
return (bss!=NULL);
}
+void rtw_cfg80211_ibss_indicate_connect(_adapter *padapter)
+{
+ struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
+ struct wlan_network *cur_network = &(pmlmepriv->cur_network);
+ struct wireless_dev *pwdev = padapter->rtw_wdev;
+ struct cfg80211_bss *bss = NULL;
+
+ DBG_871X(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(padapter));
+ if (pwdev->iftype != NL80211_IFTYPE_ADHOC)
+ {
+ return;
+ }
+
+ if (!rtw_cfg80211_check_bss(padapter)) {
+ WLAN_BSSID_EX *pnetwork = &(padapter->mlmeextpriv.mlmext_info.network);
+ struct wlan_network *scanned = pmlmepriv->cur_network_scanned;
+
+ if(check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)==_TRUE)
+ {
+
+ _rtw_memcpy(&cur_network->network, pnetwork, sizeof(WLAN_BSSID_EX));
+ if(cur_network)
+ {
+ if (!rtw_cfg80211_inform_bss(padapter,cur_network))
+ DBG_871X(FUNC_ADPT_FMT" inform fail !!\n", FUNC_ADPT_ARG(padapter));
+ else
+ DBG_871X(FUNC_ADPT_FMT" inform success !!\n", FUNC_ADPT_ARG(padapter));
+ }
+ else
+ {
+ DBG_871X("cur_network is not exist!!!\n");
+ return ;
+ }
+ }
+ else
+ {
+ if(scanned == NULL)
+ rtw_warn_on(1);
+
+ if (_rtw_memcmp(&(scanned->network.Ssid), &(pnetwork->Ssid), sizeof(NDIS_802_11_SSID)) == _TRUE
+ && _rtw_memcmp(scanned->network.MacAddress, pnetwork->MacAddress, sizeof(NDIS_802_11_MAC_ADDRESS)) == _TRUE
+ ) {
+ if (!rtw_cfg80211_inform_bss(padapter,scanned)) {
+ DBG_871X(FUNC_ADPT_FMT" inform fail !!\n", FUNC_ADPT_ARG(padapter));
+ } else {
+ //DBG_871X(FUNC_ADPT_FMT" inform success !!\n", FUNC_ADPT_ARG(padapter));
+ }
+ } else {
+ DBG_871X("scanned & pnetwork compare fail\n");
+ rtw_warn_on(1);
+ }
+ }
+
+ if (!rtw_cfg80211_check_bss(padapter))
+ DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" BSS not found !!\n", FUNC_ADPT_ARG(padapter));
+ }
+ //notify cfg80211 that device joined an IBSS
+ cfg80211_ibss_joined(padapter->pnetdev, cur_network->network.MacAddress, GFP_ATOMIC);
+}
+
void rtw_cfg80211_indicate_connect(_adapter *padapter)
{
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
@@ -614,17 +700,19 @@ void rtw_cfg80211_indicate_connect(_adapter *padapter)
}
#endif //CONFIG_P2P
- if (!rtw_cfg80211_check_bss(padapter)) {
+ {
WLAN_BSSID_EX *pnetwork = &(padapter->mlmeextpriv.mlmext_info.network);
struct wlan_network *scanned = pmlmepriv->cur_network_scanned;
//DBG_871X(FUNC_ADPT_FMT" BSS not found\n", FUNC_ADPT_ARG(padapter));
- if(scanned == NULL)
+ if(scanned == NULL) {
rtw_warn_on(1);
+ goto check_bss;
+ }
- if (_rtw_memcmp(&(scanned->network.Ssid), &(pnetwork->Ssid), sizeof(NDIS_802_11_SSID)) == _TRUE
- && _rtw_memcmp(scanned->network.MacAddress, pnetwork->MacAddress, sizeof(NDIS_802_11_MAC_ADDRESS)) == _TRUE
+ if (_rtw_memcmp(scanned->network.MacAddress, pnetwork->MacAddress, sizeof(NDIS_802_11_MAC_ADDRESS)) == _TRUE
+ && _rtw_memcmp(&(scanned->network.Ssid), &(pnetwork->Ssid), sizeof(NDIS_802_11_SSID)) == _TRUE
) {
if (!rtw_cfg80211_inform_bss(padapter,scanned)) {
DBG_871X(FUNC_ADPT_FMT" inform fail !!\n", FUNC_ADPT_ARG(padapter));
@@ -632,13 +720,18 @@ void rtw_cfg80211_indicate_connect(_adapter *padapter)
//DBG_871X(FUNC_ADPT_FMT" inform success !!\n", FUNC_ADPT_ARG(padapter));
}
} else {
+ DBG_871X("scanned: %s("MAC_FMT"), cur: %s("MAC_FMT")\n",
+ scanned->network.Ssid.Ssid, MAC_ARG(scanned->network.MacAddress),
+ pnetwork->Ssid.Ssid, MAC_ARG(pnetwork->MacAddress)
+ );
rtw_warn_on(1);
}
-
- if (!rtw_cfg80211_check_bss(padapter))
- DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" BSS not found !!\n", FUNC_ADPT_ARG(padapter));
}
+check_bss:
+ if (!rtw_cfg80211_check_bss(padapter))
+ DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" BSS not found !!\n", FUNC_ADPT_ARG(padapter));
+
#ifdef CONFIG_LAYER2_ROAMING
if (rtw_to_roaming(padapter) > 0) {
#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 39) || defined(COMPAT_KERNEL_RELEASE)
@@ -707,10 +800,6 @@ void rtw_cfg80211_indicate_disconnect(_adapter *padapter)
{
if(!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))
{
- _cancel_timer_ex( &pwdinfo->find_phase_timer );
- _cancel_timer_ex( &pwdinfo->restore_p2p_state_timer );
- _cancel_timer_ex( &pwdinfo->pre_tx_scan_timer);
-
rtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo));
rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE);
@@ -1831,10 +1920,6 @@ static int cfg80211_rtw_change_iface(struct wiphy *wiphy,
{
if(change && rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO))
{
- _cancel_timer_ex( &pwdinfo->find_phase_timer );
- _cancel_timer_ex( &pwdinfo->restore_p2p_state_timer );
- _cancel_timer_ex( &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));
@@ -2205,13 +2290,6 @@ if (padapter->registrypriv.mp_mode == 1)
rtw_cfg80211_set_probe_req_wpsp2pie(padapter, (u8 *)request->ie, request->ie_len );
}
- if (pmlmepriv->LinkDetectInfo.bBusyTraffic == _TRUE)
- {
- DBG_8192C("%s, bBusyTraffic == _TRUE\n", __func__);
- need_indicate_scan_done = _TRUE;
- goto check_need_indicate_scan_done;
- }
-
if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE) {
DBG_8192C("%s, fwstate=0x%x\n", __func__, pmlmepriv->fw_state);
need_indicate_scan_done = _TRUE;
@@ -2222,6 +2300,13 @@ if (padapter->registrypriv.mp_mode == 1)
goto check_need_indicate_scan_done;
}
+ if (pmlmepriv->LinkDetectInfo.bBusyTraffic == _TRUE)
+ {
+ DBG_8192C("%s, bBusyTraffic == _TRUE\n", __func__);
+ need_indicate_scan_done = _TRUE;
+ goto check_need_indicate_scan_done;
+ }
+
if (rtw_is_scan_deny(padapter)){
DBG_871X(FUNC_ADPT_FMT ": scan deny\n", FUNC_ADPT_ARG(padapter));
need_indicate_scan_done = _TRUE;
@@ -2279,7 +2364,6 @@ if (padapter->registrypriv.mp_mode == 1)
_rtw_memcpy(ssid[i].Ssid, ssids[i].ssid, ssids[i].ssid_len);
ssid[i].SsidLength = ssids[i].ssid_len;
}
-
/* parsing channels, n_channels */
_rtw_memset(ch, 0, sizeof(struct rtw_ieee80211_channel)*RTW_CHANNEL_SCAN_AMOUNT);
@@ -2296,13 +2380,13 @@ if (padapter->registrypriv.mp_mode == 1)
for(i=1;i<survey_times_for_one_ch;i++)
_rtw_memcpy(&ch[i], &ch[0], sizeof(struct rtw_ieee80211_channel));
_status = rtw_sitesurvey_cmd(padapter, ssid, RTW_SSID_SCAN_AMOUNT, ch, survey_times_for_one_ch);
- } else if (request->n_channels == 2) {
- _rtw_memcpy(&ch[3], &ch[1], sizeof(struct rtw_ieee80211_channel));
- for(i=1;i<survey_times;i++) {
- _rtw_memcpy(&ch[i], &ch[0], sizeof(struct rtw_ieee80211_channel));
- _rtw_memcpy(&ch[i+3], &ch[3], sizeof(struct rtw_ieee80211_channel));
+ } else if (request->n_channels <= 4) {
+ for(j=request->n_channels-1;j>=0;j--)
+ for(i=0;i<survey_times;i++)
+ {
+ _rtw_memcpy(&ch[j*survey_times+i], &ch[j], sizeof(struct rtw_ieee80211_channel));
}
- _status = rtw_sitesurvey_cmd(padapter, ssid, RTW_SSID_SCAN_AMOUNT, ch, survey_times * 2);
+ _status = rtw_sitesurvey_cmd(padapter, ssid, RTW_SSID_SCAN_AMOUNT, ch, survey_times * request->n_channels);
} else {
_status = rtw_sitesurvey_cmd(padapter, ssid, RTW_SSID_SCAN_AMOUNT, NULL, 0);
}
@@ -2359,44 +2443,7 @@ static int cfg80211_rtw_set_wiphy_params(struct wiphy *wiphy, u32 changed)
return 0;
}
-static int cfg80211_rtw_join_ibss(struct wiphy *wiphy, struct net_device *ndev,
- struct cfg80211_ibss_params *params)
-{
-#if 0
- struct iwm_priv *iwm = wiphy_to_iwm(wiphy);
- struct ieee80211_channel *chan = params->channel;
-
- if (!test_bit(IWM_STATUS_READY, &iwm->status))
- return -EIO;
- /* UMAC doesn't support creating or joining an IBSS network
- * with specified bssid. */
- if (params->bssid)
- return -EOPNOTSUPP;
-
- iwm->channel = ieee80211_frequency_to_channel(chan->center_freq);
- iwm->umac_profile->ibss.band = chan->band;
- iwm->umac_profile->ibss.channel = iwm->channel;
- iwm->umac_profile->ssid.ssid_len = params->ssid_len;
- memcpy(iwm->umac_profile->ssid.ssid, params->ssid, params->ssid_len);
-
- return iwm_send_mlme_profile(iwm);
-#endif
- DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev));
- return 0;
-}
-
-static int cfg80211_rtw_leave_ibss(struct wiphy *wiphy, struct net_device *ndev)
-{
-#if 0
- struct iwm_priv *iwm = wiphy_to_iwm(wiphy);
-
- if (iwm->umac_profile_active)
- return iwm_invalidate_mlme_profile(iwm);
-#endif
- DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev));
- return 0;
-}
static int rtw_cfg80211_set_wpa_version(struct security_priv *psecuritypriv, u32 wpa_version)
{
@@ -2783,6 +2830,110 @@ exit:
return ret;
}
+static int cfg80211_rtw_join_ibss(struct wiphy *wiphy, struct net_device *ndev,
+ struct cfg80211_ibss_params *params)
+{
+ _adapter *padapter = wiphy_to_adapter(wiphy);
+ NDIS_802_11_SSID ndis_ssid;
+ struct security_priv *psecuritypriv = &padapter->securitypriv;
+ struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
+ int ret=0;
+
+ if(_FAIL == rtw_pwr_wakeup(padapter)) {
+ ret= -EPERM;
+ goto exit;
+ }
+
+ if(check_fwstate(pmlmepriv, WIFI_AP_STATE)) {
+ ret = -EPERM;
+ goto exit;
+ }
+
+#ifdef CONFIG_CONCURRENT_MODE
+ if (check_buddy_fwstate(padapter, _FW_UNDER_LINKING) == _TRUE) {
+ DBG_8192C("%s, but buddy_intf is under linking\n", __FUNCTION__);
+ ret = -EINVAL;
+ goto exit;
+ }
+ if (check_buddy_fwstate(padapter, _FW_UNDER_SURVEY) == _TRUE) {
+ rtw_scan_abort(padapter->pbuddy_adapter);
+ }
+#endif //CONFIG_CONCURRENT_MODE
+
+ if (!params->ssid || !params->ssid_len)
+ {
+ ret = -EINVAL;
+ goto exit;
+ }
+
+ if (params->ssid_len > IW_ESSID_MAX_SIZE){
+
+ ret= -E2BIG;
+ goto exit;
+ }
+
+ _rtw_memset(&ndis_ssid, 0, sizeof(NDIS_802_11_SSID));
+ ndis_ssid.SsidLength = params->ssid_len;
+ _rtw_memcpy(ndis_ssid.Ssid, params->ssid, params->ssid_len);
+
+ //DBG_8192C("ssid=%s, len=%zu\n", ndis_ssid.Ssid, params->ssid_len);
+
+ psecuritypriv->ndisencryptstatus = Ndis802_11EncryptionDisabled;
+ psecuritypriv->dot11PrivacyAlgrthm = _NO_PRIVACY_;
+ psecuritypriv->dot118021XGrpPrivacy = _NO_PRIVACY_;
+ psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_Open; //open system
+ psecuritypriv->ndisauthtype = Ndis802_11AuthModeOpen;
+
+ ret = rtw_cfg80211_set_auth_type(psecuritypriv, NL80211_AUTHTYPE_OPEN_SYSTEM);
+ rtw_set_802_11_authentication_mode(padapter, psecuritypriv->ndisauthtype);
+
+ if (rtw_set_802_11_ssid(padapter, &ndis_ssid) == _FALSE)
+ {
+ ret = -1;
+ goto exit;
+ }
+
+exit:
+ return ret;
+}
+
+static int cfg80211_rtw_leave_ibss(struct wiphy *wiphy, struct net_device *ndev)
+{
+ _adapter *padapter = wiphy_to_adapter(wiphy);
+ struct wireless_dev *rtw_wdev = wiphy_to_wdev(wiphy);
+ enum nl80211_iftype old_type;
+ int ret = 0;
+
+ DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev));
+
+ padapter->mlmepriv.not_indic_disco = _TRUE;
+
+ old_type = rtw_wdev->iftype;
+
+ rtw_set_roaming(padapter, 0);
+
+ if(check_fwstate(&padapter->mlmepriv, _FW_LINKED))
+ {
+ rtw_scan_abort(padapter);
+ LeaveAllPowerSaveMode(padapter);
+
+ rtw_wdev->iftype = NL80211_IFTYPE_STATION;
+
+ if (rtw_set_802_11_infrastructure_mode(padapter, Ndis802_11Infrastructure) ==_FALSE)
+ {
+ rtw_wdev->iftype = old_type;
+ ret = -EPERM;
+ goto leave_ibss;
+ }
+ rtw_setopmode_cmd(padapter, Ndis802_11Infrastructure,_TRUE);
+ }
+
+leave_ibss:
+ padapter->mlmepriv.not_indic_disco = _FALSE;
+
+ return 0;
+}
+
static int cfg80211_rtw_connect(struct wiphy *wiphy, struct net_device *ndev,
struct cfg80211_connect_params *sme)
{
@@ -2801,6 +2952,8 @@ static int cfg80211_rtw_connect(struct wiphy *wiphy, struct net_device *ndev,
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
struct security_priv *psecuritypriv = &padapter->securitypriv;
_queue *queue = &pmlmepriv->scanned_queue;
+
+ padapter->mlmepriv.not_indic_disco = _TRUE;
DBG_871X("=>"FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev));
DBG_871X("privacy=%d, key=%p, key_len=%d, key_idx=%d\n",
@@ -3025,7 +3178,9 @@ static int cfg80211_rtw_connect(struct wiphy *wiphy, struct net_device *ndev,
exit:
DBG_8192C("<=%s, ret %d\n",__FUNCTION__, ret);
-
+
+ padapter->mlmepriv.not_indic_disco = _FALSE;
+
return ret;
}
@@ -3036,6 +3191,8 @@ static int cfg80211_rtw_disconnect(struct wiphy *wiphy, struct net_device *ndev,
DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev));
+ padapter->mlmepriv.not_indic_disco = _TRUE;
+
rtw_set_roaming(padapter, 0);
if(check_fwstate(&padapter->mlmepriv, _FW_LINKED))
@@ -3046,13 +3203,13 @@ static int cfg80211_rtw_disconnect(struct wiphy *wiphy, struct net_device *ndev,
DBG_871X("%s...call rtw_indicate_disconnect\n", __FUNCTION__);
- padapter->mlmepriv.not_indic_disco = _TRUE;
rtw_indicate_disconnect(padapter);
- padapter->mlmepriv.not_indic_disco = _FALSE;
rtw_free_assoc_resources(padapter, 1);
}
-
+
+ padapter->mlmepriv.not_indic_disco = _FALSE;
+
return 0;
}
@@ -3792,11 +3949,7 @@ static int rtw_add_beacon(_adapter *adapter, const u8 *head, size_t head_len, co
}
else
{
- _cancel_timer_ex( &pwdinfo->find_phase_timer );
- _cancel_timer_ex( &pwdinfo->restore_p2p_state_timer );
- _cancel_timer_ex( &pwdinfo->pre_tx_scan_timer);
-
- DBG_8192C("enter GO Mode, p2p_ielen=%d\n", p2p_ielen);
+ DBG_8192C("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);
@@ -4486,6 +4639,7 @@ static s32 cfg80211_rtw_remain_on_channel(struct wiphy *wiphy,
{
rtw_p2p_enable(padapter, P2P_ROLE_DEVICE);
wdev_to_priv(padapter->rtw_wdev)->p2p_enabled = _TRUE;
+ padapter->wdinfo.listen_channel = remain_ch;
}
else
{
@@ -4540,7 +4694,7 @@ static s32 cfg80211_rtw_remain_on_channel(struct wiphy *wiphy,
//set_channel_bwmode(padapter, remain_ch, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20);
}else
#endif //CONFIG_CONCURRENT_MODE
- if(remain_ch != pmlmeext->cur_channel )
+ if(remain_ch != rtw_get_oper_ch(padapter) )
{
ready_on_channel = _TRUE;
//pmlmeext->cur_channel = remain_ch;
@@ -4554,7 +4708,7 @@ static s32 cfg80211_rtw_remain_on_channel(struct wiphy *wiphy,
//call this after other things have been done
#ifdef CONFIG_CONCURRENT_MODE
if(ATOMIC_READ(&pwdev_priv->ro_ch_to)==1 ||
- (remain_ch != pmlmeext->cur_channel))
+ (remain_ch != rtw_get_oper_ch(padapter)))
{
u8 co_channel = 0xff;
ATOMIC_SET(&pwdev_priv->ro_ch_to, 0);
@@ -4617,10 +4771,6 @@ static s32 cfg80211_rtw_cancel_remain_on_channel(struct wiphy *wiphy,
{
if(!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))
{
- _cancel_timer_ex( &pwdinfo->find_phase_timer );
- _cancel_timer_ex( &pwdinfo->restore_p2p_state_timer );
- _cancel_timer_ex( &pwdinfo->pre_tx_scan_timer);
-
rtw_p2p_set_state(pwdinfo, P2P_STATE_NONE);
_rtw_memset(pwdinfo, 0x00, sizeof(struct wifidirect_info));
}
@@ -4628,9 +4778,9 @@ static s32 cfg80211_rtw_cancel_remain_on_channel(struct wiphy *wiphy,
else
#endif
{
- rtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo));
+ rtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo));
#ifdef CONFIG_DEBUG_CFG80211
- DBG_8192C("%s, role=%d, p2p_state=%d\n", __func__, rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo));
+ DBG_8192C("%s, role=%d, p2p_state=%d\n", __func__, rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo));
#endif
}
pcfg80211_wdinfo->is_ro_ch = _FALSE;
diff --git a/drivers/net/wireless/rtl8723as/os_dep/linux/ioctl_linux.c b/drivers/net/wireless/rtl8723as/os_dep/linux/ioctl_linux.c
index d0fd7479ec1e..d76facb6321f 100755
--- a/drivers/net/wireless/rtl8723as/os_dep/linux/ioctl_linux.c
+++ b/drivers/net/wireless/rtl8723as/os_dep/linux/ioctl_linux.c
@@ -242,13 +242,19 @@ void indicate_wx_scan_complete_event(_adapter *padapter)
void rtw_indicate_wx_assoc_event(_adapter *padapter)
{
union iwreq_data wrqu;
- struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
+ struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
+ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
+ struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
+ WLAN_BSSID_EX *pnetwork = (WLAN_BSSID_EX*)(&(pmlmeinfo->network));
_rtw_memset(&wrqu, 0, sizeof(union iwreq_data));
wrqu.ap_addr.sa_family = ARPHRD_ETHER;
- _rtw_memcpy(wrqu.ap_addr.sa_data, pmlmepriv->cur_network.network.MacAddress, ETH_ALEN);
+ if(check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)==_TRUE )
+ _rtw_memcpy(wrqu.ap_addr.sa_data, pnetwork->MacAddress, ETH_ALEN);
+ else
+ _rtw_memcpy(wrqu.ap_addr.sa_data, pmlmepriv->cur_network.network.MacAddress, ETH_ALEN);
DBG_871X_LEVEL(_drv_always_, "assoc success\n");
#ifndef CONFIG_IOCTL_CFG80211
@@ -2047,11 +2053,15 @@ if (padapter->registrypriv.mp_mode == 1)
// When Busy Traffic, driver do not site survey. So driver return success.
// wpa_supplicant will not issue SIOCSIWSCAN cmd again after scan timeout.
// modify by thomas 2011-02-22.
- if (pmlmepriv->LinkDetectInfo.bBusyTraffic == _TRUE)
+ if (pmlmepriv->LinkDetectInfo.bBusyTraffic == _TRUE
+#ifdef CONFIG_CONCURRENT_MODE
+ || rtw_get_buddy_bBusyTraffic(padapter) == _TRUE
+#endif //CONFIG_CONCURRENT_MODE
+ )
{
indicate_wx_scan_complete_event(padapter);
goto exit;
- }
+ }
if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY|_FW_UNDER_LINKING) == _TRUE)
{
@@ -11791,6 +11801,18 @@ static int rtw_mp_set(struct net_device *dev,
return -ENETDOWN;
}
+ if((padapter->bup == _FALSE )||(padapter->hw_init_completed == _FALSE))
+ {
+ DBG_871X(" %s fail =>(padapter->bup == _FALSE )||(padapter->hw_init_completed == _FALSE) \n",__FUNCTION__);
+ return -ENETDOWN;
+ }
+
+ if( (padapter->bSurpriseRemoved == _TRUE) || ( padapter->bDriverStopped == _TRUE))
+ {
+ DBG_871X("%s fail =>(padapter->bSurpriseRemoved == _TRUE) || ( padapter->bDriverStopped == _TRUE) \n",__FUNCTION__);
+ return -ENETDOWN;
+ }
+
//_rtw_memset(extra, 0x00, IW_PRIV_SIZE_MASK);
if (extra == NULL)
diff --git a/drivers/net/wireless/rtl8723as/os_dep/linux/mlme_linux.c b/drivers/net/wireless/rtl8723as/os_dep/linux/mlme_linux.c
index 41e870f7aac5..58c466bb52cf 100755
--- a/drivers/net/wireless/rtl8723as/os_dep/linux/mlme_linux.c
+++ b/drivers/net/wireless/rtl8723as/os_dep/linux/mlme_linux.c
@@ -157,11 +157,17 @@ extern void rtw_indicate_wx_disassoc_event(_adapter *padapter);
void rtw_os_indicate_connect(_adapter *adapter)
{
-
+ struct mlme_priv *pmlmepriv = &(adapter->mlmepriv);
_func_enter_;
#ifdef CONFIG_IOCTL_CFG80211
- rtw_cfg80211_indicate_connect(adapter);
+ if ( (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)==_TRUE ) ||
+ (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE)==_TRUE ) )
+ {
+ rtw_cfg80211_ibss_indicate_connect(adapter);
+ }
+ else
+ rtw_cfg80211_indicate_connect(adapter);
#endif //CONFIG_IOCTL_CFG80211
rtw_indicate_wx_assoc_event(adapter);
@@ -254,8 +260,8 @@ void rtw_reset_securitypriv( _adapter *adapter )
void rtw_os_indicate_disconnect( _adapter *adapter )
{
- //RT_PMKID_LIST backupPMKIDList[ NUM_PMKID_CACHE ];
-
+ //RT_PMKID_LIST backupPMKIDList[ NUM_PMKID_CACHE ];
+
_func_enter_;
netif_carrier_off(adapter->pnetdev); // Do it first for tx broadcast pkt after disconnection issue!
diff --git a/drivers/net/wireless/rtl8723as/os_dep/linux/os_intfs.c b/drivers/net/wireless/rtl8723as/os_dep/linux/os_intfs.c
index ce0b23dd04c4..67497e90a1c4 100755
--- a/drivers/net/wireless/rtl8723as/os_dep/linux/os_intfs.c
+++ b/drivers/net/wireless/rtl8723as/os_dep/linux/os_intfs.c
@@ -2505,13 +2505,6 @@ static int netdev_close(struct net_device *pnetdev)
#endif // CONFIG_BR_EXT
#ifdef CONFIG_P2P
-#ifdef CONFIG_IOCTL_CFG80211
- if( padapter->wdinfo.driver_interface == DRIVER_CFG80211 )
- {
- if(wdev_to_priv(padapter->rtw_wdev)->p2p_enabled == _TRUE)
- wdev_to_priv(padapter->rtw_wdev)->p2p_enabled = _FALSE;
- }
-#endif //CONFIG_IOCTL_CFG80211
rtw_p2p_enable(padapter, P2P_ROLE_DISABLE);
#endif //CONFIG_P2P
@@ -2884,7 +2877,6 @@ int rtw_suspend_common(_adapter *padapter)
int ret = 0;
_func_enter_;
- LeaveAllPowerSaveMode(padapter);
rtw_suspend_free_assoc_resource(padapter);
@@ -2962,18 +2954,19 @@ int rtw_resume_common(_adapter *padapter)
#ifdef CONFIG_CONCURRENT_MODE
if(rtw_buddy_adapter_up(padapter))
- {
- mlmepriv = &padapter->pbuddy_adapter->mlmepriv;
+ {
+ padapter = padapter->pbuddy_adapter;
+ mlmepriv = &padapter->mlmepriv;
if (check_fwstate(mlmepriv, WIFI_STATION_STATE)) {
DBG_871X(FUNC_ADPT_FMT" fwstate:0x%08x - WIFI_STATION_STATE\n", FUNC_ADPT_ARG(padapter), get_fwstate(mlmepriv));
#ifdef CONFIG_LAYER2_ROAMING_RESUME
- rtw_roaming(padapter->pbuddy_adapter, NULL);
+ rtw_roaming(padapter, NULL);
#endif //CONFIG_LAYER2_ROAMING_RESUME
} else if (check_fwstate(mlmepriv, WIFI_AP_STATE)) {
DBG_871X(FUNC_ADPT_FMT" fwstate:0x%08x - WIFI_AP_STATE\n", FUNC_ADPT_ARG(padapter), get_fwstate(mlmepriv));
- rtw_ap_restore_network(padapter->pbuddy_adapter);
+ rtw_ap_restore_network(padapter);
} else if (check_fwstate(mlmepriv, WIFI_ADHOC_STATE)) {
DBG_871X(FUNC_ADPT_FMT" fwstate:0x%08x - WIFI_ADHOC_STATE\n", FUNC_ADPT_ARG(padapter), get_fwstate(mlmepriv));
} else {
diff --git a/drivers/net/wireless/rtl8723as/os_dep/linux/rtw_android.c b/drivers/net/wireless/rtl8723as/os_dep/linux/rtw_android.c
index 440566e8a637..201aead25a0c 100755
--- a/drivers/net/wireless/rtl8723as/os_dep/linux/rtw_android.c
+++ b/drivers/net/wireless/rtl8723as/os_dep/linux/rtw_android.c
@@ -343,6 +343,10 @@ int rtw_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd)
int cmd_num;
int bytes_written = 0;
android_wifi_priv_cmd priv_cmd;
+ _adapter* padapter = ( _adapter * ) rtw_netdev_priv(net);
+#ifdef CONFIG_WFD
+ struct wifi_display_info *pwfd_info;
+#endif
rtw_lock_suspend();
@@ -526,10 +530,7 @@ int rtw_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd)
// Commented by Albert 2012/07/24
// We can enable the WFD function by using the following command:
// wpa_cli driver wfd-enable
-
- struct wifi_display_info *pwfd_info;
- _adapter* padapter = ( _adapter * ) rtw_netdev_priv(net);
-
+
pwfd_info = &padapter->wfd_info;
if( padapter->wdinfo.driver_interface == DRIVER_CFG80211 )
pwfd_info->wfd_enable = _TRUE;
@@ -541,10 +542,7 @@ int rtw_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd)
// Commented by Albert 2012/07/24
// We can disable the WFD function by using the following command:
// wpa_cli driver wfd-disable
-
- struct wifi_display_info *pwfd_info;
- _adapter* padapter = ( _adapter * ) rtw_netdev_priv(net);
-
+
pwfd_info = &padapter->wfd_info;
if( padapter->wdinfo.driver_interface == DRIVER_CFG80211 )
pwfd_info->wfd_enable = _FALSE;
@@ -555,10 +553,7 @@ int rtw_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd)
// Commented by Albert 2012/07/24
// We can set the tcp port number by using the following command:
// wpa_cli driver wfd-set-tcpport = 554
-
- struct wifi_display_info *pwfd_info;
- _adapter* padapter = ( _adapter * ) rtw_netdev_priv(net);
-
+
pwfd_info = &padapter->wfd_info;
if( padapter->wdinfo.driver_interface == DRIVER_CFG80211 )
pwfd_info->rtsp_ctrlport = ( u16 ) get_int_from_command( priv_cmd.buf );
@@ -566,8 +561,6 @@ int rtw_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd)
}
case ANDROID_WIFI_CMD_WFD_SET_MAX_TPUT:
{
-
-
break;
}
case ANDROID_WIFI_CMD_WFD_SET_DEVTYPE:
diff --git a/drivers/net/wireless/rtl8723as/os_dep/linux/sdio_intf.c b/drivers/net/wireless/rtl8723as/os_dep/linux/sdio_intf.c
index 8e188dad43c1..e1c0166669eb 100755
--- a/drivers/net/wireless/rtl8723as/os_dep/linux/sdio_intf.c
+++ b/drivers/net/wireless/rtl8723as/os_dep/linux/sdio_intf.c
@@ -93,28 +93,15 @@ int rtl8189es_sdio_poweroff(void)
#endif //defined(CONFIG_MMC_SUNXI_POWER_CONTROL)
#endif //CONFIG_PLATFORM_ARM_SUNxI
-#ifdef CONFIG_PLATFORM_ARM_SUN6I
+#if defined(CONFIG_PLATFORM_ARM_SUN6I) || defined(CONFIG_PLATFORM_ARM_SUN7I)
#ifdef CONFIG_MMC
-
-#ifdef CONFIG_A31_EVB
-#define SDIOID 0
-#else
-#define SDIOID 1
-#endif
-#define SUNXI_SDIO_WIFI_NUM_RTL8723AS 3
-#define SUNXI_SDIO_WIFI_NUM_RTL8189ES 4
-
-#ifdef CONFIG_RTL8188E
-#define SUNXI_SDIO_WIFI_NUM SUNXI_SDIO_WIFI_NUM_RTL8189ES
-#else // CONFIG_RTL8723A
-#define SUNXI_SDIO_WIFI_NUM SUNXI_SDIO_WIFI_NUM_RTL8723AS
-#endif
-
+#include <mach/sys_config.h>
+static unsigned sdc_id = 0;
extern void sw_mci_rescan_card(unsigned id, unsigned insert);
extern int wifi_pm_get_mod_type(void);
extern void wifi_pm_power(int on);
#endif //CONFIG_MMC
-#endif //CONFIG_PLATFORM_ARM_SUN6I
+#endif //#if defined(CONFIG_PLATFORM_ARM_SUN6I) || defined(CONFIG_PLATFORM_ARM_SUN7I)
#ifndef dev_to_sdio_func
#define dev_to_sdio_func(d) container_of(d, struct sdio_func, dev)
@@ -866,7 +853,7 @@ _func_exit_;
#if 1
#ifdef CONFIG_WOWLAN
-static int rtw_suspend_wow(_adapter *padapter,struct sdio_func *func )
+static int rtw_suspend_wow(_adapter *padapter)
{
_adapter *pbuddy_adapter = padapter->pbuddy_adapter;
@@ -989,27 +976,6 @@ static int rtw_suspend_wow(_adapter *padapter,struct sdio_func *func )
}
exit:
-
-#if (!(defined ANDROID_2X)) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,34))
- //Android 4.0 don't support WIFI close power
- //or power down or clock will close after wifi resume,
- //this is sprd's bug in Android 4.0, but sprd don't
- //want to fix it.
- //we have test power under 8723as, power consumption is ok
- if (func) {
- mmc_pm_flag_t pm_flag = 0;
- pm_flag = sdio_get_host_pm_caps(func);
- DBG_871X("cmd: %s: suspend: PM flag = 0x%x\n", sdio_func_id(func), pm_flag);
- if (!(pm_flag & MMC_PM_KEEP_POWER)) {
- DBG_871X("%s: cannot remain alive while host is suspended\n", sdio_func_id(func));
- return -ENOSYS;
- } else {
- DBG_871X("cmd: suspend with MMC_PM_KEEP_POWER\n");
- sdio_set_host_pm_flags(func, MMC_PM_KEEP_POWER);
- }
- }
-#endif
-
_func_exit_;
return ret;
@@ -1050,6 +1016,15 @@ static int rtw_sdio_suspend(struct device *dev)
while (pwrpriv->bips_processing == _TRUE)
rtw_msleep_os(1);
+#ifdef CONFIG_IOL_READ_EFUSE_MAP
+ if(!padapter->bup){
+ u8 bMacPwrCtrlOn = _FALSE;
+ rtw_hal_get_hwreg(padapter, HW_VAR_APFM_ON_MAC, &bMacPwrCtrlOn);
+ if(bMacPwrCtrlOn)
+ rtw_hal_power_off(padapter);
+ }
+#endif
+
if((!padapter->bup) || (padapter->bDriverStopped)||(padapter->bSurpriseRemoved))
{
DBG_871X("%s bup=%d bDriverStopped=%d bSurpriseRemoved = %d\n", __FUNCTION__
@@ -1059,8 +1034,9 @@ static int rtw_sdio_suspend(struct device *dev)
#ifdef CONFIG_WOWLAN
- rtw_suspend_wow(padapter,func);
+ rtw_suspend_wow(padapter);
#else
+ LeaveAllPowerSaveMode(padapter);
rtw_suspend_common(padapter);
#endif
@@ -1071,8 +1047,15 @@ static int rtw_sdio_suspend(struct device *dev)
rtw_get_passing_time_ms(start_time));
exit:
- if (func) {
- mmc_pm_flag_t pm_flag = 0;
+
+#ifdef CONFIG_MMC_PM_KEEP_POWER
+ //Android 4.0 don't support WIFI close power
+ //or power down or clock will close after wifi resume,
+ //this is sprd's bug in Android 4.0, but sprd don't
+ //want to fix it.
+ //we have test power under 8723as, power consumption is ok
+ if (func) {
+ mmc_pm_flag_t pm_flag = 0;
pm_flag = sdio_get_host_pm_caps(func);
DBG_871X("cmd: %s: suspend: PM flag = 0x%x\n", sdio_func_id(func), pm_flag);
if (!(pm_flag & MMC_PM_KEEP_POWER)) {
@@ -1083,6 +1066,7 @@ exit:
sdio_set_host_pm_flags(func, MMC_PM_KEEP_POWER);
}
}
+#endif
#ifdef CONFIG_PLATFORM_SPRD
#ifndef CONFIG_WOWLAN
@@ -1098,7 +1082,6 @@ exit:
#endif // CONFIG_WOWLAN
#endif // CONFIG_PLATFORM_SPRD
-
DBG_871X("<=== %s return %d.............. in %dms\n", __FUNCTION__
, ret, rtw_get_passing_time_ms(start_time));
@@ -1840,25 +1823,6 @@ static int __init rtw_drv_entry(void)
/*depends on sunxi power control */
#if defined CONFIG_MMC_SUNXI_POWER_CONTROL
unsigned int mod_sel = mmc_pm_get_mod_type();
-#endif
-#endif
-
-#ifdef CONFIG_PLATFORM_ARM_SUN6I
-#ifdef CONFIG_MMC
- unsigned int mod_sel = wifi_pm_get_mod_type();
-#endif //CONFIG_MMC
-#endif //CONFIG_PLATFORM_ARM_SUN6I
-
- DBG_871X_LEVEL(_drv_always_, "module init start version:"DRIVERVERSION"\n");
-
-// DBG_871X(KERN_INFO "+%s", __func__);
- RT_TRACE(_module_hci_intfs_c_, _drv_notice_, ("+rtw_drv_entry\n"));
- DBG_871X(DRV_NAME " driver version=%s\n", DRIVERVERSION);
- DBG_871X("build time: %s %s\n", __DATE__, __TIME__);
-
-#ifdef CONFIG_PLATFORM_ARM_SUNxI
-/*depends on sunxi power control */
-#if defined CONFIG_MMC_SUNXI_POWER_CONTROL
if(mod_sel == SUNXI_SDIO_WIFI_NUM_RTL8189ES)
{
@@ -1877,25 +1841,40 @@ static int __init rtw_drv_entry(void)
#endif //CONFIG_PLATFORM_ARM_SUNxI
-#ifdef CONFIG_PLATFORM_ARM_SUN6I
+#if defined(CONFIG_PLATFORM_ARM_SUN6I) || defined(CONFIG_PLATFORM_ARM_SUN7I)
#ifdef CONFIG_MMC
- DBG_871X("----- %s mod_sel: %d, sdio num: %d\n", __FUNCTION__, mod_sel, SUNXI_SDIO_WIFI_NUM);
- if(mod_sel == SUNXI_SDIO_WIFI_NUM)
+ script_item_value_type_e type;
+ script_item_u item;
+
+ unsigned int mod_sel = wifi_pm_get_mod_type();
+
+ type = script_get_item("wifi_para", "wifi_sdc_id", &item);
+ if (SCIRPT_ITEM_VALUE_TYPE_INT != type)
{
- wifi_pm_power(1);
- mdelay(10);
- sw_mci_rescan_card(SDIOID, 1);
- printk("[rtw_sdio] %s: power up, rescan card.\n", __FUNCTION__);
+ DBG_871X("ERR: script_get_item wifi_sdc_id failed\n");
+ ret = -1;
}
else
{
- ret = -1;
- printk("[rtw_sdio] %s: mod_sel = %d is incorrect.\n", __FUNCTION__, mod_sel);
+ sdc_id = item.val;
+ DBG_871X("----- %s sdc_id: %d, mod_sel: %d\n", __FUNCTION__, sdc_id, mod_sel);
+ wifi_pm_power(1);
+ mdelay(10);
+ sw_mci_rescan_card(sdc_id, 1);
+ DBG_871X("[rtw_sdio] %s: power up, rescan card.\n", __FUNCTION__);
}
#endif //CONFIG_MMC
if(ret != 0)
goto exit;
-#endif //CONFIG_PLATFORM_ARM_SUN6I
+
+#endif //#if defined(CONFIG_PLATFORM_ARM_SUN6I) || defined(CONFIG_PLATFORM_ARM_SUN7I)
+
+ DBG_871X_LEVEL(_drv_always_, "module init start version:"DRIVERVERSION"\n");
+
+// DBG_871X(KERN_INFO "+%s", __func__);
+ RT_TRACE(_module_hci_intfs_c_, _drv_notice_, ("+rtw_drv_entry\n"));
+ DBG_871X(DRV_NAME " driver version=%s\n", DRIVERVERSION);
+ DBG_871X("build time: %s %s\n", __DATE__, __TIME__);
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24))
//console_suspend_enabled=0;
@@ -1974,13 +1953,13 @@ static void __exit rtw_drv_halt(void)
#endif //defined(CONFIG_MMC_SUNXI_POWER_CONTROL)
#endif //CONFIG_PLATFORM_ARM_SUNxI
-#ifdef CONFIG_PLATFORM_ARM_SUN6I
+#if defined(CONFIG_PLATFORM_ARM_SUN6I) || defined(CONFIG_PLATFORM_ARM_SUN7I)
#ifdef CONFIG_MMC
wifi_pm_power(0);
- sw_mci_rescan_card(SDIOID, 0);
+ sw_mci_rescan_card(sdc_id, 0);
printk("[rtl8723as] %s: remove card, power off.\n", __FUNCTION__);
#endif //CONFIG_MMC
-#endif //CONFIG_PLATFORM_ARM_SUN6I
+#endif //#if defined(CONFIG_PLATFORM_ARM_SUN6I) || defined(CONFIG_PLATFORM_ARM_SUN7I)
rtw_suspend_lock_uninit();
DBG_871X_LEVEL(_drv_always_, "module exit success\n");
diff --git a/drivers/net/wireless/rtl8723as/os_dep/linux/usb_intf.c b/drivers/net/wireless/rtl8723as/os_dep/linux/usb_intf.c
index 284d23a8d71b..4c32dcbd07f3 100755
--- a/drivers/net/wireless/rtl8723as/os_dep/linux/usb_intf.c
+++ b/drivers/net/wireless/rtl8723as/os_dep/linux/usb_intf.c
@@ -69,18 +69,29 @@ static void rtw_dev_remove(struct usb_interface *pusb_intf);
static void rtw_dev_shutdown(struct device *dev)
{
struct usb_interface *usb_intf = container_of(dev, struct usb_interface, dev);
- struct dvobj_priv *dvobj = usb_get_intfdata(usb_intf);
- _adapter *adapter = dvobj->if1;
+ struct dvobj_priv *dvobj = NULL;
+ _adapter *adapter = NULL;
int i;
DBG_871X("%s\n", __func__);
- for (i = 0; i<dvobj->iface_nums; i++) {
- adapter = dvobj->padapters[i];
- adapter->bSurpriseRemoved = _TRUE;
- }
+ if(usb_intf)
+ {
+ dvobj = usb_get_intfdata(usb_intf);
+ if (dvobj)
+ {
+ for (i = 0; i<dvobj->iface_nums; i++)
+ {
+ adapter = dvobj->padapters[i];
+ if (adapter)
+ {
+ adapter->bSurpriseRemoved = _TRUE;
+ }
+ }
- ATOMIC_SET(&dvobj->continual_io_error, MAX_CONTINUAL_IO_ERR+1);
+ ATOMIC_SET(&dvobj->continual_io_error, MAX_CONTINUAL_IO_ERR+1);
+ }
+ }
}
#if (LINUX_VERSION_CODE<=KERNEL_VERSION(2,6,23))
@@ -1006,10 +1017,6 @@ static void rtw_suspend_wow(_adapter *padapter)
pwrpriv->wowlan_mode = _FALSE;
rtw_cancel_all_timer(padapter);
- LeaveAllPowerSaveMode(padapter);
-
- rtw_stop_cmd_thread(padapter);
-
//padapter->net_closed = _TRUE;
//s1.
@@ -1081,6 +1088,16 @@ static int rtw_suspend(struct usb_interface *pusb_intf, pm_message_t message)
DBG_871X("==> %s (%s:%d)\n",__FUNCTION__, current->comm, current->pid);
+
+#ifdef CONFIG_IOL_READ_EFUSE_MAP
+ if(!padapter->bup){
+ u8 bMacPwrCtrlOn = _FALSE;
+ rtw_hal_get_hwreg(padapter, HW_VAR_APFM_ON_MAC, &bMacPwrCtrlOn);
+ if(bMacPwrCtrlOn)
+ rtw_hal_power_off(padapter);
+ }
+#endif
+
if((!padapter->bup) || (padapter->bDriverStopped)||(padapter->bSurpriseRemoved))
{
DBG_871X("padapter->bup=%d bDriverStopped=%d bSurpriseRemoved = %d\n",
@@ -1105,6 +1122,10 @@ static int rtw_suspend(struct usb_interface *pusb_intf, pm_message_t message)
pwrpriv->bInSuspend = _TRUE;
+ LeaveAllPowerSaveMode(padapter);
+
+ rtw_stop_cmd_thread(padapter);
+
_enter_pwrlock(&pwrpriv->lock);
#ifdef CONFIG_WOWLAN
rtw_suspend_wow(padapter);