summaryrefslogtreecommitdiff
path: root/drivers/net/wireless/rtl8723as/core/rtw_mlme.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/rtl8723as/core/rtw_mlme.c')
-rwxr-xr-xdrivers/net/wireless/rtl8723as/core/rtw_mlme.c311
1 files changed, 204 insertions, 107 deletions
diff --git a/drivers/net/wireless/rtl8723as/core/rtw_mlme.c b/drivers/net/wireless/rtl8723as/core/rtw_mlme.c
index a827c0221b36..b5e1807c69d7 100755
--- a/drivers/net/wireless/rtl8723as/core/rtw_mlme.c
+++ b/drivers/net/wireless/rtl8723as/core/rtw_mlme.c
@@ -119,7 +119,7 @@ static void rtw_free_mlme_ie_data(u8 **ppie, u32 *plen)
{
if(*ppie)
{
- _rtw_mfree(*ppie, *plen);
+ rtw_mfree(*ppie, *plen);
*plen = 0;
*ppie=NULL;
}
@@ -628,7 +628,7 @@ inline int is_same_ess(WLAN_BSSID_EX *a, WLAN_BSSID_EX *b)
&& _rtw_memcmp(a->Ssid.Ssid, b->Ssid.Ssid, a->Ssid.SsidLength)==_TRUE;
}
-int is_same_network(WLAN_BSSID_EX *src, WLAN_BSSID_EX *dst)
+int is_same_network(WLAN_BSSID_EX *src, WLAN_BSSID_EX *dst, u8 feature)
{
u16 s_cap, d_cap;
@@ -658,6 +658,14 @@ _func_enter_;
_func_exit_;
+#ifdef CONFIG_P2P
+ if ((feature == 1) && // 1: P2P supported
+ (_rtw_memcmp(src->MacAddress, dst->MacAddress, ETH_ALEN) == _TRUE)
+ ) {
+ return _TRUE;
+ }
+#endif
+
return ((src->Ssid.SsidLength == dst->Ssid.SsidLength) &&
// (src->Configuration.DSConfig == dst->Configuration.DSConfig) &&
( (_rtw_memcmp(src->MacAddress, dst->MacAddress, ETH_ALEN)) == _TRUE) &&
@@ -723,10 +731,10 @@ _func_enter_;
rtw_hal_antdiv_rssi_compared(padapter, dst, src); //this will update src.Rssi, need consider again
#endif
- #if defined(DBG_RX_SIGNAL_DISPLAY_PROCESSING) && 1
+ #if defined(DBG_RX_SIGNAL_DISPLAY_SSID_MONITORED) && 1
if(strcmp(dst->Ssid.Ssid, DBG_RX_SIGNAL_DISPLAY_SSID_MONITORED) == 0) {
- DBG_871X("%s %s("MAC_FMT", ch%u) ss_ori:%3u, sq_ori:%3u, rssi_ori:%3ld, ss_smp:%3u, sq_smp:%3u, rssi_smp:%3ld\n"
- , __FUNCTION__
+ DBG_871X(FUNC_ADPT_FMT" %s("MAC_FMT", ch%u) ss_ori:%3u, sq_ori:%3u, rssi_ori:%3ld, ss_smp:%3u, sq_smp:%3u, rssi_smp:%3ld\n"
+ , FUNC_ADPT_ARG(padapter)
, src->Ssid.Ssid, MAC_ARG(src->MacAddress), src->Configuration.DSConfig
,ss_ori, sq_ori, rssi_ori
,ss_smp, sq_smp, rssi_smp
@@ -735,7 +743,7 @@ _func_enter_;
#endif
/* The rule below is 1/5 for sample value, 4/5 for history value */
- if (check_fwstate(&padapter->mlmepriv, _FW_LINKED) && is_same_network(&(padapter->mlmepriv.cur_network.network), src)) {
+ if (check_fwstate(&padapter->mlmepriv, _FW_LINKED) && is_same_network(&(padapter->mlmepriv.cur_network.network), src, 0)) {
/* Take the recvpriv's value for the connected AP*/
ss_final = padapter->recvpriv.signal_strength;
sq_final = padapter->recvpriv.signal_qual;
@@ -759,24 +767,27 @@ _func_enter_;
}
- if (update_ie)
+ if (update_ie) {
+ dst->Reserved[0] = src->Reserved[0];
+ dst->Reserved[1] = src->Reserved[1];
_rtw_memcpy((u8 *)dst, (u8 *)src, get_WLAN_BSSID_EX_sz(src));
+ }
dst->PhyInfo.SignalStrength = ss_final;
dst->PhyInfo.SignalQuality = sq_final;
dst->Rssi = rssi_final;
- #if defined(DBG_RX_SIGNAL_DISPLAY_PROCESSING) && 1
+ #if defined(DBG_RX_SIGNAL_DISPLAY_SSID_MONITORED) && 1
if(strcmp(dst->Ssid.Ssid, DBG_RX_SIGNAL_DISPLAY_SSID_MONITORED) == 0) {
- DBG_871X("%s %s("MAC_FMT"), SignalStrength:%u, SignalQuality:%u, RawRSSI:%ld\n"
- , __FUNCTION__
+ DBG_871X(FUNC_ADPT_FMT" %s("MAC_FMT"), SignalStrength:%u, SignalQuality:%u, RawRSSI:%ld\n"
+ , FUNC_ADPT_ARG(padapter)
, dst->Ssid.Ssid, MAC_ARG(dst->MacAddress), dst->PhyInfo.SignalStrength, dst->PhyInfo.SignalQuality, dst->Rssi);
}
#endif
#if 0 // old codes, may be useful one day...
// DBG_871X("update_network: rssi=0x%lx dst->Rssi=%d ,dst->Rssi=0x%lx , src->Rssi=0x%lx",(dst->Rssi+src->Rssi)/2,dst->Rssi,dst->Rssi,src->Rssi);
- if (check_fwstate(&padapter->mlmepriv, _FW_LINKED) && is_same_network(&(padapter->mlmepriv.cur_network.network), src))
+ if (check_fwstate(&padapter->mlmepriv, _FW_LINKED) && is_same_network(&(padapter->mlmepriv.cur_network.network), src, 0))
{
//DBG_871X("b:ssid=%s update_network: src->rssi=0x%d padapter->recvpriv.ui_rssi=%d\n",src->Ssid.Ssid,src->Rssi,padapter->recvpriv.signal);
@@ -825,7 +836,7 @@ _func_enter_;
}
#endif
- if ( (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) && (is_same_network(&(pmlmepriv->cur_network.network), pnetwork)))
+ if ( (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) && (is_same_network(&(pmlmepriv->cur_network.network), pnetwork, 0)))
{
//RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,"Same Network\n");
@@ -854,9 +865,13 @@ void rtw_update_scanned_network(_adapter *adapter, WLAN_BSSID_EX *target)
_list *plist, *phead;
ULONG bssid_ex_sz;
struct mlme_priv *pmlmepriv = &(adapter->mlmepriv);
+ struct mlme_ext_priv *pmlmeext = &(adapter->mlmeextpriv);
+ struct wifidirect_info *pwdinfo= &(adapter->wdinfo);
_queue *queue = &(pmlmepriv->scanned_queue);
struct wlan_network *pnetwork = NULL;
struct wlan_network *oldest = NULL;
+ int target_find = 0;
+ u8 feature = 0;
_func_enter_;
@@ -864,6 +879,11 @@ _func_enter_;
phead = get_list_head(queue);
plist = get_next(phead);
+#ifdef CONFIG_P2P
+ if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))
+ feature = 1; // p2p enable
+#endif
+
while(1)
{
if (rtw_end_of_queue_search(phead,plist)== _TRUE)
@@ -878,8 +898,10 @@ _func_enter_;
#endif
}
- if (is_same_network(&(pnetwork->network), target))
+ if (is_same_network(&(pnetwork->network), target, feature)) {
+ target_find = 1;
break;
+ }
if ((oldest == ((struct wlan_network *)0)) ||
time_after(oldest->last_scanned, pnetwork->last_scanned))
@@ -892,7 +914,8 @@ _func_enter_;
/* If we didn't find a match, then get a new network slot to initialize
* with this beacon's information */
- if (rtw_end_of_queue_search(phead,plist)== _TRUE) {
+ //if (rtw_end_of_queue_search(phead,plist)== _TRUE) {
+ if (!target_find) {
if (_rtw_queue_empty(&(pmlmepriv->free_bss_pool)) == _TRUE) {
/* If there are no more slots, expire the oldest */
@@ -955,8 +978,15 @@ _func_enter_;
pnetwork->last_scanned = rtw_get_current_time();
//target.Reserved[0]==1, means that scaned network is a bcn frame.
- if((pnetwork->network.IELength>target->IELength) && (target->Reserved[0]==1))
+ // probe resp(3) > beacon(1) > probe req(2)
+ if ((target->Reserved[0] != 2) &&
+ (target->Reserved[0] >= pnetwork->network.Reserved[0])
+ ) {
+ update_ie = _TRUE;
+ }
+ else {
update_ie = _FALSE;
+ }
update_network(&(pnetwork->network), target,adapter, update_ie);
}
@@ -1026,8 +1056,20 @@ int rtw_is_desired_network(_adapter *adapter, struct wlan_network *pnetwork)
}
if (adapter->registrypriv.wifi_spec == 1) //for correct flow of 8021X to do....
{
+ u8 *p=NULL;
+ uint ie_len=0;
+
if ((desired_encmode == Ndis802_11EncryptionDisabled) && (privacy != 0))
bselected = _FALSE;
+
+ if ( psecuritypriv->ndisauthtype == Ndis802_11AuthModeWPA2PSK) {
+ p = rtw_get_ie(pnetwork->network.IEs + _BEACON_IE_OFFSET_, _RSN_IE_2_, &ie_len, (pnetwork->network.IELength - _BEACON_IE_OFFSET_));
+ if (p && ie_len>0) {
+ bselected = _TRUE;
+ } else {
+ bselected = _FALSE;
+ }
+ }
}
@@ -1129,7 +1171,7 @@ _func_enter_;
pnetwork->Ssid.SsidLength = 0;
}
rtw_add_network(adapter, pnetwork);
- }
+ }
exit:
@@ -1145,6 +1187,7 @@ _func_exit_;
void rtw_surveydone_event_callback(_adapter *adapter, u8 *pbuf)
{
_irqL irqL;
+ u8 timer_cancelled = _FALSE;
struct mlme_priv *pmlmepriv = &(adapter->mlmepriv);
#ifdef CONFIG_MLME_EXT
@@ -1156,7 +1199,6 @@ void rtw_surveydone_event_callback(_adapter *adapter, u8 *pbuf)
_func_enter_;
_enter_critical_bh(&pmlmepriv->lock, &irqL);
-
if(pmlmepriv->wps_probe_req_ie)
{
u32 free_len = pmlmepriv->wps_probe_req_ie_len;
@@ -1169,9 +1211,10 @@ _func_enter_;
if (check_fwstate(pmlmepriv,_FW_UNDER_SURVEY))
{
- u8 timer_cancelled;
-
- _cancel_timer(&pmlmepriv->scan_to_timer, &timer_cancelled);
+ //u8 timer_cancelled;
+
+ timer_cancelled = _TRUE;
+ //_cancel_timer(&pmlmepriv->scan_to_timer, &timer_cancelled);
_clr_fwstate_(pmlmepriv, _FW_UNDER_SURVEY);
}
@@ -1179,6 +1222,13 @@ _func_enter_;
RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("nic status =%x, survey done event comes too late!\n", get_fwstate(pmlmepriv)));
}
+ _exit_critical_bh(&pmlmepriv->lock, &irqL);
+
+ if(timer_cancelled)
+ _cancel_timer(&pmlmepriv->scan_to_timer, &timer_cancelled);
+
+
+ _enter_critical_bh(&pmlmepriv->lock, &irqL);
#ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS
rtw_set_signal_stat_timer(&adapter->recvpriv);
@@ -1293,7 +1343,7 @@ _func_enter_;
{
struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv;
if(pmlmeext->sitesurvey_res.bss_cnt == 0){
- rtw_hal_sreset_reset(adapter);
+ //rtw_hal_sreset_reset(adapter);
}
}
#endif
@@ -1413,6 +1463,32 @@ _func_enter_;
if(pwlan)
{
pwlan->fixed = _FALSE;
+#ifdef CONFIG_P2P
+ if(!rtw_p2p_chk_state(&adapter->wdinfo, P2P_STATE_NONE))
+ {
+ u32 p2p_ielen=0;
+ u8 *p2p_ie;
+ //u16 capability;
+ u8 *pcap = NULL;
+ u32 capability_len=0;
+
+ //DBG_871X("free disconnecting network\n");
+ //rtw_free_network_nolock(pmlmepriv, pwlan);
+
+ if((p2p_ie=rtw_get_p2p_ie(pwlan->network.IEs+_FIXED_IE_LENGTH_, pwlan->network.IELength-_FIXED_IE_LENGTH_, NULL, &p2p_ielen)))
+ {
+ pcap = rtw_get_p2p_attr_content(p2p_ie, p2p_ielen, P2P_ATTR_CAPABILITY, NULL, &capability_len);
+ if(pcap && capability_len==2)
+ {
+ u16 cap = *(u16*)pcap ;
+ *(u16*)pcap = cap&0x00ff;//clear group capability when free this network
+ }
+ }
+
+ rtw_set_scan_deny(adapter, 2000);
+ //rtw_clear_scan_deny(adapter);
+ }
+#endif //CONFIG_P2P
}
else
{
@@ -1429,7 +1505,7 @@ _func_enter_;
if(lock_scanned_queue)
_exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
- pmlmepriv->key_mask = 0;
+ adapter->securitypriv.key_mask = 0;
_func_exit_;
@@ -1536,7 +1612,7 @@ _func_enter_;
rtw_os_indicate_disconnect(padapter);
//set ips_deny_time to avoid enter IPS before LPS leave
- padapter->pwrctrlpriv.ips_deny_time = rtw_get_current_time() + rtw_ms_to_systime(3000);
+ adapter_to_pwrctl(padapter)->ips_deny_time = rtw_get_current_time() + rtw_ms_to_systime(3000);
_clr_fwstate_(pmlmepriv, _FW_LINKED);
@@ -1551,9 +1627,6 @@ _func_enter_;
#endif // CONFIG_P2P_PS
#ifdef CONFIG_LPS
-#ifdef CONFIG_WOWLAN
- if(padapter->pwrctrlpriv.wowlan_mode==_FALSE)
-#endif //CONFIG_WOWLAN
rtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_DISCONNECT, 1);
#endif
@@ -1587,7 +1660,7 @@ void rtw_scan_abort(_adapter *adapter)
if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY)) {
if (!adapter->bDriverStopped && !adapter->bSurpriseRemoved)
DBG_871X(FUNC_NDEV_FMT"waiting for scan_abort time out!\n", FUNC_NDEV_ARG(adapter->pnetdev));
- #ifdef CONFIG_PLATFORM_MSTAR_TITANIA12
+ #ifdef CONFIG_PLATFORM_MSTAR
//_clr_fwstate_(pmlmepriv, _FW_UNDER_SURVEY);
set_survey_timer(pmlmeext, 0);
_set_timer(&pmlmepriv->scan_to_timer, 50);
@@ -1642,7 +1715,10 @@ static struct sta_info *rtw_joinbss_update_stainfo(_adapter *padapter, struct wl
_rtw_memset((u8 *)&psta->dot11tkiprxmickey, 0, sizeof (union Keytype));
_rtw_memset((u8 *)&psta->dot11tkiptxmickey, 0, sizeof (union Keytype));
- _rtw_memset((u8 *)&psta->dot11txpn, 0, sizeof (union pn48));
+ _rtw_memset((u8 *)&psta->dot11txpn, 0, sizeof (union pn48));
+#ifdef CONFIG_IEEE80211W
+ _rtw_memset((u8 *)&psta->dot11wtxpn, 0, sizeof (union pn48));
+#endif //CONFIG_IEEE80211W
_rtw_memset((u8 *)&psta->dot11rxpn, 0, sizeof (union pn48));
}
@@ -1732,9 +1808,9 @@ static void rtw_joinbss_update_network(_adapter *padapter, struct wlan_network *
//the ptarget_wlan->network.Rssi is raw data, we use ptarget_wlan->network.PhyInfo.SignalStrength instead (has scaled)
padapter->recvpriv.rssi = translate_percentage_to_dbm(ptarget_wlan->network.PhyInfo.SignalStrength);
#if defined(DBG_RX_SIGNAL_DISPLAY_PROCESSING) && 1
- DBG_871X("%s signal_strength:%3u, rssi:%3d, signal_qual:%3u"
+ DBG_871X(FUNC_ADPT_FMT" signal_strength:%3u, rssi:%3d, signal_qual:%3u"
"\n"
- , __FUNCTION__
+ , FUNC_ADPT_ARG(padapter)
, padapter->recvpriv.signal_strength
, padapter->recvpriv.rssi
, padapter->recvpriv.signal_qual
@@ -1911,15 +1987,16 @@ _func_enter_;
}
//s4. indicate connect
- if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE)
- {
- rtw_indicate_connect(adapter);
- }
- else
- {
- //adhoc mode will rtw_indicate_connect when rtw_stassoc_event_callback
- RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("adhoc mode, fw_state:%x", get_fwstate(pmlmepriv)));
- }
+ if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE)
+ {
+ pmlmepriv->cur_network_scanned = ptarget_wlan;
+ rtw_indicate_connect(adapter);
+ }
+ else
+ {
+ //adhoc mode will rtw_indicate_connect when rtw_stassoc_event_callback
+ RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("adhoc mode, fw_state:%x", get_fwstate(pmlmepriv)));
+ }
//s5. Cancle assoc_timer
@@ -2057,10 +2134,10 @@ u8 search_max_mac_id(_adapter *padapter)
}
-//FOR AP ,AD-HOC mode
-void rtw_stassoc_hw_rpt(_adapter *adapter,struct sta_info *psta)
+//FOR STA, AP ,AD-HOC mode
+void rtw_sta_media_status_rpt(_adapter *adapter,struct sta_info *psta, u32 mstatus)
{
- u16 media_status;
+ u16 media_status_rpt;
if(psta==NULL) return;
@@ -2070,8 +2147,8 @@ void rtw_stassoc_hw_rpt(_adapter *adapter,struct sta_info *psta)
rtw_hal_set_hwreg(adapter,HW_VAR_TX_RPT_MAX_MACID, (u8*)&macid);
}
#endif
- media_status = (psta->mac_id<<8)|1; // MACID|OPMODE:1 connect
- rtw_hal_set_hwreg(adapter,HW_VAR_H2C_MEDIA_STATUS_RPT,(u8 *)&media_status);
+ media_status_rpt = (u16)((psta->mac_id<<8)|mstatus); // MACID|OPMODE:1 connect
+ rtw_hal_set_hwreg(adapter,HW_VAR_H2C_MEDIA_STATUS_RPT,(u8 *)&media_status_rpt);
}
void rtw_stassoc_event_callback(_adapter *adapter, u8 *pbuf)
@@ -2094,13 +2171,18 @@ _func_enter_;
psta = rtw_get_stainfo(&adapter->stapriv, pstassoc->macaddr);
if(psta)
{
-#ifdef CONFIG_IOCTL_CFG80211
- #ifdef COMPAT_KERNEL_RELEASE
-
- #elif (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,37)) || defined(CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER)
u8 *passoc_req = NULL;
- u32 assoc_req_len;
+ u32 assoc_req_len = 0;
+
+ rtw_sta_media_status_rpt(adapter, psta, 1);
+
+#ifndef CONFIG_AUTO_AP_MODE
+
+ ap_sta_info_defer_update(adapter, psta);
+ //report to upper layer
+ DBG_871X("indicate_sta_assoc_event to upper layer - hostapd\n");
+#ifdef CONFIG_IOCTL_CFG80211
_enter_critical_bh(&psta->lock, &irqL);
if(psta->passoc_req && psta->assoc_req_len>0)
{
@@ -2110,7 +2192,7 @@ _func_enter_;
assoc_req_len = psta->assoc_req_len;
_rtw_memcpy(passoc_req, psta->passoc_req, assoc_req_len);
- _rtw_mfree(psta->passoc_req , psta->assoc_req_len);
+ rtw_mfree(psta->passoc_req , psta->assoc_req_len);
psta->passoc_req = NULL;
psta->assoc_req_len = 0;
}
@@ -2120,23 +2202,18 @@ _func_enter_;
if(passoc_req && assoc_req_len>0)
{
rtw_cfg80211_indicate_sta_assoc(adapter, passoc_req, assoc_req_len);
-
- _rtw_mfree(passoc_req, assoc_req_len);
- }
- #endif //(LINUX_VERSION_CODE < KERNEL_VERSION(2,6,37)) || defined(CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER)
-#endif //CONFIG_IOCTL_CFG80211
-
- //bss_cap_update_on_sta_join(adapter, psta);
- //sta_info_update(adapter, psta);
- ap_sta_info_defer_update(adapter, psta);
-
- rtw_stassoc_hw_rpt(adapter,psta);
-
- }
+ rtw_mfree(passoc_req, assoc_req_len);
+ }
+#else //!CONFIG_IOCTL_CFG80211
+ rtw_indicate_sta_assoc_event(adapter, psta);
+#endif //!CONFIG_IOCTL_CFG80211
+#endif //!CONFIG_AUTO_AP_MODE
+ }
goto exit;
}
-#endif
+#endif //defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME)
+
//for AD-HOC mode
psta = rtw_get_stainfo(&adapter->stapriv, pstassoc->macaddr);
if( psta != NULL)
@@ -2162,7 +2239,7 @@ _func_enter_;
//for ad-hoc mode
rtw_hal_set_odm_var(adapter,HAL_ODM_STA_INFO,psta,_TRUE);
- rtw_stassoc_hw_rpt(adapter,psta);
+ rtw_sta_media_status_rpt(adapter, psta, 1);
if(adapter->securitypriv.dot11AuthAlgrthm==dot11AuthAlgrthm_8021X)
psta->dot118021XPrivacy = adapter->securitypriv.dot11PrivacyAlgrthm;
@@ -2193,7 +2270,7 @@ _func_enter_;
#ifdef CONFIG_RTL8711
//submit SetStaKey_cmd to tell fw, fw will allocate an CAM entry for this sta
- rtw_setstakey_cmd(adapter, (unsigned char*)psta, _FALSE);
+ rtw_setstakey_cmd(adapter, (unsigned char*)psta, _FALSE, _TRUE);
#endif
exit:
@@ -2253,7 +2330,9 @@ _func_enter_;
if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) )
{
#ifdef CONFIG_LAYER2_ROAMING
- if (rtw_to_roaming(adapter) > 0)
+ if(adapter->registrypriv.wifi_spec==1)
+ rtw_set_roaming(adapter, 0); /* don't roam */
+ else if (rtw_to_roaming(adapter) > 0)
pmlmepriv->to_roaming--; /* this stadel_event is caused by roaming, decrease to_roaming */
else if (rtw_to_roaming(adapter) == 0)
rtw_set_roaming(adapter, adapter->registrypriv.max_roaming_times);
@@ -2357,7 +2436,7 @@ _func_enter_;
RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("+rtw_cpwm_event_callback !!!\n"));
#ifdef CONFIG_LPS_LCLK
preportpwrstate = (struct reportpwrstate_parm*)pbuf;
- preportpwrstate->state |= (u8)(padapter->pwrctrlpriv.cpwm_tog + 0x80);
+ preportpwrstate->state |= (u8)(adapter_to_pwrctl(padapter)->cpwm_tog + 0x80);
cpwm_int_hdl(padapter, preportpwrstate);
#endif
@@ -2489,7 +2568,7 @@ void rtw_scan_timeout_handler (_adapter *adapter)
static void rtw_auto_scan_handler(_adapter *padapter)
{
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
- struct pwrctrl_priv *pwrctrlpriv = &padapter->pwrctrlpriv;
+ struct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(padapter);
//auto site survey per 60sec
if(pmlmepriv->scan_interval >0)
@@ -2549,7 +2628,12 @@ void rtw_dynamic_check_timer_handlder(_adapter *adapter)
return;
#if defined(CONFIG_CHECK_BT_HANG) && defined(CONFIG_BT_COEXIST)
if(adapter->HalFunc.hal_checke_bt_hang)
- adapter->HalFunc.hal_checke_bt_hang(adapter);
+ {
+#ifdef CONFIG_CONCURRENT_MODE
+ if (adapter->adapter_type == PRIMARY_ADAPTER)
+#endif
+ adapter->HalFunc.hal_checke_bt_hang(adapter);
+ }
#endif
if(adapter->hw_init_completed == _FALSE)
return;
@@ -2678,6 +2762,13 @@ void rtw_set_scan_deny(_adapter *adapter, u32 ms)
}
#endif
+#ifdef CONFIG_DETECT_C2H_BY_POLLING
+void rtw_event_polling_timer_hdl(_adapter *adapter)
+{
+ rtw_event_polling_cmd(adapter);
+}
+#endif
+
#if defined(IEEE80211_SCAN_RESULT_EXPIRE)
#define RTW_SCAN_RESULT_EXPIRE IEEE80211_SCAN_RESULT_EXPIRE/HZ*1000 -1000 //3000 -1000
#else
@@ -2953,7 +3044,7 @@ _func_enter_;
if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)
{
- if(is_same_network(&pmlmepriv->cur_network.network, &pnetwork->network))
+ if(is_same_network(&pmlmepriv->cur_network.network, &pnetwork->network), 0)
{
//DBG_871X("select_and_join(1): _FW_LINKED and is same network, it needn't join again\n");
@@ -2987,7 +3078,7 @@ _func_enter_;
if( (roaming_candidate == NULL ||roaming_candidate->network.Rssi<pnetwork->network.Rssi )
&& is_same_ess(&pnetwork->network, &pmlmepriv->cur_network.network)
- //&&(!is_same_network(&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
) {
roaming_candidate = pnetwork;
@@ -3030,7 +3121,7 @@ _func_enter_;
if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)
{
#if 0
- if(is_same_network(&pmlmepriv->cur_network.network, &pnetwork->network))
+ if(is_same_network(&pmlmepriv->cur_network.network, &pnetwork->network, 0))
{
DBG_871X("select_and_join(2): _FW_LINKED and is same network, it needn't join again\n");
@@ -3141,7 +3232,7 @@ _func_exit_;
}
-sint rtw_set_key(_adapter * adapter,struct security_priv *psecuritypriv,sint keyid, u8 set_tx)
+sint rtw_set_key(_adapter * adapter,struct security_priv *psecuritypriv,sint keyid, u8 set_tx, bool enqueue)
{
u8 keylen;
struct cmd_obj *pcmd;
@@ -3151,19 +3242,12 @@ sint rtw_set_key(_adapter * adapter,struct security_priv *psecuritypriv,sint key
sint res=_SUCCESS;
_func_enter_;
-
- pcmd = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
- if(pcmd==NULL){
- res= _FAIL; //try again
- goto exit;
- }
+
psetkeyparm=(struct setkey_parm*)rtw_zmalloc(sizeof(struct setkey_parm));
- if(psetkeyparm==NULL){
- rtw_mfree((unsigned char *)pcmd, sizeof(struct cmd_obj));
+ if(psetkeyparm==NULL){
res= _FAIL;
goto exit;
}
-
_rtw_memset(psetkeyparm, 0, sizeof(struct setkey_parm));
if(psecuritypriv->dot11AuthAlgrthm ==dot11AuthAlgrthm_8021X){
@@ -3178,20 +3262,13 @@ _func_enter_;
psetkeyparm->keyid = (u8)keyid;//0~3
psetkeyparm->set_tx = set_tx;
if (is_wep_enc(psetkeyparm->algorithm))
- pmlmepriv->key_mask |= BIT(psetkeyparm->keyid);
+ psecuritypriv->key_mask |= BIT(psetkeyparm->keyid);
-#ifdef CONFIG_AUTOSUSPEND
- if( _TRUE == adapter->pwrctrlpriv.bInternalAutoSuspend)
- {
- adapter->pwrctrlpriv.wepkeymask = pmlmepriv->key_mask;
- DBG_871X("....AutoSuspend pwrctrlpriv.wepkeymask(%x)\n",adapter->pwrctrlpriv.wepkeymask);
- }
-#endif
- DBG_871X("==> rtw_set_key algorithm(%x),keyid(%x),key_mask(%x)\n",psetkeyparm->algorithm,psetkeyparm->keyid,pmlmepriv->key_mask);
+ DBG_871X("==> rtw_set_key algorithm(%x),keyid(%x),key_mask(%x)\n",psetkeyparm->algorithm,psetkeyparm->keyid, psecuritypriv->key_mask);
RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("\n rtw_set_key: psetkeyparm->algorithm=%d psetkeyparm->keyid=(u8)keyid=%d \n",psetkeyparm->algorithm, keyid));
switch(psetkeyparm->algorithm){
-
+
case _WEP40_:
keylen=5;
_rtw_memcpy(&(psetkeyparm->key[0]), &(psecuritypriv->dot11DefKey[keyid].skey[0]), keylen);
@@ -3201,7 +3278,7 @@ _func_enter_;
_rtw_memcpy(&(psetkeyparm->key[0]), &(psecuritypriv->dot11DefKey[keyid].skey[0]), keylen);
break;
case _TKIP_:
- keylen=16;
+ keylen=16;
_rtw_memcpy(&psetkeyparm->key, &psecuritypriv->dot118021XGrpKey[keyid], keylen);
psetkeyparm->grpkey=1;
break;
@@ -3213,23 +3290,35 @@ _func_enter_;
default:
RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("\n rtw_set_key:psecuritypriv->dot11PrivacyAlgrthm = %x (must be 1 or 2 or 4 or 5)\n",psecuritypriv->dot11PrivacyAlgrthm));
res= _FAIL;
+ rtw_mfree((unsigned char *)psetkeyparm, sizeof(struct setkey_parm));
goto exit;
}
+
+
+ if(enqueue){
+ pcmd = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
+ if(pcmd==NULL){
+ rtw_mfree((unsigned char *)psetkeyparm, sizeof(struct setkey_parm));
+ res= _FAIL; //try again
+ goto exit;
+ }
+
+ pcmd->cmdcode = _SetKey_CMD_;
+ pcmd->parmbuf = (u8 *)psetkeyparm;
+ pcmd->cmdsz = (sizeof(struct setkey_parm));
+ pcmd->rsp = NULL;
+ pcmd->rspsz = 0;
-
- pcmd->cmdcode = _SetKey_CMD_;
- pcmd->parmbuf = (u8 *)psetkeyparm;
- pcmd->cmdsz = (sizeof(struct setkey_parm));
- pcmd->rsp = NULL;
- pcmd->rspsz = 0;
-
-
- _rtw_init_listhead(&pcmd->list);
-
- //_rtw_init_sema(&(pcmd->cmd_sem), 0);
+ _rtw_init_listhead(&pcmd->list);
- res = rtw_enqueue_cmd(pcmdpriv, pcmd);
+ //_rtw_init_sema(&(pcmd->cmd_sem), 0);
+ res = rtw_enqueue_cmd(pcmdpriv, pcmd);
+ }
+ else{
+ setkey_hdl(adapter, (u8 *)psetkeyparm);
+ rtw_mfree((u8 *) psetkeyparm, sizeof(struct setkey_parm));
+ }
exit:
_func_exit_;
return res;
@@ -3389,6 +3478,14 @@ _func_enter_;
{
//copy RSN or SSN
_rtw_memcpy(&out_ie[ielength], &psecuritypriv->supplicant_ie[0], psecuritypriv->supplicant_ie[1]+2);
+ /* debug for CONFIG_IEEE80211W
+ {
+ int jj;
+ printk("supplicant_ie_length=%d &&&&&&&&&&&&&&&&&&&\n", psecuritypriv->supplicant_ie[1]+2);
+ for(jj=0; jj < psecuritypriv->supplicant_ie[1]+2; jj++)
+ printk(" %02x ", psecuritypriv->supplicant_ie[jj]);
+ printk("\n");
+ }*/
ielength+=psecuritypriv->supplicant_ie[1]+2;
rtw_report_sec_ie(adapter, authmode, psecuritypriv->supplicant_ie);
@@ -3655,7 +3752,7 @@ unsigned int rtw_restructure_ht_ie(_adapter *padapter, u8 *in_ie, u8 *out_ie, ui
p = rtw_get_ie(in_ie+12, _HT_ADD_INFO_IE_, &ielen, in_len-12);
if(p && (ielen==sizeof(struct ieee80211_ht_addt_info)))
{
- out_len = *pout_len;
+ out_len = *pout_len;
pframe = rtw_set_ie(out_ie+out_len, _HT_ADD_INFO_IE_, ielen, p+2 , pout_len);
}