diff options
Diffstat (limited to 'drivers/staging/rtl8188eu/core/rtw_mlme.c')
-rw-r--r-- | drivers/staging/rtl8188eu/core/rtw_mlme.c | 216 |
1 files changed, 55 insertions, 161 deletions
diff --git a/drivers/staging/rtl8188eu/core/rtw_mlme.c b/drivers/staging/rtl8188eu/core/rtw_mlme.c index 155282ef78fb..149c271e966d 100644 --- a/drivers/staging/rtl8188eu/core/rtw_mlme.c +++ b/drivers/staging/rtl8188eu/core/rtw_mlme.c @@ -30,13 +30,12 @@ #include <wifi.h> #include <wlan_bssdef.h> #include <rtw_ioctl_set.h> -#include <usb_osintf.h> #include <linux/vmalloc.h> extern unsigned char MCS_rate_2R[16]; extern unsigned char MCS_rate_1R[16]; -int _rtw_init_mlme_priv(struct adapter *padapter) +int rtw_init_mlme_priv(struct adapter *padapter) { int i; u8 *pbuf; @@ -59,7 +58,7 @@ int _rtw_init_mlme_priv(struct adapter *padapter) set_scanned_network_val(pmlmepriv, 0); - _rtw_memset(&pmlmepriv->assoc_ssid, 0, sizeof(struct ndis_802_11_ssid)); + memset(&pmlmepriv->assoc_ssid, 0, sizeof(struct ndis_802_11_ssid)); pbuf = vzalloc(MAX_BSS_CNT * (sizeof(struct wlan_network))); @@ -72,9 +71,9 @@ int _rtw_init_mlme_priv(struct adapter *padapter) pnetwork = (struct wlan_network *)pbuf; for (i = 0; i < MAX_BSS_CNT; i++) { - _rtw_init_listhead(&(pnetwork->list)); + INIT_LIST_HEAD(&(pnetwork->list)); - rtw_list_insert_tail(&(pnetwork->list), &(pmlmepriv->free_bss_pool.queue)); + list_add_tail(&(pnetwork->list), &(pmlmepriv->free_bss_pool.queue)); pnetwork++; } @@ -118,7 +117,7 @@ void rtw_free_mlme_priv_ie_data(struct mlme_priv *pmlmepriv) } #endif -void _rtw_free_mlme_priv(struct mlme_priv *pmlmepriv) +void rtw_free_mlme_priv(struct mlme_priv *pmlmepriv) { rtw_free_mlme_priv_ie_data(pmlmepriv); @@ -128,40 +127,6 @@ void _rtw_free_mlme_priv(struct mlme_priv *pmlmepriv) } } -int _rtw_enqueue_network(struct __queue *queue, struct wlan_network *pnetwork) -{ - if (pnetwork == NULL) - goto exit; - - spin_lock_bh(&queue->lock); - - rtw_list_insert_tail(&pnetwork->list, &queue->queue); - - spin_unlock_bh(&queue->lock); - -exit: - return _SUCCESS; -} - -struct wlan_network *_rtw_dequeue_network(struct __queue *queue) -{ - struct wlan_network *pnetwork; - - spin_lock_bh(&queue->lock); - - if (_rtw_queue_empty(queue)) { - pnetwork = NULL; - } else { - pnetwork = container_of((&queue->queue)->next, struct wlan_network, list); - - rtw_list_delete(&(pnetwork->list)); - } - - spin_unlock_bh(&queue->lock); - - return pnetwork; -} - struct wlan_network *_rtw_alloc_network(struct mlme_priv *pmlmepriv)/* _queue *free_queue) */ { struct wlan_network *pnetwork; @@ -170,7 +135,7 @@ struct wlan_network *_rtw_alloc_network(struct mlme_priv *pmlmepriv)/* _queue *f spin_lock_bh(&free_queue->lock); - if (_rtw_queue_empty(free_queue) == true) { + if (list_empty(&free_queue->queue)) { pnetwork = NULL; goto exit; } @@ -178,7 +143,7 @@ struct wlan_network *_rtw_alloc_network(struct mlme_priv *pmlmepriv)/* _queue *f pnetwork = container_of(plist , struct wlan_network, list); - rtw_list_delete(&pnetwork->list); + list_del_init(&pnetwork->list); RT_TRACE(_module_rtl871x_mlme_c_, _drv_info_, ("_rtw_alloc_network: ptr=%p\n", plist)); pnetwork->network_type = 0; @@ -195,7 +160,7 @@ exit: return pnetwork; } -void _rtw_free_network(struct mlme_priv *pmlmepriv , struct wlan_network *pnetwork, u8 isfreeall) +static void _rtw_free_network(struct mlme_priv *pmlmepriv , struct wlan_network *pnetwork, u8 isfreeall) { u32 curr_time, delta_time; u32 lifetime = SCANQUEUE_LIFETIME; @@ -216,8 +181,8 @@ void _rtw_free_network(struct mlme_priv *pmlmepriv , struct wlan_network *pnetwo return; } spin_lock_bh(&free_queue->lock); - rtw_list_delete(&(pnetwork->list)); - rtw_list_insert_tail(&(pnetwork->list), &(free_queue->queue)); + list_del_init(&(pnetwork->list)); + list_add_tail(&(pnetwork->list), &(free_queue->queue)); pmlmepriv->num_of_scanned--; spin_unlock_bh(&free_queue->lock); } @@ -230,8 +195,8 @@ void _rtw_free_network_nolock(struct mlme_priv *pmlmepriv, struct wlan_network * return; if (pnetwork->fixed) return; - rtw_list_delete(&(pnetwork->list)); - rtw_list_insert_tail(&(pnetwork->list), get_list_head(free_queue)); + list_del_init(&(pnetwork->list)); + list_add_tail(&(pnetwork->list), get_list_head(free_queue)); pmlmepriv->num_of_scanned--; } @@ -240,7 +205,7 @@ void _rtw_free_network_nolock(struct mlme_priv *pmlmepriv, struct wlan_network * Shall be calle under atomic context... to avoid possible racing condition... */ -struct wlan_network *_rtw_find_network(struct __queue *scanned_queue, u8 *addr) +struct wlan_network *rtw_find_network(struct __queue *scanned_queue, u8 *addr) { struct list_head *phead, *plist; struct wlan_network *pnetwork = NULL; @@ -266,7 +231,7 @@ exit: } -void _rtw_free_network_queue(struct adapter *padapter, u8 isfreeall) +void rtw_free_network_queue(struct adapter *padapter, u8 isfreeall) { struct list_head *phead, *plist; struct wlan_network *pnetwork; @@ -278,7 +243,7 @@ void _rtw_free_network_queue(struct adapter *padapter, u8 isfreeall) phead = get_list_head(scanned_queue); plist = phead->next; - while (rtw_end_of_queue_search(phead, plist) == false) { + while (phead != plist) { pnetwork = container_of(plist, struct wlan_network, list); plist = plist->next; @@ -332,29 +297,11 @@ u16 rtw_get_capability(struct wlan_bssid_ex *bss) return le16_to_cpu(val); } -u8 *rtw_get_timestampe_from_ie(u8 *ie) -{ - return ie + 0; -} - u8 *rtw_get_beacon_interval_from_ie(u8 *ie) { return ie + 8; } -int rtw_init_mlme_priv(struct adapter *padapter) -{ - int res; - res = _rtw_init_mlme_priv(padapter);/* (pmlmepriv); */ - return res; -} - -void rtw_free_mlme_priv(struct mlme_priv *pmlmepriv) -{ - RT_TRACE(_module_rtl871x_mlme_c_, _drv_err_, ("rtw_free_mlme_priv\n")); - _rtw_free_mlme_priv(pmlmepriv); -} - static struct wlan_network *rtw_alloc_network(struct mlme_priv *pmlmepriv) { return _rtw_alloc_network(pmlmepriv); @@ -366,24 +313,6 @@ static void rtw_free_network_nolock(struct mlme_priv *pmlmepriv, _rtw_free_network_nolock(pmlmepriv, pnetwork); } - -void rtw_free_network_queue(struct adapter *dev, u8 isfreeall) -{ - _rtw_free_network_queue(dev, isfreeall); -} - -/* - return the wlan_network with the matching addr - - Shall be calle under atomic context... to avoid possible racing condition... -*/ -struct wlan_network *rtw_find_network(struct __queue *scanned_queue, u8 *addr) -{ - struct wlan_network *pnetwork = _rtw_find_network(scanned_queue, addr); - - return pnetwork; -} - int rtw_is_same_ibss(struct adapter *adapter, struct wlan_network *pnetwork) { int ret = true; @@ -438,7 +367,7 @@ struct wlan_network *rtw_get_oldest_wlan_network(struct __queue *scanned_queue) plist = phead->next; while (1) { - if (rtw_end_of_queue_search(phead, plist) == true) + if (phead == plist) break; pwlan = container_of(plist, struct wlan_network, list); @@ -522,10 +451,7 @@ void rtw_update_scanned_network(struct adapter *adapter, struct wlan_bssid_ex *t phead = get_list_head(queue); plist = phead->next; - while (1) { - if (rtw_end_of_queue_search(phead, plist) == true) - break; - + while (phead != plist) { pnetwork = container_of(plist, struct wlan_network, list); if (is_same_network(&(pnetwork->network), target)) @@ -537,8 +463,8 @@ void rtw_update_scanned_network(struct adapter *adapter, struct wlan_bssid_ex *t } /* 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_queue_empty(&(pmlmepriv->free_bss_pool)) == true) { + if (phead == plist) { + if (list_empty(&(pmlmepriv->free_bss_pool.queue))) { /* If there are no more slots, expire the oldest */ pnetwork = oldest; @@ -575,7 +501,7 @@ void rtw_update_scanned_network(struct adapter *adapter, struct wlan_bssid_ex *t /* bss info not receiving from the right channel */ if (pnetwork->network.PhyInfo.SignalQuality == 101) pnetwork->network.PhyInfo.SignalQuality = 0; - rtw_list_insert_tail(&(pnetwork->list), &(queue->queue)); + list_add_tail(&(pnetwork->list), &(queue->queue)); } } else { /* we have an entry and we are going to update it. But this entry may @@ -601,9 +527,6 @@ exit: static void rtw_add_network(struct adapter *adapter, struct wlan_bssid_ex *pnetwork) { -#if defined(CONFIG_88EU_P2P) - rtw_wlan_bssid_ex_remove_p2p_attr(pnetwork, P2P_ATTR_GROUP_INFO); -#endif update_current_network(adapter, pnetwork); rtw_update_scanned_network(adapter, pnetwork); } @@ -728,10 +651,7 @@ void rtw_surveydone_event_callback(struct adapter *adapter, u8 *pbuf) RT_TRACE(_module_rtl871x_mlme_c_, _drv_info_, ("rtw_surveydone_event_callback: fw_state:%x\n\n", get_fwstate(pmlmepriv))); if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY)) { - u8 timer_cancelled; - - _cancel_timer(&pmlmepriv->scan_to_timer, &timer_cancelled); - + del_timer_sync(&pmlmepriv->scan_to_timer); _clr_fwstate_(pmlmepriv, _FW_UNDER_SURVEY); } else { RT_TRACE(_module_rtl871x_mlme_c_, _drv_err_, ("nic status=%x, survey done event comes too late!\n", get_fwstate(pmlmepriv))); @@ -754,7 +674,7 @@ void rtw_surveydone_event_callback(struct adapter *adapter, u8 *pbuf) RT_TRACE(_module_rtl871x_mlme_c_, _drv_err_, ("switching to adhoc master\n")); - _rtw_memset(&pdev_network->Ssid, 0, sizeof(struct ndis_802_11_ssid)); + memset(&pdev_network->Ssid, 0, sizeof(struct ndis_802_11_ssid)); memcpy(&pdev_network->Ssid, &pmlmepriv->assoc_ssid, sizeof(struct ndis_802_11_ssid)); rtw_update_registrypriv_dev_network(adapter); @@ -798,14 +718,9 @@ void rtw_surveydone_event_callback(struct adapter *adapter, u8 *pbuf) spin_unlock_bh(&pmlmepriv->lock); - if (check_fwstate(pmlmepriv, _FW_LINKED) == true) - p2p_ps_wk_cmd(adapter, P2P_PS_SCAN_DONE, 0); - rtw_os_xmit_schedule(adapter); pmlmeext = &adapter->mlmeextpriv; - if (pmlmeext->sitesurvey_res.bss_cnt == 0) - rtw_hal_sreset_reset(adapter); } void rtw_dummy_event_callback(struct adapter *adapter , u8 *pbuf) @@ -831,8 +746,8 @@ static void free_scanqueue(struct mlme_priv *pmlmepriv) while (plist != phead) { ptemp = plist->next; - rtw_list_delete(plist); - rtw_list_insert_tail(plist, &free_queue->queue); + list_del_init(plist); + list_add_tail(plist, &free_queue->queue); plist = ptemp; pmlmepriv->num_of_scanned--; } @@ -945,7 +860,6 @@ void rtw_indicate_disconnect(struct adapter *padapter) rtw_led_control(padapter, LED_CTL_NO_LINK); rtw_clear_scan_deny(padapter); } - p2p_ps_wk_cmd(padapter, P2P_PS_DISABLE, 1); rtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_DISCONNECT, 1); } @@ -1002,11 +916,11 @@ static struct sta_info *rtw_joinbss_update_stainfo(struct adapter *padapter, str padapter->securitypriv.bgrpkey_handshake = false; psta->ieee8021x_blocked = true; psta->dot118021XPrivacy = padapter->securitypriv.dot11PrivacyAlgrthm; - _rtw_memset((u8 *)&psta->dot118021x_UncstKey, 0, sizeof(union Keytype)); - _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->dot11rxpn, 0, sizeof(union pn48)); + memset((u8 *)&psta->dot118021x_UncstKey, 0, sizeof(union Keytype)); + memset((u8 *)&psta->dot11tkiprxmickey, 0, sizeof(union Keytype)); + memset((u8 *)&psta->dot11tkiptxmickey, 0, sizeof(union Keytype)); + memset((u8 *)&psta->dot11txpn, 0, sizeof(union pn48)); + memset((u8 *)&psta->dot11rxpn, 0, sizeof(union pn48)); } /* * Commented by Albert 2012/07/21 @@ -1108,7 +1022,6 @@ static void rtw_joinbss_update_network(struct adapter *padapter, struct wlan_net void rtw_joinbss_event_prehandle(struct adapter *adapter, u8 *pbuf) { - u8 timer_cancelled; struct sta_info *ptarget_sta = NULL, *pcur_sta = NULL; struct sta_priv *pstapriv = &adapter->stapriv; struct mlme_priv *pmlmepriv = &(adapter->mlmepriv); @@ -1201,7 +1114,7 @@ void rtw_joinbss_event_prehandle(struct adapter *adapter, u8 *pbuf) } /* s5. Cancle assoc_timer */ - _cancel_timer(&pmlmepriv->assoc_timer, &timer_cancelled); + del_timer_sync(&pmlmepriv->assoc_timer); RT_TRACE(_module_rtl871x_mlme_c_, _drv_info_, ("Cancle assoc_timer\n")); @@ -1421,7 +1334,7 @@ void rtw_stadel_event_callback(struct adapter *adapter, u8 *pbuf) memcpy(pdev_network, &tgt_network->network, get_wlan_bssid_ex_sz(&tgt_network->network)); - _rtw_memset(&pdev_network->Ssid, 0, sizeof(struct ndis_802_11_ssid)); + memset(&pdev_network->Ssid, 0, sizeof(struct ndis_802_11_ssid)); memcpy(&pdev_network->Ssid, &pmlmepriv->assoc_ssid, sizeof(struct ndis_802_11_ssid)); rtw_update_registrypriv_dev_network(adapter); @@ -1449,8 +1362,9 @@ void rtw_cpwm_event_callback(struct adapter *padapter, u8 *pbuf) * _rtw_join_timeout_handler - Timeout/faliure handler for CMD JoinBss * @adapter: pointer to struct adapter structure */ -void _rtw_join_timeout_handler (struct adapter *adapter) +void _rtw_join_timeout_handler (void *function_context) { + struct adapter *adapter = (struct adapter *)function_context; struct mlme_priv *pmlmepriv = &adapter->mlmepriv; int do_join_r; @@ -1490,8 +1404,9 @@ void _rtw_join_timeout_handler (struct adapter *adapter) * rtw_scan_timeout_handler - Timeout/Faliure handler for CMD SiteSurvey * @adapter: pointer to struct adapter structure */ -void rtw_scan_timeout_handler (struct adapter *adapter) +void rtw_scan_timeout_handler (void *function_context) { + struct adapter *adapter = (struct adapter *)function_context; struct mlme_priv *pmlmepriv = &adapter->mlmepriv; DBG_88E(FUNC_ADPT_FMT" fw_state=%x\n", FUNC_ADPT_ARG(adapter), get_fwstate(pmlmepriv)); @@ -1516,48 +1431,27 @@ static void rtw_auto_scan_handler(struct adapter *padapter) } } -void rtw_dynamic_check_timer_handlder(struct adapter *adapter) +void rtw_dynamic_check_timer_handlder(void *function_context) { - struct mlme_priv *pmlmepriv = &adapter->mlmepriv; + struct adapter *adapter = (struct adapter *)function_context; struct registry_priv *pregistrypriv = &adapter->registrypriv; if (!adapter) - return; + goto exit; if (!adapter->hw_init_completed) - return; + goto exit; if ((adapter->bDriverStopped) || (adapter->bSurpriseRemoved)) - return; + goto exit; if (adapter->net_closed) - return; + goto exit; rtw_dynamic_chk_wk_cmd(adapter); if (pregistrypriv->wifi_spec == 1) { -#ifdef CONFIG_88EU_P2P - struct wifidirect_info *pwdinfo = &adapter->wdinfo; - if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) -#endif - { - /* auto site survey */ - rtw_auto_scan_handler(adapter); - } - } - - rcu_read_lock(); - - if (rcu_dereference(adapter->pnetdev->rx_handler_data) && - (check_fwstate(pmlmepriv, WIFI_STATION_STATE|WIFI_ADHOC_STATE) == true)) { - /* expire NAT2.5 entry */ - nat25_db_expire(adapter); - - if (adapter->pppoe_connection_in_progress > 0) - adapter->pppoe_connection_in_progress--; - - /* due to rtw_dynamic_check_timer_handlder() is called every 2 seconds */ - if (adapter->pppoe_connection_in_progress > 0) - adapter->pppoe_connection_in_progress--; + /* auto site survey */ + rtw_auto_scan_handler(adapter); } - - rcu_read_unlock(); +exit: + _set_timer(&adapter->mlmepriv.dynamic_chk_timer, 2000); } #define RTW_SCAN_RESULT_EXPIRE 2000 @@ -1635,7 +1529,7 @@ int rtw_select_and_join_from_scanned_queue(struct mlme_priv *pmlmepriv) phead = get_list_head(queue); adapter = (struct adapter *)pmlmepriv->nic_hdl; pmlmepriv->pscanned = phead->next; - while (!rtw_end_of_queue_search(phead, pmlmepriv->pscanned)) { + while (phead != pmlmepriv->pscanned) { pnetwork = container_of(pmlmepriv->pscanned, struct wlan_network, list); if (pnetwork == NULL) { RT_TRACE(_module_rtl871x_mlme_c_, _drv_err_, ("%s return _FAIL:(pnetwork==NULL)\n", __func__)); @@ -1689,26 +1583,26 @@ int rtw_set_auth(struct adapter *adapter, struct security_priv *psecuritypriv) struct cmd_priv *pcmdpriv = &(adapter->cmdpriv); int res = _SUCCESS; - pcmd = (struct cmd_obj *)rtw_zmalloc(sizeof(struct cmd_obj)); + pcmd = kzalloc(sizeof(struct cmd_obj), GFP_KERNEL); if (pcmd == NULL) { res = _FAIL; /* try again */ goto exit; } - psetauthparm = (struct setauth_parm *)rtw_zmalloc(sizeof(struct setauth_parm)); + psetauthparm = kzalloc(sizeof(struct setauth_parm), GFP_KERNEL); if (psetauthparm == NULL) { kfree(pcmd); res = _FAIL; goto exit; } - _rtw_memset(psetauthparm, 0, sizeof(struct setauth_parm)); + memset(psetauthparm, 0, sizeof(struct setauth_parm)); psetauthparm->mode = (unsigned char)psecuritypriv->dot11AuthAlgrthm; pcmd->cmdcode = _SetAuth_CMD_; pcmd->parmbuf = (unsigned char *)psetauthparm; pcmd->cmdsz = (sizeof(struct setauth_parm)); pcmd->rsp = NULL; pcmd->rspsz = 0; - _rtw_init_listhead(&pcmd->list); + INIT_LIST_HEAD(&pcmd->list); RT_TRACE(_module_rtl871x_mlme_c_, _drv_err_, ("after enqueue set_auth_cmd, auth_mode=%x\n", psecuritypriv->dot11AuthAlgrthm)); @@ -1726,17 +1620,17 @@ int rtw_set_key(struct adapter *adapter, struct security_priv *psecuritypriv, in struct mlme_priv *pmlmepriv = &(adapter->mlmepriv); int res = _SUCCESS; - pcmd = (struct cmd_obj *)rtw_zmalloc(sizeof(struct cmd_obj)); + pcmd = kzalloc(sizeof(struct cmd_obj), GFP_KERNEL); if (pcmd == NULL) return _FAIL; /* try again */ - psetkeyparm = (struct setkey_parm *)rtw_zmalloc(sizeof(struct setkey_parm)); + psetkeyparm = kzalloc(sizeof(struct setkey_parm), GFP_KERNEL); if (psetkeyparm == NULL) { res = _FAIL; goto err_free_cmd; } - _rtw_memset(psetkeyparm, 0, sizeof(struct setkey_parm)); + memset(psetkeyparm, 0, sizeof(struct setkey_parm)); if (psecuritypriv->dot11AuthAlgrthm == dot11AuthAlgrthm_8021X) { psetkeyparm->algorithm = (unsigned char)psecuritypriv->dot118021XGrpPrivacy; @@ -1789,7 +1683,7 @@ int rtw_set_key(struct adapter *adapter, struct security_priv *psecuritypriv, in pcmd->cmdsz = (sizeof(struct setkey_parm)); pcmd->rsp = NULL; pcmd->rspsz = 0; - _rtw_init_listhead(&pcmd->list); + INIT_LIST_HEAD(&pcmd->list); res = rtw_enqueue_cmd(pcmdpriv, pcmd); return res; @@ -2070,7 +1964,7 @@ unsigned int rtw_restructure_ht_ie(struct adapter *padapter, u8 *in_ie, u8 *out_ out_len = *pout_len; - _rtw_memset(&ht_capie, 0, sizeof(struct rtw_ieee80211_ht_cap)); + memset(&ht_capie, 0, sizeof(struct rtw_ieee80211_ht_cap)); ht_capie.cap_info = IEEE80211_HT_CAP_SUP_WIDTH | IEEE80211_HT_CAP_SGI_20 | |