diff options
author | Jianzheng Zhou <jianzheng.zhou@freescale.com> | 2013-12-04 15:38:52 +0800 |
---|---|---|
committer | Jianzheng Zhou <jianzheng.zhou@freescale.com> | 2013-12-04 15:38:52 +0800 |
commit | edbd3280a178b47cd611dd6e858b71b0fac4ac1b (patch) | |
tree | adf0be323e4a59074b63c0940d6ba66e940ac2ac | |
parent | 1dd004b95cd001496fa8260d0dc9e84c5151006d (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>
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); |