diff options
Diffstat (limited to 'drivers/staging/rtl8723au/os_dep')
-rw-r--r-- | drivers/staging/rtl8723au/os_dep/ioctl_cfg80211.c | 3348 | ||||
-rw-r--r-- | drivers/staging/rtl8723au/os_dep/mlme_linux.c | 81 | ||||
-rw-r--r-- | drivers/staging/rtl8723au/os_dep/os_intfs.c | 852 | ||||
-rw-r--r-- | drivers/staging/rtl8723au/os_dep/recv_linux.c | 165 | ||||
-rw-r--r-- | drivers/staging/rtl8723au/os_dep/usb_intf.c | 627 | ||||
-rw-r--r-- | drivers/staging/rtl8723au/os_dep/usb_ops_linux.c | 233 | ||||
-rw-r--r-- | drivers/staging/rtl8723au/os_dep/xmit_linux.c | 154 |
7 files changed, 0 insertions, 5460 deletions
diff --git a/drivers/staging/rtl8723au/os_dep/ioctl_cfg80211.c b/drivers/staging/rtl8723au/os_dep/ioctl_cfg80211.c deleted file mode 100644 index d0ba377..0000000 --- a/drivers/staging/rtl8723au/os_dep/ioctl_cfg80211.c +++ /dev/null @@ -1,3348 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - ******************************************************************************/ -#define _IOCTL_CFG80211_C_ - -#include <osdep_service.h> -#include <drv_types.h> -#include <xmit_osdep.h> - -#include "ioctl_cfg80211.h" - -#define RTW_MAX_MGMT_TX_CNT 8 - -#define RTW_MAX_REMAIN_ON_CHANNEL_DURATION 65535 /* ms */ -#define RTW_MAX_NUM_PMKIDS 4 - -static const u32 rtw_cipher_suites[] = { - WLAN_CIPHER_SUITE_WEP40, - WLAN_CIPHER_SUITE_WEP104, - WLAN_CIPHER_SUITE_TKIP, - WLAN_CIPHER_SUITE_CCMP, -}; - -#define RATETAB_ENT(_rate, _rateid, _flags) { \ - .bitrate = (_rate), \ - .hw_value = (_rateid), \ - .flags = (_flags), \ -} - -#define CHAN2G(_channel, _freq, _flags) { \ - .band = NL80211_BAND_2GHZ, \ - .center_freq = (_freq), \ - .hw_value = (_channel), \ - .flags = (_flags), \ - .max_antenna_gain = 0, \ - .max_power = 30, \ -} - -#define CHAN5G(_channel, _flags) { \ - .band = NL80211_BAND_5GHZ, \ - .center_freq = 5000 + (5 * (_channel)), \ - .hw_value = (_channel), \ - .flags = (_flags), \ - .max_antenna_gain = 0, \ - .max_power = 30, \ -} - -static struct ieee80211_rate rtw_rates[] = { - RATETAB_ENT(10, 0x1, 0), - RATETAB_ENT(20, 0x2, 0), - RATETAB_ENT(55, 0x4, 0), - RATETAB_ENT(110, 0x8, 0), - RATETAB_ENT(60, 0x10, 0), - RATETAB_ENT(90, 0x20, 0), - RATETAB_ENT(120, 0x40, 0), - RATETAB_ENT(180, 0x80, 0), - RATETAB_ENT(240, 0x100, 0), - RATETAB_ENT(360, 0x200, 0), - RATETAB_ENT(480, 0x400, 0), - RATETAB_ENT(540, 0x800, 0), -}; - -#define rtw_a_rates (rtw_rates + 4) -#define RTW_A_RATES_NUM 8 -#define rtw_g_rates (rtw_rates + 0) -#define RTW_G_RATES_NUM 12 - -#define RTW_2G_CHANNELS_NUM 14 -#define RTW_5G_CHANNELS_NUM 37 - -static struct ieee80211_channel rtw_2ghz_channels[] = { - CHAN2G(1, 2412, 0), - CHAN2G(2, 2417, 0), - CHAN2G(3, 2422, 0), - CHAN2G(4, 2427, 0), - CHAN2G(5, 2432, 0), - CHAN2G(6, 2437, 0), - CHAN2G(7, 2442, 0), - CHAN2G(8, 2447, 0), - CHAN2G(9, 2452, 0), - CHAN2G(10, 2457, 0), - CHAN2G(11, 2462, 0), - CHAN2G(12, 2467, 0), - CHAN2G(13, 2472, 0), - CHAN2G(14, 2484, 0), -}; - -static struct ieee80211_channel rtw_5ghz_a_channels[] = { - CHAN5G(34, 0), CHAN5G(36, 0), - CHAN5G(38, 0), CHAN5G(40, 0), - CHAN5G(42, 0), CHAN5G(44, 0), - CHAN5G(46, 0), CHAN5G(48, 0), - CHAN5G(52, 0), CHAN5G(56, 0), - CHAN5G(60, 0), CHAN5G(64, 0), - CHAN5G(100, 0), CHAN5G(104, 0), - CHAN5G(108, 0), CHAN5G(112, 0), - CHAN5G(116, 0), CHAN5G(120, 0), - CHAN5G(124, 0), CHAN5G(128, 0), - CHAN5G(132, 0), CHAN5G(136, 0), - CHAN5G(140, 0), CHAN5G(149, 0), - CHAN5G(153, 0), CHAN5G(157, 0), - CHAN5G(161, 0), CHAN5G(165, 0), - CHAN5G(184, 0), CHAN5G(188, 0), - CHAN5G(192, 0), CHAN5G(196, 0), - CHAN5G(200, 0), CHAN5G(204, 0), - CHAN5G(208, 0), CHAN5G(212, 0), - CHAN5G(216, 0), -}; - -static void rtw_2g_channels_init(struct ieee80211_channel *channels) -{ - memcpy((void *)channels, (void *)rtw_2ghz_channels, - sizeof(struct ieee80211_channel) * RTW_2G_CHANNELS_NUM); -} - -static void rtw_5g_channels_init(struct ieee80211_channel *channels) -{ - memcpy((void *)channels, (void *)rtw_5ghz_a_channels, - sizeof(struct ieee80211_channel) * RTW_5G_CHANNELS_NUM); -} - -static void rtw_2g_rates_init(struct ieee80211_rate *rates) -{ - memcpy(rates, rtw_g_rates, - sizeof(struct ieee80211_rate) * RTW_G_RATES_NUM); -} - -static void rtw_5g_rates_init(struct ieee80211_rate *rates) -{ - memcpy(rates, rtw_a_rates, - sizeof(struct ieee80211_rate) * RTW_A_RATES_NUM); -} - -static struct ieee80211_supported_band * -rtw_spt_band_alloc(enum nl80211_band band) -{ - struct ieee80211_supported_band *spt_band = NULL; - int n_channels, n_bitrates; - - if (band == NL80211_BAND_2GHZ) { - n_channels = RTW_2G_CHANNELS_NUM; - n_bitrates = RTW_G_RATES_NUM; - } else if (band == NL80211_BAND_5GHZ) { - n_channels = RTW_5G_CHANNELS_NUM; - n_bitrates = RTW_A_RATES_NUM; - } else { - goto exit; - } - spt_band = kzalloc(sizeof(struct ieee80211_supported_band) + - sizeof(struct ieee80211_channel) * n_channels + - sizeof(struct ieee80211_rate) * n_bitrates, - GFP_KERNEL); - if (!spt_band) - goto exit; - - spt_band->channels = - (struct ieee80211_channel *)(((u8 *) spt_band) + - sizeof(struct - ieee80211_supported_band)); - spt_band->bitrates = - (struct ieee80211_rate *)(((u8 *) spt_band->channels) + - sizeof(struct ieee80211_channel) * - n_channels); - spt_band->band = band; - spt_band->n_channels = n_channels; - spt_band->n_bitrates = n_bitrates; - - if (band == NL80211_BAND_2GHZ) { - rtw_2g_channels_init(spt_band->channels); - rtw_2g_rates_init(spt_band->bitrates); - } else if (band == NL80211_BAND_5GHZ) { - rtw_5g_channels_init(spt_band->channels); - rtw_5g_rates_init(spt_band->bitrates); - } - - /* spt_band.ht_cap */ - -exit: - return spt_band; -} - -static const struct ieee80211_txrx_stypes -rtw_cfg80211_default_mgmt_stypes[NUM_NL80211_IFTYPES] = { - [NL80211_IFTYPE_ADHOC] = { - .tx = 0xffff, - .rx = BIT(IEEE80211_STYPE_ACTION >> 4) - }, - [NL80211_IFTYPE_STATION] = { - .tx = 0xffff, - .rx = BIT(IEEE80211_STYPE_ACTION >> 4) | - BIT(IEEE80211_STYPE_PROBE_REQ >> 4) - }, - [NL80211_IFTYPE_AP] = { - .tx = 0xffff, - .rx = BIT(IEEE80211_STYPE_ASSOC_REQ >> 4) | - BIT(IEEE80211_STYPE_REASSOC_REQ >> 4) | - BIT(IEEE80211_STYPE_PROBE_REQ >> 4) | - BIT(IEEE80211_STYPE_DISASSOC >> 4) | - BIT(IEEE80211_STYPE_AUTH >> 4) | - BIT(IEEE80211_STYPE_DEAUTH >> 4) | - BIT(IEEE80211_STYPE_ACTION >> 4) - }, - [NL80211_IFTYPE_AP_VLAN] = { - /* copy AP */ - .tx = 0xffff, - .rx = BIT(IEEE80211_STYPE_ASSOC_REQ >> 4) | - BIT(IEEE80211_STYPE_REASSOC_REQ >> 4) | - BIT(IEEE80211_STYPE_PROBE_REQ >> 4) | - BIT(IEEE80211_STYPE_DISASSOC >> 4) | - BIT(IEEE80211_STYPE_AUTH >> 4) | - BIT(IEEE80211_STYPE_DEAUTH >> 4) | - BIT(IEEE80211_STYPE_ACTION >> 4) - }, - [NL80211_IFTYPE_P2P_CLIENT] = { - .tx = 0xffff, - .rx = BIT(IEEE80211_STYPE_ACTION >> 4) | - BIT(IEEE80211_STYPE_PROBE_REQ >> 4) - }, - [NL80211_IFTYPE_P2P_GO] = { - .tx = 0xffff, - .rx = BIT(IEEE80211_STYPE_ASSOC_REQ >> 4) | - BIT(IEEE80211_STYPE_REASSOC_REQ >> 4) | - BIT(IEEE80211_STYPE_PROBE_REQ >> 4) | - BIT(IEEE80211_STYPE_DISASSOC >> 4) | - BIT(IEEE80211_STYPE_AUTH >> 4) | - BIT(IEEE80211_STYPE_DEAUTH >> 4) | - BIT(IEEE80211_STYPE_ACTION >> 4) - }, -}; - -static int rtw_cfg80211_inform_bss(struct rtw_adapter *padapter, - struct wlan_network *pnetwork) -{ - int ret = 0; - struct ieee80211_channel *notify_channel; - struct cfg80211_bss *bss; - u16 channel; - u32 freq; - u8 *notify_ie; - size_t notify_ielen; - s32 notify_signal; - struct wireless_dev *wdev = padapter->rtw_wdev; - struct wiphy *wiphy = wdev->wiphy; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - - channel = pnetwork->network.DSConfig; - if (channel <= RTW_CH_MAX_2G_CHANNEL) - freq = ieee80211_channel_to_frequency(channel, - NL80211_BAND_2GHZ); - else - freq = ieee80211_channel_to_frequency(channel, - NL80211_BAND_5GHZ); - - notify_channel = ieee80211_get_channel(wiphy, freq); - - notify_ie = pnetwork->network.IEs; - notify_ielen = pnetwork->network.IELength; - - /* We've set wiphy's signal_type as CFG80211_SIGNAL_TYPE_MBM: - * signal strength in mBm (100*dBm) - */ - if (check_fwstate(pmlmepriv, _FW_LINKED) && - is_same_network23a(&pmlmepriv->cur_network.network, - &pnetwork->network)) { - notify_signal = 100 * translate_percentage_to_dbm(padapter->recvpriv.signal_strength); /* dbm */ - } else { - notify_signal = 100 * translate_percentage_to_dbm( - pnetwork->network.SignalStrength); /* dbm */ - } - - bss = cfg80211_inform_bss(wiphy, notify_channel, - CFG80211_BSS_FTYPE_UNKNOWN, - pnetwork->network.MacAddress, - pnetwork->network.tsf, - pnetwork->network.capability, - pnetwork->network.beacon_interval, - notify_ie, notify_ielen, - notify_signal, GFP_ATOMIC); - - if (unlikely(!bss)) { - DBG_8723A("rtw_cfg80211_inform_bss error\n"); - return -EINVAL; - } - - cfg80211_put_bss(wiphy, bss); - - return ret; -} - -void rtw_cfg80211_indicate_connect(struct rtw_adapter *padapter) -{ - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct wlan_network *cur_network = &pmlmepriv->cur_network; - struct wireless_dev *pwdev = padapter->rtw_wdev; - - DBG_8723A("%s(padapter =%p)\n", __func__, padapter); - - if (pwdev->iftype != NL80211_IFTYPE_STATION && - pwdev->iftype != NL80211_IFTYPE_P2P_CLIENT) - return; - - if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) - return; - - if (padapter->mlmepriv.to_roaming > 0) { - struct wiphy *wiphy = pwdev->wiphy; - struct ieee80211_channel *notify_channel; - u32 freq; - u16 channel = cur_network->network.DSConfig; - - if (channel <= RTW_CH_MAX_2G_CHANNEL) - freq = - ieee80211_channel_to_frequency(channel, - NL80211_BAND_2GHZ); - else - freq = - ieee80211_channel_to_frequency(channel, - NL80211_BAND_5GHZ); - - notify_channel = ieee80211_get_channel(wiphy, freq); - - DBG_8723A("%s call cfg80211_roamed\n", __func__); - cfg80211_roamed(padapter->pnetdev, notify_channel, - cur_network->network.MacAddress, - pmlmepriv->assoc_req + - sizeof(struct ieee80211_hdr_3addr) + 2, - pmlmepriv->assoc_req_len - - sizeof(struct ieee80211_hdr_3addr) - 2, - pmlmepriv->assoc_rsp + - sizeof(struct ieee80211_hdr_3addr) + 6, - pmlmepriv->assoc_rsp_len - - sizeof(struct ieee80211_hdr_3addr) - 6, - GFP_ATOMIC); - } else { - cfg80211_connect_result(padapter->pnetdev, - cur_network->network.MacAddress, - pmlmepriv->assoc_req + - sizeof(struct ieee80211_hdr_3addr) + 2, - pmlmepriv->assoc_req_len - - sizeof(struct ieee80211_hdr_3addr) - 2, - pmlmepriv->assoc_rsp + - sizeof(struct ieee80211_hdr_3addr) + 6, - pmlmepriv->assoc_rsp_len - - sizeof(struct ieee80211_hdr_3addr) - 6, - WLAN_STATUS_SUCCESS, GFP_ATOMIC); - } -} - -void rtw_cfg80211_indicate_disconnect(struct rtw_adapter *padapter) -{ - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct wireless_dev *pwdev = padapter->rtw_wdev; - - DBG_8723A("%s(padapter =%p)\n", __func__, padapter); - - if (pwdev->iftype != NL80211_IFTYPE_STATION && - pwdev->iftype != NL80211_IFTYPE_P2P_CLIENT) - return; - - if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) - return; - - if (!padapter->mlmepriv.not_indic_disco) { - if (check_fwstate(&padapter->mlmepriv, WIFI_UNDER_LINKING)) { - cfg80211_connect_result(padapter->pnetdev, NULL, NULL, - 0, NULL, 0, - WLAN_STATUS_UNSPECIFIED_FAILURE, - GFP_ATOMIC); - } else { - cfg80211_disconnected(padapter->pnetdev, 0, NULL, - 0, false, GFP_ATOMIC); - } - } -} - -#ifdef CONFIG_8723AU_AP_MODE -static int set_pairwise_key(struct rtw_adapter *padapter, struct sta_info *psta) -{ - struct cmd_obj *ph2c; - struct set_stakey_parm *psetstakey_para; - struct cmd_priv *pcmdpriv = &padapter->cmdpriv; - int res = _SUCCESS; - - ph2c = kzalloc(sizeof(struct cmd_obj), GFP_KERNEL); - if (ph2c == NULL) { - res = _FAIL; - goto exit; - } - - psetstakey_para = kzalloc(sizeof(struct set_stakey_parm), GFP_KERNEL); - if (psetstakey_para == NULL) { - kfree(ph2c); - res = _FAIL; - goto exit; - } - - init_h2fwcmd_w_parm_no_rsp(ph2c, psetstakey_para, _SetStaKey_CMD_); - - psetstakey_para->algorithm = psta->dot118021XPrivacy; - - ether_addr_copy(psetstakey_para->addr, psta->hwaddr); - - memcpy(psetstakey_para->key, &psta->dot118021x_UncstKey, 16); - - res = rtw_enqueue_cmd23a(pcmdpriv, ph2c); - -exit: - return res; -} - -static int set_group_key(struct rtw_adapter *padapter, struct key_params *parms, - u32 alg, u8 keyid) -{ - struct cmd_obj *pcmd; - struct setkey_parm *psetkeyparm; - struct cmd_priv *pcmdpriv = &padapter->cmdpriv; - int res = _SUCCESS; - - DBG_8723A("%s\n", __func__); - - if (keyid >= 4) { - res = _FAIL; - goto exit; - } - - pcmd = kzalloc(sizeof(struct cmd_obj), GFP_KERNEL); - if (!pcmd) { - res = _FAIL; - goto exit; - } - psetkeyparm = kzalloc(sizeof(struct setkey_parm), GFP_KERNEL); - if (!psetkeyparm) { - kfree(pcmd); - res = _FAIL; - goto exit; - } - - psetkeyparm->keyid = keyid; - if (is_wep_enc(alg)) - padapter->mlmepriv.key_mask |= BIT(psetkeyparm->keyid); - - psetkeyparm->algorithm = alg; - - psetkeyparm->set_tx = 1; - - memcpy(&psetkeyparm->key, parms->key, parms->key_len); - - pcmd->cmdcode = _SetKey_CMD_; - pcmd->parmbuf = (u8 *) psetkeyparm; - pcmd->cmdsz = sizeof(struct setkey_parm); - pcmd->rsp = NULL; - pcmd->rspsz = 0; - - res = rtw_enqueue_cmd23a(pcmdpriv, pcmd); - -exit: - return res; -} - -static int rtw_cfg80211_ap_set_encryption(struct net_device *dev, u8 key_index, - int set_tx, const u8 *sta_addr, - struct key_params *keyparms) -{ - int key_len; - struct sta_info *psta = NULL, *pbcmc_sta = NULL; - struct rtw_adapter *padapter = netdev_priv(dev); - struct security_priv *psecuritypriv = &padapter->securitypriv; - struct sta_priv *pstapriv = &padapter->stapriv; - - DBG_8723A("%s\n", __func__); - - if (!is_broadcast_ether_addr(sta_addr)) { - psta = rtw_get_stainfo23a(pstapriv, sta_addr); - if (!psta) { - /* ret = -EINVAL; */ - DBG_8723A("rtw_set_encryption(), sta has already " - "been removed or never been added\n"); - goto exit; - } - } - - key_len = keyparms->key_len; - - if (!psta && (keyparms->cipher == WLAN_CIPHER_SUITE_WEP40 || - keyparms->cipher == WLAN_CIPHER_SUITE_WEP104)) { - DBG_8723A("r871x_set_encryption, crypt.alg = WEP\n"); - - DBG_8723A("r871x_set_encryption, wep_key_idx =%d, len =%d\n", - key_index, key_len); - - if (psecuritypriv->bWepDefaultKeyIdxSet == 0) { - /* wep default key has not been set, so use - this key index as default key. */ - - psecuritypriv->ndisencryptstatus = - Ndis802_11Encryption1Enabled; - psecuritypriv->dot11PrivacyAlgrthm = keyparms->cipher; - psecuritypriv->dot118021XGrpPrivacy = keyparms->cipher; - - psecuritypriv->dot11PrivacyKeyIndex = key_index; - } - - memcpy(&psecuritypriv->wep_key[key_index].key, - keyparms->key, key_len); - - psecuritypriv->wep_key[key_index].keylen = key_len; - - set_group_key(padapter, keyparms, keyparms->cipher, key_index); - - goto exit; - } - - if (!psta) { /* group key */ - if (set_tx == 0) { /* group key */ - if (keyparms->cipher == WLAN_CIPHER_SUITE_WEP40 || - keyparms->cipher == WLAN_CIPHER_SUITE_WEP104) { - DBG_8723A("%s, set group_key, WEP\n", __func__); - - memcpy(psecuritypriv-> - dot118021XGrpKey[key_index].skey, - keyparms->key, key_len); - - psecuritypriv->dot118021XGrpPrivacy = - keyparms->cipher; - } else if (keyparms->cipher == WLAN_CIPHER_SUITE_TKIP) { - DBG_8723A("%s, set group_key, TKIP\n", - __func__); - - psecuritypriv->dot118021XGrpPrivacy = - WLAN_CIPHER_SUITE_TKIP; - - memcpy(psecuritypriv-> - dot118021XGrpKey[key_index].skey, - keyparms->key, - (min(16, key_len))); - - /* set mic key */ - memcpy(psecuritypriv-> - dot118021XGrptxmickey[key_index].skey, - &keyparms->key[16], 8); - memcpy(psecuritypriv-> - dot118021XGrprxmickey[key_index].skey, - &keyparms->key[24], 8); - - psecuritypriv->busetkipkey = 1; - - } else if (keyparms->cipher == WLAN_CIPHER_SUITE_CCMP) { - DBG_8723A("%s, set group_key, CCMP\n", - __func__); - - psecuritypriv->dot118021XGrpPrivacy = - WLAN_CIPHER_SUITE_CCMP; - - memcpy(psecuritypriv-> - dot118021XGrpKey[key_index].skey, - keyparms->key, - (min(16, key_len))); - } else { - DBG_8723A("%s, set group_key, none\n", - __func__); - - psecuritypriv->dot118021XGrpPrivacy = 0; - } - - psecuritypriv->dot118021XGrpKeyid = key_index; - - psecuritypriv->binstallGrpkey = 1; - - psecuritypriv->dot11PrivacyAlgrthm = - psecuritypriv->dot118021XGrpPrivacy; - - set_group_key(padapter, keyparms, - psecuritypriv->dot118021XGrpPrivacy, - key_index); - - pbcmc_sta = rtw_get_bcmc_stainfo23a(padapter); - if (pbcmc_sta) { - pbcmc_sta->ieee8021x_blocked = false; - /* rx will use bmc_sta's dot118021XPrivacy */ - pbcmc_sta->dot118021XPrivacy = - psecuritypriv->dot118021XGrpPrivacy; - - } - - } - - goto exit; - } - - if (psecuritypriv->dot11AuthAlgrthm == dot11AuthAlgrthm_8021X && psta) { - /* psk/802_1x */ - if (set_tx == 1) { - /* pairwise key */ - memcpy(psta->dot118021x_UncstKey.skey, - keyparms->key, (min(16, key_len))); - - if (keyparms->cipher == WLAN_CIPHER_SUITE_WEP40 || - keyparms->cipher == WLAN_CIPHER_SUITE_WEP104) { - DBG_8723A("%s, set pairwise key, WEP\n", - __func__); - - psecuritypriv->dot118021XGrpPrivacy = - keyparms->cipher; - } else if (keyparms->cipher == WLAN_CIPHER_SUITE_TKIP) { - DBG_8723A("%s, set pairwise key, TKIP\n", - __func__); - - psta->dot118021XPrivacy = - WLAN_CIPHER_SUITE_TKIP; - - /* set mic key */ - memcpy(psta->dot11tkiptxmickey.skey, - &keyparms->key[16], 8); - memcpy(psta->dot11tkiprxmickey.skey, - &keyparms->key[24], 8); - - psecuritypriv->busetkipkey = 1; - - } else if (keyparms->cipher == WLAN_CIPHER_SUITE_CCMP) { - DBG_8723A("%s, set pairwise key, CCMP\n", - __func__); - - psta->dot118021XPrivacy = - WLAN_CIPHER_SUITE_CCMP; - } else { - DBG_8723A("%s, set pairwise key, none\n", - __func__); - - psta->dot118021XPrivacy = 0; - } - - set_pairwise_key(padapter, psta); - - psta->ieee8021x_blocked = false; - - psta->bpairwise_key_installed = true; - } else { /* group key??? */ - if (keyparms->cipher == WLAN_CIPHER_SUITE_WEP40 || - keyparms->cipher == WLAN_CIPHER_SUITE_WEP104) { - memcpy(psecuritypriv-> - dot118021XGrpKey[key_index].skey, - keyparms->key, key_len); - - psecuritypriv->dot118021XGrpPrivacy = - keyparms->cipher; - } else if (keyparms->cipher == WLAN_CIPHER_SUITE_TKIP) { - psecuritypriv->dot118021XGrpPrivacy = - WLAN_CIPHER_SUITE_TKIP; - - memcpy(psecuritypriv-> - dot118021XGrpKey[key_index].skey, - keyparms->key, - (min(16, key_len))); - - /* set mic key */ - memcpy(psecuritypriv-> - dot118021XGrptxmickey[key_index].skey, - &keyparms->key[16], 8); - memcpy(psecuritypriv-> - dot118021XGrprxmickey[key_index].skey, - &keyparms->key[24], 8); - - psecuritypriv->busetkipkey = 1; - } else if (keyparms->cipher == WLAN_CIPHER_SUITE_CCMP) { - psecuritypriv->dot118021XGrpPrivacy = - WLAN_CIPHER_SUITE_CCMP; - - memcpy(psecuritypriv-> - dot118021XGrpKey[key_index].skey, - keyparms->key, - (min(16, key_len))); - } else { - psecuritypriv->dot118021XGrpPrivacy = 0; - } - - psecuritypriv->dot118021XGrpKeyid = key_index; - - psecuritypriv->binstallGrpkey = 1; - - psecuritypriv->dot11PrivacyAlgrthm = - psecuritypriv->dot118021XGrpPrivacy; - - set_group_key(padapter, keyparms, - psecuritypriv->dot118021XGrpPrivacy, - key_index); - - pbcmc_sta = rtw_get_bcmc_stainfo23a(padapter); - if (pbcmc_sta) { - /* rx will use bmc_sta's - dot118021XPrivacy */ - pbcmc_sta->ieee8021x_blocked = false; - pbcmc_sta->dot118021XPrivacy = - psecuritypriv->dot118021XGrpPrivacy; - } - } - } - -exit: - - return 0; -} -#endif - -static int rtw_cfg80211_set_encryption(struct net_device *dev, u8 key_index, - int set_tx, const u8 *sta_addr, - struct key_params *keyparms) -{ - int ret = 0; - int key_len; - struct rtw_adapter *padapter = netdev_priv(dev); - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct security_priv *psecuritypriv = &padapter->securitypriv; - - DBG_8723A("%s\n", __func__); - - key_len = keyparms->key_len; - - if (keyparms->cipher == WLAN_CIPHER_SUITE_WEP40 || - keyparms->cipher == WLAN_CIPHER_SUITE_WEP104) { - RT_TRACE(_module_rtl871x_ioctl_os_c, _drv_err_, - "wpa_set_encryption, crypt.alg = WEP\n"); - DBG_8723A("wpa_set_encryption, crypt.alg = WEP\n"); - - if (psecuritypriv->bWepDefaultKeyIdxSet == 0) { - /* wep default key has not been set, so use this - key index as default key. */ - - psecuritypriv->ndisencryptstatus = - Ndis802_11Encryption1Enabled; - psecuritypriv->dot11PrivacyAlgrthm = keyparms->cipher; - psecuritypriv->dot118021XGrpPrivacy = keyparms->cipher; - - psecuritypriv->dot11PrivacyKeyIndex = key_index; - } - - memcpy(&psecuritypriv->wep_key[key_index].key, - keyparms->key, key_len); - - psecuritypriv->wep_key[key_index].keylen = key_len; - - rtw_set_key23a(padapter, psecuritypriv, key_index, 0); - - goto exit; - } - - if (padapter->securitypriv.dot11AuthAlgrthm == - dot11AuthAlgrthm_8021X) { /* 802_1x */ - struct sta_info *psta, *pbcmc_sta; - struct sta_priv *pstapriv = &padapter->stapriv; - - if (check_fwstate(pmlmepriv, - WIFI_STATION_STATE | WIFI_MP_STATE)) { - /* sta mode */ - psta = rtw_get_stainfo23a(pstapriv, get_bssid(pmlmepriv)); - if (psta == NULL) { - DBG_8723A("%s, : Obtain Sta_info fail\n", - __func__); - } else { - /* Jeff: don't disable ieee8021x_blocked - while clearing key */ - if (keyparms->cipher != IW_AUTH_CIPHER_NONE && - keyparms->cipher != 0) - psta->ieee8021x_blocked = false; - - if ((padapter->securitypriv.ndisencryptstatus == - Ndis802_11Encryption2Enabled) || - (padapter->securitypriv.ndisencryptstatus == - Ndis802_11Encryption3Enabled)) { - psta->dot118021XPrivacy = - padapter->securitypriv. - dot11PrivacyAlgrthm; - } - - if (set_tx == 1) { - /* pairwise key */ - DBG_8723A("%s, : set_tx == 1\n", - __func__); - - memcpy(psta->dot118021x_UncstKey.skey, - keyparms->key, - (min(16, key_len))); - - if (keyparms->cipher == - WLAN_CIPHER_SUITE_TKIP) { - memcpy(psta->dot11tkiptxmickey. - skey, - &keyparms->key[16], 8); - memcpy(psta->dot11tkiprxmickey. - skey, - &keyparms->key[24], 8); - - padapter->securitypriv. - busetkipkey = 0; - } - DBG_8723A(" ~~~~set sta key:unicastkey\n"); - - rtw_setstakey_cmd23a(padapter, - (unsigned char *)psta, - true); - } else { /* group key */ - memcpy(padapter->securitypriv. - dot118021XGrpKey[key_index].skey, - keyparms->key, - (min(16, key_len))); - memcpy(padapter->securitypriv. - dot118021XGrptxmickey[key_index]. - skey, &keyparms->key[16], 8); - memcpy(padapter->securitypriv. - dot118021XGrprxmickey[key_index]. - skey, &keyparms->key[24], 8); - padapter->securitypriv.binstallGrpkey = - 1; - DBG_8723A - (" ~~~~set sta key:groupkey\n"); - - padapter->securitypriv. - dot118021XGrpKeyid = key_index; - - rtw_set_key23a(padapter, - &padapter->securitypriv, - key_index, 1); - } - } - - pbcmc_sta = rtw_get_bcmc_stainfo23a(padapter); - if (pbcmc_sta) { - /* Jeff: don't disable ieee8021x_blocked - while clearing key */ - if (keyparms->cipher != IW_AUTH_CIPHER_NONE && - keyparms->cipher != 0) - pbcmc_sta->ieee8021x_blocked = false; - - if ((padapter->securitypriv.ndisencryptstatus == - Ndis802_11Encryption2Enabled) || - (padapter->securitypriv.ndisencryptstatus == - Ndis802_11Encryption3Enabled)) { - pbcmc_sta->dot118021XPrivacy = - padapter->securitypriv. - dot11PrivacyAlgrthm; - } - } - } - } - -exit: - - DBG_8723A("%s, ret =%d\n", __func__, ret); - - - - return ret; -} - -static int cfg80211_rtw_add_key(struct wiphy *wiphy, struct net_device *ndev, - u8 key_index, bool pairwise, - const u8 *mac_addr, struct key_params *params) -{ - int set_tx, ret = 0; - struct wireless_dev *rtw_wdev = wiphy_to_wdev(wiphy); - struct rtw_adapter *padapter = wiphy_to_adapter(wiphy); - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - u8 sta_addr[ETH_ALEN]; - - DBG_8723A("%s(%s): adding key for %pM\n", __func__, ndev->name, - mac_addr); - DBG_8723A("cipher = 0x%x\n", params->cipher); - DBG_8723A("key_len = 0x%x\n", params->key_len); - DBG_8723A("seq_len = 0x%x\n", params->seq_len); - DBG_8723A("key_index =%d\n", key_index); - DBG_8723A("pairwise =%d\n", pairwise); - - switch (params->cipher) { - case IW_AUTH_CIPHER_NONE: - case WLAN_CIPHER_SUITE_WEP40: - if (params->key_len != WLAN_KEY_LEN_WEP40) { - ret = -EINVAL; - goto exit; - } - case WLAN_CIPHER_SUITE_WEP104: - if (params->key_len != WLAN_KEY_LEN_WEP104) { - ret = -EINVAL; - goto exit; - } - case WLAN_CIPHER_SUITE_TKIP: - case WLAN_CIPHER_SUITE_CCMP: - break; - default: - ret = -ENOTSUPP; - goto exit; - } - - if (key_index >= WEP_KEYS || params->key_len < 0) { - ret = -EINVAL; - goto exit; - } - - eth_broadcast_addr(sta_addr); - - if (!mac_addr || is_broadcast_ether_addr(mac_addr)) - set_tx = 0; /* for wpa/wpa2 group key */ - else - set_tx = 1; /* for wpa/wpa2 pairwise key */ - - if (check_fwstate(pmlmepriv, WIFI_STATION_STATE)) { - ret = rtw_cfg80211_set_encryption(ndev, key_index, set_tx, - sta_addr, params); - } else if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) { -#ifdef CONFIG_8723AU_AP_MODE - if (mac_addr) - ether_addr_copy(sta_addr, mac_addr); - - ret = rtw_cfg80211_ap_set_encryption(ndev, key_index, set_tx, - sta_addr, params); -#endif - } else { - DBG_8723A("error! fw_state = 0x%x, iftype =%d\n", - pmlmepriv->fw_state, rtw_wdev->iftype); - - } - -exit: - return ret; -} - -static int -cfg80211_rtw_get_key(struct wiphy *wiphy, struct net_device *ndev, - u8 key_index, bool pairwise, const u8 *mac_addr, - void *cookie, - void (*callback) (void *cookie, struct key_params *)) -{ - DBG_8723A("%s(%s)\n", __func__, ndev->name); - return 0; -} - -static int cfg80211_rtw_del_key(struct wiphy *wiphy, struct net_device *ndev, - u8 key_index, bool pairwise, - const u8 *mac_addr) -{ - struct rtw_adapter *padapter = netdev_priv(ndev); - struct security_priv *psecuritypriv = &padapter->securitypriv; - - DBG_8723A("%s(%s): key_index =%d\n", __func__, ndev->name, key_index); - - if (key_index == psecuritypriv->dot11PrivacyKeyIndex) { - /* clear the flag of wep default key set. */ - psecuritypriv->bWepDefaultKeyIdxSet = 0; - } - - return 0; -} - -static int cfg80211_rtw_set_default_key(struct wiphy *wiphy, - struct net_device *ndev, u8 key_index, - bool unicast, bool multicast) -{ - struct rtw_adapter *padapter = netdev_priv(ndev); - struct security_priv *psecuritypriv = &padapter->securitypriv; - - DBG_8723A("%s(%s): key_index =%d, unicast =%d, multicast =%d.\n", - __func__, ndev->name, key_index, unicast, multicast); - - if (key_index < NUM_WEP_KEYS && - (psecuritypriv->dot11PrivacyAlgrthm == WLAN_CIPHER_SUITE_WEP40 || - psecuritypriv->dot11PrivacyAlgrthm == WLAN_CIPHER_SUITE_WEP104)) { - /* set wep default key */ - psecuritypriv->ndisencryptstatus = Ndis802_11Encryption1Enabled; - - psecuritypriv->dot11PrivacyKeyIndex = key_index; - - psecuritypriv->dot11PrivacyAlgrthm = WLAN_CIPHER_SUITE_WEP40; - psecuritypriv->dot118021XGrpPrivacy = WLAN_CIPHER_SUITE_WEP40; - if (psecuritypriv->wep_key[key_index].keylen == 13) { - psecuritypriv->dot11PrivacyAlgrthm = - WLAN_CIPHER_SUITE_WEP104; - psecuritypriv->dot118021XGrpPrivacy = - WLAN_CIPHER_SUITE_WEP104; - } - - /* set the flag to represent that wep default key - has been set */ - psecuritypriv->bWepDefaultKeyIdxSet = 1; - } - - return 0; -} - -static u16 rtw_get_cur_max_rate(struct rtw_adapter *adapter) -{ - int i = 0; - const u8 *p; - u16 rate = 0, max_rate = 0; - struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; - struct registry_priv *pregistrypriv = &adapter->registrypriv; - struct mlme_priv *pmlmepriv = &adapter->mlmepriv; - struct wlan_bssid_ex *pcur_bss = &pmlmepriv->cur_network.network; - struct ieee80211_ht_cap *pht_capie; - u8 rf_type = 0; - u8 bw_40MHz = 0, short_GI_20 = 0, short_GI_40 = 0; - u16 mcs_rate = 0; - - p = cfg80211_find_ie(WLAN_EID_HT_CAPABILITY, - pcur_bss->IEs, pcur_bss->IELength); - if (p && p[1] > 0) { - pht_capie = (struct ieee80211_ht_cap *)(p + 2); - - memcpy(&mcs_rate, &pht_capie->mcs, 2); - - /* bw_40MHz = (pht_capie->cap_info& - IEEE80211_HT_CAP_SUP_WIDTH_20_40) ? 1:0; */ - /* cur_bwmod is updated by beacon, pmlmeinfo is - updated by association response */ - bw_40MHz = (pmlmeext->cur_bwmode && - (pmlmeinfo->HT_info.ht_param & - IEEE80211_HT_PARAM_CHAN_WIDTH_ANY)) ? 1:0; - - /* short_GI = (pht_capie->cap_info & (IEEE80211_HT_CAP - _SGI_20|IEEE80211_HT_CAP_SGI_40)) ? 1 : 0; */ - short_GI_20 = (pmlmeinfo->ht_cap.cap_info & - cpu_to_le16(IEEE80211_HT_CAP_SGI_20)) ? 1:0; - short_GI_40 = (pmlmeinfo->ht_cap.cap_info & - cpu_to_le16(IEEE80211_HT_CAP_SGI_40)) ? 1:0; - - rf_type = rtl8723a_get_rf_type(adapter); - max_rate = rtw_mcs_rate23a(rf_type, bw_40MHz & - pregistrypriv->cbw40_enable, - short_GI_20, short_GI_40, - &pmlmeinfo->ht_cap.mcs); - } else { - while (pcur_bss->SupportedRates[i] != 0 && - pcur_bss->SupportedRates[i] != 0xFF) { - rate = pcur_bss->SupportedRates[i] & 0x7F; - if (rate > max_rate) - max_rate = rate; - i++; - } - - max_rate = max_rate * 10 / 2; - } - - return max_rate; -} - -static int cfg80211_rtw_get_station(struct wiphy *wiphy, - struct net_device *ndev, - const u8 *mac, struct station_info *sinfo) -{ - int ret = 0; - struct rtw_adapter *padapter = wiphy_to_adapter(wiphy); - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct sta_info *psta = NULL; - struct sta_priv *pstapriv = &padapter->stapriv; - - sinfo->filled = 0; - - if (!mac) { - DBG_8723A("%s(%s): mac ==%p\n", __func__, ndev->name, mac); - ret = -ENOENT; - goto exit; - } - - psta = rtw_get_stainfo23a(pstapriv, mac); - if (psta == NULL) { - DBG_8723A("%s, sta_info is null\n", __func__); - ret = -ENOENT; - goto exit; - } - DBG_8723A("%s(%s): mac=%pM\n", __func__, ndev->name, mac); - - /* for infra./P2PClient mode */ - if (check_fwstate(pmlmepriv, WIFI_STATION_STATE) && - check_fwstate(pmlmepriv, _FW_LINKED)) { - struct wlan_network *cur_network = &pmlmepriv->cur_network; - - if (!ether_addr_equal(mac, cur_network->network.MacAddress)) { - DBG_8723A("%s, mismatch bssid=%pM\n", - __func__, cur_network->network.MacAddress); - ret = -ENOENT; - goto exit; - } - - sinfo->filled |= BIT(NL80211_STA_INFO_SIGNAL); - sinfo->signal = translate_percentage_to_dbm(padapter->recvpriv. - signal_strength); - - sinfo->filled |= BIT(NL80211_STA_INFO_TX_BITRATE); - sinfo->txrate.legacy = rtw_get_cur_max_rate(padapter); - - sinfo->filled |= BIT(NL80211_STA_INFO_RX_PACKETS); - sinfo->rx_packets = sta_rx_data_pkts(psta); - - sinfo->filled |= BIT(NL80211_STA_INFO_TX_PACKETS); - sinfo->tx_packets = psta->sta_stats.tx_pkts; - } - - /* for Ad-Hoc/AP mode */ - if ((check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) || - check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) || - check_fwstate(pmlmepriv, WIFI_AP_STATE)) && - check_fwstate(pmlmepriv, _FW_LINKED) - ) { - /* TODO: should acquire station info... */ - } - -exit: - return ret; -} - -static int cfg80211_infrastructure_mode(struct rtw_adapter *padapter, - enum nl80211_iftype ifmode) -{ - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct wlan_network *cur_network = &pmlmepriv->cur_network; - enum nl80211_iftype old_mode; - - old_mode = cur_network->network.ifmode; - - RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_notice_, - "+%s: old =%d new =%d fw_state = 0x%08x\n", __func__, - old_mode, ifmode, get_fwstate(pmlmepriv)); - - if (old_mode != ifmode) { - spin_lock_bh(&pmlmepriv->lock); - - RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_info_, - "change mode!\n"); - - if (old_mode == NL80211_IFTYPE_AP || - old_mode == NL80211_IFTYPE_P2P_GO) { - /* change to other mode from Ndis802_11APMode */ - cur_network->join_res = -1; - -#ifdef CONFIG_8723AU_AP_MODE - stop_ap_mode23a(padapter); -#endif - } - - if (check_fwstate(pmlmepriv, _FW_LINKED) || - old_mode == NL80211_IFTYPE_ADHOC) - rtw_disassoc_cmd23a(padapter, 0, true); - - if (check_fwstate(pmlmepriv, _FW_LINKED) || - check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)) - rtw_free_assoc_resources23a(padapter, 1); - - if (old_mode == NL80211_IFTYPE_STATION || - old_mode == NL80211_IFTYPE_P2P_CLIENT || - old_mode == NL80211_IFTYPE_ADHOC) { - if (check_fwstate(pmlmepriv, _FW_LINKED)) { - /* will clr Linked_state; before this function, - we must have chked whether issue - dis-assoc_cmd or not */ - rtw_indicate_disconnect23a(padapter); - } - } - - cur_network->network.ifmode = ifmode; - - _clr_fwstate_(pmlmepriv, ~WIFI_NULL_STATE); - - switch (ifmode) { - case NL80211_IFTYPE_ADHOC: - set_fwstate(pmlmepriv, WIFI_ADHOC_STATE); - break; - - case NL80211_IFTYPE_P2P_CLIENT: - case NL80211_IFTYPE_STATION: - set_fwstate(pmlmepriv, WIFI_STATION_STATE); - break; - - case NL80211_IFTYPE_P2P_GO: - case NL80211_IFTYPE_AP: - set_fwstate(pmlmepriv, WIFI_AP_STATE); -#ifdef CONFIG_8723AU_AP_MODE - start_ap_mode23a(padapter); - /* rtw_indicate_connect23a(padapter); */ -#endif - break; - - default: - break; - } - - /* SecClearAllKeys(adapter); */ - - spin_unlock_bh(&pmlmepriv->lock); - } - - return _SUCCESS; -} - -static int cfg80211_rtw_change_iface(struct wiphy *wiphy, - struct net_device *ndev, - enum nl80211_iftype type, u32 *flags, - struct vif_params *params) -{ - enum nl80211_iftype old_type; - struct rtw_adapter *padapter = wiphy_to_adapter(wiphy); - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct wireless_dev *rtw_wdev = wiphy_to_wdev(wiphy); - int ret = 0; - - DBG_8723A("%s(%s): call netdev_open23a\n", __func__, ndev->name); - - old_type = rtw_wdev->iftype; - DBG_8723A("%s(%s): old_iftype =%d, new_iftype =%d\n", - __func__, ndev->name, old_type, type); - - if (old_type != type) { - pmlmeext->action_public_rxseq = 0xffff; - pmlmeext->action_public_dialog_token = 0xff; - } - - switch (type) { - case NL80211_IFTYPE_ADHOC: - case NL80211_IFTYPE_P2P_CLIENT: - case NL80211_IFTYPE_STATION: - case NL80211_IFTYPE_P2P_GO: - case NL80211_IFTYPE_AP: - case NL80211_IFTYPE_UNSPECIFIED: - break; - default: - return -EOPNOTSUPP; - } - - rtw_wdev->iftype = type; - - if (cfg80211_infrastructure_mode(padapter, type) != _SUCCESS) { - rtw_wdev->iftype = old_type; - ret = -EPERM; - goto exit; - } - - rtw_setopmode_cmd23a(padapter, type); - -exit: - return ret; -} - -void rtw_cfg80211_indicate_scan_done(struct rtw_wdev_priv *pwdev_priv, - bool aborted) -{ - spin_lock_bh(&pwdev_priv->scan_req_lock); - if (pwdev_priv->scan_request != NULL) { - DBG_8723A("%s with scan req\n", __func__); - - if (pwdev_priv->scan_request->wiphy != - pwdev_priv->rtw_wdev->wiphy) { - DBG_8723A("error wiphy compare\n"); - } else { - struct cfg80211_scan_info info = { - .aborted = aborted, - }; - - cfg80211_scan_done(pwdev_priv->scan_request, &info); - } - - pwdev_priv->scan_request = NULL; - } else { - DBG_8723A("%s without scan req\n", __func__); - } - spin_unlock_bh(&pwdev_priv->scan_req_lock); -} - -void rtw_cfg80211_surveydone_event_callback(struct rtw_adapter *padapter) -{ - struct list_head *phead; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct rtw_queue *queue = &pmlmepriv->scanned_queue; - struct wlan_network *pnetwork, *ptmp; - - spin_lock_bh(&pmlmepriv->scanned_queue.lock); - phead = get_list_head(queue); - list_for_each_entry_safe(pnetwork, ptmp, phead, list) { - /* report network only if the current channel set - contains the channel to which this network belongs */ - if (rtw_ch_set_search_ch23a - (padapter->mlmeextpriv.channel_set, - pnetwork->network.DSConfig) >= 0) - rtw_cfg80211_inform_bss(padapter, pnetwork); - } - spin_unlock_bh(&pmlmepriv->scanned_queue.lock); - - /* call this after other things have been done */ - rtw_cfg80211_indicate_scan_done(wdev_to_priv(padapter->rtw_wdev), - false); -} - -static int rtw_cfg80211_set_probe_req_wpsp2pie(struct rtw_adapter *padapter, - char *buf, int len) -{ - int ret = 0; - const u8 *wps_ie; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - - DBG_8723A("%s, ielen =%d\n", __func__, len); - - if (len > 0) { - wps_ie = cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT, - WLAN_OUI_TYPE_MICROSOFT_WPS, - buf, len); - if (wps_ie) { - DBG_8723A("probe_req_wps_ielen =%d\n", wps_ie[1]); - - if (pmlmepriv->wps_probe_req_ie) { - pmlmepriv->wps_probe_req_ie_len = 0; - kfree(pmlmepriv->wps_probe_req_ie); - pmlmepriv->wps_probe_req_ie = NULL; - } - - pmlmepriv->wps_probe_req_ie = kmemdup(wps_ie, wps_ie[1], - GFP_KERNEL); - if (pmlmepriv->wps_probe_req_ie == NULL) { - DBG_8723A("%s()-%d: kmalloc() ERROR!\n", - __func__, __LINE__); - return -EINVAL; - } - pmlmepriv->wps_probe_req_ie_len = wps_ie[1]; - } - } - - return ret; -} - -static int cfg80211_rtw_scan(struct wiphy *wiphy, - struct cfg80211_scan_request *request) -{ - int i; - u8 _status = false; - int ret = 0; - struct rtw_adapter *padapter = wiphy_to_adapter(wiphy); - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct cfg80211_ssid ssid[RTW_SSID_SCAN_AMOUNT]; - struct rtw_ieee80211_channel ch[RTW_CHANNEL_SCAN_AMOUNT]; - struct rtw_wdev_priv *pwdev_priv = wdev_to_priv(padapter->rtw_wdev); - struct cfg80211_ssid *ssids = request->ssids; - bool need_indicate_scan_done = false; - - DBG_8723A("%s(%s)\n", __func__, padapter->pnetdev->name); - - spin_lock_bh(&pwdev_priv->scan_req_lock); - pwdev_priv->scan_request = request; - spin_unlock_bh(&pwdev_priv->scan_req_lock); - - if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) { - DBG_8723A("%s under WIFI_AP_STATE\n", __func__); - /* need_indicate_scan_done = true; */ - /* goto check_need_indicate_scan_done; */ - } - - if (rtw_pwr_wakeup(padapter) == _FAIL) { - need_indicate_scan_done = true; - goto check_need_indicate_scan_done; - } - - if (request->ie && request->ie_len > 0) { - rtw_cfg80211_set_probe_req_wpsp2pie(padapter, - (u8 *) request->ie, - request->ie_len); - } - - if (pmlmepriv->LinkDetectInfo.bBusyTraffic == true) { - DBG_8723A("%s, bBusyTraffic == true\n", __func__); - need_indicate_scan_done = true; - goto check_need_indicate_scan_done; - } - if (rtw_is_scan_deny(padapter)) { - DBG_8723A("%s(%s): scan deny\n", __func__, - padapter->pnetdev->name); - need_indicate_scan_done = true; - goto check_need_indicate_scan_done; - } - - if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY | _FW_UNDER_LINKING) == - true) { - DBG_8723A("%s, fwstate = 0x%x\n", __func__, pmlmepriv->fw_state); - need_indicate_scan_done = true; - goto check_need_indicate_scan_done; - } - - memset(ssid, 0, sizeof(struct cfg80211_ssid) * RTW_SSID_SCAN_AMOUNT); - /* parsing request ssids, n_ssids */ - for (i = 0; i < request->n_ssids && i < RTW_SSID_SCAN_AMOUNT; i++) { - DBG_8723A("ssid =%s, len =%d\n", ssids[i].ssid, - ssids[i].ssid_len); - memcpy(ssid[i].ssid, ssids[i].ssid, ssids[i].ssid_len); - ssid[i].ssid_len = ssids[i].ssid_len; - } - - /* parsing channels, n_channels */ - memset(ch, 0, - sizeof(struct rtw_ieee80211_channel) * RTW_CHANNEL_SCAN_AMOUNT); - - if (request->n_channels == 1) { - for (i = 0; i < request->n_channels && - i < RTW_CHANNEL_SCAN_AMOUNT; i++) { - DBG_8723A("%s:(%s):" CHAN_FMT "\n", - __func__, padapter->pnetdev->name, - CHAN_ARG(request->channels[i])); - ch[i].hw_value = request->channels[i]->hw_value; - ch[i].flags = request->channels[i]->flags; - } - } - - spin_lock_bh(&pmlmepriv->lock); - if (request->n_channels == 1) { - memcpy(&ch[1], &ch[0], sizeof(struct rtw_ieee80211_channel)); - memcpy(&ch[2], &ch[0], sizeof(struct rtw_ieee80211_channel)); - _status = rtw_sitesurvey_cmd23a(padapter, ssid, - RTW_SSID_SCAN_AMOUNT, ch, 3); - } else { - _status = rtw_sitesurvey_cmd23a(padapter, ssid, - RTW_SSID_SCAN_AMOUNT, NULL, 0); - } - spin_unlock_bh(&pmlmepriv->lock); - - if (_status == false) - ret = -1; - -check_need_indicate_scan_done: - if (need_indicate_scan_done) - rtw_cfg80211_surveydone_event_callback(padapter); - return ret; -} - -static int cfg80211_rtw_set_wiphy_params(struct wiphy *wiphy, u32 changed) -{ - DBG_8723A("%s\n", __func__); - return 0; -} - -static int cfg80211_rtw_join_ibss(struct wiphy *wiphy, struct net_device *ndev, - struct cfg80211_ibss_params *params) -{ - DBG_8723A("%s(%s)\n", __func__, ndev->name); - return 0; -} - -static int cfg80211_rtw_leave_ibss(struct wiphy *wiphy, struct net_device *ndev) -{ - DBG_8723A("%s(%s)\n", __func__, ndev->name); - return 0; -} - -static int rtw_cfg80211_set_wpa_version(struct security_priv *psecuritypriv, - u32 wpa_version) -{ - DBG_8723A("%s, wpa_version =%d\n", __func__, wpa_version); - - if (!wpa_version) { - psecuritypriv->ndisauthtype = Ndis802_11AuthModeOpen; - return 0; - } - - if (wpa_version & (NL80211_WPA_VERSION_1 | NL80211_WPA_VERSION_2)) - psecuritypriv->ndisauthtype = Ndis802_11AuthModeWPAPSK; - -/* - if (wpa_version & NL80211_WPA_VERSION_2) - { - psecuritypriv->ndisauthtype = Ndis802_11AuthModeWPA2PSK; - } -*/ - - return 0; -} - -static int rtw_cfg80211_set_auth_type(struct security_priv *psecuritypriv, - enum nl80211_auth_type sme_auth_type) -{ - DBG_8723A("%s, nl80211_auth_type =%d\n", __func__, sme_auth_type); - - switch (sme_auth_type) { - case NL80211_AUTHTYPE_AUTOMATIC: - psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_Auto; - - break; - case NL80211_AUTHTYPE_OPEN_SYSTEM: - psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_Open; - - if (psecuritypriv->ndisauthtype > Ndis802_11AuthModeWPA) - psecuritypriv->dot11AuthAlgrthm = - dot11AuthAlgrthm_8021X; - break; - case NL80211_AUTHTYPE_SHARED_KEY: - psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_Shared; - - psecuritypriv->ndisencryptstatus = Ndis802_11Encryption1Enabled; - break; - default: - psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_Open; - /* return -ENOTSUPP; */ - } - - return 0; -} - -static int rtw_cfg80211_set_cipher(struct security_priv *psecuritypriv, - u32 cipher, bool ucast) -{ - u32 ndisencryptstatus = Ndis802_11EncryptionDisabled; - - u32 *profile_cipher = ucast ? &psecuritypriv->dot11PrivacyAlgrthm : - &psecuritypriv->dot118021XGrpPrivacy; - - DBG_8723A("%s, ucast =%d, cipher = 0x%x\n", __func__, ucast, cipher); - - if (!cipher) { - *profile_cipher = 0; - psecuritypriv->ndisencryptstatus = ndisencryptstatus; - return 0; - } - - switch (cipher) { - case IW_AUTH_CIPHER_NONE: - *profile_cipher = 0; - ndisencryptstatus = Ndis802_11EncryptionDisabled; - break; - case WLAN_CIPHER_SUITE_WEP40: - *profile_cipher = WLAN_CIPHER_SUITE_WEP40; - ndisencryptstatus = Ndis802_11Encryption1Enabled; - break; - case WLAN_CIPHER_SUITE_WEP104: - *profile_cipher = WLAN_CIPHER_SUITE_WEP104; - ndisencryptstatus = Ndis802_11Encryption1Enabled; - break; - case WLAN_CIPHER_SUITE_TKIP: - *profile_cipher = WLAN_CIPHER_SUITE_TKIP; - ndisencryptstatus = Ndis802_11Encryption2Enabled; - break; - case WLAN_CIPHER_SUITE_CCMP: - *profile_cipher = WLAN_CIPHER_SUITE_CCMP; - ndisencryptstatus = Ndis802_11Encryption3Enabled; - break; - default: - DBG_8723A("Unsupported cipher: 0x%x\n", cipher); - return -ENOTSUPP; - } - - if (ucast) - psecuritypriv->ndisencryptstatus = ndisencryptstatus; - - return 0; -} - -static int rtw_cfg80211_set_key_mgt(struct security_priv *psecuritypriv, - u32 key_mgt) -{ - DBG_8723A("%s, key_mgt = 0x%x\n", __func__, key_mgt); - - if (key_mgt == WLAN_AKM_SUITE_8021X) - psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_8021X; - else if (key_mgt == WLAN_AKM_SUITE_PSK) - psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_8021X; - else - DBG_8723A("Invalid key mgt: 0x%x\n", key_mgt); - - return 0; -} - -static int rtw_cfg80211_set_wpa_ie(struct rtw_adapter *padapter, const u8 *pie, - size_t ielen) -{ - const u8 *wps_ie; - int group_cipher = 0, pairwise_cipher = 0; - int ret = 0; - const u8 *pwpa, *pwpa2; - int i; - - if (!pie || !ielen) { - /* Treat this as normal case, but need to clear - WIFI_UNDER_WPS */ - _clr_fwstate_(&padapter->mlmepriv, WIFI_UNDER_WPS); - goto exit; - } - if (ielen > MAX_WPA_IE_LEN + MAX_WPS_IE_LEN + MAX_P2P_IE_LEN) { - ret = -EINVAL; - goto exit; - } - - /* dump */ - DBG_8723A("set wpa_ie(length:%zu):\n", ielen); - for (i = 0; i < ielen; i = i + 8) - DBG_8723A("0x%.2x 0x%.2x 0x%.2x 0x%.2x " - "0x%.2x 0x%.2x 0x%.2x 0x%.2x\n", - pie[i], pie[i + 1], pie[i + 2], pie[i + 3], - pie[i + 4], pie[i + 5], pie[i + 6], pie[i + 7]); - if (ielen < RSN_HEADER_LEN) { - RT_TRACE(_module_rtl871x_ioctl_os_c, _drv_err_, - "Ie len too short %d\n", (int)ielen); - ret = -1; - goto exit; - } - - pwpa = cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT, - WLAN_OUI_TYPE_MICROSOFT_WPA, - pie, ielen); - if (pwpa && pwpa[1] > 0) { - if (rtw_parse_wpa_ie23a(pwpa, pwpa[1] + 2, &group_cipher, - &pairwise_cipher, NULL) == _SUCCESS) { - padapter->securitypriv.dot11AuthAlgrthm = - dot11AuthAlgrthm_8021X; - padapter->securitypriv.ndisauthtype = - Ndis802_11AuthModeWPAPSK; - memcpy(padapter->securitypriv.supplicant_ie, pwpa, - pwpa[1] + 2); - - DBG_8723A("got wpa_ie, wpa_ielen:%u\n", pwpa[1]); - } - } - - pwpa2 = cfg80211_find_ie(WLAN_EID_RSN, pie, ielen); - if (pwpa2 && pwpa2[1] > 0) { - if (rtw_parse_wpa2_ie23a (pwpa2, pwpa2[1] + 2, &group_cipher, - &pairwise_cipher, NULL) == _SUCCESS) { - padapter->securitypriv.dot11AuthAlgrthm = - dot11AuthAlgrthm_8021X; - padapter->securitypriv.ndisauthtype = - Ndis802_11AuthModeWPA2PSK; - memcpy(padapter->securitypriv.supplicant_ie, pwpa2, - pwpa2[1] + 2); - - DBG_8723A("got wpa2_ie, wpa2_ielen:%u\n", pwpa2[1]); - } - } - - if (group_cipher == 0) { - group_cipher = WPA_CIPHER_NONE; - } - if (pairwise_cipher == 0) { - pairwise_cipher = WPA_CIPHER_NONE; - } - - switch (group_cipher) { - case WPA_CIPHER_NONE: - padapter->securitypriv.dot118021XGrpPrivacy = 0; - padapter->securitypriv.ndisencryptstatus = - Ndis802_11EncryptionDisabled; - break; - case WPA_CIPHER_WEP40: - padapter->securitypriv.dot118021XGrpPrivacy = WLAN_CIPHER_SUITE_WEP40; - padapter->securitypriv.ndisencryptstatus = - Ndis802_11Encryption1Enabled; - break; - case WPA_CIPHER_TKIP: - padapter->securitypriv.dot118021XGrpPrivacy = WLAN_CIPHER_SUITE_TKIP; - padapter->securitypriv.ndisencryptstatus = - Ndis802_11Encryption2Enabled; - break; - case WPA_CIPHER_CCMP: - padapter->securitypriv.dot118021XGrpPrivacy = WLAN_CIPHER_SUITE_CCMP; - padapter->securitypriv.ndisencryptstatus = - Ndis802_11Encryption3Enabled; - break; - case WPA_CIPHER_WEP104: - padapter->securitypriv.dot118021XGrpPrivacy = WLAN_CIPHER_SUITE_WEP104; - padapter->securitypriv.ndisencryptstatus = - Ndis802_11Encryption1Enabled; - break; - } - - switch (pairwise_cipher) { - case WPA_CIPHER_NONE: - padapter->securitypriv.dot11PrivacyAlgrthm = 0; - padapter->securitypriv.ndisencryptstatus = - Ndis802_11EncryptionDisabled; - break; - case WPA_CIPHER_WEP40: - padapter->securitypriv.dot11PrivacyAlgrthm = WLAN_CIPHER_SUITE_WEP40; - padapter->securitypriv.ndisencryptstatus = - Ndis802_11Encryption1Enabled; - break; - case WPA_CIPHER_TKIP: - padapter->securitypriv.dot11PrivacyAlgrthm = WLAN_CIPHER_SUITE_TKIP; - padapter->securitypriv.ndisencryptstatus = - Ndis802_11Encryption2Enabled; - break; - case WPA_CIPHER_CCMP: - padapter->securitypriv.dot11PrivacyAlgrthm = WLAN_CIPHER_SUITE_CCMP; - padapter->securitypriv.ndisencryptstatus = - Ndis802_11Encryption3Enabled; - break; - case WPA_CIPHER_WEP104: - padapter->securitypriv.dot11PrivacyAlgrthm = WLAN_CIPHER_SUITE_WEP104; - padapter->securitypriv.ndisencryptstatus = - Ndis802_11Encryption1Enabled; - break; - } - - wps_ie = cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT, - WLAN_OUI_TYPE_MICROSOFT_WPS, - pie, ielen); - if (wps_ie && wps_ie[1] > 0) { - DBG_8723A("got wps_ie, wps_ielen:%u\n", wps_ie[1]); - padapter->securitypriv.wps_ie_len = wps_ie[1]; - memcpy(padapter->securitypriv.wps_ie, wps_ie, - padapter->securitypriv.wps_ie_len); - set_fwstate(&padapter->mlmepriv, WIFI_UNDER_WPS); - } else { - _clr_fwstate_(&padapter->mlmepriv, WIFI_UNDER_WPS); - } - - /* TKIP and AES disallow multicast packets until installing group key */ - if (padapter->securitypriv.dot11PrivacyAlgrthm == - WLAN_CIPHER_SUITE_TKIP || - padapter->securitypriv.dot11PrivacyAlgrthm == - WLAN_CIPHER_SUITE_CCMP) - /* WPS open need to enable multicast */ - /* check_fwstate(&padapter->mlmepriv, WIFI_UNDER_WPS) == true)*/ - rtl8723a_off_rcr_am(padapter); - - RT_TRACE(_module_rtl871x_ioctl_os_c, _drv_info_, - "rtw_set_wpa_ie: pairwise_cipher = 0x%08x padapter->securitypriv.ndisencryptstatus =%d padapter->securitypriv.ndisauthtype =%d\n", - pairwise_cipher, - padapter->securitypriv.ndisencryptstatus, - padapter->securitypriv.ndisauthtype); - -exit: - if (ret) - _clr_fwstate_(&padapter->mlmepriv, WIFI_UNDER_WPS); - return ret; -} - -static int rtw_cfg80211_add_wep(struct rtw_adapter *padapter, - struct rtw_wep_key *wep, u8 keyid) -{ - int res; - struct security_priv *psecuritypriv = &padapter->securitypriv; - - if (keyid >= NUM_WEP_KEYS) { - RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, - "%s:keyid>4 =>fail\n", __func__); - res = _FAIL; - goto exit; - } - - switch (wep->keylen) { - case WLAN_KEY_LEN_WEP40: - psecuritypriv->dot11PrivacyAlgrthm = WLAN_CIPHER_SUITE_WEP40; - RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_info_, - "%s:wep->KeyLength = 5\n", __func__); - break; - case WLAN_KEY_LEN_WEP104: - psecuritypriv->dot11PrivacyAlgrthm = WLAN_CIPHER_SUITE_WEP104; - RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_info_, - "%s:wep->KeyLength = 13\n", __func__); - break; - default: - psecuritypriv->dot11PrivacyAlgrthm = 0; - RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_info_, - "%s:wep->KeyLength!= 5 or 13\n", __func__); - res = _FAIL; - goto exit; - } - - RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_info_, - "%s:before memcpy, wep->KeyLength = 0x%x keyid =%x\n", - __func__, wep->keylen, keyid); - - memcpy(&psecuritypriv->wep_key[keyid], wep, sizeof(struct rtw_wep_key)); - - psecuritypriv->dot11PrivacyKeyIndex = keyid; - - RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_info_, - "%s:security key material : %x %x %x %x %x %x %x %x %x %x %x %x %x\n", - __func__, - psecuritypriv->wep_key[keyid].key[0], - psecuritypriv->wep_key[keyid].key[1], - psecuritypriv->wep_key[keyid].key[2], - psecuritypriv->wep_key[keyid].key[3], - psecuritypriv->wep_key[keyid].key[4], - psecuritypriv->wep_key[keyid].key[5], - psecuritypriv->wep_key[keyid].key[6], - psecuritypriv->wep_key[keyid].key[7], - psecuritypriv->wep_key[keyid].key[8], - psecuritypriv->wep_key[keyid].key[9], - psecuritypriv->wep_key[keyid].key[10], - psecuritypriv->wep_key[keyid].key[11], - psecuritypriv->wep_key[keyid].key[12]); - - res = rtw_set_key23a(padapter, psecuritypriv, keyid, 1); - -exit: - - return res; -} - -static int rtw_set_ssid(struct rtw_adapter *padapter, - struct wlan_network *newnetwork) -{ - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct wlan_network *pnetwork = &pmlmepriv->cur_network; - int status = _SUCCESS; - u32 cur_time = 0; - - DBG_8723A_LEVEL(_drv_always_, "set ssid [%s] fw_state = 0x%08x\n", - newnetwork->network.Ssid.ssid, get_fwstate(pmlmepriv)); - - if (padapter->hw_init_completed == false) { - RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, - "set_ssid: hw_init_completed == false =>exit!!!\n"); - status = _FAIL; - goto exit; - } - - spin_lock_bh(&pmlmepriv->lock); - - DBG_8723A("Set SSID under fw_state = 0x%08x\n", get_fwstate(pmlmepriv)); - if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY)) - goto handle_tkip_countermeasure; - - if (check_fwstate(pmlmepriv, _FW_LINKED|WIFI_ADHOC_MASTER_STATE)) { - RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_info_, - "set_ssid: _FW_LINKED||WIFI_ADHOC_MASTER_STATE\n"); - - if (pmlmepriv->assoc_ssid.ssid_len == - newnetwork->network.Ssid.ssid_len && - !memcmp(&pmlmepriv->assoc_ssid.ssid, - newnetwork->network.Ssid.ssid, - newnetwork->network.Ssid.ssid_len)) { - if (!check_fwstate(pmlmepriv, WIFI_STATION_STATE)) { - RT_TRACE(_module_rtl871x_ioctl_set_c_, - _drv_err_, - "New SSID is same SSID, fw_state = 0x%08x\n", - get_fwstate(pmlmepriv)); - - if (rtw_is_same_ibss23a(padapter, pnetwork)) { - /* - * it means driver is in - * WIFI_ADHOC_MASTER_STATE, we needn't - * create bss again. - */ - goto release_mlme_lock; - } - - /* - * if in WIFI_ADHOC_MASTER_STATE | - * WIFI_ADHOC_STATE, create bss or - * rejoin again - */ - rtw_disassoc_cmd23a(padapter, 0, true); - - if (check_fwstate(pmlmepriv, _FW_LINKED)) - rtw_indicate_disconnect23a(padapter); - - rtw_free_assoc_resources23a(padapter, 1); - - if (check_fwstate(pmlmepriv, - WIFI_ADHOC_MASTER_STATE)) { - _clr_fwstate_(pmlmepriv, - WIFI_ADHOC_MASTER_STATE); - set_fwstate(pmlmepriv, - WIFI_ADHOC_STATE); - } - } else { - rtw_lps_ctrl_wk_cmd23a(padapter, - LPS_CTRL_JOINBSS, 1); - } - } else { - RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_info_, - "Set SSID not the same ssid\n"); - RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_info_, - "set_ssid =[%s] len = 0x%x\n", - newnetwork->network.Ssid.ssid, - newnetwork->network.Ssid.ssid_len); - RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_info_, - "assoc_ssid =[%s] len = 0x%x\n", - pmlmepriv->assoc_ssid.ssid, - pmlmepriv->assoc_ssid.ssid_len); - - rtw_disassoc_cmd23a(padapter, 0, true); - - if (check_fwstate(pmlmepriv, _FW_LINKED)) - rtw_indicate_disconnect23a(padapter); - - rtw_free_assoc_resources23a(padapter, 1); - - if (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)) { - _clr_fwstate_(pmlmepriv, WIFI_ADHOC_MASTER_STATE); - set_fwstate(pmlmepriv, WIFI_ADHOC_STATE); - } - } - } - -handle_tkip_countermeasure: - - if (padapter->securitypriv.btkip_countermeasure == true) { - cur_time = jiffies; - - if ((cur_time - - padapter->securitypriv.btkip_countermeasure_time) > - 60 * HZ) { - padapter->securitypriv.btkip_countermeasure = false; - padapter->securitypriv.btkip_countermeasure_time = 0; - } else { - status = _FAIL; - goto release_mlme_lock; - } - } - - memcpy(&pmlmepriv->assoc_ssid, &newnetwork->network.Ssid, - sizeof(struct cfg80211_ssid)); - - pmlmepriv->assoc_by_bssid = false; - - pmlmepriv->to_join = true; - - if (!check_fwstate(pmlmepriv, _FW_UNDER_SURVEY)) { - pmlmepriv->cur_network.join_res = -2; - - status = rtw_do_join_network(padapter, newnetwork); - if (status == _SUCCESS) { - pmlmepriv->to_join = false; - } else { - if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE)) { - /* switch to ADHOC_MASTER */ - status = rtw_do_join_adhoc(padapter); - if (status != _SUCCESS) - goto release_mlme_lock; - } else { - /* can't associate ; reset under-linking */ - _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING); - status = _FAIL; - pmlmepriv->to_join = false; - } - } - } -release_mlme_lock: - spin_unlock_bh(&pmlmepriv->lock); - -exit: - RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, - "-%s: status =%d\n", __func__, status); - - return status; -} - -static int cfg80211_rtw_connect(struct wiphy *wiphy, struct net_device *ndev, - struct cfg80211_connect_params *sme) -{ - int ret = 0; - struct list_head *phead, *plist, *ptmp; - struct wlan_network *pnetwork = NULL; - /* u8 matched_by_bssid = false; */ - /* u8 matched_by_ssid = false; */ - u8 matched = false; - struct rtw_adapter *padapter = wiphy_to_adapter(wiphy); - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct security_priv *psecuritypriv = &padapter->securitypriv; - struct rtw_queue *queue = &pmlmepriv->scanned_queue; - - DBG_8723A("=>" "%s(%s)\n", __func__, ndev->name); - DBG_8723A("privacy =%d, key =%p, key_len =%d, key_idx =%d\n", - sme->privacy, sme->key, sme->key_len, sme->key_idx); - - if (_FAIL == rtw_pwr_wakeup(padapter)) { - ret = -EPERM; - goto exit; - } - - if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) { - ret = -EPERM; - goto exit; - } - - if (!sme->ssid || !sme->ssid_len || - sme->ssid_len > IEEE80211_MAX_SSID_LEN) { - ret = -EINVAL; - goto exit; - } - - DBG_8723A("ssid =%s, len =%zu\n", sme->ssid, sme->ssid_len); - - if (sme->bssid) - DBG_8723A("bssid=%pM\n", sme->bssid); - - if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING)) { - ret = -EBUSY; - DBG_8723A("%s, fw_state = 0x%x, goto exit\n", __func__, - pmlmepriv->fw_state); - goto exit; - } - if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY)) { - rtw_scan_abort23a(padapter); - } - - spin_lock_bh(&queue->lock); - - phead = get_list_head(queue); - - list_for_each_safe(plist, ptmp, phead) { - pnetwork = container_of(plist, struct wlan_network, list); - - if (sme->bssid) { - if (!ether_addr_equal(pnetwork->network.MacAddress, - sme->bssid)) - continue; - } - - if (sme->ssid && sme->ssid_len) { - if (pnetwork->network.Ssid.ssid_len != sme->ssid_len || - memcmp(pnetwork->network.Ssid.ssid, sme->ssid, - sme->ssid_len)) - continue; - } - - if (sme->bssid) { - if (ether_addr_equal(pnetwork->network.MacAddress, - sme->bssid)) { - DBG_8723A("matched by bssid\n"); - - matched = true; - break; - } - } else if (sme->ssid && sme->ssid_len) { - if (!memcmp(pnetwork->network.Ssid.ssid, - sme->ssid, sme->ssid_len) && - pnetwork->network.Ssid.ssid_len == sme->ssid_len) { - DBG_8723A("matched by ssid\n"); - - matched = true; - break; - } - } - } - - spin_unlock_bh(&queue->lock); - - if (!matched || !pnetwork) { - ret = -ENOENT; - DBG_8723A("connect, matched == false, goto exit\n"); - goto exit; - } - - if (cfg80211_infrastructure_mode( - padapter, pnetwork->network.ifmode) != _SUCCESS) { - ret = -EPERM; - goto exit; - } - - psecuritypriv->ndisencryptstatus = Ndis802_11EncryptionDisabled; - psecuritypriv->dot11PrivacyAlgrthm = 0; - psecuritypriv->dot118021XGrpPrivacy = 0; - psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_Open; - psecuritypriv->ndisauthtype = Ndis802_11AuthModeOpen; - - ret = rtw_cfg80211_set_wpa_version(psecuritypriv, - sme->crypto.wpa_versions); - if (ret < 0) - goto exit; - - ret = rtw_cfg80211_set_auth_type(psecuritypriv, sme->auth_type); - - if (ret < 0) - goto exit; - - DBG_8723A("%s, ie_len =%zu\n", __func__, sme->ie_len); - - ret = rtw_cfg80211_set_wpa_ie(padapter, sme->ie, sme->ie_len); - if (ret < 0) - goto exit; - - if (sme->crypto.n_ciphers_pairwise) { - ret = rtw_cfg80211_set_cipher(psecuritypriv, - sme->crypto.ciphers_pairwise[0], - true); - if (ret < 0) - goto exit; - } - - /* For WEP Shared auth */ - if ((psecuritypriv->dot11AuthAlgrthm == dot11AuthAlgrthm_Shared || - psecuritypriv->dot11AuthAlgrthm == dot11AuthAlgrthm_Auto) && - sme->key) { - struct rtw_wep_key wep_key; - u8 wep_key_idx, wep_key_len; - DBG_8723A("%s(): Shared/Auto WEP\n", __func__); - - wep_key_idx = sme->key_idx; - wep_key_len = sme->key_len; - - if (wep_key_idx > WEP_KEYS || !wep_key_len || - wep_key_len > WLAN_KEY_LEN_WEP104) { - ret = -EINVAL; - goto exit; - } - - wep_key_len = wep_key_len <= 5 ? 5 : 13; - - memset(&wep_key, 0, sizeof(struct rtw_wep_key)); - - wep_key.keylen = wep_key_len; - - if (wep_key_len == 13) { - padapter->securitypriv.dot11PrivacyAlgrthm = - WLAN_CIPHER_SUITE_WEP104; - padapter->securitypriv.dot118021XGrpPrivacy = - WLAN_CIPHER_SUITE_WEP104; - } else { - padapter->securitypriv.dot11PrivacyAlgrthm = - WLAN_CIPHER_SUITE_WEP40; - padapter->securitypriv.dot118021XGrpPrivacy = - WLAN_CIPHER_SUITE_WEP40; - } - - memcpy(wep_key.key, (void *)sme->key, wep_key.keylen); - - if (rtw_cfg80211_add_wep(padapter, &wep_key, wep_key_idx) != - _SUCCESS) - ret = -EOPNOTSUPP; - - if (ret < 0) - goto exit; - } - - ret = rtw_cfg80211_set_cipher(psecuritypriv, - sme->crypto.cipher_group, false); - if (ret < 0) - goto exit; - - if (sme->crypto.n_akm_suites) { - ret = rtw_cfg80211_set_key_mgt(psecuritypriv, - sme->crypto.akm_suites[0]); - if (ret < 0) - goto exit; - } - - if (psecuritypriv->ndisauthtype > 3) - psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_8021X; - - if (rtw_set_auth23a(padapter, psecuritypriv) != _SUCCESS) { - ret = -EBUSY; - goto exit; - } - - /* rtw_set_802_11_encryption_mode(padapter, - padapter->securitypriv.ndisencryptstatus); */ - - if (rtw_set_ssid(padapter, pnetwork) != _SUCCESS) { - ret = -EBUSY; - goto exit; - } - - DBG_8723A("set ssid:dot11AuthAlgrthm =%d, dot11PrivacyAlgrthm =%d, " - "dot118021XGrpPrivacy =%d\n", psecuritypriv->dot11AuthAlgrthm, - psecuritypriv->dot11PrivacyAlgrthm, - psecuritypriv->dot118021XGrpPrivacy); - -exit: - - DBG_8723A("<=%s, ret %d\n", __func__, ret); - - return ret; -} - -static int cfg80211_rtw_disconnect(struct wiphy *wiphy, struct net_device *ndev, - u16 reason_code) -{ - struct rtw_adapter *padapter = wiphy_to_adapter(wiphy); - - DBG_8723A("%s(%s)\n", __func__, ndev->name); - - rtw_set_roaming(padapter, 0); - - if (check_fwstate(&padapter->mlmepriv, _FW_LINKED)) { - rtw_scan_abort23a(padapter); - LeaveAllPowerSaveMode23a(padapter); - rtw_disassoc_cmd23a(padapter, 500, false); - - DBG_8723A("%s...call rtw_indicate_disconnect23a\n", __func__); - - padapter->mlmepriv.not_indic_disco = true; - rtw_indicate_disconnect23a(padapter); - padapter->mlmepriv.not_indic_disco = false; - - rtw_free_assoc_resources23a(padapter, 1); - } - - return 0; -} - -static int cfg80211_rtw_set_txpower(struct wiphy *wiphy, - struct wireless_dev *wdev, - enum nl80211_tx_power_setting type, int mbm) -{ - DBG_8723A("%s\n", __func__); - return 0; -} - -static int cfg80211_rtw_get_txpower(struct wiphy *wiphy, - struct wireless_dev *wdev, int *dbm) -{ - DBG_8723A("%s\n", __func__); - *dbm = 12; - return 0; -} - -inline bool rtw_cfg80211_pwr_mgmt(struct rtw_adapter *adapter) -{ - struct rtw_wdev_priv *rtw_wdev_priv = wdev_to_priv(adapter->rtw_wdev); - return rtw_wdev_priv->power_mgmt; -} - -static int cfg80211_rtw_set_power_mgmt(struct wiphy *wiphy, - struct net_device *ndev, - bool enabled, int timeout) -{ - struct rtw_adapter *padapter = wiphy_to_adapter(wiphy); - struct rtw_wdev_priv *rtw_wdev_priv = wdev_to_priv(padapter->rtw_wdev); - - DBG_8723A("%s(%s): enabled:%u, timeout:%d\n", - __func__, ndev->name, enabled, timeout); - - rtw_wdev_priv->power_mgmt = enabled; - - if (!enabled) - LPS_Leave23a(padapter); - - return 0; -} - -static int cfg80211_rtw_set_pmksa(struct wiphy *wiphy, - struct net_device *netdev, - struct cfg80211_pmksa *pmksa) -{ - u8 index, blInserted = false; - struct rtw_adapter *padapter = wiphy_to_adapter(wiphy); - struct security_priv *psecuritypriv = &padapter->securitypriv; - - DBG_8723A("%s(%s)\n", __func__, netdev->name); - - if (is_zero_ether_addr(pmksa->bssid)) - return -EINVAL; - - blInserted = false; - - /* overwrite PMKID */ - for (index = 0; index < NUM_PMKID_CACHE; index++) { - if (ether_addr_equal(psecuritypriv->PMKIDList[index].Bssid, - pmksa->bssid)) { - /* BSSID is matched, the same AP => rewrite with - new PMKID. */ - DBG_8723A("%s(%s): BSSID exists in the PMKList.\n", - __func__, netdev->name); - - memcpy(psecuritypriv->PMKIDList[index].PMKID, - pmksa->pmkid, WLAN_PMKID_LEN); - psecuritypriv->PMKIDList[index].bUsed = true; - psecuritypriv->PMKIDIndex = index + 1; - blInserted = true; - break; - } - } - - if (!blInserted) { - /* Find a new entry */ - DBG_8723A("%s(%s): Use new entry index = %d for this PMKID\n", - __func__, netdev->name, psecuritypriv->PMKIDIndex); - - ether_addr_copy( - psecuritypriv->PMKIDList[psecuritypriv->PMKIDIndex]. - Bssid, pmksa->bssid); - memcpy(psecuritypriv->PMKIDList[psecuritypriv->PMKIDIndex]. - PMKID, pmksa->pmkid, WLAN_PMKID_LEN); - - psecuritypriv->PMKIDList[psecuritypriv->PMKIDIndex].bUsed = - true; - psecuritypriv->PMKIDIndex++; - if (psecuritypriv->PMKIDIndex == 16) { - psecuritypriv->PMKIDIndex = 0; - } - } - - return 0; -} - -static int cfg80211_rtw_del_pmksa(struct wiphy *wiphy, - struct net_device *netdev, - struct cfg80211_pmksa *pmksa) -{ - u8 index, bMatched = false; - struct rtw_adapter *padapter = wiphy_to_adapter(wiphy); - struct security_priv *psecuritypriv = &padapter->securitypriv; - - DBG_8723A("%s(%s)\n", __func__, netdev->name); - - for (index = 0; index < NUM_PMKID_CACHE; index++) { - if (ether_addr_equal(psecuritypriv->PMKIDList[index].Bssid, - pmksa->bssid)) { - /* BSSID is matched, the same AP => Remove this PMKID - information and reset it. */ - eth_zero_addr(psecuritypriv->PMKIDList[index].Bssid); - memset(psecuritypriv->PMKIDList[index].PMKID, 0x00, - WLAN_PMKID_LEN); - psecuritypriv->PMKIDList[index].bUsed = false; - bMatched = true; - break; - } - } - - if (false == bMatched) { - DBG_8723A("%s(%s): do not have matched BSSID\n", __func__, - netdev->name); - return -EINVAL; - } - - return 0; -} - -static int cfg80211_rtw_flush_pmksa(struct wiphy *wiphy, - struct net_device *netdev) -{ - struct rtw_adapter *padapter = wiphy_to_adapter(wiphy); - struct security_priv *psecuritypriv = &padapter->securitypriv; - - DBG_8723A("%s(%s)\n", __func__, netdev->name); - - memset(&psecuritypriv->PMKIDList[0], 0x00, - sizeof(struct rt_pmkid_list) * NUM_PMKID_CACHE); - psecuritypriv->PMKIDIndex = 0; - - return 0; -} - -#ifdef CONFIG_8723AU_AP_MODE -void rtw_cfg80211_indicate_sta_assoc(struct rtw_adapter *padapter, - u8 *pmgmt_frame, uint frame_len) -{ - s32 freq; - int channel; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct net_device *ndev = padapter->pnetdev; - - DBG_8723A("%s(padapter =%p,%s)\n", __func__, padapter, ndev->name); - -#if defined(RTW_USE_CFG80211_STA_EVENT) - { - struct station_info sinfo; - u8 ie_offset; - - if (ieee80211_is_assoc_req(hdr->frame_control)) - ie_offset = offsetof(struct ieee80211_mgmt, - u.assoc_req.variable); - else /* WIFI_REASSOCREQ */ - ie_offset = offsetof(struct ieee80211_mgmt, - u.reassoc_req.variable); - - sinfo.filled = 0; - sinfo.assoc_req_ies = pmgmt_frame + ie_offset; - sinfo.assoc_req_ies_len = frame_len - ie_offset; - cfg80211_new_sta(ndev, hdr->addr2, &sinfo, GFP_ATOMIC); - } -#else /* defined(RTW_USE_CFG80211_STA_EVENT) */ - channel = pmlmeext->cur_channel; - if (channel <= RTW_CH_MAX_2G_CHANNEL) - freq = ieee80211_channel_to_frequency(channel, - NL80211_BAND_2GHZ); - else - freq = ieee80211_channel_to_frequency(channel, - NL80211_BAND_5GHZ); - - cfg80211_rx_mgmt(padapter->rtw_wdev, freq, 0, pmgmt_frame, frame_len, - 0); -#endif /* defined(RTW_USE_CFG80211_STA_EVENT) */ -} - -void rtw_cfg80211_indicate_sta_disassoc(struct rtw_adapter *padapter, - unsigned char *da, - unsigned short reason) -{ - s32 freq; - int channel; - uint frame_len; - struct ieee80211_mgmt mgmt; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; - struct net_device *ndev = padapter->pnetdev; - - DBG_8723A("%s(padapter =%p,%s)\n", __func__, padapter, ndev->name); - - memset(&mgmt, 0, sizeof(struct ieee80211_mgmt)); - -#if defined(RTW_USE_CFG80211_STA_EVENT) - cfg80211_del_sta(ndev, da, GFP_ATOMIC); -#else /* defined(RTW_USE_CFG80211_STA_EVENT) */ - channel = pmlmeext->cur_channel; - if (channel <= RTW_CH_MAX_2G_CHANNEL) - freq = ieee80211_channel_to_frequency(channel, - NL80211_BAND_2GHZ); - else - freq = ieee80211_channel_to_frequency(channel, - NL80211_BAND_5GHZ); - - mgmt.frame_control = - cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_DEAUTH); - - ether_addr_copy(mgmt.da, myid(&padapter->eeprompriv)); - ether_addr_copy(mgmt.sa, da); - ether_addr_copy(mgmt.bssid, get_my_bssid23a(&pmlmeinfo->network)); - - mgmt.seq_ctrl = cpu_to_le16(IEEE80211_SN_TO_SEQ(pmlmeext->mgnt_seq)); - pmlmeext->mgnt_seq++; - - mgmt.u.disassoc.reason_code = cpu_to_le16(reason); - - frame_len = sizeof(struct ieee80211_hdr_3addr) + 2; - - cfg80211_rx_mgmt(padapter->rtw_wdev, freq, 0, (u8 *)&mgmt, frame_len, - 0); -#endif /* defined(RTW_USE_CFG80211_STA_EVENT) */ -} - -static int rtw_cfg80211_monitor_if_open(struct net_device *ndev) -{ - DBG_8723A("%s\n", __func__); - - return 0; -} - -static int rtw_cfg80211_monitor_if_close(struct net_device *ndev) -{ - DBG_8723A("%s\n", __func__); - - return 0; -} - -static int rtw_cfg80211_monitor_if_xmit_entry(struct sk_buff *skb, - struct net_device *ndev) -{ - int ret = 0; - int rtap_len; - int qos_len = 0; - int dot11_hdr_len = 24; - int snap_len = 6; - unsigned char *pdata; - unsigned char src_mac_addr[6]; - unsigned char dst_mac_addr[6]; - struct ieee80211_hdr *dot11_hdr; - struct ieee80211_radiotap_header *rtap_hdr; - struct rtw_adapter *padapter = netdev_priv(ndev); - - DBG_8723A("%s(%s)\n", __func__, ndev->name); - - if (unlikely(skb->len < sizeof(struct ieee80211_radiotap_header))) - goto fail; - - rtap_hdr = (struct ieee80211_radiotap_header *)skb->data; - if (unlikely(rtap_hdr->it_version)) - goto fail; - - rtap_len = ieee80211_get_radiotap_len(skb->data); - if (unlikely(skb->len < rtap_len)) - goto fail; - - if (rtap_len != 14) { - DBG_8723A("radiotap len (should be 14): %d\n", rtap_len); - goto fail; - } - - /* Skip the ratio tap header */ - skb_pull(skb, rtap_len); - - dot11_hdr = (struct ieee80211_hdr *)skb->data; - /* Check if the QoS bit is set */ - if (ieee80211_is_data(dot11_hdr->frame_control)) { - /* Check if this ia a Wireless Distribution System (WDS) frame - * which has 4 MAC addresses - */ - if (ieee80211_is_data_qos(dot11_hdr->frame_control)) - qos_len = IEEE80211_QOS_CTL_LEN; - if (ieee80211_has_a4(dot11_hdr->frame_control)) - dot11_hdr_len += 6; - - memcpy(dst_mac_addr, dot11_hdr->addr1, sizeof(dst_mac_addr)); - memcpy(src_mac_addr, dot11_hdr->addr2, sizeof(src_mac_addr)); - - /* - * Skip the 802.11 header, QoS (if any) and SNAP, - * but leave spaces for two MAC addresses - */ - skb_pull(skb, dot11_hdr_len + qos_len + snap_len - - ETH_ALEN * 2); - pdata = (unsigned char *)skb->data; - ether_addr_copy(pdata, dst_mac_addr); - ether_addr_copy(pdata + ETH_ALEN, src_mac_addr); - - DBG_8723A("should be eapol packet\n"); - - /* Use the real net device to transmit the packet */ - ret = rtw_xmit23a_entry23a(skb, padapter->pnetdev); - - return ret; - - } else if (ieee80211_is_action(dot11_hdr->frame_control)) { - struct ieee80211_mgmt *mgmt; - /* only for action frames */ - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - unsigned char *pframe; - /* u8 category, action, OUI_Subtype, dialogToken = 0; */ - /* unsigned char *frame_body; */ - struct xmit_priv *pxmitpriv = &padapter->xmitpriv; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - u32 len = skb->len; - u8 category, action; - - mgmt = (struct ieee80211_mgmt *)dot11_hdr; - - DBG_8723A("RTW_Tx:da=%pM via %s(%s)\n", - mgmt->da, __func__, ndev->name); - category = mgmt->u.action.category; - action = mgmt->u.action.u.wme_action.action_code; - DBG_8723A("RTW_Tx:category(%u), action(%u)\n", - category, action); - - /* starting alloc mgmt frame to dump it */ - pmgntframe = alloc_mgtxmitframe23a(pxmitpriv); - if (pmgntframe == NULL) - goto fail; - - /* update attribute */ - pattrib = &pmgntframe->attrib; - update_mgntframe_attrib23a(padapter, pattrib); - pattrib->retry_ctrl = false; - - memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); - - pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; - - memcpy(pframe, skb->data, len); - pattrib->pktlen = len; - - /* update seq number */ - pmlmeext->mgnt_seq = le16_to_cpu(dot11_hdr->seq_ctrl) >> 4; - pattrib->seqnum = pmlmeext->mgnt_seq; - pmlmeext->mgnt_seq++; - - pattrib->last_txcmdsz = pattrib->pktlen; - - dump_mgntframe23a(padapter, pmgntframe); - } - -fail: - - dev_kfree_skb(skb); - - return 0; -} - -static int -rtw_cfg80211_monitor_if_set_mac_address(struct net_device *ndev, void *addr) -{ - DBG_8723A("%s\n", __func__); - - return 0; -} - -static const struct net_device_ops rtw_cfg80211_monitor_if_ops = { - .ndo_open = rtw_cfg80211_monitor_if_open, - .ndo_stop = rtw_cfg80211_monitor_if_close, - .ndo_start_xmit = rtw_cfg80211_monitor_if_xmit_entry, - .ndo_set_mac_address = rtw_cfg80211_monitor_if_set_mac_address, -}; - -static int rtw_cfg80211_add_monitor_if(struct rtw_adapter *padapter, char *name, - unsigned char name_assign_type, - struct net_device **ndev) -{ - int ret = 0; - struct net_device *mon_ndev = NULL; - struct wireless_dev *mon_wdev = NULL; - struct rtw_wdev_priv *pwdev_priv = wdev_to_priv(padapter->rtw_wdev); - - if (!name) { - DBG_8723A("%s(%s): without specific name\n", - __func__, padapter->pnetdev->name); - ret = -EINVAL; - goto out; - } - - if (pwdev_priv->pmon_ndev) { - DBG_8723A("%s(%s): monitor interface exist: %s\n", __func__, - padapter->pnetdev->name, pwdev_priv->pmon_ndev->name); - ret = -EBUSY; - goto out; - } - - mon_ndev = alloc_etherdev(sizeof(struct rtw_adapter)); - if (!mon_ndev) { - DBG_8723A("%s(%s): allocate ndev fail\n", __func__, - padapter->pnetdev->name); - ret = -ENOMEM; - goto out; - } - - mon_ndev->type = ARPHRD_IEEE80211_RADIOTAP; - strncpy(mon_ndev->name, name, IFNAMSIZ); - mon_ndev->name[IFNAMSIZ - 1] = 0; - mon_ndev->name_assign_type = name_assign_type; - mon_ndev->destructor = rtw_ndev_destructor; - - mon_ndev->netdev_ops = &rtw_cfg80211_monitor_if_ops; - - /* wdev */ - mon_wdev = kzalloc(sizeof(struct wireless_dev), GFP_KERNEL); - if (!mon_wdev) { - ret = -ENOMEM; - goto out; - } - - mon_wdev->wiphy = padapter->rtw_wdev->wiphy; - mon_wdev->netdev = mon_ndev; - mon_wdev->iftype = NL80211_IFTYPE_MONITOR; - mon_ndev->ieee80211_ptr = mon_wdev; - - ret = register_netdevice(mon_ndev); - if (ret) { - goto out; - } - - *ndev = pwdev_priv->pmon_ndev = mon_ndev; - memcpy(pwdev_priv->ifname_mon, name, IFNAMSIZ + 1); - -out: - if (ret) { - kfree(mon_wdev); - mon_wdev = NULL; - } - - if (ret && mon_ndev) { - free_netdev(mon_ndev); - *ndev = mon_ndev = NULL; - } - - return ret; -} - -static struct wireless_dev * -cfg80211_rtw_add_virtual_intf(struct wiphy *wiphy, const char *name, - unsigned char name_assign_type, - enum nl80211_iftype type, u32 *flags, - struct vif_params *params) -{ - int ret = 0; - struct net_device *ndev = NULL; - struct rtw_adapter *padapter = wiphy_to_adapter(wiphy); - - DBG_8723A("%s(%s): wiphy:%s, name:%s, type:%d\n", __func__, - padapter->pnetdev->name, wiphy_name(wiphy), name, type); - - switch (type) { - case NL80211_IFTYPE_ADHOC: - case NL80211_IFTYPE_AP_VLAN: - case NL80211_IFTYPE_WDS: - case NL80211_IFTYPE_MESH_POINT: - ret = -ENODEV; - break; - case NL80211_IFTYPE_MONITOR: - ret = - rtw_cfg80211_add_monitor_if(padapter, (char *)name, - name_assign_type, &ndev); - break; - - case NL80211_IFTYPE_P2P_CLIENT: - case NL80211_IFTYPE_STATION: - ret = -ENODEV; - break; - - case NL80211_IFTYPE_P2P_GO: - case NL80211_IFTYPE_AP: - ret = -ENODEV; - break; - default: - ret = -ENODEV; - DBG_8723A("Unsupported interface type\n"); - break; - } - - DBG_8723A("%s(%s): ndev:%p, ret:%d\n", __func__, - padapter->pnetdev->name, - ndev, ret); - - return ndev ? ndev->ieee80211_ptr : ERR_PTR(ret); -} - -static int cfg80211_rtw_del_virtual_intf(struct wiphy *wiphy, - struct wireless_dev *wdev) -{ - struct rtw_wdev_priv *pwdev_priv = - (struct rtw_wdev_priv *)wiphy_priv(wiphy); - struct net_device *ndev; - ndev = wdev ? wdev->netdev : NULL; - - if (!ndev) - goto exit; - - unregister_netdevice(ndev); - - if (ndev == pwdev_priv->pmon_ndev) { - pwdev_priv->pmon_ndev = NULL; - pwdev_priv->ifname_mon[0] = '\0'; - DBG_8723A("%s(%s): remove monitor interface\n", - __func__, ndev->name); - } - -exit: - return 0; -} - -static int rtw_add_beacon(struct rtw_adapter *adapter, const u8 *head, - size_t head_len, const u8 *tail, size_t tail_len) -{ - int ret = 0; - u8 *pbuf; - uint len, ielen, wps_ielen = 0; - struct mlme_priv *pmlmepriv = &adapter->mlmepriv; - struct wlan_bssid_ex *bss = &pmlmepriv->cur_network.network; - const struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *)head; - struct ieee80211_mgmt *tmpmgmt; - /* struct sta_priv *pstapriv = &padapter->stapriv; */ - - DBG_8723A("%s beacon_head_len =%zu, beacon_tail_len =%zu\n", - __func__, head_len, tail_len); - - if (check_fwstate(pmlmepriv, WIFI_AP_STATE) != true) - return -EINVAL; - - if (head_len < offsetof(struct ieee80211_mgmt, u.beacon.variable)) - return -EINVAL; - - pbuf = kzalloc(head_len + tail_len, GFP_KERNEL); - if (!pbuf) - return -ENOMEM; - tmpmgmt = (struct ieee80211_mgmt *)pbuf; - - bss->beacon_interval = get_unaligned_le16(&mgmt->u.beacon.beacon_int); - bss->capability = get_unaligned_le16(&mgmt->u.beacon.capab_info); - bss->tsf = get_unaligned_le64(&mgmt->u.beacon.timestamp); - - /* 24 = beacon header len. */ - memcpy(pbuf, (void *)head, head_len); - memcpy(pbuf + head_len, (void *)tail, tail_len); - - len = head_len + tail_len; - ielen = len - offsetof(struct ieee80211_mgmt, u.beacon.variable); - /* check wps ie if inclued */ - if (cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT, - WLAN_OUI_TYPE_MICROSOFT_WPS, - tmpmgmt->u.beacon.variable, ielen)) - DBG_8723A("add bcn, wps_ielen =%d\n", wps_ielen); - - /* pbss_network->IEs will not include p2p_ie, wfd ie */ - rtw_ies_remove_ie23a(tmpmgmt->u.beacon.variable, &ielen, 0, - WLAN_EID_VENDOR_SPECIFIC, P2P_OUI23A, 4); - rtw_ies_remove_ie23a(tmpmgmt->u.beacon.variable, &ielen, 0, - WLAN_EID_VENDOR_SPECIFIC, WFD_OUI23A, 4); - - len = ielen + offsetof(struct ieee80211_mgmt, u.beacon.variable); - if (rtw_check_beacon_data23a(adapter, tmpmgmt, len) == _SUCCESS) { - ret = 0; - } else { - ret = -EINVAL; - } - - kfree(pbuf); - - return ret; -} - -static int cfg80211_rtw_start_ap(struct wiphy *wiphy, struct net_device *ndev, - struct cfg80211_ap_settings *settings) -{ - int ret = 0; - struct rtw_adapter *adapter = wiphy_to_adapter(wiphy); - - DBG_8723A("%s(%s): hidden_ssid:%d, auth_type:%d\n", - __func__, ndev->name, settings->hidden_ssid, - settings->auth_type); - - ret = rtw_add_beacon(adapter, settings->beacon.head, - settings->beacon.head_len, settings->beacon.tail, - settings->beacon.tail_len); - - adapter->mlmeextpriv.mlmext_info.hidden_ssid_mode = - settings->hidden_ssid; - - if (settings->ssid && settings->ssid_len) { - struct wlan_bssid_ex *pbss_network = - &adapter->mlmepriv.cur_network.network; - struct wlan_bssid_ex *pbss_network_ext = - &adapter->mlmeextpriv.mlmext_info.network; - - memcpy(pbss_network->Ssid.ssid, (void *)settings->ssid, - settings->ssid_len); - pbss_network->Ssid.ssid_len = settings->ssid_len; - memcpy(pbss_network_ext->Ssid.ssid, (void *)settings->ssid, - settings->ssid_len); - pbss_network_ext->Ssid.ssid_len = settings->ssid_len; - } - - return ret; -} - -static int cfg80211_rtw_change_beacon(struct wiphy *wiphy, - struct net_device *ndev, - struct cfg80211_beacon_data *info) -{ - int ret = 0; - struct rtw_adapter *adapter = wiphy_to_adapter(wiphy); - - DBG_8723A("%s(%s)\n", __func__, ndev->name); - - ret = rtw_add_beacon(adapter, info->head, info->head_len, info->tail, - info->tail_len); - - return ret; -} - -static int cfg80211_rtw_stop_ap(struct wiphy *wiphy, struct net_device *ndev) -{ - DBG_8723A("%s(%s)\n", __func__, ndev->name); - return 0; -} - -static int cfg80211_rtw_add_station(struct wiphy *wiphy, - struct net_device *ndev, const u8 *mac, - struct station_parameters *params) -{ - DBG_8723A("%s(%s)\n", __func__, ndev->name); - - return 0; -} - -static int cfg80211_rtw_del_station(struct wiphy *wiphy, - struct net_device *ndev, - struct station_del_parameters *params) -{ - const u8 *mac = params->mac; - int ret = 0; - struct list_head *phead; - u8 updated = 0; - struct sta_info *psta, *ptmp; - struct rtw_adapter *padapter = netdev_priv(ndev); - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct sta_priv *pstapriv = &padapter->stapriv; - - DBG_8723A("+%s(%s)\n", __func__, ndev->name); - - if (check_fwstate(pmlmepriv, (_FW_LINKED | WIFI_AP_STATE)) != true) { - DBG_8723A("%s, fw_state != FW_LINKED|WIFI_AP_STATE\n", - __func__); - return -EINVAL; - } - - if (!mac) { - DBG_8723A("flush all sta, and cam_entry\n"); - - flush_all_cam_entry23a(padapter); /* clear CAM */ - - ret = rtw_sta_flush23a(padapter); - - return ret; - } - - DBG_8723A("free sta macaddr=%pM\n", mac); - - if (is_broadcast_ether_addr(mac)) - return -EINVAL; - - spin_lock_bh(&pstapriv->asoc_list_lock); - phead = &pstapriv->asoc_list; - /* check asoc_queue */ - list_for_each_entry_safe(psta, ptmp, phead, asoc_list) { - if (ether_addr_equal(mac, psta->hwaddr)) { - if (psta->dot8021xalg == 1 && - psta->bpairwise_key_installed == false) { - DBG_8723A("%s, sta's dot8021xalg = 1 and " - "key_installed = false\n", __func__); - } else { - DBG_8723A("free psta =%p, aid =%d\n", psta, - psta->aid); - - list_del_init(&psta->asoc_list); - pstapriv->asoc_list_cnt--; - - /* spin_unlock_bh(&pstapriv->asoc_list_lock); */ - updated = - ap_free_sta23a(padapter, psta, true, - WLAN_REASON_DEAUTH_LEAVING); - /* spin_lock_bh(&pstapriv->asoc_list_lock); */ - - psta = NULL; - - break; - } - } - } - spin_unlock_bh(&pstapriv->asoc_list_lock); - - associated_clients_update23a(padapter, updated); - - DBG_8723A("-%s(%s)\n", __func__, ndev->name); - - return ret; -} - -static int cfg80211_rtw_change_station(struct wiphy *wiphy, - struct net_device *ndev, const u8 *mac, - struct station_parameters *params) -{ - DBG_8723A("%s(%s)\n", __func__, ndev->name); - return 0; -} - -static int cfg80211_rtw_dump_station(struct wiphy *wiphy, - struct net_device *ndev, int idx, u8 *mac, - struct station_info *sinfo) -{ - DBG_8723A("%s(%s)\n", __func__, ndev->name); - - /* TODO: dump scanned queue */ - - return -ENOENT; -} - -static int cfg80211_rtw_change_bss(struct wiphy *wiphy, struct net_device *ndev, - struct bss_parameters *params) -{ - DBG_8723A("%s(%s)\n", __func__, ndev->name); - return 0; -} -#endif /* CONFIG_8723AU_AP_MODE */ - -static int _cfg80211_rtw_mgmt_tx(struct rtw_adapter *padapter, u8 tx_ch, - const u8 *buf, size_t len) -{ - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - unsigned char *pframe; - int ret = _FAIL; - struct ieee80211_hdr *pwlanhdr; - struct xmit_priv *pxmitpriv = &padapter->xmitpriv; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - - if (_FAIL == rtw_pwr_wakeup(padapter)) { - ret = -EFAULT; - goto exit; - } - - rtw_set_scan_deny(padapter, 1000); - - rtw_scan_abort23a(padapter); - - if (tx_ch != rtw_get_oper_ch23a(padapter)) { - if (!check_fwstate(&padapter->mlmepriv, _FW_LINKED)) - pmlmeext->cur_channel = tx_ch; - set_channel_bwmode23a(padapter, tx_ch, - HAL_PRIME_CHNL_OFFSET_DONT_CARE, - HT_CHANNEL_WIDTH_20); - } - - /* starting alloc mgmt frame to dump it */ - pmgntframe = alloc_mgtxmitframe23a(pxmitpriv); - if (!pmgntframe) { - /* ret = -ENOMEM; */ - ret = _FAIL; - goto exit; - } - - /* update attribute */ - pattrib = &pmgntframe->attrib; - update_mgntframe_attrib23a(padapter, pattrib); - pattrib->retry_ctrl = false; - - memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); - - pframe = (u8 *) (pmgntframe->buf_addr) + TXDESC_OFFSET; - - memcpy(pframe, (void *)buf, len); - pattrib->pktlen = len; - - pwlanhdr = (struct ieee80211_hdr *)pframe; - /* update seq number */ - pmlmeext->mgnt_seq = le16_to_cpu(pwlanhdr->seq_ctrl) >> 4; - pattrib->seqnum = pmlmeext->mgnt_seq; - pmlmeext->mgnt_seq++; - - pattrib->last_txcmdsz = pattrib->pktlen; - - ret = dump_mgntframe23a_and_wait_ack23a(padapter, pmgntframe); - - if (ret != _SUCCESS) - DBG_8723A("%s, ack == false\n", __func__); - else - DBG_8723A("%s, ack == true\n", __func__); - -exit: - - DBG_8723A("%s, ret =%d\n", __func__, ret); - - return ret; -} - -static int cfg80211_rtw_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev, - struct cfg80211_mgmt_tx_params *params, - u64 *cookie) -{ - struct rtw_adapter *padapter = - (struct rtw_adapter *)wiphy_to_adapter(wiphy); - int ret = 0; - int tx_ret; - u32 dump_limit = RTW_MAX_MGMT_TX_CNT; - u32 dump_cnt = 0; - bool ack = true; - u8 category, action; - unsigned long start = jiffies; - size_t len = params->len; - struct ieee80211_channel *chan = params->chan; - const u8 *buf = params->buf; - struct ieee80211_mgmt *hdr = (struct ieee80211_mgmt *)buf; - u8 tx_ch = (u8) ieee80211_frequency_to_channel(chan->center_freq); - - if (!ieee80211_is_action(hdr->frame_control)) - return -EINVAL; - - /* cookie generation */ - *cookie = (unsigned long)buf; - - DBG_8723A("%s(%s): len =%zu, ch =%d\n", __func__, - padapter->pnetdev->name, len, tx_ch); - - /* indicate ack before issue frame to avoid racing with rsp frame */ - cfg80211_mgmt_tx_status(padapter->rtw_wdev, *cookie, buf, len, ack, - GFP_KERNEL); - - DBG_8723A("RTW_Tx:tx_ch =%d, da =%pM\n", tx_ch, hdr->da); - category = hdr->u.action.category; - action = hdr->u.action.u.wme_action.action_code; - DBG_8723A("RTW_Tx:category(%u), action(%u)\n", category, action); - - do { - dump_cnt++; - tx_ret = _cfg80211_rtw_mgmt_tx(padapter, tx_ch, buf, len); - } while (dump_cnt < dump_limit && tx_ret != _SUCCESS); - - if (tx_ret != _SUCCESS || dump_cnt > 1) { - DBG_8723A("%s(%s): %s (%d/%d) in %d ms\n", - __func__, padapter->pnetdev->name, - tx_ret == _SUCCESS ? "OK" : "FAIL", dump_cnt, - dump_limit, jiffies_to_msecs(jiffies - start)); - } - - return ret; -} - -static void cfg80211_rtw_mgmt_frame_register(struct wiphy *wiphy, - struct wireless_dev *wdev, - u16 frame_type, bool reg) -{ - if (frame_type != (IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_PROBE_REQ)) - return; - - return; -} - -static struct cfg80211_ops rtw_cfg80211_ops = { - .change_virtual_intf = cfg80211_rtw_change_iface, - .add_key = cfg80211_rtw_add_key, - .get_key = cfg80211_rtw_get_key, - .del_key = cfg80211_rtw_del_key, - .set_default_key = cfg80211_rtw_set_default_key, - .get_station = cfg80211_rtw_get_station, - .scan = cfg80211_rtw_scan, - .set_wiphy_params = cfg80211_rtw_set_wiphy_params, - .connect = cfg80211_rtw_connect, - .disconnect = cfg80211_rtw_disconnect, - .join_ibss = cfg80211_rtw_join_ibss, - .leave_ibss = cfg80211_rtw_leave_ibss, - .set_tx_power = cfg80211_rtw_set_txpower, - .get_tx_power = cfg80211_rtw_get_txpower, - .set_power_mgmt = cfg80211_rtw_set_power_mgmt, - .set_pmksa = cfg80211_rtw_set_pmksa, - .del_pmksa = cfg80211_rtw_del_pmksa, - .flush_pmksa = cfg80211_rtw_flush_pmksa, - -#ifdef CONFIG_8723AU_AP_MODE - .add_virtual_intf = cfg80211_rtw_add_virtual_intf, - .del_virtual_intf = cfg80211_rtw_del_virtual_intf, - - .start_ap = cfg80211_rtw_start_ap, - .change_beacon = cfg80211_rtw_change_beacon, - .stop_ap = cfg80211_rtw_stop_ap, - - .add_station = cfg80211_rtw_add_station, - .del_station = cfg80211_rtw_del_station, - .change_station = cfg80211_rtw_change_station, - .dump_station = cfg80211_rtw_dump_station, - .change_bss = cfg80211_rtw_change_bss, -#endif /* CONFIG_8723AU_AP_MODE */ - - .mgmt_tx = cfg80211_rtw_mgmt_tx, - .mgmt_frame_register = cfg80211_rtw_mgmt_frame_register, -}; - -static void rtw_cfg80211_init_ht_capab(struct ieee80211_sta_ht_cap *ht_cap, - enum nl80211_band band, u8 rf_type) -{ - -#define MAX_BIT_RATE_40MHZ_MCS15 300 /* Mbps */ -#define MAX_BIT_RATE_40MHZ_MCS7 150 /* Mbps */ - - ht_cap->ht_supported = true; - - ht_cap->cap = IEEE80211_HT_CAP_SUP_WIDTH_20_40 | - IEEE80211_HT_CAP_SGI_40 | IEEE80211_HT_CAP_SGI_20 | - IEEE80211_HT_CAP_DSSSCCK40 | IEEE80211_HT_CAP_MAX_AMSDU; - - /* - *Maximum length of AMPDU that the STA can receive. - *Length = 2 ^ (13 + max_ampdu_length_exp) - 1 (octets) - */ - ht_cap->ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K; - - /*Minimum MPDU start spacing , */ - ht_cap->ampdu_density = IEEE80211_HT_MPDU_DENSITY_16; - - ht_cap->mcs.tx_params = IEEE80211_HT_MCS_TX_DEFINED; - - /* - *hw->wiphy->bands[NL80211_BAND_2GHZ] - *base on ant_num - *rx_mask: RX mask - *if rx_ant = 1 rx_mask[0]= 0xff;==>MCS0-MCS7 - *if rx_ant = 2 rx_mask[1]= 0xff;==>MCS8-MCS15 - *if rx_ant >= 3 rx_mask[2]= 0xff; - *if BW_40 rx_mask[4]= 0x01; - *highest supported RX rate - */ - if (rf_type == RF_1T1R) { - ht_cap->mcs.rx_mask[0] = 0xFF; - ht_cap->mcs.rx_mask[1] = 0x00; - ht_cap->mcs.rx_mask[4] = 0x01; - - ht_cap->mcs.rx_highest = cpu_to_le16(MAX_BIT_RATE_40MHZ_MCS7); - } else if ((rf_type == RF_1T2R) || (rf_type == RF_2T2R)) { - ht_cap->mcs.rx_mask[0] = 0xFF; - ht_cap->mcs.rx_mask[1] = 0xFF; - ht_cap->mcs.rx_mask[4] = 0x01; - - ht_cap->mcs.rx_highest = cpu_to_le16(MAX_BIT_RATE_40MHZ_MCS15); - } else { - DBG_8723A("%s, error rf_type =%d\n", __func__, rf_type); - } - -} - -void rtw_cfg80211_init_wiphy(struct rtw_adapter *padapter) -{ - u8 rf_type; - struct ieee80211_supported_band *bands; - struct wireless_dev *pwdev = padapter->rtw_wdev; - struct wiphy *wiphy = pwdev->wiphy; - - rf_type = rtl8723a_get_rf_type(padapter); - - DBG_8723A("%s:rf_type =%d\n", __func__, rf_type); - - /* if (padapter->registrypriv.wireless_mode & WIRELESS_11G) */ - { - bands = wiphy->bands[NL80211_BAND_2GHZ]; - if (bands) - rtw_cfg80211_init_ht_capab(&bands->ht_cap, - NL80211_BAND_2GHZ, - rf_type); - } - - /* if (padapter->registrypriv.wireless_mode & WIRELESS_11A) */ - { - bands = wiphy->bands[NL80211_BAND_5GHZ]; - if (bands) - rtw_cfg80211_init_ht_capab(&bands->ht_cap, - NL80211_BAND_5GHZ, - rf_type); - } -} - -static void rtw_cfg80211_preinit_wiphy(struct rtw_adapter *padapter, - struct wiphy *wiphy) -{ - wiphy->signal_type = CFG80211_SIGNAL_TYPE_MBM; - - wiphy->max_scan_ssids = RTW_SSID_SCAN_AMOUNT; - wiphy->max_scan_ie_len = IEEE80211_MAX_DATA_LEN; - wiphy->max_num_pmkids = RTW_MAX_NUM_PMKIDS; - - wiphy->max_remain_on_channel_duration = - RTW_MAX_REMAIN_ON_CHANNEL_DURATION; - - wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) | - BIT(NL80211_IFTYPE_ADHOC) | -#ifdef CONFIG_8723AU_AP_MODE - BIT(NL80211_IFTYPE_AP) | BIT(NL80211_IFTYPE_MONITOR) | -#endif - 0; - -#ifdef CONFIG_8723AU_AP_MODE - wiphy->mgmt_stypes = rtw_cfg80211_default_mgmt_stypes; -#endif /* CONFIG_8723AU_AP_MODE */ - - wiphy->software_iftypes |= BIT(NL80211_IFTYPE_MONITOR); - - /* - wiphy->iface_combinations = &rtw_combinations; - wiphy->n_iface_combinations = 1; - */ - - wiphy->cipher_suites = rtw_cipher_suites; - wiphy->n_cipher_suites = ARRAY_SIZE(rtw_cipher_suites); - - /* if (padapter->registrypriv.wireless_mode & WIRELESS_11G) */ - wiphy->bands[NL80211_BAND_2GHZ] = - rtw_spt_band_alloc(NL80211_BAND_2GHZ); - /* if (padapter->registrypriv.wireless_mode & WIRELESS_11A) */ - wiphy->bands[NL80211_BAND_5GHZ] = - rtw_spt_band_alloc(NL80211_BAND_5GHZ); - - wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL; - wiphy->flags |= WIPHY_FLAG_OFFCHAN_TX | WIPHY_FLAG_HAVE_AP_SME; - - if (padapter->registrypriv.power_mgnt != PS_MODE_ACTIVE) - wiphy->flags |= WIPHY_FLAG_PS_ON_BY_DEFAULT; - else - wiphy->flags &= ~WIPHY_FLAG_PS_ON_BY_DEFAULT; -} - -int rtw_wdev_alloc(struct rtw_adapter *padapter, struct device *dev) -{ - int ret = 0; - struct wiphy *wiphy; - struct wireless_dev *wdev; - struct rtw_wdev_priv *pwdev_priv; - struct net_device *pnetdev = padapter->pnetdev; - - DBG_8723A("%s(padapter =%p)\n", __func__, padapter); - - /* wiphy */ - wiphy = wiphy_new(&rtw_cfg80211_ops, sizeof(struct rtw_wdev_priv)); - if (!wiphy) { - DBG_8723A("Couldn't allocate wiphy device\n"); - ret = -ENOMEM; - goto exit; - } - - /* wdev */ - wdev = kzalloc(sizeof(struct wireless_dev), GFP_KERNEL); - if (!wdev) { - ret = -ENOMEM; - goto free_wiphy; - } - - set_wiphy_dev(wiphy, dev); - rtw_cfg80211_preinit_wiphy(padapter, wiphy); - - ret = wiphy_register(wiphy); - if (ret < 0) { - DBG_8723A("Couldn't register wiphy device\n"); - goto free_wdev; - } - - wdev->wiphy = wiphy; - wdev->netdev = pnetdev; - /* wdev->iftype = NL80211_IFTYPE_STATION; */ - /* for rtw_setopmode_cmd23a() in cfg80211_rtw_change_iface() */ - wdev->iftype = NL80211_IFTYPE_MONITOR; - padapter->rtw_wdev = wdev; - pnetdev->ieee80211_ptr = wdev; - - /* init pwdev_priv */ - pwdev_priv = wdev_to_priv(wdev); - pwdev_priv->rtw_wdev = wdev; - pwdev_priv->pmon_ndev = NULL; - pwdev_priv->ifname_mon[0] = '\0'; - pwdev_priv->padapter = padapter; - pwdev_priv->scan_request = NULL; - spin_lock_init(&pwdev_priv->scan_req_lock); - - pwdev_priv->p2p_enabled = false; - - if (padapter->registrypriv.power_mgnt != PS_MODE_ACTIVE) - pwdev_priv->power_mgmt = true; - else - pwdev_priv->power_mgmt = false; - - return ret; -free_wdev: - kfree(wdev); -free_wiphy: - wiphy_free(wiphy); -exit: - return ret; -} - -void rtw_wdev_free(struct wireless_dev *wdev) -{ - DBG_8723A("%s(wdev =%p)\n", __func__, wdev); - - if (!wdev) - return; - - kfree(wdev->wiphy->bands[NL80211_BAND_2GHZ]); - kfree(wdev->wiphy->bands[NL80211_BAND_5GHZ]); - - wiphy_free(wdev->wiphy); - - kfree(wdev); -} - -void rtw_wdev_unregister(struct wireless_dev *wdev) -{ - struct rtw_wdev_priv *pwdev_priv; - - DBG_8723A("%s(wdev =%p)\n", __func__, wdev); - - if (!wdev) - return; - - pwdev_priv = wdev_to_priv(wdev); - - rtw_cfg80211_indicate_scan_done(pwdev_priv, true); - - if (pwdev_priv->pmon_ndev) { - DBG_8723A("%s, unregister monitor interface\n", __func__); - unregister_netdev(pwdev_priv->pmon_ndev); - } - - wiphy_unregister(wdev->wiphy); -} diff --git a/drivers/staging/rtl8723au/os_dep/mlme_linux.c b/drivers/staging/rtl8723au/os_dep/mlme_linux.c deleted file mode 100644 index ca24369..0000000 --- a/drivers/staging/rtl8723au/os_dep/mlme_linux.c +++ /dev/null @@ -1,81 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - ******************************************************************************/ - -#define _MLME_OSDEP_C_ - -#include <osdep_service.h> -#include <drv_types.h> -#include <mlme_osdep.h> - -static struct rt_pmkid_list backupPMKIDList[NUM_PMKID_CACHE]; - -void rtw_reset_securitypriv23a(struct rtw_adapter *adapter) -{ - u8 backupPMKIDIndex = 0; - u8 backupTKIPCountermeasure = 0x00; - unsigned long backupTKIPcountermeasure_time = 0; - - if (adapter->securitypriv.dot11AuthAlgrthm == - dot11AuthAlgrthm_8021X) { /* 802.1x */ - /* We have to backup the PMK information for WiFi PMK - * Caching test item. - * Backup the btkip_countermeasure information. - * When the countermeasure is trigger, the driver have to - * disconnect with AP for 60 seconds. - */ - memcpy(&backupPMKIDList[0], &adapter->securitypriv.PMKIDList[0], - sizeof(struct rt_pmkid_list) * NUM_PMKID_CACHE); - backupPMKIDIndex = adapter->securitypriv.PMKIDIndex; - backupTKIPCountermeasure = adapter->securitypriv.btkip_countermeasure; - backupTKIPcountermeasure_time = adapter->securitypriv.btkip_countermeasure_time; - - memset((unsigned char *)&adapter->securitypriv, 0, - sizeof (struct security_priv)); - /* Restore the PMK information to securitypriv structure - * for the following connection. - */ - memcpy(&adapter->securitypriv.PMKIDList[0], &backupPMKIDList[0], - sizeof(struct rt_pmkid_list) * NUM_PMKID_CACHE); - adapter->securitypriv.PMKIDIndex = backupPMKIDIndex; - adapter->securitypriv.btkip_countermeasure = backupTKIPCountermeasure; - adapter->securitypriv.btkip_countermeasure_time = backupTKIPcountermeasure_time; - - adapter->securitypriv.ndisauthtype = Ndis802_11AuthModeOpen; - adapter->securitypriv.ndisencryptstatus = Ndis802_11WEPDisabled; - } else { /* reset values in securitypriv */ - struct security_priv *psec_priv = &adapter->securitypriv; - - /* open system */ - psec_priv->dot11AuthAlgrthm = dot11AuthAlgrthm_Open; - psec_priv->dot11PrivacyAlgrthm = 0; - psec_priv->dot11PrivacyKeyIndex = 0; - - psec_priv->dot118021XGrpPrivacy = 0; - psec_priv->dot118021XGrpKeyid = 1; - - psec_priv->ndisauthtype = Ndis802_11AuthModeOpen; - psec_priv->ndisencryptstatus = Ndis802_11WEPDisabled; - } -} - -void rtw_os_indicate_disconnect23a(struct rtw_adapter *adapter) -{ - /* Do it first for tx broadcast pkt after disconnection issue! */ - netif_carrier_off(adapter->pnetdev); - - rtw_cfg80211_indicate_disconnect(adapter); - - rtw_reset_securitypriv23a(adapter); -} diff --git a/drivers/staging/rtl8723au/os_dep/os_intfs.c b/drivers/staging/rtl8723au/os_dep/os_intfs.c deleted file mode 100644 index b8848c2..0000000 --- a/drivers/staging/rtl8723au/os_dep/os_intfs.c +++ /dev/null @@ -1,852 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - ******************************************************************************/ -#define _OS_INTFS_C_ - -#include <osdep_service.h> -#include <drv_types.h> -#include <xmit_osdep.h> -#include <recv_osdep.h> -#include <hal_intf.h> -#include <rtw_version.h> - -#include <rtl8723a_hal.h> - -MODULE_LICENSE("GPL"); -MODULE_DESCRIPTION("Realtek Wireless Lan Driver"); -MODULE_AUTHOR("Realtek Semiconductor Corp."); -MODULE_AUTHOR("Larry Finger <Larry.Finger@lwfinger.net>"); -MODULE_AUTHOR("Jes Sorensen <Jes.Sorensen@redhat.com>"); -MODULE_VERSION(DRIVERVERSION); -MODULE_FIRMWARE("rtlwifi/rtl8723aufw_A.bin"); -MODULE_FIRMWARE("rtlwifi/rtl8723aufw_B.bin"); -MODULE_FIRMWARE("rtlwifi/rtl8723aufw_B_NoBT.bin"); - -/* module param defaults */ -static int rtw_chip_version; -static int rtw_rfintfs = HWPI; -static int rtw_debug = 1; - -static int rtw_channel = 1;/* ad-hoc support requirement */ -static int rtw_wireless_mode = WIRELESS_11BG_24N; -static int rtw_vrtl_carrier_sense = AUTO_VCS; -static int rtw_vcs_type = RTS_CTS;/* */ -static int rtw_rts_thresh = 2347;/* */ -static int rtw_frag_thresh = 2346;/* */ -static int rtw_preamble = PREAMBLE_LONG;/* long, short, auto */ -static int rtw_scan_mode = 1;/* active, passive */ -static int rtw_adhoc_tx_pwr = 1; -static int rtw_soft_ap; -static int rtw_power_mgnt = 1; -static int rtw_ips_mode = IPS_NORMAL; - -static int rtw_smart_ps = 2; - -module_param(rtw_ips_mode, int, 0644); -MODULE_PARM_DESC(rtw_ips_mode, "The default IPS mode"); - -static int rtw_long_retry_lmt = 7; -static int rtw_short_retry_lmt = 7; -static int rtw_busy_thresh = 40; -static int rtw_ack_policy = NORMAL_ACK; - -static int rtw_acm_method;/* 0:By SW 1:By HW. */ - -static int rtw_wmm_enable = 1;/* default is set to enable the wmm. */ -static int rtw_uapsd_enable; - -static int rtw_ht_enable = 1; -/* 0 :diable, bit(0): enable 2.4g, bit(1): enable 5g */ -static int rtw_cbw40_enable = 3; -static int rtw_ampdu_enable = 1;/* for enable tx_ampdu */ -/* 0: disable, bit(0):enable 2.4g, bit(1):enable 5g, default is set to enable - * 2.4GHZ for IOT issue with bufflao's AP at 5GHZ - */ -static int rtw_rx_stbc = 1; -static int rtw_ampdu_amsdu;/* 0: disabled, 1:enabled, 2:auto */ - -/* Use 2 path Tx to transmit MCS0~7 and legacy mode */ -static int rtw_lowrate_two_xmit = 1; - -/* int rf_config = RF_1T2R; 1T2R */ -static int rtw_rf_config = RF_819X_MAX_TYPE; /* auto */ -static int rtw_low_power; -static int rtw_wifi_spec; -static int rtw_channel_plan = RT_CHANNEL_DOMAIN_MAX; - -#ifdef CONFIG_8723AU_BT_COEXIST -static int rtw_btcoex_enable = 1; -static int rtw_bt_iso = 2;/* 0:Low, 1:High, 2:From Efuse */ -/* 0:Idle, 1:None-SCO, 2:SCO, 3:From Counter, 4.Busy, 5.OtherBusy */ -static int rtw_bt_sco = 3; -/* 0:Disable BT control A-MPDU, 1:Enable BT control A-MPDU. */ -static int rtw_bt_ampdu = 1; -#endif - -/* 0:Reject AP's Add BA req, 1:Accept AP's Add BA req. */ -static int rtw_AcceptAddbaReq = true; - -static int rtw_antdiv_cfg = 2; /* 0:OFF , 1:ON, 2:decide by Efuse config */ -static int rtw_antdiv_type; /* 0:decide by efuse */ - -static int rtw_enusbss;/* 0:disable, 1:enable */ - -static int rtw_hwpdn_mode = 2;/* 0:disable, 1:enable, 2: by EFUSE config */ - -static int rtw_hwpwrp_detect; /* HW power ping detect 0:disable , 1:enable */ - -static int rtw_hw_wps_pbc = 1; - -static int rtw_80211d; - -static int rtw_regulatory_id = 0xff;/* Regulatory tab id, 0xff = follow efuse's setting */ - -module_param(rtw_regulatory_id, int, 0644); - -static char *ifname = "wlan%d"; -module_param(ifname, charp, 0644); -MODULE_PARM_DESC(ifname, "The default name to allocate for first interface"); - -static char *if2name = "wlan%d"; -module_param(if2name, charp, 0644); -MODULE_PARM_DESC(if2name, "The default name to allocate for second interface"); - -module_param(rtw_channel_plan, int, 0644); -module_param(rtw_chip_version, int, 0644); -module_param(rtw_rfintfs, int, 0644); -module_param(rtw_channel, int, 0644); -module_param(rtw_wmm_enable, int, 0644); -module_param(rtw_vrtl_carrier_sense, int, 0644); -module_param(rtw_vcs_type, int, 0644); -module_param(rtw_busy_thresh, int, 0644); -module_param(rtw_ht_enable, int, 0644); -module_param(rtw_cbw40_enable, int, 0644); -module_param(rtw_ampdu_enable, int, 0644); -module_param(rtw_rx_stbc, int, 0644); -module_param(rtw_ampdu_amsdu, int, 0644); - -module_param(rtw_lowrate_two_xmit, int, 0644); - -module_param(rtw_rf_config, int, 0644); -module_param(rtw_power_mgnt, int, 0644); -module_param(rtw_smart_ps, int, 0644); -module_param(rtw_low_power, int, 0644); -module_param(rtw_wifi_spec, int, 0644); - -module_param(rtw_antdiv_cfg, int, 0644); - -module_param(rtw_enusbss, int, 0644); -module_param(rtw_hwpdn_mode, int, 0644); -module_param(rtw_hwpwrp_detect, int, 0644); - -module_param(rtw_hw_wps_pbc, int, 0644); - -static uint rtw_max_roaming_times = 2; -module_param(rtw_max_roaming_times, uint, 0644); -MODULE_PARM_DESC(rtw_max_roaming_times, "The max roaming times to try"); - -module_param(rtw_80211d, int, 0644); -MODULE_PARM_DESC(rtw_80211d, "Enable 802.11d mechanism"); - -#ifdef CONFIG_8723AU_BT_COEXIST -module_param(rtw_btcoex_enable, int, 0644); -MODULE_PARM_DESC(rtw_btcoex_enable, "Enable BT co-existence mechanism"); -#endif - -static uint rtw_notch_filter; -module_param(rtw_notch_filter, uint, 0644); -MODULE_PARM_DESC(rtw_notch_filter, "0:Disable, 1:Enable, 2:Enable only for P2P"); -module_param_named(debug, rtw_debug, int, 0444); -MODULE_PARM_DESC(debug, "Set debug level (1-9) (default 1)"); - -static int netdev_close(struct net_device *pnetdev); - -static void loadparam(struct rtw_adapter *padapter, struct net_device *pnetdev) -{ - struct registry_priv *registry_par = &padapter->registrypriv; - - GlobalDebugLevel23A = rtw_debug; - registry_par->chip_version = (u8)rtw_chip_version; - registry_par->rfintfs = (u8)rtw_rfintfs; - memcpy(registry_par->ssid.ssid, "ANY", 3); - registry_par->ssid.ssid_len = 3; - registry_par->channel = (u8)rtw_channel; - registry_par->wireless_mode = (u8)rtw_wireless_mode; - registry_par->vrtl_carrier_sense = (u8)rtw_vrtl_carrier_sense; - registry_par->vcs_type = (u8)rtw_vcs_type; - registry_par->rts_thresh = (u16)rtw_rts_thresh; - registry_par->frag_thresh = (u16)rtw_frag_thresh; - registry_par->preamble = (u8)rtw_preamble; - registry_par->scan_mode = (u8)rtw_scan_mode; - registry_par->adhoc_tx_pwr = (u8)rtw_adhoc_tx_pwr; - registry_par->soft_ap = (u8)rtw_soft_ap; - registry_par->smart_ps = (u8)rtw_smart_ps; - registry_par->power_mgnt = (u8)rtw_power_mgnt; - registry_par->ips_mode = (u8)rtw_ips_mode; - registry_par->long_retry_lmt = (u8)rtw_long_retry_lmt; - registry_par->short_retry_lmt = (u8)rtw_short_retry_lmt; - registry_par->busy_thresh = (u16)rtw_busy_thresh; - registry_par->ack_policy = (u8)rtw_ack_policy; - registry_par->acm_method = (u8)rtw_acm_method; - /* UAPSD */ - registry_par->wmm_enable = (u8)rtw_wmm_enable; - registry_par->uapsd_enable = (u8)rtw_uapsd_enable; - registry_par->ht_enable = (u8)rtw_ht_enable; - registry_par->cbw40_enable = (u8)rtw_cbw40_enable; - registry_par->ampdu_enable = (u8)rtw_ampdu_enable; - registry_par->rx_stbc = (u8)rtw_rx_stbc; - registry_par->ampdu_amsdu = (u8)rtw_ampdu_amsdu; - registry_par->lowrate_two_xmit = (u8)rtw_lowrate_two_xmit; - registry_par->rf_config = (u8)rtw_rf_config; - registry_par->low_power = (u8)rtw_low_power; - registry_par->wifi_spec = (u8)rtw_wifi_spec; - registry_par->channel_plan = (u8)rtw_channel_plan; -#ifdef CONFIG_8723AU_BT_COEXIST - registry_par->btcoex = (u8)rtw_btcoex_enable; - registry_par->bt_iso = (u8)rtw_bt_iso; - registry_par->bt_sco = (u8)rtw_bt_sco; - registry_par->bt_ampdu = (u8)rtw_bt_ampdu; -#endif - registry_par->bAcceptAddbaReq = (u8)rtw_AcceptAddbaReq; - registry_par->antdiv_cfg = (u8)rtw_antdiv_cfg; - registry_par->antdiv_type = (u8)rtw_antdiv_type; - - /* 0:disable, 1:enable, 2:by EFUSE config */ - registry_par->hwpdn_mode = (u8)rtw_hwpdn_mode; - /* 0:disable, 1:enable */ - registry_par->hwpwrp_detect = (u8)rtw_hwpwrp_detect; - registry_par->hw_wps_pbc = (u8)rtw_hw_wps_pbc; - registry_par->max_roaming_times = (u8)rtw_max_roaming_times; - registry_par->enable80211d = (u8)rtw_80211d; - snprintf(registry_par->ifname, 16, "%s", ifname); - snprintf(registry_par->if2name, 16, "%s", if2name); - registry_par->notch_filter = (u8)rtw_notch_filter; - registry_par->regulatory_tid = (u8)rtw_regulatory_id; -} - -static int rtw_net_set_mac_address(struct net_device *pnetdev, void *p) -{ - struct rtw_adapter *padapter = netdev_priv(pnetdev); - struct sockaddr *addr = p; - - if (!padapter->bup) - ether_addr_copy(padapter->eeprompriv.mac_addr, addr->sa_data); - return 0; -} - -static struct net_device_stats *rtw_net_get_stats(struct net_device *pnetdev) -{ - struct rtw_adapter *padapter = netdev_priv(pnetdev); - struct xmit_priv *pxmitpriv = &padapter->xmitpriv; - struct recv_priv *precvpriv = &padapter->recvpriv; - - padapter->stats.tx_packets = pxmitpriv->tx_pkts; - padapter->stats.rx_packets = precvpriv->rx_pkts; - padapter->stats.tx_dropped = pxmitpriv->tx_drop; - padapter->stats.rx_dropped = precvpriv->rx_drop; - padapter->stats.tx_bytes = pxmitpriv->tx_bytes; - padapter->stats.rx_bytes = precvpriv->rx_bytes; - - return &padapter->stats; -} - -/* - * AC to queue mapping - * - * AC_VO -> queue 0 - * AC_VI -> queue 1 - * AC_BE -> queue 2 - * AC_BK -> queue 3 - */ -static const u16 rtw_1d_to_queue[8] = { 2, 3, 3, 2, 1, 1, 0, 0 }; - -/* Given a data frame determine the 802.1p/1d tag to use. */ -static u32 rtw_classify8021d(struct sk_buff *skb) -{ - u32 dscp; - - /* skb->priority values from 256->263 are magic values to - * directly indicate a specific 802.1d priority. This is used - * to allow 802.1d priority to be passed directly in from VLAN - * tags, etc. - */ - if (skb->priority >= 256 && skb->priority <= 263) - return skb->priority - 256; - switch (skb->protocol) { - case htons(ETH_P_IP): - dscp = ip_hdr(skb)->tos & 0xfc; - break; - default: - return 0; - } - return dscp >> 5; -} - -static u16 rtw_select_queue(struct net_device *dev, struct sk_buff *skb, - void *accel_priv, - select_queue_fallback_t fallback) -{ - struct rtw_adapter *padapter = netdev_priv(dev); - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - - skb->priority = rtw_classify8021d(skb); - - if (pmlmepriv->acm_mask != 0) - skb->priority = qos_acm23a(pmlmepriv->acm_mask, skb->priority); - return rtw_1d_to_queue[skb->priority]; -} - -u16 rtw_recv_select_queue23a(struct sk_buff *skb) -{ - struct iphdr *piphdr; - struct ethhdr *eth = (struct ethhdr *)skb->data; - unsigned int dscp; - u16 eth_type = get_unaligned_be16(ð->h_proto); - u32 priority; - u8 *pdata = skb->data; - - switch (eth_type) { - case ETH_P_IP: - piphdr = (struct iphdr *)(pdata + ETH_HLEN); - dscp = piphdr->tos & 0xfc; - priority = dscp >> 5; - break; - default: - priority = 0; - } - return rtw_1d_to_queue[priority]; -} - -static const struct net_device_ops rtw_netdev_ops = { - .ndo_open = netdev_open23a, - .ndo_stop = netdev_close, - .ndo_start_xmit = rtw_xmit23a_entry23a, - .ndo_select_queue = rtw_select_queue, - .ndo_set_mac_address = rtw_net_set_mac_address, - .ndo_get_stats = rtw_net_get_stats, -}; - -int rtw_init_netdev23a_name23a(struct net_device *pnetdev, const char *ifname) -{ - if (dev_alloc_name(pnetdev, ifname) < 0) { - RT_TRACE(_module_os_intfs_c_, _drv_err_, - "dev_alloc_name, fail!\n"); - } - netif_carrier_off(pnetdev); - return 0; -} - -static const struct device_type wlan_type = { - .name = "wlan", -}; - -struct net_device *rtw_init_netdev23a(struct rtw_adapter *old_padapter) -{ - struct rtw_adapter *padapter; - struct net_device *pnetdev; - - RT_TRACE(_module_os_intfs_c_, _drv_info_, "+init_net_dev\n"); - - pnetdev = alloc_etherdev_mq(sizeof(struct rtw_adapter), 4); - if (!pnetdev) - return NULL; - - pnetdev->dev.type = &wlan_type; - padapter = netdev_priv(pnetdev); - padapter->pnetdev = pnetdev; - - DBG_8723A("register rtw_netdev_ops to netdev_ops\n"); - pnetdev->netdev_ops = &rtw_netdev_ops; - - pnetdev->watchdog_timeo = HZ*3; /* 3 second timeout */ - - loadparam(padapter, pnetdev); - return pnetdev; -} - -static int rtw_init_default_value(struct rtw_adapter *padapter) -{ - struct registry_priv *pregistrypriv = &padapter->registrypriv; - struct xmit_priv *pxmitpriv = &padapter->xmitpriv; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct security_priv *psecuritypriv = &padapter->securitypriv; - - /* xmit_priv */ - pxmitpriv->vcs = pregistrypriv->vcs_type; - /* pxmitpriv->rts_thresh = pregistrypriv->rts_thresh; */ - pxmitpriv->frag_len = pregistrypriv->frag_thresh; - - /* mlme_priv */ - pmlmepriv->scan_interval = SCAN_INTERVAL;/* 30*2 sec = 60sec */ - pmlmepriv->scan_mode = SCAN_ACTIVE; - - /* ht_priv */ - pmlmepriv->htpriv.ampdu_enable = false;/* set to disabled */ - - /* security_priv */ - psecuritypriv->binstallGrpkey = 0; - - /* open system */ - psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_Open; - psecuritypriv->dot11PrivacyAlgrthm = 0; - - psecuritypriv->dot11PrivacyKeyIndex = 0; - - psecuritypriv->dot118021XGrpPrivacy = 0; - psecuritypriv->dot118021XGrpKeyid = 1; - - psecuritypriv->ndisauthtype = Ndis802_11AuthModeOpen; - psecuritypriv->ndisencryptstatus = Ndis802_11WEPDisabled; - - /* registry_priv */ - rtw_init_registrypriv_dev_network23a(padapter); - rtw_update_registrypriv_dev_network23a(padapter); - - /* hal_priv */ - rtl8723a_init_default_value(padapter); - - /* misc. */ - padapter->bReadPortCancel = false; - padapter->bWritePortCancel = false; - return _SUCCESS; -} - -int rtw_reset_drv_sw23a(struct rtw_adapter *padapter) -{ - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct pwrctrl_priv *pwrctrlpriv = &padapter->pwrctrlpriv; - - /* hal_priv */ - rtl8723a_init_default_value(padapter); - padapter->bReadPortCancel = false; - padapter->bWritePortCancel = false; - pmlmepriv->scan_interval = SCAN_INTERVAL;/* 30*2 sec = 60sec */ - - padapter->xmitpriv.tx_pkts = 0; - padapter->recvpriv.rx_pkts = 0; - - pmlmepriv->LinkDetectInfo.bBusyTraffic = false; - - _clr_fwstate_(pmlmepriv, _FW_UNDER_SURVEY | _FW_UNDER_LINKING); - - rtw_sreset_reset_value(padapter); - pwrctrlpriv->pwr_state_check_cnts = 0; - - /* mlmeextpriv */ - padapter->mlmeextpriv.sitesurvey_res.state = SCAN_DISABLE; - - rtw_set_signal_stat_timer(&padapter->recvpriv); - return _SUCCESS; -} - -int rtw_init_drv_sw23a(struct rtw_adapter *padapter) -{ - int ret8 = _SUCCESS; - - RT_TRACE(_module_os_intfs_c_, _drv_info_, "+rtw_init_drv_sw23a\n"); - - if (rtw_init_cmd_priv23a(&padapter->cmdpriv) == _FAIL) { - RT_TRACE(_module_os_intfs_c_, _drv_err_, - "Can't init cmd_priv\n"); - ret8 = _FAIL; - goto exit; - } - - padapter->cmdpriv.padapter = padapter; - - if (rtw_init_evt_priv23a(&padapter->evtpriv) == _FAIL) { - RT_TRACE(_module_os_intfs_c_, _drv_err_, - "Can't init evt_priv\n"); - ret8 = _FAIL; - goto exit; - } - - if (rtw_init_mlme_priv23a(padapter) == _FAIL) { - RT_TRACE(_module_os_intfs_c_, _drv_err_, - "Can't init mlme_priv\n"); - ret8 = _FAIL; - goto exit; - } - - - if (init_mlme_ext_priv23a(padapter) == _FAIL) { - RT_TRACE(_module_os_intfs_c_, _drv_err_, - "Can't init mlme_ext_priv\n"); - ret8 = _FAIL; - goto exit; - } - - if (_rtw_init_xmit_priv23a(&padapter->xmitpriv, padapter) == _FAIL) { - DBG_8723A("Can't _rtw_init_xmit_priv23a\n"); - ret8 = _FAIL; - goto exit; - } - - if (_rtw_init_recv_priv23a(&padapter->recvpriv, padapter) == _FAIL) { - DBG_8723A("Can't _rtw_init_recv_priv23a\n"); - ret8 = _FAIL; - goto exit; - } - - if (_rtw_init_sta_priv23a(&padapter->stapriv) == _FAIL) { - DBG_8723A("Can't _rtw_init_sta_priv23a\n"); - ret8 = _FAIL; - goto exit; - } - - padapter->stapriv.padapter = padapter; - padapter->setband = GHZ24_50; - rtw_init_bcmc_stainfo23a(padapter); - - rtw_init_pwrctrl_priv23a(padapter); - - ret8 = rtw_init_default_value(padapter); - - rtl8723a_init_dm_priv(padapter); - - rtw_sreset_init(padapter); - -exit: - - RT_TRACE(_module_os_intfs_c_, _drv_info_, "-rtw_init_drv_sw23a\n"); - return ret8; -} - -void rtw_cancel_all_timer23a(struct rtw_adapter *padapter) -{ - RT_TRACE(_module_os_intfs_c_, _drv_info_, - "+rtw_cancel_all_timer23a\n"); - - del_timer_sync(&padapter->mlmepriv.assoc_timer); - RT_TRACE(_module_os_intfs_c_, _drv_info_, - "%s:cancel association timer complete!\n", __func__); - - del_timer_sync(&padapter->mlmepriv.scan_to_timer); - RT_TRACE(_module_os_intfs_c_, _drv_info_, - "%s:cancel scan_to_timer!\n", __func__); - - del_timer_sync(&padapter->mlmepriv.dynamic_chk_timer); - RT_TRACE(_module_os_intfs_c_, _drv_info_, - "%s:cancel dynamic_chk_timer!\n", __func__); - - del_timer_sync(&padapter->pwrctrlpriv.pwr_state_check_timer); - - del_timer_sync(&padapter->mlmepriv.set_scan_deny_timer); - rtw_clear_scan_deny(padapter); - RT_TRACE(_module_os_intfs_c_, _drv_info_, - "%s:cancel set_scan_deny_timer!\n", __func__); - - del_timer_sync(&padapter->recvpriv.signal_stat_timer); -} - -int rtw_free_drv_sw23a(struct rtw_adapter *padapter) -{ - RT_TRACE(_module_os_intfs_c_, _drv_info_, "==>rtw_free_drv_sw23a\n"); - - free_mlme_ext_priv23a(&padapter->mlmeextpriv); - - rtw_free_evt_priv23a(&padapter->evtpriv); - - rtw_free_mlme_priv23a(&padapter->mlmepriv); - - _rtw_free_xmit_priv23a(&padapter->xmitpriv); - - /* will free bcmc_stainfo here */ - _rtw_free_sta_priv23a(&padapter->stapriv); - - _rtw_free_recv_priv23a(&padapter->recvpriv); - - rtw_free_pwrctrl_priv(padapter); - - kfree(padapter->HalData); - padapter->HalData = NULL; - - RT_TRACE(_module_os_intfs_c_, _drv_info_, "-rtw_free_drv_sw23a\n"); - return _SUCCESS; -} - -static int _rtw_drv_register_netdev(struct rtw_adapter *padapter, char *name) -{ - struct net_device *pnetdev = padapter->pnetdev; - int ret = _SUCCESS; - - /* alloc netdev name */ - rtw_init_netdev23a_name23a(pnetdev, name); - - ether_addr_copy(pnetdev->dev_addr, padapter->eeprompriv.mac_addr); - - /* Tell the network stack we exist */ - if (register_netdev(pnetdev)) { - DBG_8723A("%s(%s): Failed!\n", __func__, pnetdev->name); - ret = _FAIL; - goto error_register_netdev; - } - DBG_8723A("%s, MAC Address (if%d) = %pM\n", - __func__, padapter->iface_id + 1, pnetdev->dev_addr); - return ret; - -error_register_netdev: - - if (padapter->iface_id > IFACE_ID0) { - rtw_free_drv_sw23a(padapter); - - free_netdev(pnetdev); - } - return ret; -} - -int rtw_drv_register_netdev(struct rtw_adapter *if1) -{ - struct dvobj_priv *dvobj = if1->dvobj; - int i, status = _SUCCESS; - - if (dvobj->iface_nums >= IFACE_ID_MAX) { - status = _FAIL; /* -EINVAL */ - goto exit; - } - - for (i = 0; i < dvobj->iface_nums; i++) { - struct rtw_adapter *padapter = dvobj->padapters[i]; - - if (padapter) { - char *name; - - if (padapter->iface_id == IFACE_ID0) - name = if1->registrypriv.ifname; - else if (padapter->iface_id == IFACE_ID1) - name = if1->registrypriv.if2name; - else - name = "wlan%d"; - status = _rtw_drv_register_netdev(padapter, name); - if (status != _SUCCESS) - break; - } - } - -exit: - return status; -} - -int netdev_open23a(struct net_device *pnetdev) -{ - struct rtw_adapter *padapter = netdev_priv(pnetdev); - struct pwrctrl_priv *pwrctrlpriv; - int ret = 0; - int status; - - RT_TRACE(_module_os_intfs_c_, _drv_info_, "+871x_drv - dev_open\n"); - DBG_8723A("+871x_drv - drv_open, bup =%d\n", padapter->bup); - - mutex_lock(&adapter_to_dvobj(padapter)->hw_init_mutex); - - pwrctrlpriv = &padapter->pwrctrlpriv; - - if (!padapter->bup) { - padapter->bDriverStopped = false; - padapter->bSurpriseRemoved = false; - padapter->bCardDisableWOHSM = false; - - status = rtl8723au_hal_init(padapter); - if (status == _FAIL) { - RT_TRACE(_module_os_intfs_c_, _drv_err_, - "rtl871x_hal_init(): Can't init h/w!\n"); - goto netdev_open23a_error; - } - - DBG_8723A("MAC Address = %pM\n", pnetdev->dev_addr); - - if (init_hw_mlme_ext23a(padapter) == _FAIL) { - DBG_8723A("can't init mlme_ext_priv\n"); - goto netdev_open23a_error; - } - - rtl8723au_inirp_init(padapter); - - rtw_cfg80211_init_wiphy(padapter); - - padapter->bup = true; - } - padapter->net_closed = false; - - mod_timer(&padapter->mlmepriv.dynamic_chk_timer, - jiffies + msecs_to_jiffies(2000)); - - padapter->pwrctrlpriv.bips_processing = false; - rtw_set_pwr_state_check_timer(&padapter->pwrctrlpriv); - - /* netif_carrier_on(pnetdev);call this func when - rtw23a_joinbss_event_cb return success */ - if (!rtw_netif_queue_stopped(pnetdev)) - netif_tx_start_all_queues(pnetdev); - else - netif_tx_wake_all_queues(pnetdev); - - RT_TRACE(_module_os_intfs_c_, _drv_info_, "-871x_drv - dev_open\n"); - DBG_8723A("-871x_drv - drv_open, bup =%d\n", padapter->bup); -exit: - mutex_unlock(&adapter_to_dvobj(padapter)->hw_init_mutex); - return ret; - -netdev_open23a_error: - padapter->bup = false; - - netif_carrier_off(pnetdev); - netif_tx_stop_all_queues(pnetdev); - - RT_TRACE(_module_os_intfs_c_, _drv_err_, - "-871x_drv - dev_open, fail!\n"); - DBG_8723A("-871x_drv - drv_open fail, bup =%d\n", padapter->bup); - - ret = -1; - goto exit; -} - -static int ips_netdrv_open(struct rtw_adapter *padapter) -{ - int status = _SUCCESS; - - padapter->net_closed = false; - DBG_8723A("===> %s.........\n", __func__); - - padapter->bDriverStopped = false; - padapter->bSurpriseRemoved = false; - padapter->bCardDisableWOHSM = false; - - status = rtl8723au_hal_init(padapter); - if (status == _FAIL) { - RT_TRACE(_module_os_intfs_c_, _drv_err_, - "ips_netdrv_open(): Can't init h/w!\n"); - goto netdev_open23a_error; - } - - rtl8723au_inirp_init(padapter); - - rtw_set_pwr_state_check_timer(&padapter->pwrctrlpriv); - mod_timer(&padapter->mlmepriv.dynamic_chk_timer, - jiffies + msecs_to_jiffies(5000)); - - return _SUCCESS; - -netdev_open23a_error: - /* padapter->bup = false; */ - DBG_8723A("-ips_netdrv_open - drv_open failure, bup =%d\n", - padapter->bup); - - return _FAIL; -} - -int rtw_ips_pwr_up23a(struct rtw_adapter *padapter) -{ - int result; - unsigned long start_time = jiffies; - - DBG_8723A("===> rtw_ips_pwr_up23a..............\n"); - rtw_reset_drv_sw23a(padapter); - - result = ips_netdrv_open(padapter); - - DBG_8723A("<=== rtw_ips_pwr_up23a.............. in %dms\n", - jiffies_to_msecs(jiffies - start_time)); - return result; -} - -void rtw_ips_pwr_down23a(struct rtw_adapter *padapter) -{ - unsigned long start_time = jiffies; - - DBG_8723A("===> rtw_ips_pwr_down23a...................\n"); - - padapter->bCardDisableWOHSM = true; - padapter->net_closed = true; - - rtw_ips_dev_unload23a(padapter); - padapter->bCardDisableWOHSM = false; - DBG_8723A("<=== rtw_ips_pwr_down23a..................... in %dms\n", - jiffies_to_msecs(jiffies - start_time)); -} - -void rtw_ips_dev_unload23a(struct rtw_adapter *padapter) -{ - rtl8723a_fifo_cleanup(padapter); - - rtl8723a_usb_intf_stop(padapter); - - /* s5. */ - if (!padapter->bSurpriseRemoved) - rtl8723au_hal_deinit(padapter); -} - -int pm_netdev_open23a(struct net_device *pnetdev, u8 bnormal) -{ - int status; - - if (bnormal) - status = netdev_open23a(pnetdev); - else - status = (_SUCCESS == ips_netdrv_open(netdev_priv(pnetdev))) ? - (0) : (-1); - - return status; -} - -static int netdev_close(struct net_device *pnetdev) -{ - struct rtw_adapter *padapter = netdev_priv(pnetdev); - - RT_TRACE(_module_os_intfs_c_, _drv_info_, "+871x_drv - drv_close\n"); - - padapter->net_closed = true; - - if (padapter->pwrctrlpriv.rf_pwrstate == rf_on) { - DBG_8723A("(2)871x_drv - drv_close, bup =%d, " - "hw_init_completed =%d\n", padapter->bup, - padapter->hw_init_completed); - - /* s1. */ - if (pnetdev) { - if (!rtw_netif_queue_stopped(pnetdev)) - netif_tx_stop_all_queues(pnetdev); - } - - /* s2. */ - LeaveAllPowerSaveMode23a(padapter); - rtw_disassoc_cmd23a(padapter, 500, false); - /* s2-2. indicate disconnect to os */ - rtw_indicate_disconnect23a(padapter); - /* s2-3. */ - rtw_free_assoc_resources23a(padapter, 1); - /* s2-4. */ - rtw_free_network_queue23a(padapter); - } - - rtw_scan_abort23a(padapter); - - RT_TRACE(_module_os_intfs_c_, _drv_info_, "-871x_drv - drv_close\n"); - DBG_8723A("-871x_drv - drv_close, bup =%d\n", padapter->bup); - - return 0; -} - -void rtw_ndev_destructor(struct net_device *ndev) -{ - DBG_8723A("%s(%s)\n", __func__, ndev->name); - kfree(ndev->ieee80211_ptr); - free_netdev(ndev); -} - -void _rtw_init_queue23a(struct rtw_queue *pqueue) -{ - INIT_LIST_HEAD(&pqueue->queue); - spin_lock_init(&pqueue->lock); -} diff --git a/drivers/staging/rtl8723au/os_dep/recv_linux.c b/drivers/staging/rtl8723au/os_dep/recv_linux.c deleted file mode 100644 index 084b506..0000000 --- a/drivers/staging/rtl8723au/os_dep/recv_linux.c +++ /dev/null @@ -1,165 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - ******************************************************************************/ -#define _RECV_OSDEP_C_ - -#include <osdep_service.h> -#include <drv_types.h> - -#include <wifi.h> -#include <recv_osdep.h> - -#include <osdep_intf.h> - -#include <usb_ops.h> - -void rtw_handle_tkip_mic_err23a(struct rtw_adapter *padapter, u8 bgroup) -{ - enum nl80211_key_type key_type = 0; - union iwreq_data wrqu; - struct iw_michaelmicfailure ev; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct security_priv *psecuritypriv = &padapter->securitypriv; - unsigned long cur_time; - - if (psecuritypriv->last_mic_err_time == 0) { - psecuritypriv->last_mic_err_time = jiffies; - } else { - cur_time = jiffies; - - if (cur_time - psecuritypriv->last_mic_err_time < 60*HZ) { - psecuritypriv->btkip_countermeasure = true; - psecuritypriv->last_mic_err_time = 0; - psecuritypriv->btkip_countermeasure_time = cur_time; - } else { - psecuritypriv->last_mic_err_time = jiffies; - } - } - - if (bgroup) - key_type |= NL80211_KEYTYPE_GROUP; - else - key_type |= NL80211_KEYTYPE_PAIRWISE; - - cfg80211_michael_mic_failure(padapter->pnetdev, - (u8 *)&pmlmepriv->assoc_bssid[0], - key_type, -1, NULL, GFP_ATOMIC); - - memset(&ev, 0x00, sizeof(ev)); - if (bgroup) - ev.flags |= IW_MICFAILURE_GROUP; - else - ev.flags |= IW_MICFAILURE_PAIRWISE; - - ev.src_addr.sa_family = ARPHRD_ETHER; - ether_addr_copy(ev.src_addr.sa_data, &pmlmepriv->assoc_bssid[0]); - - memset(&wrqu, 0x00, sizeof(wrqu)); - wrqu.data.length = sizeof(ev); -} - -int rtw_recv_indicatepkt23a(struct rtw_adapter *padapter, - struct recv_frame *precv_frame) -{ - struct recv_priv *precvpriv; - struct sk_buff *skb; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - - precvpriv = &padapter->recvpriv; - - skb = precv_frame->pkt; - if (!skb) { - RT_TRACE(_module_recv_osdep_c_, _drv_err_, - "rtw_recv_indicatepkt23a():skb == NULL!!!!\n"); - goto _recv_indicatepkt_drop; - } - - RT_TRACE(_module_recv_osdep_c_, _drv_info_, - "rtw_recv_indicatepkt23a():skb != NULL !!!\n"); - RT_TRACE(_module_recv_osdep_c_, _drv_info_, - "rtw_recv_indicatepkt23a():precv_frame->hdr.rx_data =%p\n", - precv_frame->pkt->data); - RT_TRACE(_module_recv_osdep_c_, _drv_info_, - "skb->head =%p skb->data =%p skb->tail =%p skb->end =%p skb->len =%d\n", - skb->head, skb->data, - skb_tail_pointer(skb), skb_end_pointer(skb), skb->len); - - if (check_fwstate(pmlmepriv, WIFI_AP_STATE) == true) { - struct sk_buff *pskb2 = NULL; - struct sta_info *psta = NULL; - struct sta_priv *pstapriv = &padapter->stapriv; - struct rx_pkt_attrib *pattrib = &precv_frame->attrib; - int bmcast = is_multicast_ether_addr(pattrib->dst); - - /* DBG_8723A("bmcast =%d\n", bmcast); */ - - if (!ether_addr_equal(pattrib->dst, - myid(&padapter->eeprompriv))) { - /* DBG_8723A("not ap psta =%p, addr =%pM\n", psta, pattrib->dst); */ - if (bmcast) { - psta = rtw_get_bcmc_stainfo23a(padapter); - pskb2 = skb_clone(skb, GFP_ATOMIC); - } else { - psta = rtw_get_stainfo23a(pstapriv, pattrib->dst); - } - - if (psta) { - struct net_device *pnetdev = padapter->pnetdev; - - /* DBG_8723A("directly forwarding to the rtw_xmit23a_entry23a\n"); */ - - /* skb->ip_summed = CHECKSUM_NONE; */ - skb->dev = pnetdev; - skb_set_queue_mapping(skb, rtw_recv_select_queue23a(skb)); - - rtw_xmit23a_entry23a(skb, pnetdev); - - if (bmcast) - skb = pskb2; - else - goto _recv_indicatepkt_end; - } - } else { /* to APself */ - /* DBG_8723A("to APSelf\n"); */ - } - } - - skb->ip_summed = CHECKSUM_NONE; - skb->dev = padapter->pnetdev; - skb->protocol = eth_type_trans(skb, padapter->pnetdev); - - netif_rx(skb); - -_recv_indicatepkt_end: - - precv_frame->pkt = NULL; /* pointers to NULL before rtw_free_recvframe23a() */ - - rtw_free_recvframe23a(precv_frame); - - RT_TRACE(_module_recv_osdep_c_, _drv_info_, - "rtw_recv_indicatepkt23a :after netif_rx!!!!\n"); - return _SUCCESS; - -_recv_indicatepkt_drop: - - rtw_free_recvframe23a(precv_frame); - return _FAIL; -} - -void rtw_init_recv_timer23a(struct recv_reorder_ctrl *preorder_ctrl) -{ - setup_timer(&preorder_ctrl->reordering_ctrl_timer, - rtw_reordering_ctrl_timeout_handler23a, - (unsigned long)preorder_ctrl); -} diff --git a/drivers/staging/rtl8723au/os_dep/usb_intf.c b/drivers/staging/rtl8723au/os_dep/usb_intf.c deleted file mode 100644 index cf83eff..0000000 --- a/drivers/staging/rtl8723au/os_dep/usb_intf.c +++ /dev/null @@ -1,627 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - ******************************************************************************/ -#define _HCI_INTF_C_ - -#include <osdep_service.h> -#include <drv_types.h> -#include <recv_osdep.h> -#include <xmit_osdep.h> -#include <hal_intf.h> -#include <rtw_version.h> -#include <osdep_intf.h> -#include <usb_ops.h> -#include <rtl8723a_hal.h> - -static int rtw_suspend(struct usb_interface *intf, pm_message_t message); -static int rtw_resume(struct usb_interface *intf); -static int rtw_drv_init(struct usb_interface *pusb_intf, - const struct usb_device_id *pdid); -static void rtw_disconnect(struct usb_interface *pusb_intf); - -#define USB_VENDER_ID_REALTEK 0x0BDA - -#define RTL8723A_USB_IDS \ - {USB_DEVICE_AND_INTERFACE_INFO(USB_VENDER_ID_REALTEK, 0x8724, \ - 0xff, 0xff, 0xff)}, /* 8723AU 1*1 */ \ - {USB_DEVICE_AND_INTERFACE_INFO(USB_VENDER_ID_REALTEK, 0x1724, \ - 0xff, 0xff, 0xff)}, /* 8723AU 1*1 */ \ - {USB_DEVICE_AND_INTERFACE_INFO(USB_VENDER_ID_REALTEK, 0x0724, \ - 0xff, 0xff, 0xff)}, /* 8723AU 1*1 */ - -static struct usb_device_id rtl8723a_usb_id_tbl[] = { - RTL8723A_USB_IDS - {} /* Terminating entry */ -}; - -MODULE_DEVICE_TABLE(usb, rtl8723a_usb_id_tbl); - -static struct usb_driver rtl8723a_usb_drv = { - .name = (char *)"rtl8723au", - .probe = rtw_drv_init, - .disconnect = rtw_disconnect, - .id_table = rtl8723a_usb_id_tbl, - .suspend = rtw_suspend, - .resume = rtw_resume, - .reset_resume = rtw_resume, -}; - -static struct usb_driver *usb_drv = &rtl8723a_usb_drv; - -static int rtw_init_intf_priv(struct dvobj_priv *dvobj) -{ - mutex_init(&dvobj->usb_vendor_req_mutex); - - return _SUCCESS; -} - -static int rtw_deinit_intf_priv(struct dvobj_priv *dvobj) -{ - mutex_destroy(&dvobj->usb_vendor_req_mutex); - - return _SUCCESS; -} - -static struct dvobj_priv *usb_dvobj_init(struct usb_interface *usb_intf) -{ - struct dvobj_priv *pdvobjpriv; - struct usb_host_config *phost_conf; - struct usb_config_descriptor *pconf_desc; - struct usb_host_interface *phost_iface; - struct usb_interface_descriptor *piface_desc; - struct usb_endpoint_descriptor *pendp_desc; - struct usb_device *pusbd; - int i, status = _FAIL; - - pdvobjpriv = kzalloc(sizeof(*pdvobjpriv), GFP_KERNEL); - if (!pdvobjpriv) - goto exit; - - mutex_init(&pdvobjpriv->hw_init_mutex); - mutex_init(&pdvobjpriv->h2c_fwcmd_mutex); - mutex_init(&pdvobjpriv->setch_mutex); - mutex_init(&pdvobjpriv->setbw_mutex); - - pdvobjpriv->pusbintf = usb_intf; - pusbd = interface_to_usbdev(usb_intf); - pdvobjpriv->pusbdev = pusbd; - usb_set_intfdata(usb_intf, pdvobjpriv); - - pdvobjpriv->RtNumInPipes = 0; - pdvobjpriv->RtNumOutPipes = 0; - - phost_conf = pusbd->actconfig; - pconf_desc = &phost_conf->desc; - - phost_iface = &usb_intf->altsetting[0]; - piface_desc = &phost_iface->desc; - - pdvobjpriv->NumInterfaces = pconf_desc->bNumInterfaces; - pdvobjpriv->InterfaceNumber = piface_desc->bInterfaceNumber; - pdvobjpriv->nr_endpoint = piface_desc->bNumEndpoints; - - for (i = 0; i < pdvobjpriv->nr_endpoint; i++) { - pendp_desc = &phost_iface->endpoint[i].desc; - - DBG_8723A("\nusb_endpoint_descriptor(%d):\n", i); - DBG_8723A("bLength =%x\n", pendp_desc->bLength); - DBG_8723A("bDescriptorType =%x\n", pendp_desc->bDescriptorType); - DBG_8723A("bEndpointAddress =%x\n", - pendp_desc->bEndpointAddress); - DBG_8723A("wMaxPacketSize =%d\n", - le16_to_cpu(pendp_desc->wMaxPacketSize)); - DBG_8723A("bInterval =%x\n", pendp_desc->bInterval); - - if (usb_endpoint_is_bulk_in(pendp_desc)) { - DBG_8723A("usb_endpoint_is_bulk_in = %x\n", - usb_endpoint_num(pendp_desc)); - pdvobjpriv->RtInPipe[pdvobjpriv->RtNumInPipes] = - usb_endpoint_num(pendp_desc); - pdvobjpriv->RtNumInPipes++; - } else if (usb_endpoint_is_int_in(pendp_desc)) { - DBG_8723A("usb_endpoint_is_int_in = %x, Interval = " - "%x\n", usb_endpoint_num(pendp_desc), - pendp_desc->bInterval); - pdvobjpriv->RtInPipe[pdvobjpriv->RtNumInPipes] = - usb_endpoint_num(pendp_desc); - pdvobjpriv->RtNumInPipes++; - } else if (usb_endpoint_is_bulk_out(pendp_desc)) { - DBG_8723A("usb_endpoint_is_bulk_out = %x\n", - usb_endpoint_num(pendp_desc)); - pdvobjpriv->RtOutPipe[pdvobjpriv->RtNumOutPipes] = - usb_endpoint_num(pendp_desc); - pdvobjpriv->RtNumOutPipes++; - } - pdvobjpriv->ep_num[i] = usb_endpoint_num(pendp_desc); - } - DBG_8723A("nr_endpoint =%d, in_num =%d, out_num =%d\n\n", - pdvobjpriv->nr_endpoint, pdvobjpriv->RtNumInPipes, - pdvobjpriv->RtNumOutPipes); - - if (pusbd->speed == USB_SPEED_HIGH) { - pdvobjpriv->ishighspeed = true; - DBG_8723A("USB_SPEED_HIGH\n"); - } else { - pdvobjpriv->ishighspeed = false; - DBG_8723A("NON USB_SPEED_HIGH\n"); - } - - if (rtw_init_intf_priv(pdvobjpriv) == _FAIL) { - RT_TRACE(_module_os_intfs_c_, _drv_err_, - "Can't INIT rtw_init_intf_priv\n"); - goto free_dvobj; - } - /* 3 misc */ - rtw_reset_continual_urb_error(pdvobjpriv); - usb_get_dev(pusbd); - status = _SUCCESS; -free_dvobj: - if (status != _SUCCESS && pdvobjpriv) { - usb_set_intfdata(usb_intf, NULL); - mutex_destroy(&pdvobjpriv->hw_init_mutex); - mutex_destroy(&pdvobjpriv->h2c_fwcmd_mutex); - mutex_destroy(&pdvobjpriv->setch_mutex); - mutex_destroy(&pdvobjpriv->setbw_mutex); - kfree(pdvobjpriv); - pdvobjpriv = NULL; - } -exit: - return pdvobjpriv; -} - -static void usb_dvobj_deinit(struct usb_interface *usb_intf) -{ - struct dvobj_priv *dvobj = usb_get_intfdata(usb_intf); - - usb_set_intfdata(usb_intf, NULL); - if (dvobj) { - /* Modify condition for 92DU DMDP 2010.11.18, by Thomas */ - if ((dvobj->NumInterfaces != 2 && dvobj->NumInterfaces != 3) || - (dvobj->InterfaceNumber == 1)) { - if (interface_to_usbdev(usb_intf)->state != - USB_STATE_NOTATTACHED) { - /* If we didn't unplug usb dongle and - * remove/insert module, driver fails on - * sitesurvey for the first time when - * device is up . - * Reset usb port for sitesurvey fail issue. - */ - DBG_8723A("usb attached..., try to reset usb device\n"); - usb_reset_device(interface_to_usbdev(usb_intf)); - } - } - rtw_deinit_intf_priv(dvobj); - mutex_destroy(&dvobj->hw_init_mutex); - mutex_destroy(&dvobj->h2c_fwcmd_mutex); - mutex_destroy(&dvobj->setch_mutex); - mutex_destroy(&dvobj->setbw_mutex); - kfree(dvobj); - } - usb_put_dev(interface_to_usbdev(usb_intf)); -} - -void rtl8723a_usb_intf_stop(struct rtw_adapter *padapter) -{ - RT_TRACE(_module_hci_intfs_c_, _drv_err_, "+usb_intf_stop\n"); - - /* disable_hw_interrupt */ - if (!padapter->bSurpriseRemoved) { - /* device still exists, so driver can do i/o operation - * TODO: - */ - RT_TRACE(_module_hci_intfs_c_, _drv_err_, - "SurpriseRemoved == false\n"); - } - - /* cancel in irp */ - rtl8723au_inirp_deinit(padapter); - - /* cancel out irp */ - rtl8723au_write_port_cancel(padapter); - - /* todo:cancel other irps */ - RT_TRACE(_module_hci_intfs_c_, _drv_err_, "-usb_intf_stop\n"); -} - -static void rtw_dev_unload(struct rtw_adapter *padapter) -{ - struct submit_ctx *pack_tx_ops = &padapter->xmitpriv.ack_tx_ops; - - RT_TRACE(_module_hci_intfs_c_, _drv_err_, "+rtw_dev_unload\n"); - - if (padapter->bup) { - DBG_8723A("===> rtw_dev_unload\n"); - - padapter->bDriverStopped = true; - if (padapter->xmitpriv.ack_tx) - rtw23a_sctx_done_err(&pack_tx_ops, - RTW_SCTX_DONE_DRV_STOP); - - /* s3. */ - rtl8723a_usb_intf_stop(padapter); - - /* s4. */ - flush_workqueue(padapter->cmdpriv.wq); - - /* s5. */ - if (!padapter->bSurpriseRemoved) { - rtl8723au_hal_deinit(padapter); - padapter->bSurpriseRemoved = true; - } - padapter->bup = false; - } else { - RT_TRACE(_module_hci_intfs_c_, _drv_err_, - "r871x_dev_unload():padapter->bup == false\n"); - } - DBG_8723A("<=== rtw_dev_unload\n"); - RT_TRACE(_module_hci_intfs_c_, _drv_err_, "-rtw_dev_unload\n"); -} - -static int rtw_suspend(struct usb_interface *pusb_intf, pm_message_t message) -{ - struct dvobj_priv *dvobj = usb_get_intfdata(pusb_intf); - struct rtw_adapter *padapter = dvobj->if1; - struct net_device *pnetdev = padapter->pnetdev; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; - int ret = 0; - unsigned long start_time = jiffies; - - DBG_8723A("==> %s (%s:%d)\n", __func__, current->comm, current->pid); - - if ((!padapter->bup) || (padapter->bDriverStopped) || - (padapter->bSurpriseRemoved)) { - DBG_8723A("padapter->bup =%d bDriverStopped =%d bSurpriseRemoved = %d\n", - padapter->bup, padapter->bDriverStopped, - padapter->bSurpriseRemoved); - goto exit; - } - pwrpriv->bInSuspend = true; - rtw_cancel_all_timer23a(padapter); - LeaveAllPowerSaveMode23a(padapter); - - down(&pwrpriv->lock); - /* padapter->net_closed = true; */ - /* s1. */ - if (pnetdev) { - netif_carrier_off(pnetdev); - netif_tx_stop_all_queues(pnetdev); - } - - /* s2. */ - rtw_disassoc_cmd23a(padapter, 0, false); - - if (check_fwstate(pmlmepriv, WIFI_STATION_STATE) && - check_fwstate(pmlmepriv, _FW_LINKED)) { - DBG_8723A("%s:%d %s(%pM), length:%d assoc_ssid.length:%d\n", - __func__, __LINE__, - pmlmepriv->cur_network.network.Ssid.ssid, - pmlmepriv->cur_network.network.MacAddress, - pmlmepriv->cur_network.network.Ssid.ssid_len, - pmlmepriv->assoc_ssid.ssid_len); - - rtw_set_roaming(padapter, 1); - } - /* s2-2. indicate disconnect to os */ - rtw_indicate_disconnect23a(padapter); - /* s2-3. */ - rtw_free_assoc_resources23a(padapter, 1); - /* s2-4. */ - rtw_free_network_queue23a(padapter); - - rtw_dev_unload(padapter); - up(&pwrpriv->lock); - - if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY)) - rtw_cfg80211_indicate_scan_done( - wdev_to_priv(padapter->rtw_wdev), true); - - if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING)) - rtw_indicate_disconnect23a(padapter); - -exit: - DBG_8723A("<=== %s return %d.............. in %dms\n", __func__, - ret, jiffies_to_msecs(jiffies - start_time)); - - return ret; -} - -static int rtw_resume(struct usb_interface *pusb_intf) -{ - struct dvobj_priv *dvobj = usb_get_intfdata(pusb_intf); - struct rtw_adapter *padapter = dvobj->if1; - struct net_device *pnetdev; - struct pwrctrl_priv *pwrpriv = NULL; - int ret = -1; - unsigned long start_time = jiffies; - - DBG_8723A("==> %s (%s:%d)\n", __func__, current->comm, current->pid); - - if (!padapter) - goto exit; - pnetdev = padapter->pnetdev; - pwrpriv = &padapter->pwrctrlpriv; - - down(&pwrpriv->lock); - rtw_reset_drv_sw23a(padapter); - pwrpriv->bkeepfwalive = false; - - DBG_8723A("bkeepfwalive(%x)\n", pwrpriv->bkeepfwalive); - if (pm_netdev_open23a(pnetdev, true) != 0) { - up(&pwrpriv->lock); - goto exit; - } - - netif_device_attach(pnetdev); - netif_carrier_on(pnetdev); - - up(&pwrpriv->lock); - - if (padapter->pid[1] != 0) { - DBG_8723A("pid[1]:%d\n", padapter->pid[1]); - kill_pid(find_vpid(padapter->pid[1]), SIGUSR2, 1); - } - - rtw23a_roaming(padapter, NULL); - - ret = 0; -exit: - if (pwrpriv) - pwrpriv->bInSuspend = false; - DBG_8723A("<=== %s return %d.............. in %dms\n", __func__, - ret, jiffies_to_msecs(jiffies - start_time)); - - return ret; -} - -/* - * drv_init() - a device potentially for us - * - * notes: drv_init() is called when the bus driver has located a card - * for us to support. - * We accept the new device by returning 0. - */ -static struct rtw_adapter *rtw_usb_if1_init(struct dvobj_priv *dvobj, - struct usb_interface *pusb_intf, - const struct usb_device_id *pdid) -{ - struct rtw_adapter *padapter = NULL; - struct net_device *pnetdev = NULL; - int status = _FAIL; - - pnetdev = rtw_init_netdev23a(padapter); - if (!pnetdev) - goto free_adapter; - padapter = netdev_priv(pnetdev); - - padapter->dvobj = dvobj; - padapter->bDriverStopped = true; - dvobj->if1 = padapter; - dvobj->padapters[dvobj->iface_nums++] = padapter; - padapter->iface_id = IFACE_ID0; - - rtl8723au_set_hw_type(padapter); - - SET_NETDEV_DEV(pnetdev, dvobj_to_dev(dvobj)); - - if (rtw_wdev_alloc(padapter, dvobj_to_dev(dvobj))) - goto free_adapter; - - /* step 2. allocate HalData */ - padapter->HalData = kzalloc(sizeof(struct hal_data_8723a), GFP_KERNEL); - if (!padapter->HalData) - goto free_wdev; - - /* step read_chip_version */ - rtl8723a_read_chip_version(padapter); - - /* step usb endpoint mapping */ - if (!rtl8723au_chip_configure(padapter)) - goto free_hal_data; - - /* step read efuse/eeprom data and get mac_addr */ - rtl8723a_read_adapter_info(padapter); - - /* step 5. */ - if (rtw_init_drv_sw23a(padapter) == _FAIL) { - RT_TRACE(_module_hci_intfs_c_, _drv_err_, - "Initialize driver software resource Failed!\n"); - goto free_hal_data; - } - -#ifdef CONFIG_PM - if (padapter->pwrctrlpriv.bSupportRemoteWakeup) { - dvobj->pusbdev->do_remote_wakeup = 1; - pusb_intf->needs_remote_wakeup = 1; - device_init_wakeup(&pusb_intf->dev, 1); - DBG_8723A("\n padapter->pwrctrlpriv.bSupportRemoteWakeup~~~~~~\n"); - DBG_8723A("\n padapter->pwrctrlpriv.bSupportRemoteWakeup~~~[%d]~~~\n", - device_may_wakeup(&pusb_intf->dev)); - } -#endif - /* 2012-07-11 Move here to prevent the 8723AS-VAU BT - * auto suspend influence - */ - if (usb_autopm_get_interface(pusb_intf) < 0) - DBG_8723A("can't get autopm:\n"); -#ifdef CONFIG_8723AU_BT_COEXIST - padapter->pwrctrlpriv.autopm_cnt = 1; -#endif - - /* If the eeprom mac address is corrupted, assign a random address */ - if (is_broadcast_ether_addr(padapter->eeprompriv.mac_addr) || - is_zero_ether_addr(padapter->eeprompriv.mac_addr)) - eth_random_addr(padapter->eeprompriv.mac_addr); - - DBG_8723A("bDriverStopped:%d, bSurpriseRemoved:%d, bup:%d, hw_init_completed:%d\n", - padapter->bDriverStopped, padapter->bSurpriseRemoved, - padapter->bup, padapter->hw_init_completed - ); - status = _SUCCESS; - -free_hal_data: - if (status != _SUCCESS) - kfree(padapter->HalData); -free_wdev: - if (status != _SUCCESS) { - rtw_wdev_unregister(padapter->rtw_wdev); - rtw_wdev_free(padapter->rtw_wdev); - } -free_adapter: - if (status != _SUCCESS) { - if (pnetdev) - free_netdev(pnetdev); - padapter = NULL; - } - return padapter; -} - -static void rtw_usb_if1_deinit(struct rtw_adapter *if1) -{ - struct net_device *pnetdev = if1->pnetdev; - struct mlme_priv *pmlmepriv = &if1->mlmepriv; - - if (check_fwstate(pmlmepriv, _FW_LINKED)) - rtw_disassoc_cmd23a(if1, 0, false); - -#ifdef CONFIG_8723AU_AP_MODE - free_mlme_ap_info23a(if1); -#endif - - if (pnetdev) - unregister_netdev(pnetdev); /* will call netdev_close() */ - - rtw_cancel_all_timer23a(if1); - - rtw_dev_unload(if1); - - DBG_8723A("+r871xu_dev_remove, hw_init_completed =%d\n", - if1->hw_init_completed); - - if (if1->rtw_wdev) { - rtw_wdev_unregister(if1->rtw_wdev); - rtw_wdev_free(if1->rtw_wdev); - } - -#ifdef CONFIG_8723AU_BT_COEXIST - if (1 == if1->pwrctrlpriv.autopm_cnt) { - usb_autopm_put_interface(adapter_to_dvobj(if1)->pusbintf); - if1->pwrctrlpriv.autopm_cnt--; - } -#endif - - rtw_free_drv_sw23a(if1); - - if (pnetdev) - free_netdev(pnetdev); -} - -static int rtw_drv_init(struct usb_interface *pusb_intf, - const struct usb_device_id *pdid) -{ - struct rtw_adapter *if1 = NULL; - struct dvobj_priv *dvobj; - struct usb_device *udev; - int status = _FAIL; - - RT_TRACE(_module_hci_intfs_c_, _drv_err_, "+rtw_drv_init\n"); - - /* Initialize dvobj_priv */ - dvobj = usb_dvobj_init(pusb_intf); - if (!dvobj) { - RT_TRACE(_module_hci_intfs_c_, _drv_err_, - "initialize device object priv Failed!\n"); - goto exit; - } - - udev = dvobj->pusbdev; - dev_warn(&udev->dev, "WARNING: The rtl8723au driver is deprecated!"); - dev_warn(&udev->dev, "Please use the rtl8xxxu driver for this device!"); - - if1 = rtw_usb_if1_init(dvobj, pusb_intf, pdid); - if (!if1) { - DBG_8723A("rtw_init_primary_adapter Failed!\n"); - goto free_dvobj; - } - - /* dev_alloc_name && register_netdev */ - status = rtw_drv_register_netdev(if1); - if (status != _SUCCESS) - goto free_if1; - RT_TRACE(_module_hci_intfs_c_, _drv_err_, - "-871x_drv - drv_init, success!\n"); - - status = _SUCCESS; - -free_if1: - if (status != _SUCCESS && if1) - rtw_usb_if1_deinit(if1); -free_dvobj: - if (status != _SUCCESS) - usb_dvobj_deinit(pusb_intf); -exit: - return status == _SUCCESS ? 0 : -ENODEV; -} - -/* dev_remove() - our device is being removed */ -static void rtw_disconnect(struct usb_interface *pusb_intf) -{ - struct dvobj_priv *dvobj; - struct rtw_adapter *padapter; - struct net_device *pnetdev; - struct mlme_priv *pmlmepriv; - - dvobj = usb_get_intfdata(pusb_intf); - if (!dvobj) - return; - - padapter = dvobj->if1; - pnetdev = padapter->pnetdev; - pmlmepriv = &padapter->mlmepriv; - - usb_set_intfdata(pusb_intf, NULL); - - RT_TRACE(_module_hci_intfs_c_, _drv_err_, "+dev_remove()\n"); - - rtw_pm_set_ips23a(padapter, IPS_NONE); - rtw_pm_set_lps23a(padapter, PS_MODE_ACTIVE); - - LeaveAllPowerSaveMode23a(padapter); - - rtw_usb_if1_deinit(padapter); - - usb_dvobj_deinit(pusb_intf); - - RT_TRACE(_module_hci_intfs_c_, _drv_err_, "-dev_remove()\n"); - DBG_8723A("-r871xu_dev_remove, done\n"); -} - -static int __init rtw_drv_entry(void) -{ - RT_TRACE(_module_hci_intfs_c_, _drv_err_, "+rtw_drv_entry\n"); - return usb_register(usb_drv); -} - -static void __exit rtw_drv_halt(void) -{ - RT_TRACE(_module_hci_intfs_c_, _drv_err_, "+rtw_drv_halt\n"); - DBG_8723A("+rtw_drv_halt\n"); - - usb_deregister(usb_drv); - - DBG_8723A("-rtw_drv_halt\n"); -} - -module_init(rtw_drv_entry); -module_exit(rtw_drv_halt); diff --git a/drivers/staging/rtl8723au/os_dep/usb_ops_linux.c b/drivers/staging/rtl8723au/os_dep/usb_ops_linux.c deleted file mode 100644 index cf4a506..0000000 --- a/drivers/staging/rtl8723au/os_dep/usb_ops_linux.c +++ /dev/null @@ -1,233 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - ******************************************************************************/ -#define _USB_OPS_LINUX_C_ - -#include <drv_types.h> -#include <usb_ops_linux.h> -#include <rtw_sreset.h> - -void rtl8723au_read_port_cancel(struct rtw_adapter *padapter) -{ - struct recv_buf *precvbuf; - int i; - - precvbuf = (struct recv_buf *)padapter->recvpriv.precv_buf; - - DBG_8723A("%s\n", __func__); - - padapter->bReadPortCancel = true; - - for (i = 0; i < NR_RECVBUFF ; i++) { - if (precvbuf->purb) - usb_kill_urb(precvbuf->purb); - precvbuf++; - } - usb_kill_urb(padapter->recvpriv.int_in_urb); -} - -static void usb_write_port23a_complete(struct urb *purb) -{ - struct xmit_buf *pxmitbuf = (struct xmit_buf *)purb->context; - struct rtw_adapter *padapter = pxmitbuf->padapter; - struct xmit_priv *pxmitpriv = &padapter->xmitpriv; - struct hal_data_8723a *phaldata; - unsigned long irqL; - - switch (pxmitbuf->flags) { - case HIGH_QUEUE_INX: -#ifdef CONFIG_8723AU_AP_MODE - rtw_chk_hi_queue_cmd23a(padapter); -#endif - break; - default: - break; - } - - if (padapter->bSurpriseRemoved || padapter->bDriverStopped || - padapter->bWritePortCancel) { - RT_TRACE(_module_hci_ops_os_c_, _drv_err_, - "usb_write_port23a_complete:bDriverStopped(%d) OR bSurpriseRemoved(%d)\n", - padapter->bDriverStopped, padapter->bSurpriseRemoved); - DBG_8723A("%s(): TX Warning! bDriverStopped(%d) OR " - "bSurpriseRemoved(%d) bWritePortCancel(%d) " - "pxmitbuf->ext_tag(%x)\n", __func__, - padapter->bDriverStopped, padapter->bSurpriseRemoved, - padapter->bReadPortCancel, pxmitbuf->ext_tag); - - goto check_completion; - } - - if (purb->status) { - RT_TRACE(_module_hci_ops_os_c_, _drv_err_, - "usb_write_port23a_complete : purb->status(%d) != 0\n", - purb->status); - DBG_8723A("###=> urb_write_port_complete status(%d)\n", - purb->status); - if (purb->status == -EPIPE || purb->status == -EPROTO) { - } else if (purb->status == -EINPROGRESS) { - RT_TRACE(_module_hci_ops_os_c_, _drv_err_, - "usb_write_port23a_complete: EINPROGESS\n"); - goto check_completion; - } else if (purb->status == -ENOENT) { - DBG_8723A("%s: -ENOENT\n", __func__); - goto check_completion; - } else if (purb->status == -ECONNRESET) { - DBG_8723A("%s: -ECONNRESET\n", __func__); - goto check_completion; - } else if (purb->status == -ESHUTDOWN) { - RT_TRACE(_module_hci_ops_os_c_, _drv_err_, - "usb_write_port23a_complete: ESHUTDOWN\n"); - padapter->bDriverStopped = true; - RT_TRACE(_module_hci_ops_os_c_, _drv_err_, - "usb_write_port23a_complete:bDriverStopped = true\n"); - goto check_completion; - } else { - padapter->bSurpriseRemoved = true; - DBG_8723A("bSurpriseRemoved = true\n"); - RT_TRACE(_module_hci_ops_os_c_, _drv_err_, - "usb_write_port23a_complete:bSurpriseRemoved = true\n"); - goto check_completion; - } - } - phaldata = GET_HAL_DATA(padapter); - phaldata->srestpriv.last_tx_complete_time = jiffies; - -check_completion: - spin_lock_irqsave(&pxmitpriv->lock_sctx, irqL); - rtw23a_sctx_done_err(&pxmitbuf->sctx, - purb->status ? RTW_SCTX_DONE_WRITE_PORT_ERR : - RTW_SCTX_DONE_SUCCESS); - spin_unlock_irqrestore(&pxmitpriv->lock_sctx, irqL); - - rtw_free_xmitbuf23a(pxmitpriv, pxmitbuf); - - tasklet_hi_schedule(&pxmitpriv->xmit_tasklet); -} - -int rtl8723au_write_port(struct rtw_adapter *padapter, u32 addr, u32 cnt, - struct xmit_buf *pxmitbuf) -{ - struct urb *purb = NULL; - struct dvobj_priv *pdvobj = adapter_to_dvobj(padapter); - struct xmit_priv *pxmitpriv = &padapter->xmitpriv; - struct xmit_frame *pxmitframe; - struct usb_device *pusbd = pdvobj->pusbdev; - unsigned long irqL; - unsigned int pipe, ep_num; - int status; - int ret = _FAIL; - - RT_TRACE(_module_hci_ops_os_c_, _drv_err_, "+usb_write_port23a\n"); - - if (padapter->bDriverStopped || padapter->bSurpriseRemoved) { - RT_TRACE(_module_hci_ops_os_c_, _drv_err_, - "%s:(padapter->bDriverStopped || padapter->bSurpriseRemoved)!!!\n", - __func__); - rtw23a_sctx_done_err(&pxmitbuf->sctx, RTW_SCTX_DONE_TX_DENY); - goto exit; - } - - pxmitframe = (struct xmit_frame *)pxmitbuf->priv_data; - spin_lock_irqsave(&pxmitpriv->lock, irqL); - - switch (addr) { - case VO_QUEUE_INX: - pxmitbuf->flags = VO_QUEUE_INX; - break; - case VI_QUEUE_INX: - pxmitbuf->flags = VI_QUEUE_INX; - break; - case BE_QUEUE_INX: - pxmitbuf->flags = BE_QUEUE_INX; - break; - case BK_QUEUE_INX: - pxmitbuf->flags = BK_QUEUE_INX; - break; - case HIGH_QUEUE_INX: - pxmitbuf->flags = HIGH_QUEUE_INX; - break; - default: - pxmitbuf->flags = MGT_QUEUE_INX; - break; - } - - spin_unlock_irqrestore(&pxmitpriv->lock, irqL); - - purb = pxmitbuf->pxmit_urb[0]; - - /* translate DMA FIFO addr to pipehandle */ - ep_num = pdvobj->Queue2Pipe[addr]; - pipe = usb_sndbulkpipe(pusbd, ep_num); - - usb_fill_bulk_urb(purb, pusbd, pipe, - pxmitframe->buf_addr, /* pxmitbuf->pbuf */ - cnt, usb_write_port23a_complete, - pxmitbuf);/* context is pxmitbuf */ - - status = usb_submit_urb(purb, GFP_ATOMIC); - if (!status) { - struct hal_data_8723a *phaldata = GET_HAL_DATA(padapter); - phaldata->srestpriv.last_tx_time = jiffies; - } else { - rtw23a_sctx_done_err(&pxmitbuf->sctx, - RTW_SCTX_DONE_WRITE_PORT_ERR); - DBG_8723A("usb_write_port23a, status =%d\n", status); - RT_TRACE(_module_hci_ops_os_c_, _drv_err_, - "usb_write_port23a(): usb_submit_urb, status =%x\n", - status); - - switch (status) { - case -ENODEV: - padapter->bDriverStopped = true; - break; - default: - break; - } - goto exit; - } - ret = _SUCCESS; - RT_TRACE(_module_hci_ops_os_c_, _drv_err_, "-usb_write_port23a\n"); - -exit: - if (ret != _SUCCESS) - rtw_free_xmitbuf23a(pxmitpriv, pxmitbuf); - - return ret; -} - -void rtl8723au_write_port_cancel(struct rtw_adapter *padapter) -{ - struct xmit_buf *pxmitbuf; - int j; - - DBG_8723A("%s\n", __func__); - - padapter->bWritePortCancel = true; - - list_for_each_entry(pxmitbuf, &padapter->xmitpriv.xmitbuf_list, - list2) { - for (j = 0; j < 8; j++) { - if (pxmitbuf->pxmit_urb[j]) - usb_kill_urb(pxmitbuf->pxmit_urb[j]); - } - } - list_for_each_entry(pxmitbuf, &padapter->xmitpriv.xmitextbuf_list, - list2) { - for (j = 0; j < 8; j++) { - if (pxmitbuf->pxmit_urb[j]) - usb_kill_urb(pxmitbuf->pxmit_urb[j]); - } - } -} diff --git a/drivers/staging/rtl8723au/os_dep/xmit_linux.c b/drivers/staging/rtl8723au/os_dep/xmit_linux.c deleted file mode 100644 index 64be72a..0000000 --- a/drivers/staging/rtl8723au/os_dep/xmit_linux.c +++ /dev/null @@ -1,154 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - ******************************************************************************/ -#define _XMIT_OSDEP_C_ - -#include <osdep_service.h> -#include <drv_types.h> - -#include <linux/if_ether.h> -#include <linux/ip.h> -#include <wifi.h> -#include <mlme_osdep.h> -#include <xmit_osdep.h> -#include <osdep_intf.h> - -int rtw_os_xmit_resource_alloc23a(struct rtw_adapter *padapter, - struct xmit_buf *pxmitbuf, u32 alloc_sz) -{ - int i; - - pxmitbuf->pallocated_buf = kzalloc(alloc_sz, GFP_KERNEL); - if (pxmitbuf->pallocated_buf == NULL) - return _FAIL; - - pxmitbuf->pbuf = PTR_ALIGN(pxmitbuf->pallocated_buf, XMITBUF_ALIGN_SZ); - - for (i = 0; i < 8; i++) { - pxmitbuf->pxmit_urb[i] = usb_alloc_urb(0, GFP_KERNEL); - if (!pxmitbuf->pxmit_urb[i]) { - DBG_8723A("pxmitbuf->pxmit_urb[i]==NULL"); - return _FAIL; - } - } - return _SUCCESS; -} - -void rtw_os_xmit_resource_free23a(struct rtw_adapter *padapter, - struct xmit_buf *pxmitbuf) -{ - int i; - - for (i = 0; i < 8; i++) - usb_free_urb(pxmitbuf->pxmit_urb[i]); - kfree(pxmitbuf->pallocated_buf); -} - -#define WMM_XMIT_THRESHOLD (NR_XMITFRAME*2/5) - -void rtw_os_pkt_complete23a(struct rtw_adapter *padapter, struct sk_buff *pkt) -{ - struct xmit_priv *pxmitpriv = &padapter->xmitpriv; - u16 queue; - - queue = skb_get_queue_mapping(pkt); - if (padapter->registrypriv.wifi_spec) { - if (__netif_subqueue_stopped(padapter->pnetdev, queue) && - (pxmitpriv->hwxmits[queue].accnt < WMM_XMIT_THRESHOLD)) - netif_wake_subqueue(padapter->pnetdev, queue); - } else { - if (__netif_subqueue_stopped(padapter->pnetdev, queue)) - netif_wake_subqueue(padapter->pnetdev, queue); - } - dev_kfree_skb_any(pkt); -} - -void rtw_os_xmit_complete23a(struct rtw_adapter *padapter, - struct xmit_frame *pxframe) -{ - if (pxframe->pkt) - rtw_os_pkt_complete23a(padapter, pxframe->pkt); - - pxframe->pkt = NULL; -} - -void rtw_os_xmit_schedule23a(struct rtw_adapter *padapter) -{ - struct xmit_priv *pxmitpriv; - - if (!padapter) - return; - pxmitpriv = &padapter->xmitpriv; - - spin_lock_bh(&pxmitpriv->lock); - - if (rtw_txframes_pending23a(padapter)) - tasklet_hi_schedule(&pxmitpriv->xmit_tasklet); - spin_unlock_bh(&pxmitpriv->lock); -} - -static void rtw_check_xmit_resource(struct rtw_adapter *padapter, - struct sk_buff *pkt) -{ - struct xmit_priv *pxmitpriv = &padapter->xmitpriv; - u16 queue; - - queue = skb_get_queue_mapping(pkt); - if (padapter->registrypriv.wifi_spec) { - /* No free space for Tx, tx_worker is too slow */ - if (pxmitpriv->hwxmits[queue].accnt > WMM_XMIT_THRESHOLD) - netif_stop_subqueue(padapter->pnetdev, queue); - } else { - if (pxmitpriv->free_xmitframe_cnt <= 4) { - if (!netif_tx_queue_stopped(netdev_get_tx_queue(padapter->pnetdev, queue))) - netif_stop_subqueue(padapter->pnetdev, queue); - } - } -} - -int rtw_xmit23a_entry23a(struct sk_buff *skb, struct net_device *pnetdev) -{ - struct rtw_adapter *padapter = netdev_priv(pnetdev); - struct xmit_priv *pxmitpriv = &padapter->xmitpriv; - int res = 0; - - RT_TRACE(_module_rtl871x_mlme_c_, _drv_info_, "+xmit_enry\n"); - - if (!rtw_if_up23a(padapter)) { - RT_TRACE(_module_xmit_osdep_c_, _drv_err_, - "rtw_xmit23a_entry23a: rtw_if_up23a fail\n"); - goto drop_packet; - } - - rtw_check_xmit_resource(padapter, skb); - - res = rtw_xmit23a(padapter, skb); - if (res < 0) - goto drop_packet; - - pxmitpriv->tx_pkts++; - RT_TRACE(_module_xmit_osdep_c_, _drv_info_, - "rtw_xmit23a_entry23a: tx_pkts=%d\n", - (u32)pxmitpriv->tx_pkts); - goto exit; - -drop_packet: - pxmitpriv->tx_drop++; - dev_kfree_skb_any(skb); - RT_TRACE(_module_xmit_osdep_c_, _drv_notice_, - "rtw_xmit23a_entry23a: drop, tx_drop=%d\n", - (u32)pxmitpriv->tx_drop); -exit: - return 0; -} |