mirror of
https://github.com/RinCat/RTL88x2BU-Linux-Driver.git
synced 2026-01-19 10:26:35 +00:00
Update to 5.6.1
This commit is contained in:
625
os_dep/linux/ioctl_cfg80211.c
Normal file → Executable file
625
os_dep/linux/ioctl_cfg80211.c
Normal file → Executable file
File diff suppressed because it is too large
Load Diff
@@ -15,11 +15,14 @@
|
||||
#ifndef __IOCTL_CFG80211_H__
|
||||
#define __IOCTL_CFG80211_H__
|
||||
|
||||
#ifndef RTW_CFG80211_ALWAYS_INFORM_STA_DISCONNECT_EVENT
|
||||
#define RTW_CFG80211_BLOCK_DISCON_WHEN_CONNECT BIT0
|
||||
#define RTW_CFG80211_BLOCK_DISCON_WHEN_DISCONNECT BIT1
|
||||
|
||||
#ifndef RTW_CFG80211_BLOCK_STA_DISCON_EVENT
|
||||
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0))
|
||||
#define RTW_CFG80211_ALWAYS_INFORM_STA_DISCONNECT_EVENT 1
|
||||
#define RTW_CFG80211_BLOCK_STA_DISCON_EVENT (RTW_CFG80211_BLOCK_DISCON_WHEN_CONNECT)
|
||||
#else
|
||||
#define RTW_CFG80211_ALWAYS_INFORM_STA_DISCONNECT_EVENT 0
|
||||
#define RTW_CFG80211_BLOCK_STA_DISCON_EVENT (RTW_CFG80211_BLOCK_DISCON_WHEN_CONNECT | RTW_CFG80211_BLOCK_DISCON_WHEN_DISCONNECT)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@@ -139,7 +142,7 @@ struct rtw_wdev_priv {
|
||||
|
||||
_adapter *padapter;
|
||||
|
||||
#if !RTW_CFG80211_ALWAYS_INFORM_STA_DISCONNECT_EVENT
|
||||
#if RTW_CFG80211_BLOCK_STA_DISCON_EVENT
|
||||
u8 not_indic_disco;
|
||||
#endif
|
||||
|
||||
@@ -177,16 +180,27 @@ struct rtw_wdev_priv {
|
||||
ATOMIC_T switch_ch_to;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_RTW_CFGVENDOR_RANDOM_MAC_OUI
|
||||
u8 pno_mac_addr[ETH_ALEN];
|
||||
u16 pno_scan_seq_num;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_RTW_CFGVEDNOR_RSSIMONITOR
|
||||
s8 rssi_monitor_max;
|
||||
s8 rssi_monitor_min;
|
||||
u8 rssi_monitor_enable;
|
||||
#endif
|
||||
|
||||
};
|
||||
|
||||
bool rtw_cfg80211_is_connect_requested(_adapter *adapter);
|
||||
|
||||
#if RTW_CFG80211_ALWAYS_INFORM_STA_DISCONNECT_EVENT
|
||||
#define rtw_wdev_not_indic_disco(rtw_wdev_data) 0
|
||||
#define rtw_wdev_set_not_indic_disco(rtw_wdev_data, val) do {} while (0)
|
||||
#else
|
||||
#if RTW_CFG80211_BLOCK_STA_DISCON_EVENT
|
||||
#define rtw_wdev_not_indic_disco(rtw_wdev_data) ((rtw_wdev_data)->not_indic_disco)
|
||||
#define rtw_wdev_set_not_indic_disco(rtw_wdev_data, val) do { (rtw_wdev_data)->not_indic_disco = (val); } while (0)
|
||||
#else
|
||||
#define rtw_wdev_not_indic_disco(rtw_wdev_data) 0
|
||||
#define rtw_wdev_set_not_indic_disco(rtw_wdev_data, val) do {} while (0)
|
||||
#endif
|
||||
|
||||
#define rtw_wdev_free_connect_req(rtw_wdev_data) \
|
||||
|
||||
@@ -37,6 +37,7 @@ extern int rtw_ht_enable;
|
||||
#define SCAN_ITEM_SIZE 768
|
||||
#define MAX_CUSTOM_LEN 64
|
||||
#define RATE_COUNT 4
|
||||
#define MAX_SCAN_BUFFER_LEN 65535
|
||||
|
||||
#ifdef CONFIG_GLOBAL_UI_PID
|
||||
extern int ui_pid[3];
|
||||
@@ -97,7 +98,7 @@ static int hwaddr_aton_i(const char *txt, u8 *addr)
|
||||
|
||||
static void indicate_wx_custom_event(_adapter *padapter, char *msg)
|
||||
{
|
||||
u8 *buff, *p;
|
||||
u8 *buff;
|
||||
union iwreq_data wrqu;
|
||||
|
||||
if (strlen(msg) > IW_CUSTOM_MAX) {
|
||||
@@ -184,7 +185,6 @@ void rtw_request_wps_pbc_event(_adapter *padapter)
|
||||
void indicate_wx_scan_complete_event(_adapter *padapter)
|
||||
{
|
||||
union iwreq_data wrqu;
|
||||
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
|
||||
|
||||
_rtw_memset(&wrqu, 0, sizeof(union iwreq_data));
|
||||
|
||||
@@ -420,16 +420,22 @@ static inline char *iwe_stream_protocol_process(_adapter *padapter,
|
||||
char *p;
|
||||
u8 ie_offset = (pnetwork->network.Reserved[0] == BSS_TYPE_PROB_REQ ? 0 : 12); /* Probe Request */
|
||||
|
||||
#ifdef CONFIG_80211N_HT
|
||||
/* parsing HT_CAP_IE */
|
||||
p = rtw_get_ie(&pnetwork->network.IEs[ie_offset], _HT_CAPABILITY_IE_, &ht_ielen, pnetwork->network.IELength - ie_offset);
|
||||
if (p && ht_ielen > 0)
|
||||
ht_cap = _TRUE;
|
||||
if(padapter->registrypriv.ht_enable && is_supported_ht(padapter->registrypriv.wireless_mode)) {
|
||||
p = rtw_get_ie(&pnetwork->network.IEs[ie_offset], _HT_CAPABILITY_IE_, &ht_ielen, pnetwork->network.IELength - ie_offset);
|
||||
if (p && ht_ielen > 0)
|
||||
ht_cap = _TRUE;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_80211AC_VHT
|
||||
/* parsing VHT_CAP_IE */
|
||||
p = rtw_get_ie(&pnetwork->network.IEs[ie_offset], EID_VHTCapability, &vht_ielen, pnetwork->network.IELength - ie_offset);
|
||||
if (p && vht_ielen > 0)
|
||||
vht_cap = _TRUE;
|
||||
if(padapter->registrypriv.wireless_mode & WIRELESS_11AC) {
|
||||
p = rtw_get_ie(&pnetwork->network.IEs[ie_offset], EID_VHTCapability, &vht_ielen, pnetwork->network.IELength - ie_offset);
|
||||
if (p && vht_ielen > 0)
|
||||
vht_cap = _TRUE;
|
||||
}
|
||||
#endif
|
||||
/* Add the protocol name */
|
||||
iwe->cmd = SIOCGIWNAME;
|
||||
@@ -481,33 +487,36 @@ static inline char *iwe_stream_rate_process(_adapter *padapter,
|
||||
u8 ie_offset = (pnetwork->network.Reserved[0] == BSS_TYPE_PROB_REQ ? 0 : 12); /* Probe Request */
|
||||
|
||||
/* parsing HT_CAP_IE */
|
||||
p = rtw_get_ie(&pnetwork->network.IEs[ie_offset], _HT_CAPABILITY_IE_, &ht_ielen, pnetwork->network.IELength - ie_offset);
|
||||
if (p && ht_ielen > 0) {
|
||||
struct rtw_ieee80211_ht_cap *pht_capie;
|
||||
ht_cap = _TRUE;
|
||||
pht_capie = (struct rtw_ieee80211_ht_cap *)(p + 2);
|
||||
_rtw_memcpy(&mcs_rate , pht_capie->supp_mcs_set, 2);
|
||||
bw_40MHz = (pht_capie->cap_info & IEEE80211_HT_CAP_SUP_WIDTH) ? 1 : 0;
|
||||
short_GI = (pht_capie->cap_info & (IEEE80211_HT_CAP_SGI_20 | IEEE80211_HT_CAP_SGI_40)) ? 1 : 0;
|
||||
if(is_supported_ht(padapter->registrypriv.wireless_mode)) {
|
||||
p = rtw_get_ie(&pnetwork->network.IEs[ie_offset], _HT_CAPABILITY_IE_, &ht_ielen, pnetwork->network.IELength - ie_offset);
|
||||
if (p && ht_ielen > 0) {
|
||||
struct rtw_ieee80211_ht_cap *pht_capie;
|
||||
ht_cap = _TRUE;
|
||||
pht_capie = (struct rtw_ieee80211_ht_cap *)(p + 2);
|
||||
_rtw_memcpy(&mcs_rate , pht_capie->supp_mcs_set, 2);
|
||||
bw_40MHz = (pht_capie->cap_info & IEEE80211_HT_CAP_SUP_WIDTH) ? 1 : 0;
|
||||
short_GI = (pht_capie->cap_info & (IEEE80211_HT_CAP_SGI_20 | IEEE80211_HT_CAP_SGI_40)) ? 1 : 0;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef CONFIG_80211AC_VHT
|
||||
/* parsing VHT_CAP_IE */
|
||||
p = rtw_get_ie(&pnetwork->network.IEs[ie_offset], EID_VHTCapability, &vht_ielen, pnetwork->network.IELength - ie_offset);
|
||||
if (p && vht_ielen > 0) {
|
||||
u8 mcs_map[2];
|
||||
if(padapter->registrypriv.wireless_mode & WIRELESS_11AC){
|
||||
p = rtw_get_ie(&pnetwork->network.IEs[ie_offset], EID_VHTCapability, &vht_ielen, pnetwork->network.IELength - ie_offset);
|
||||
if (p && vht_ielen > 0) {
|
||||
u8 mcs_map[2];
|
||||
|
||||
vht_cap = _TRUE;
|
||||
bw_160MHz = GET_VHT_CAPABILITY_ELE_CHL_WIDTH(p + 2);
|
||||
if (bw_160MHz)
|
||||
short_GI = GET_VHT_CAPABILITY_ELE_SHORT_GI160M(p + 2);
|
||||
else
|
||||
short_GI = GET_VHT_CAPABILITY_ELE_SHORT_GI80M(p + 2);
|
||||
vht_cap = _TRUE;
|
||||
bw_160MHz = GET_VHT_CAPABILITY_ELE_CHL_WIDTH(p + 2);
|
||||
if (bw_160MHz)
|
||||
short_GI = GET_VHT_CAPABILITY_ELE_SHORT_GI160M(p + 2);
|
||||
else
|
||||
short_GI = GET_VHT_CAPABILITY_ELE_SHORT_GI80M(p + 2);
|
||||
|
||||
_rtw_memcpy(mcs_map, GET_VHT_CAPABILITY_ELE_TX_MCS(p + 2), 2);
|
||||
_rtw_memcpy(mcs_map, GET_VHT_CAPABILITY_ELE_TX_MCS(p + 2), 2);
|
||||
|
||||
vht_highest_rate = rtw_get_vht_highest_rate(mcs_map);
|
||||
vht_data_rate = rtw_vht_mcs_to_data_rate(CHANNEL_WIDTH_80, short_GI, vht_highest_rate);
|
||||
vht_highest_rate = rtw_get_vht_highest_rate(mcs_map);
|
||||
vht_data_rate = rtw_vht_mcs_to_data_rate(CHANNEL_WIDTH_80, short_GI, vht_highest_rate);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -697,8 +706,10 @@ static inline char *iwe_stream_rssi_process(_adapter *padapter,
|
||||
char *start, char *stop, struct iw_event *iwe)
|
||||
{
|
||||
u8 ss, sq;
|
||||
s16 noise = 0;
|
||||
struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
|
||||
#ifdef CONFIG_BACKGROUND_NOISE_MONITOR
|
||||
s16 noise = 0;
|
||||
#endif
|
||||
|
||||
/* Add quality statistics */
|
||||
iwe->cmd = IWEVQUAL;
|
||||
@@ -726,17 +737,7 @@ static inline char *iwe_stream_rssi_process(_adapter *padapter,
|
||||
#ifdef CONFIG_SIGNAL_DISPLAY_DBM
|
||||
iwe->u.qual.level = (u8) translate_percentage_to_dbm(ss); /* dbm */
|
||||
#else
|
||||
#ifdef CONFIG_SIGNAL_SCALE_MAPPING
|
||||
iwe->u.qual.level = (u8)ss; /* % */
|
||||
#else
|
||||
{
|
||||
/* Do signal scale mapping when using percentage as the unit of signal strength, since the scale mapping is skipped in odm */
|
||||
|
||||
HAL_DATA_TYPE *pHal = GET_HAL_DATA(padapter);
|
||||
|
||||
iwe->u.qual.level = (u8)phydm_signal_scale_mapping(&pHal->odmpriv, ss);
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
iwe->u.qual.qual = (u8)sq; /* signal quality */
|
||||
@@ -769,7 +770,6 @@ static inline char *iwe_stream_net_rsv_process(_adapter *padapter,
|
||||
{
|
||||
u8 buf[32] = {0};
|
||||
u8 *p, *pos;
|
||||
int len;
|
||||
p = buf;
|
||||
pos = pnetwork->network.Reserved;
|
||||
|
||||
@@ -863,7 +863,7 @@ static int wpa_set_auth_algs(struct net_device *dev, u32 value)
|
||||
static int wpa_set_encryption(struct net_device *dev, struct ieee_param *param, u32 param_len)
|
||||
{
|
||||
int ret = 0;
|
||||
u32 wep_key_idx, wep_key_len, wep_total_len;
|
||||
u32 wep_key_idx, wep_key_len;
|
||||
_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
|
||||
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
|
||||
struct security_priv *psecuritypriv = &padapter->securitypriv;
|
||||
@@ -1006,6 +1006,8 @@ static int wpa_set_encryption(struct net_device *dev, struct ieee_param *param,
|
||||
rtw_p2p_set_state(pwdinfo, P2P_STATE_PROVISIONING_DONE);
|
||||
#endif /* CONFIG_P2P */
|
||||
|
||||
/* WPA/WPA2 key-handshake has completed */
|
||||
clr_fwstate(pmlmepriv, WIFI_UNDER_KEY_HANDSHAKE);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1039,7 +1041,6 @@ exit:
|
||||
static int rtw_set_wpa_ie(_adapter *padapter, char *pie, unsigned short ielen)
|
||||
{
|
||||
u8 *buf = NULL, *pos = NULL;
|
||||
u32 left;
|
||||
int group_cipher = 0, pairwise_cipher = 0;
|
||||
u8 mfp_opt = MFP_NO;
|
||||
int ret = 0;
|
||||
@@ -1202,7 +1203,6 @@ static int rtw_wx_get_name(struct net_device *dev,
|
||||
union iwreq_data *wrqu, char *extra)
|
||||
{
|
||||
_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
|
||||
u16 cap;
|
||||
u32 ht_ielen = 0;
|
||||
char *p;
|
||||
u8 ht_cap = _FALSE, vht_cap = _FALSE;
|
||||
@@ -1214,17 +1214,18 @@ static int rtw_wx_get_name(struct net_device *dev,
|
||||
|
||||
if (check_fwstate(pmlmepriv, _FW_LINKED | WIFI_ADHOC_MASTER_STATE) == _TRUE) {
|
||||
/* parsing HT_CAP_IE */
|
||||
p = rtw_get_ie(&pcur_bss->IEs[12], _HT_CAPABILITY_IE_, &ht_ielen, pcur_bss->IELength - 12);
|
||||
if (p && ht_ielen > 0)
|
||||
ht_cap = _TRUE;
|
||||
|
||||
if( is_supported_ht(padapter->registrypriv.wireless_mode)&&(padapter->registrypriv.ht_enable)) {
|
||||
p = rtw_get_ie(&pcur_bss->IEs[12], _HT_CAPABILITY_IE_, &ht_ielen, pcur_bss->IELength - 12);
|
||||
if (p && ht_ielen > 0 )
|
||||
ht_cap = _TRUE;
|
||||
}
|
||||
#ifdef CONFIG_80211AC_VHT
|
||||
if (pmlmepriv->vhtpriv.vht_option == _TRUE)
|
||||
if ((padapter->registrypriv.wireless_mode & WIRELESS_11AC) &&
|
||||
(pmlmepriv->vhtpriv.vht_option == _TRUE))
|
||||
vht_cap = _TRUE;
|
||||
#endif
|
||||
|
||||
prates = &pcur_bss->SupportedRates;
|
||||
|
||||
if (rtw_is_cckratesonly_included((u8 *)prates) == _TRUE) {
|
||||
if (ht_cap == _TRUE)
|
||||
snprintf(wrqu->name, IFNAMSIZ, "IEEE 802.11bn");
|
||||
@@ -1233,8 +1234,12 @@ static int rtw_wx_get_name(struct net_device *dev,
|
||||
} else if ((rtw_is_cckrates_included((u8 *)prates)) == _TRUE) {
|
||||
if (ht_cap == _TRUE)
|
||||
snprintf(wrqu->name, IFNAMSIZ, "IEEE 802.11bgn");
|
||||
else
|
||||
snprintf(wrqu->name, IFNAMSIZ, "IEEE 802.11bg");
|
||||
else {
|
||||
if(padapter->registrypriv.wireless_mode & WIRELESS_11G)
|
||||
snprintf(wrqu->name, IFNAMSIZ, "IEEE 802.11bg");
|
||||
else
|
||||
snprintf(wrqu->name, IFNAMSIZ, "IEEE 802.11b");
|
||||
}
|
||||
} else {
|
||||
if (pcur_bss->Configuration.DSConfig > 14) {
|
||||
#ifdef CONFIG_80211AC_VHT
|
||||
@@ -1271,12 +1276,8 @@ static int rtw_wx_set_freq(struct net_device *dev,
|
||||
{
|
||||
|
||||
_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
|
||||
HAL_DATA_TYPE *hal_data = GET_HAL_DATA(padapter);
|
||||
struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
|
||||
struct wlan_network *cur_network = &(pmlmepriv->cur_network);
|
||||
int exp = 1, freq = 0, div = 0;
|
||||
|
||||
|
||||
rtw_ps_deny(padapter, PS_DENY_IOCTL);
|
||||
if (rtw_pwr_wakeup(padapter) == _FALSE)
|
||||
goto exit;
|
||||
@@ -1469,7 +1470,6 @@ static int rtw_wx_set_pmkid(struct net_device *dev,
|
||||
_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
|
||||
u8 j, blInserted = _FALSE;
|
||||
int intReturn = _FALSE;
|
||||
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
|
||||
struct security_priv *psecuritypriv = &padapter->securitypriv;
|
||||
struct iw_pmksa *pPMK = (struct iw_pmksa *) extra;
|
||||
u8 strZeroMacAddress[ETH_ALEN] = { 0x00 };
|
||||
@@ -1578,8 +1578,6 @@ static int rtw_wx_get_range(struct net_device *dev,
|
||||
struct iw_range *range = (struct iw_range *)extra;
|
||||
_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
|
||||
struct rf_ctl_t *rfctl = adapter_to_rfctl(padapter);
|
||||
struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
|
||||
|
||||
u16 val;
|
||||
int i;
|
||||
|
||||
@@ -1620,7 +1618,6 @@ static int rtw_wx_get_range(struct net_device *dev,
|
||||
* If percentage range is 0~100
|
||||
* Signal strength dbm range logical is -100 ~ 0
|
||||
* but usually value is -90 ~ -20
|
||||
* When CONFIG_SIGNAL_SCALE_MAPPING is defined, dbm range is -95 ~ -45
|
||||
*/
|
||||
range->max_qual.qual = 100;
|
||||
#ifdef CONFIG_SIGNAL_DISPLAY_DBM
|
||||
@@ -1930,18 +1927,53 @@ static int rtw_wx_set_scan(struct net_device *dev, struct iw_request_info *a,
|
||||
u8 _status = _FALSE;
|
||||
int ret = 0;
|
||||
_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
|
||||
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
|
||||
/*struct mlme_priv *pmlmepriv = &padapter->mlmepriv;*/
|
||||
struct sitesurvey_parm parm;
|
||||
|
||||
u8 ssc_chk;
|
||||
#ifdef CONFIG_P2P
|
||||
struct wifidirect_info *pwdinfo = &(padapter->wdinfo);
|
||||
#endif /* CONFIG_P2P */
|
||||
|
||||
|
||||
#ifdef DBG_IOCTL
|
||||
RTW_INFO("DBG_IOCTL %s:%d\n", __FUNCTION__, __LINE__);
|
||||
#endif
|
||||
|
||||
#if 1
|
||||
ssc_chk = rtw_sitesurvey_condition_check(padapter, _FALSE);
|
||||
|
||||
#ifdef CONFIG_DOSCAN_IN_BUSYTRAFFIC
|
||||
if ((ssc_chk != SS_ALLOW) && (ssc_chk != SS_DENY_BUSY_TRAFFIC))
|
||||
#else
|
||||
/* When Busy Traffic, driver do not site survey. So driver return success. */
|
||||
/* wpa_supplicant will not issue SIOCSIWSCAN cmd again after scan timeout. */
|
||||
/* modify by thomas 2011-02-22. */
|
||||
if (ssc_chk != SS_ALLOW)
|
||||
#endif
|
||||
{
|
||||
if (ssc_chk == SS_DENY_MP_MODE)
|
||||
ret = -EPERM;
|
||||
#ifdef DBG_LA_MODE
|
||||
else if (ssc_chk == SS_DENY_LA_MODE)
|
||||
ret = -EPERM;
|
||||
#endif
|
||||
else
|
||||
indicate_wx_scan_complete_event(padapter);
|
||||
|
||||
goto exit;
|
||||
} else
|
||||
RTW_INFO(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(padapter));
|
||||
|
||||
rtw_ps_deny(padapter, PS_DENY_SCAN);
|
||||
if (_FAIL == rtw_pwr_wakeup(padapter)) {
|
||||
ret = -1;
|
||||
goto cancel_ps_deny;
|
||||
}
|
||||
if (!rtw_is_adapter_up(padapter)) {
|
||||
ret = -1;
|
||||
goto cancel_ps_deny;
|
||||
}
|
||||
#else
|
||||
|
||||
#ifdef CONFIG_MP_INCLUDED
|
||||
if (rtw_mp_mode_check(padapter)) {
|
||||
RTW_INFO("MP mode block Scan request\n");
|
||||
@@ -2000,6 +2032,7 @@ static int rtw_wx_set_scan(struct net_device *dev, struct iw_request_info *a,
|
||||
goto cancel_ps_deny;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_P2P
|
||||
if (pwdinfo->p2p_state != P2P_STATE_NONE) {
|
||||
@@ -2141,15 +2174,17 @@ static int rtw_wx_get_scan(struct net_device *dev, struct iw_request_info *a,
|
||||
_irqL irqL;
|
||||
_list *plist, *phead;
|
||||
_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
|
||||
struct rf_ctl_t *rfctl = adapter_to_rfctl(padapter);
|
||||
RT_CHANNEL_INFO *chset = rfctl->channel_set;
|
||||
struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
|
||||
_queue *queue = &(pmlmepriv->scanned_queue);
|
||||
struct wlan_network *pnetwork = NULL;
|
||||
char *ev = extra;
|
||||
char *stop = ev + wrqu->data.length;
|
||||
u32 ret = 0;
|
||||
u32 cnt = 0;
|
||||
u32 wait_for_surveydone;
|
||||
sint wait_status;
|
||||
u8 ch;
|
||||
|
||||
#ifdef CONFIG_P2P
|
||||
struct wifidirect_info *pwdinfo = &padapter->wdinfo;
|
||||
@@ -2211,17 +2246,26 @@ static int rtw_wx_get_scan(struct net_device *dev, struct iw_request_info *a,
|
||||
break;
|
||||
|
||||
if ((stop - ev) < SCAN_ITEM_SIZE) {
|
||||
if(wrqu->data.length == MAX_SCAN_BUFFER_LEN){ /*max buffer len defined by iwlist*/
|
||||
ret = 0;
|
||||
RTW_INFO("%s: Scan results incomplete\n", __FUNCTION__);
|
||||
break;
|
||||
}
|
||||
ret = -E2BIG;
|
||||
break;
|
||||
}
|
||||
|
||||
pnetwork = LIST_CONTAINOR(plist, struct wlan_network, list);
|
||||
ch = pnetwork->network.Configuration.DSConfig;
|
||||
|
||||
/* report network only if the current channel set contains the channel to which this network belongs */
|
||||
if (rtw_chset_search_ch(adapter_to_chset(padapter), pnetwork->network.Configuration.DSConfig) >= 0
|
||||
&& rtw_mlme_band_check(padapter, pnetwork->network.Configuration.DSConfig) == _TRUE
|
||||
&& _TRUE == rtw_validate_ssid(&(pnetwork->network.Ssid))
|
||||
)
|
||||
if (rtw_chset_search_ch(chset, ch) >= 0
|
||||
&& rtw_mlme_band_check(padapter, ch) == _TRUE
|
||||
&& _TRUE == rtw_validate_ssid(&(pnetwork->network.Ssid))
|
||||
&& (!IS_DFS_SLAVE_WITH_RD(rfctl)
|
||||
|| rtw_odm_dfs_domain_unknown(rfctl_to_dvobj(rfctl))
|
||||
|| !rtw_chset_is_ch_non_ocp(chset, ch))
|
||||
)
|
||||
ev = translate_scan(padapter, a, pnetwork, ev, stop);
|
||||
|
||||
plist = get_next(plist);
|
||||
@@ -2258,7 +2302,6 @@ static int rtw_wx_set_essid(struct net_device *dev,
|
||||
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
|
||||
_queue *queue = &pmlmepriv->scanned_queue;
|
||||
_list *phead;
|
||||
s8 status = _TRUE;
|
||||
struct wlan_network *pnetwork = NULL;
|
||||
NDIS_802_11_AUTHENTICATION_MODE authmode;
|
||||
NDIS_802_11_SSID ndis_ssid;
|
||||
@@ -2899,11 +2942,14 @@ static int rtw_wx_set_auth(struct net_device *dev,
|
||||
{
|
||||
_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
|
||||
struct iw_param *param = (struct iw_param *)&(wrqu->param);
|
||||
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
|
||||
struct security_priv *psecuritypriv = &padapter->securitypriv;
|
||||
#ifdef CONFIG_WAPI_SUPPORT
|
||||
#ifndef CONFIG_IOCTL_CFG80211
|
||||
struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
|
||||
struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
|
||||
struct security_priv *psecuritypriv = &padapter->securitypriv;
|
||||
u32 value = param->value;
|
||||
#endif
|
||||
#endif
|
||||
int ret = 0;
|
||||
|
||||
switch (param->flags & IW_AUTH_INDEX) {
|
||||
@@ -2993,10 +3039,10 @@ static int rtw_wx_set_auth(struct net_device *dev,
|
||||
*/
|
||||
if (check_fwstate(&padapter->mlmepriv, _FW_LINKED)) {
|
||||
LeaveAllPowerSaveMode(padapter);
|
||||
rtw_disassoc_cmd(padapter, 500, RTW_CMDF_DIRECTLY);
|
||||
rtw_disassoc_cmd(padapter, 500, RTW_CMDF_WAIT_ACK);
|
||||
RTW_INFO("%s...call rtw_indicate_disconnect\n ", __FUNCTION__);
|
||||
rtw_indicate_disconnect(padapter, 0, _FALSE);
|
||||
rtw_free_assoc_resources(padapter, 1);
|
||||
rtw_free_assoc_resources_cmd(padapter, _TRUE, RTW_CMDF_WAIT_ACK);
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -3401,7 +3447,6 @@ static int rtw_wx_set_channel_plan(struct net_device *dev,
|
||||
union iwreq_data *wrqu, char *extra)
|
||||
{
|
||||
_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
|
||||
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
|
||||
u8 channel_plan_req = (u8)(*((int *)wrqu));
|
||||
|
||||
if (_SUCCESS != rtw_set_channel_plan(padapter, channel_plan_req))
|
||||
@@ -3660,7 +3705,7 @@ static int rtw_get_ap_info(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
union iwreq_data *wrqu, char *extra)
|
||||
{
|
||||
int bssid_match, ret = 0;
|
||||
int ret = 0;
|
||||
u32 cnt = 0, wpa_ielen;
|
||||
_irqL irqL;
|
||||
_list *plist, *phead;
|
||||
@@ -3834,8 +3879,6 @@ static int rtw_wext_p2p_enable(struct net_device *dev,
|
||||
|
||||
int ret = 0;
|
||||
_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
|
||||
struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
|
||||
struct iw_point *pdata = &wrqu->data;
|
||||
struct wifidirect_info *pwdinfo = &(padapter->wdinfo);
|
||||
struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
|
||||
enum P2P_ROLE init_role = P2P_ROLE_DISABLE;
|
||||
@@ -3901,8 +3944,6 @@ static int rtw_p2p_set_go_nego_ssid(struct net_device *dev,
|
||||
|
||||
int ret = 0;
|
||||
_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
|
||||
struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
|
||||
struct iw_point *pdata = &wrqu->data;
|
||||
struct wifidirect_info *pwdinfo = &(padapter->wdinfo);
|
||||
|
||||
RTW_INFO("[%s] ssid = %s, len = %zu\n", __FUNCTION__, extra, strlen(extra));
|
||||
@@ -4067,7 +4108,6 @@ static int rtw_p2p_get_status(struct net_device *dev,
|
||||
|
||||
int ret = 0;
|
||||
_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
|
||||
struct iw_point *pdata = &wrqu->data;
|
||||
struct wifidirect_info *pwdinfo = &(padapter->wdinfo);
|
||||
|
||||
if (padapter->bShowGetP2PState) {
|
||||
@@ -4098,7 +4138,6 @@ static int rtw_p2p_get_req_cm(struct net_device *dev,
|
||||
|
||||
int ret = 0;
|
||||
_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
|
||||
struct iw_point *pdata = &wrqu->data;
|
||||
struct wifidirect_info *pwdinfo = &(padapter->wdinfo);
|
||||
|
||||
sprintf(extra, "\n\nCM=%s\n", pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req);
|
||||
@@ -4115,10 +4154,8 @@ static int rtw_p2p_get_role(struct net_device *dev,
|
||||
|
||||
int ret = 0;
|
||||
_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
|
||||
struct iw_point *pdata = &wrqu->data;
|
||||
struct wifidirect_info *pwdinfo = &(padapter->wdinfo);
|
||||
|
||||
|
||||
RTW_INFO("[%s] Role = %d, Status = %d, peer addr = %.2X:%.2X:%.2X:%.2X:%.2X:%.2X\n", __FUNCTION__, rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo),
|
||||
pwdinfo->p2p_peer_interface_addr[0], pwdinfo->p2p_peer_interface_addr[1], pwdinfo->p2p_peer_interface_addr[2],
|
||||
pwdinfo->p2p_peer_interface_addr[3], pwdinfo->p2p_peer_interface_addr[4], pwdinfo->p2p_peer_interface_addr[5]);
|
||||
@@ -4137,7 +4174,6 @@ static int rtw_p2p_get_peer_ifaddr(struct net_device *dev,
|
||||
|
||||
int ret = 0;
|
||||
_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
|
||||
struct iw_point *pdata = &wrqu->data;
|
||||
struct wifidirect_info *pwdinfo = &(padapter->wdinfo);
|
||||
|
||||
|
||||
@@ -4161,7 +4197,6 @@ static int rtw_p2p_get_peer_devaddr(struct net_device *dev,
|
||||
|
||||
int ret = 0;
|
||||
_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
|
||||
struct iw_point *pdata = &wrqu->data;
|
||||
struct wifidirect_info *pwdinfo = &(padapter->wdinfo);
|
||||
|
||||
RTW_INFO("[%s] Role = %d, Status = %d, peer addr = %.2X:%.2X:%.2X:%.2X:%.2X:%.2X\n", __FUNCTION__, rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo),
|
||||
@@ -4185,7 +4220,6 @@ static int rtw_p2p_get_peer_devaddr_by_invitation(struct net_device *dev,
|
||||
|
||||
int ret = 0;
|
||||
_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
|
||||
struct iw_point *pdata = &wrqu->data;
|
||||
struct wifidirect_info *pwdinfo = &(padapter->wdinfo);
|
||||
|
||||
RTW_INFO("[%s] Role = %d, Status = %d, peer addr = %.2X:%.2X:%.2X:%.2X:%.2X:%.2X\n", __FUNCTION__, rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo),
|
||||
@@ -4209,7 +4243,6 @@ static int rtw_p2p_get_groupid(struct net_device *dev,
|
||||
|
||||
int ret = 0;
|
||||
_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
|
||||
struct iw_point *pdata = &wrqu->data;
|
||||
struct wifidirect_info *pwdinfo = &(padapter->wdinfo);
|
||||
|
||||
sprintf(extra, "\n%.2X:%.2X:%.2X:%.2X:%.2X:%.2X %s",
|
||||
@@ -4230,7 +4263,6 @@ static int rtw_p2p_get_op_ch(struct net_device *dev,
|
||||
|
||||
int ret = 0;
|
||||
_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
|
||||
struct iw_point *pdata = &wrqu->data;
|
||||
struct wifidirect_info *pwdinfo = &(padapter->wdinfo);
|
||||
|
||||
|
||||
@@ -4322,7 +4354,6 @@ static int rtw_p2p_get_peer_wfd_port(struct net_device *dev,
|
||||
|
||||
int ret = 0;
|
||||
_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
|
||||
struct iw_point *pdata = &wrqu->data;
|
||||
struct wifidirect_info *pwdinfo = &(padapter->wdinfo);
|
||||
|
||||
RTW_INFO("[%s] p2p_state = %d\n", __FUNCTION__, rtw_p2p_state(pwdinfo));
|
||||
@@ -4342,7 +4373,6 @@ static int rtw_p2p_get_peer_wfd_preferred_connection(struct net_device *dev,
|
||||
|
||||
int ret = 0;
|
||||
_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
|
||||
struct iw_point *pdata = &wrqu->data;
|
||||
struct wifidirect_info *pwdinfo = &(padapter->wdinfo);
|
||||
|
||||
sprintf(extra, "\n\nwfd_pc=%d\n", pwdinfo->wfd_info->wfd_pc);
|
||||
@@ -4361,7 +4391,6 @@ static int rtw_p2p_get_peer_wfd_session_available(struct net_device *dev,
|
||||
|
||||
int ret = 0;
|
||||
_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
|
||||
struct iw_point *pdata = &wrqu->data;
|
||||
struct wifidirect_info *pwdinfo = &(padapter->wdinfo);
|
||||
|
||||
sprintf(extra, "\n\nwfd_sa=%d\n", pwdinfo->wfd_info->peer_session_avail);
|
||||
@@ -4695,7 +4724,6 @@ static int rtw_p2p_connect(struct net_device *dev,
|
||||
struct wifidirect_info *pwdinfo = &(padapter->wdinfo);
|
||||
u8 peerMAC[ETH_ALEN] = { 0x00 };
|
||||
int jj, kk;
|
||||
u8 peerMACStr[ETH_ALEN * 2] = { 0x00 };
|
||||
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
|
||||
_irqL irqL;
|
||||
_list *plist, *phead;
|
||||
@@ -4831,16 +4859,14 @@ static int rtw_p2p_invite_req(struct net_device *dev,
|
||||
|
||||
int ret = 0;
|
||||
_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
|
||||
struct iw_point *pdata = &wrqu->data;
|
||||
struct wifidirect_info *pwdinfo = &(padapter->wdinfo);
|
||||
int jj, kk;
|
||||
u8 peerMACStr[ETH_ALEN * 2] = { 0x00 };
|
||||
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
|
||||
_list *plist, *phead;
|
||||
_queue *queue = &(pmlmepriv->scanned_queue);
|
||||
struct wlan_network *pnetwork = NULL;
|
||||
uint uintPeerChannel = 0;
|
||||
u8 attr_content[50] = { 0x00 }, _status = 0;
|
||||
u8 attr_content[50] = { 0x00 };
|
||||
u8 *p2pie;
|
||||
uint p2pielen = 0, attr_contentlen = 0;
|
||||
_irqL irqL;
|
||||
@@ -5014,20 +5040,7 @@ static int rtw_p2p_set_persistent(struct net_device *dev,
|
||||
|
||||
int ret = 0;
|
||||
_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
|
||||
struct iw_point *pdata = &wrqu->data;
|
||||
struct wifidirect_info *pwdinfo = &(padapter->wdinfo);
|
||||
int jj, kk;
|
||||
u8 peerMACStr[ETH_ALEN * 2] = { 0x00 };
|
||||
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
|
||||
_list *plist, *phead;
|
||||
_queue *queue = &(pmlmepriv->scanned_queue);
|
||||
struct wlan_network *pnetwork = NULL;
|
||||
uint uintPeerChannel = 0;
|
||||
u8 attr_content[50] = { 0x00 }, _status = 0;
|
||||
u8 *p2pie;
|
||||
uint p2pielen = 0, attr_contentlen = 0;
|
||||
_irqL irqL;
|
||||
struct tx_invite_req_info *pinvite_req_info = &pwdinfo->invitereq_info;
|
||||
|
||||
/* Commented by Albert 20120328 */
|
||||
/* The input data is 0 or 1 */
|
||||
@@ -5118,16 +5131,14 @@ static int rtw_p2p_set_pc(struct net_device *dev,
|
||||
|
||||
int ret = 0;
|
||||
_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
|
||||
struct iw_point *pdata = &wrqu->data;
|
||||
struct wifidirect_info *pwdinfo = &(padapter->wdinfo);
|
||||
u8 peerMAC[ETH_ALEN] = { 0x00 };
|
||||
int jj, kk;
|
||||
u8 peerMACStr[ETH_ALEN * 2] = { 0x00 };
|
||||
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
|
||||
_list *plist, *phead;
|
||||
_queue *queue = &(pmlmepriv->scanned_queue);
|
||||
struct wlan_network *pnetwork = NULL;
|
||||
u8 attr_content[50] = { 0x00 }, _status = 0;
|
||||
u8 attr_content[50] = { 0x00 };
|
||||
u8 *p2pie;
|
||||
uint p2pielen = 0, attr_contentlen = 0;
|
||||
_irqL irqL;
|
||||
@@ -5234,7 +5245,6 @@ static int rtw_p2p_set_wfd_device_type(struct net_device *dev,
|
||||
|
||||
int ret = 0;
|
||||
_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
|
||||
struct iw_point *pdata = &wrqu->data;
|
||||
struct wifidirect_info *pwdinfo = &(padapter->wdinfo);
|
||||
struct wifi_display_info *pwfd_info = pwdinfo->wfd_info;
|
||||
|
||||
@@ -5308,9 +5318,7 @@ static int rtw_p2p_set_sa(struct net_device *dev,
|
||||
|
||||
int ret = 0;
|
||||
_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
|
||||
struct iw_point *pdata = &wrqu->data;
|
||||
struct wifidirect_info *pwdinfo = &(padapter->wdinfo);
|
||||
struct wifi_display_info *pwfd_info = pwdinfo->wfd_info;
|
||||
|
||||
RTW_INFO("[%s] data = %s\n", __FUNCTION__, extra);
|
||||
|
||||
@@ -5343,13 +5351,12 @@ static int rtw_p2p_prov_disc(struct net_device *dev,
|
||||
struct wifidirect_info *pwdinfo = &(padapter->wdinfo);
|
||||
u8 peerMAC[ETH_ALEN] = { 0x00 };
|
||||
int jj, kk;
|
||||
u8 peerMACStr[ETH_ALEN * 2] = { 0x00 };
|
||||
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
|
||||
_list *plist, *phead;
|
||||
_queue *queue = &(pmlmepriv->scanned_queue);
|
||||
struct wlan_network *pnetwork = NULL;
|
||||
uint uintPeerChannel = 0;
|
||||
u8 attr_content[100] = { 0x00 }, _status = 0;
|
||||
u8 attr_content[100] = { 0x00 };
|
||||
u8 *p2pie;
|
||||
uint p2pielen = 0, attr_contentlen = 0;
|
||||
_irqL irqL;
|
||||
@@ -5603,15 +5610,9 @@ static int rtw_p2p_set(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
union iwreq_data *wrqu, char *extra)
|
||||
{
|
||||
|
||||
int ret = 0;
|
||||
#ifdef CONFIG_P2P
|
||||
|
||||
_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
|
||||
struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
|
||||
struct iw_point *pdata = &wrqu->data;
|
||||
struct wifidirect_info *pwdinfo = &(padapter->wdinfo);
|
||||
struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
|
||||
|
||||
RTW_INFO("[%s] extra = %s\n", __FUNCTION__, extra);
|
||||
|
||||
@@ -5697,16 +5698,9 @@ static int rtw_p2p_get(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
union iwreq_data *wrqu, char *extra)
|
||||
{
|
||||
|
||||
int ret = 0;
|
||||
|
||||
#ifdef CONFIG_P2P
|
||||
|
||||
_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
|
||||
struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
|
||||
struct iw_point *pdata = &wrqu->data;
|
||||
struct wifidirect_info *pwdinfo = &(padapter->wdinfo);
|
||||
struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
|
||||
|
||||
if (padapter->bShowGetP2PState)
|
||||
RTW_INFO("[%s] extra = %s\n", __FUNCTION__, (char *) wrqu->data.pointer);
|
||||
@@ -5887,11 +5881,7 @@ exit:
|
||||
#ifdef DBG_CMD_QUEUE
|
||||
u8 dump_cmd_id = 0;
|
||||
#endif
|
||||
/*
|
||||
#ifdef DBG_DUMP_TSF_BY_PORT
|
||||
extern void get_tsf_by_port(_adapter *adapter, u8 *tsftr, u8 hw_port);
|
||||
#endif
|
||||
*/
|
||||
|
||||
static int rtw_dbg_port(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
union iwreq_data *wrqu, char *extra)
|
||||
@@ -6175,11 +6165,6 @@ static int rtw_dbg_port(struct net_device *dev,
|
||||
psecuritypriv->dot11AuthAlgrthm, psecuritypriv->dot11PrivacyAlgrthm,
|
||||
psecuritypriv->ndisauthtype, psecuritypriv->ndisencryptstatus);
|
||||
break;
|
||||
case 0x02:
|
||||
RTW_INFO("pmlmeinfo->state=0x%x\n", pmlmeinfo->state);
|
||||
RTW_INFO("DrvBcnEarly=%d\n", pmlmeext->DrvBcnEarly);
|
||||
RTW_INFO("DrvBcnTimeOut=%d\n", pmlmeext->DrvBcnTimeOut);
|
||||
break;
|
||||
case 0x03:
|
||||
RTW_INFO("qos_option=%d\n", pmlmepriv->qospriv.qos_option);
|
||||
#ifdef CONFIG_80211N_HT
|
||||
@@ -6218,12 +6203,10 @@ static int rtw_dbg_port(struct net_device *dev,
|
||||
RTW_INFO("can't get sta's macaddr, cur_network's macaddr:" MAC_FMT "\n", MAC_ARG(cur_network->network.MacAddress));
|
||||
break;
|
||||
case 0x06: {
|
||||
#ifdef DBG_DUMP_TSF_BY_PORT
|
||||
u64 tsf = 0;
|
||||
|
||||
get_tsf_by_port(padapter, (u8 *)&tsf, extra_arg);
|
||||
RTW_INFO(" PORT-%d TSF :%lld\n", extra_arg, tsf);
|
||||
#endif
|
||||
tsf = rtw_hal_get_tsftr_by_port(padapter, extra_arg);
|
||||
RTW_INFO(" PORT-%d TSF :%21lld\n", extra_arg, tsf);
|
||||
}
|
||||
break;
|
||||
case 0x07:
|
||||
@@ -6580,9 +6563,6 @@ static int rtw_dbg_port(struct net_device *dev,
|
||||
{
|
||||
if (arg == 0xAA) {
|
||||
u8 page_offset, page_num;
|
||||
u32 page_size = 0;
|
||||
u8 *buffer = NULL;
|
||||
u32 buf_size = 0;
|
||||
|
||||
page_offset = (u8)(extra_arg >> 16);
|
||||
page_num = (u8)(extra_arg & 0xFF);
|
||||
@@ -6735,7 +6715,6 @@ static int rtw_dbg_port(struct net_device *dev,
|
||||
static int wpa_set_param(struct net_device *dev, u8 name, u32 value)
|
||||
{
|
||||
uint ret = 0;
|
||||
u32 flags;
|
||||
_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
|
||||
|
||||
switch (name) {
|
||||
@@ -7177,9 +7156,16 @@ static int rtw_set_encryption(struct net_device *dev, struct ieee_param *param,
|
||||
psta->dot11txpn.val = RTW_GET_LE64(param->u.crypt.seq);
|
||||
psta->dot11rxpn.val = RTW_GET_LE64(param->u.crypt.seq);
|
||||
psta->ieee8021x_blocked = _FALSE;
|
||||
psta->bpairwise_key_installed = _TRUE;
|
||||
rtw_ap_set_pairwise_key(padapter, psta);
|
||||
|
||||
if (psta->dot118021XPrivacy != _NO_PRIVACY_) {
|
||||
psta->bpairwise_key_installed = _TRUE;
|
||||
|
||||
/* WPA2 key-handshake has completed */
|
||||
if (psecuritypriv->ndisauthtype == Ndis802_11AuthModeWPA2PSK)
|
||||
psta->state &= (~WIFI_UNDER_KEY_HANDSHAKE);
|
||||
}
|
||||
|
||||
rtw_ap_set_pairwise_key(padapter, psta);
|
||||
} else {
|
||||
RTW_WARN(FUNC_ADPT_FMT" set group key of "MAC_FMT", not support\n"
|
||||
, FUNC_ADPT_ARG(padapter), MAC_ARG(psta->cmn.mac_addr));
|
||||
@@ -7250,7 +7236,6 @@ static int rtw_hostapd_sta_flush(struct net_device *dev)
|
||||
|
||||
static int rtw_add_sta(struct net_device *dev, struct ieee_param *param)
|
||||
{
|
||||
_irqL irqL;
|
||||
int ret = 0;
|
||||
struct sta_info *psta = NULL;
|
||||
_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
|
||||
@@ -7302,7 +7287,9 @@ static int rtw_add_sta(struct net_device *dev, struct ieee_param *param)
|
||||
|
||||
#ifdef CONFIG_80211N_HT
|
||||
/* chec 802.11n ht cap. */
|
||||
if (WLAN_STA_HT & flags) {
|
||||
if (padapter->registrypriv.ht_enable &&
|
||||
is_supported_ht(padapter->registrypriv.wireless_mode) &&
|
||||
(WLAN_STA_HT & flags)) {
|
||||
psta->htpriv.ht_option = _TRUE;
|
||||
psta->qos_option = 1;
|
||||
_rtw_memcpy((void *)&psta->htpriv.ht_cap, (void *)¶m->u.add_sta.ht_cap, sizeof(struct rtw_ieee80211_ht_cap));
|
||||
@@ -7311,6 +7298,7 @@ static int rtw_add_sta(struct net_device *dev, struct ieee_param *param)
|
||||
|
||||
if (pmlmepriv->htpriv.ht_option == _FALSE)
|
||||
psta->htpriv.ht_option = _FALSE;
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
@@ -7435,7 +7423,8 @@ static int rtw_ioctl_get_sta_data(struct net_device *dev, struct ieee_param *par
|
||||
psta_data->tx_supp_rates_len = psta->bssratelen;
|
||||
_rtw_memcpy(psta_data->tx_supp_rates, psta->bssrateset, psta->bssratelen);
|
||||
#ifdef CONFIG_80211N_HT
|
||||
_rtw_memcpy(&psta_data->ht_cap, &psta->htpriv.ht_cap, sizeof(struct rtw_ieee80211_ht_cap));
|
||||
if(padapter->registrypriv.ht_enable && is_supported_ht(padapter->registrypriv.wireless_mode))
|
||||
_rtw_memcpy(&psta_data->ht_cap, &psta->htpriv.ht_cap, sizeof(struct rtw_ieee80211_ht_cap));
|
||||
#endif /* CONFIG_80211N_HT */
|
||||
psta_data->rx_pkts = psta->sta_stats.rx_data_pkts;
|
||||
psta_data->rx_bytes = psta->sta_stats.rx_bytes;
|
||||
@@ -7502,7 +7491,6 @@ static int rtw_set_wps_beacon(struct net_device *dev, struct ieee_param *param,
|
||||
_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
|
||||
struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
|
||||
struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
|
||||
struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
|
||||
int ie_len;
|
||||
|
||||
RTW_INFO("%s, len=%d\n", __FUNCTION__, len);
|
||||
@@ -7871,7 +7859,9 @@ static int rtw_wx_set_priv(struct net_device *dev,
|
||||
int ret = 0;
|
||||
int len = 0;
|
||||
char *ext;
|
||||
#ifdef CONFIG_ANDROID
|
||||
int i;
|
||||
#endif
|
||||
|
||||
_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
|
||||
struct iw_point *dwrq = (struct iw_point *)awrq;
|
||||
@@ -8042,7 +8032,8 @@ static int rtw_wowlan_ctrl(struct net_device *dev,
|
||||
RTW_INFO("+rtw_wowlan_ctrl: %s\n", extra);
|
||||
|
||||
if (!check_fwstate(pmlmepriv, _FW_LINKED) &&
|
||||
check_fwstate(pmlmepriv, WIFI_STATION_STATE)) {
|
||||
check_fwstate(pmlmepriv, WIFI_STATION_STATE) &&
|
||||
!WOWLAN_IS_STA_MIX_MODE(padapter)) {
|
||||
#ifdef CONFIG_PNO_SUPPORT
|
||||
pwrctrlpriv->wowlan_pno_enable = _TRUE;
|
||||
#else
|
||||
@@ -8301,6 +8292,12 @@ int rtw_vendor_ie_get_data(struct net_device *dev, int vendor_ie_num, char *extr
|
||||
pstring += sprintf(pstring , "[Assoc Req]");
|
||||
if (vendor_ie_mask & WIFI_ASSOCRESP_VENDOR_IE_BIT)
|
||||
pstring += sprintf(pstring , "[Assoc Resp]");
|
||||
#ifdef CONFIG_P2P
|
||||
if (vendor_ie_mask & WIFI_P2P_PROBEREQ_VENDOR_IE_BIT)
|
||||
pstring += sprintf(pstring , "[P2P_Probe Req]");
|
||||
if (vendor_ie_mask & WIFI_P2P_PROBERESP_VENDOR_IE_BIT)
|
||||
pstring += sprintf(pstring , "[P2P_Probe Resp]");
|
||||
#endif
|
||||
|
||||
pstring += sprintf(pstring , "\nVendor IE:\n");
|
||||
for (j = 0 ; j < pmlmepriv->vendor_ielen[vendor_ie_num] ; j++)
|
||||
@@ -8351,6 +8348,7 @@ int rtw_vendor_ie_set(struct net_device *dev, struct iw_request_info *info, unio
|
||||
struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
|
||||
u32 vendor_ie_mask = 0;
|
||||
u32 vendor_ie_num = 0;
|
||||
u32 vendor_ie_mask_max = BIT(WLAN_MAX_VENDOR_IE_MASK_MAX) - 1;
|
||||
u32 id, elen;
|
||||
|
||||
ret = sscanf(extra, "%d,%x,%*s", &vendor_ie_num , &vendor_ie_mask);
|
||||
@@ -8359,10 +8357,10 @@ int rtw_vendor_ie_set(struct net_device *dev, struct iw_request_info *info, unio
|
||||
else
|
||||
return -EINVAL;
|
||||
totoal_ie_len = strlen(extra);
|
||||
RTW_INFO("[%s] vendor_ie_num = %d , vendor_ie_mask = %x , vendor_ie = %s , len = %d\n", __func__ , vendor_ie_num , vendor_ie_mask , extra , totoal_ie_len);
|
||||
RTW_INFO("[%s] vendor_ie_num = %d , vendor_ie_mask = 0x%x , vendor_ie = %s , len = %d\n", __func__ , vendor_ie_num , vendor_ie_mask , extra , totoal_ie_len);
|
||||
|
||||
if (vendor_ie_num > WLAN_MAX_VENDOR_IE_NUM - 1) {
|
||||
RTW_INFO("[%s] only support %d vendor ie\n", __func__ , WLAN_MAX_VENDOR_IE_NUM);
|
||||
RTW_INFO("[%s] Fail, only support %d vendor ie\n", __func__ , WLAN_MAX_VENDOR_IE_NUM);
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
@@ -8371,6 +8369,11 @@ int rtw_vendor_ie_set(struct net_device *dev, struct iw_request_info *info, unio
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
if (vendor_ie_mask > vendor_ie_mask_max) {
|
||||
RTW_INFO("[%s] Fail, not support vendor_ie_mask more than 0x%x\n", __func__ , vendor_ie_mask_max);
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
if (vendor_ie_mask == 0) {
|
||||
RTW_INFO("[%s] Clear vendor_ie_num %d group\n", __func__ , vendor_ie_num);
|
||||
goto _clear_path;
|
||||
@@ -8412,11 +8415,17 @@ int rtw_vendor_ie_set(struct net_device *dev, struct iw_request_info *info, unio
|
||||
if (vendor_ie_mask & WIFI_PROBEREQ_VENDOR_IE_BIT)
|
||||
RTW_INFO("[%s] Probe Req append vendor ie\n", __func__);
|
||||
if (vendor_ie_mask & WIFI_PROBERESP_VENDOR_IE_BIT)
|
||||
RTW_INFO("[%s] Probe Resp append vendor ie\n", __func__);
|
||||
RTW_INFO("[%s] Probe Resp append vendor ie\n", __func__);
|
||||
if (vendor_ie_mask & WIFI_ASSOCREQ_VENDOR_IE_BIT)
|
||||
RTW_INFO("[%s] Assoc Req append vendor ie\n", __func__);
|
||||
if (vendor_ie_mask & WIFI_ASSOCRESP_VENDOR_IE_BIT)
|
||||
RTW_INFO("[%s] Assoc Resp append vendor ie\n", __func__);
|
||||
#ifdef CONFIG_P2P
|
||||
if (vendor_ie_mask & WIFI_P2P_PROBEREQ_VENDOR_IE_BIT)
|
||||
RTW_INFO("[%s] P2P Probe Req append vendor ie\n", __func__);
|
||||
if (vendor_ie_mask & WIFI_P2P_PROBERESP_VENDOR_IE_BIT)
|
||||
RTW_INFO("[%s] P2P Probe Resp append vendor ie\n", __func__);
|
||||
#endif
|
||||
|
||||
pmlmepriv->vendor_ie_mask[vendor_ie_num] = vendor_ie_mask;
|
||||
|
||||
@@ -8440,7 +8449,6 @@ static int rtw_mp_efuse_get(struct net_device *dev,
|
||||
PEFUSE_HAL pEfuseHal;
|
||||
struct iw_point *wrqu;
|
||||
|
||||
u8 *PROMContent = pHalData->efuse_eeprom_data;
|
||||
u8 ips_mode = IPS_NUM; /* init invalid value */
|
||||
u8 lps_mode = PS_MODE_NUM; /* init invalid value */
|
||||
struct pwrctrl_priv *pwrctrlpriv ;
|
||||
@@ -8782,6 +8790,10 @@ static int rtw_mp_efuse_get(struct net_device *dev,
|
||||
addr = EEPROM_VID_8188FU;
|
||||
#endif /* CONFIG_RTL8188F */
|
||||
|
||||
#ifdef CONFIG_RTL8188GTV
|
||||
addr = EEPROM_VID_8188GTVU;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_RTL8703B
|
||||
#ifdef CONFIG_USB_HCI
|
||||
addr = EEPROM_VID_8703BU;
|
||||
@@ -9135,6 +9147,8 @@ static int rtw_mp_efuse_set(struct net_device *dev,
|
||||
u16 addr = 0xFF, cnts = 0, BTStatus = 0 , max_available_len = 0;
|
||||
u16 wifimaplen;
|
||||
int err;
|
||||
boolean bcmpchk = _TRUE;
|
||||
|
||||
|
||||
wrqu = (struct iw_point *)wdata;
|
||||
padapter = rtw_netdev_priv(dev);
|
||||
@@ -9421,6 +9435,10 @@ static int rtw_mp_efuse_set(struct net_device *dev,
|
||||
addr = EEPROM_VID_8188FU;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_RTL8188GTV
|
||||
addr = EEPROM_VID_8188GTVU;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_RTL8703B
|
||||
#ifdef CONFIG_USB_HCI
|
||||
addr = EEPROM_VID_8703BU;
|
||||
@@ -9678,18 +9696,42 @@ static int rtw_mp_efuse_set(struct net_device *dev,
|
||||
}
|
||||
|
||||
if (rtw_efuse_mask_map_read(padapter, 0x00, wifimaplen, ShadowMapWiFi) == _SUCCESS) {
|
||||
if (_rtw_memcmp((void *)ShadowMapWiFi , (void *)pEfuseHal->fakeEfuseModifiedMap, cnts)) {
|
||||
RTW_INFO("%s: WiFi write map afterf compare OK\n", __FUNCTION__);
|
||||
sprintf(extra, "WiFi write map compare OK\n");
|
||||
err = 0;
|
||||
goto exit;
|
||||
} else {
|
||||
sprintf(extra, "WiFi write map compare FAIL\n");
|
||||
RTW_INFO("%s: WiFi write map compare Fail\n", __FUNCTION__);
|
||||
err = 0;
|
||||
goto exit;
|
||||
addr = 0x00;
|
||||
err = _TRUE;
|
||||
|
||||
for (i = 0; i < cnts; i++) {
|
||||
if (padapter->registrypriv.boffefusemask == 0) {
|
||||
if (padapter->registrypriv.bFileMaskEfuse == _TRUE) {
|
||||
if (rtw_file_efuse_IsMasked(padapter, addr + i) == _TRUE) /*use file efuse mask. */
|
||||
bcmpchk = _FALSE;
|
||||
} else {
|
||||
if (efuse_IsMasked(padapter, addr + i) == _TRUE)
|
||||
bcmpchk = _FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
if (bcmpchk == _TRUE) {
|
||||
RTW_INFO("compare readMapWiFi[0x%02x] = %x, ModifiedMap = %x\n", addr + i, ShadowMapWiFi[ addr + i], pEfuseHal->fakeEfuseModifiedMap[addr + i]);
|
||||
if (_rtw_memcmp((void *) &ShadowMapWiFi[addr + i], (void *)&pEfuseHal->fakeEfuseModifiedMap[addr + i], 1) == _FALSE){
|
||||
err = _FALSE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
bcmpchk = _TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
if (err) {
|
||||
RTW_INFO("%s: WiFi write map afterf compare OK\n", __FUNCTION__);
|
||||
sprintf(extra, "WiFi write map compare OK\n");
|
||||
err = 0;
|
||||
goto exit;
|
||||
} else {
|
||||
sprintf(extra, "WiFi write map compare FAIL\n");
|
||||
RTW_INFO("%s: WiFi write map compare Fail\n", __FUNCTION__);
|
||||
err = 0;
|
||||
goto exit;
|
||||
}
|
||||
} else if (strcmp(tmp[0], "wlwfake") == 0) {
|
||||
if ((tmp[1] == NULL) || (tmp[2] == NULL)) {
|
||||
err = -EINVAL;
|
||||
@@ -9833,7 +9875,7 @@ static int rtw_mp_customer_str(
|
||||
|| !adapter->registrypriv.mp_customer_str)
|
||||
return -EFAULT;
|
||||
|
||||
len = wrqu->data.length;
|
||||
len = wrqu->data.length + 1;
|
||||
|
||||
pbuf = (u8 *)rtw_zmalloc(len);
|
||||
if (pbuf == NULL) {
|
||||
@@ -9841,7 +9883,7 @@ static int rtw_mp_customer_str(
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
if (copy_from_user(pbuf, wrqu->data.pointer, len)) {
|
||||
if (copy_from_user(pbuf, wrqu->data.pointer, wrqu->data.length)) {
|
||||
rtw_mfree(pbuf, len);
|
||||
RTW_WARN("%s: copy from user fail!\n", __func__);
|
||||
return -EFAULT;
|
||||
@@ -9917,7 +9959,9 @@ static int rtw_priv_mp_set(struct net_device *dev,
|
||||
|
||||
struct iw_point *wrqu = (struct iw_point *)wdata;
|
||||
u32 subcmd = wrqu->flags;
|
||||
#ifdef CONFIG_CONCURRENT_MODE
|
||||
PADAPTER padapter = rtw_netdev_priv(dev);
|
||||
#endif
|
||||
|
||||
if (!is_primary_adapter(padapter)) {
|
||||
RTW_INFO("MP mode only primary Adapter support\n");
|
||||
@@ -9956,7 +10000,9 @@ static int rtw_priv_mp_get(struct net_device *dev,
|
||||
|
||||
struct iw_point *wrqu = (struct iw_point *)wdata;
|
||||
u32 subcmd = wrqu->flags;
|
||||
#ifdef CONFIG_CONCURRENT_MODE
|
||||
PADAPTER padapter = rtw_netdev_priv(dev);
|
||||
#endif
|
||||
|
||||
if (!is_primary_adapter(padapter)) {
|
||||
RTW_INFO("MP mode only primary Adapter support\n");
|
||||
@@ -11062,7 +11108,6 @@ static int rtw_tdls_get_best_ch(struct net_device *dev,
|
||||
#ifdef CONFIG_FIND_BEST_CHANNEL
|
||||
_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
|
||||
struct rf_ctl_t *rfctl = adapter_to_rfctl(padapter);
|
||||
struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
|
||||
u32 i, best_channel_24G = 1, best_channel_5G = 36, index_24G = 0, index_5G = 0;
|
||||
|
||||
for (i = 0; i < rfctl->max_chan_nums && rfctl->channel_set[i].ChannelNum != 0; i++) {
|
||||
@@ -11314,6 +11359,11 @@ extern void rtl8723b_fill_default_txdesc(struct xmit_frame *pxmitframe, u8 *pbuf
|
||||
#define fill_default_txdesc rtl8723d_fill_default_txdesc
|
||||
#endif /* CONFIG_RTL8723D */
|
||||
|
||||
#if defined(CONFIG_RTL8710B)
|
||||
#define cal_txdesc_chksum rtl8710b_cal_txdesc_chksum
|
||||
#define fill_default_txdesc rtl8710b_fill_default_txdesc
|
||||
#endif /* CONFIG_RTL8710B */
|
||||
|
||||
#if defined(CONFIG_RTL8192E)
|
||||
extern void rtl8192e_cal_txdesc_chksum(struct tx_desc *ptxdesc);
|
||||
#define cal_txdesc_chksum rtl8192e_cal_txdesc_chksum
|
||||
@@ -11323,6 +11373,13 @@ extern void rtl8192es_fill_default_txdesc(struct xmit_frame *pxmitframe, u8 *pbu
|
||||
#endif /* CONFIG_SDIO_HCI */
|
||||
#endif /* CONFIG_RTL8192E */
|
||||
|
||||
#if defined(CONFIG_RTL8192F)
|
||||
/* extern void rtl8192f_cal_txdesc_chksum(struct tx_desc *ptxdesc); */
|
||||
#define cal_txdesc_chksum rtl8192f_cal_txdesc_chksum
|
||||
/* extern void rtl8192f_fill_default_txdesc(struct xmit_frame *pxmitframe, u8 *pbuf); */
|
||||
#define fill_default_txdesc rtl8192f_fill_default_txdesc
|
||||
#endif /* CONFIG_RTL8192F */
|
||||
|
||||
static s32 initLoopback(PADAPTER padapter)
|
||||
{
|
||||
PLOOPBACKDATA ploopback;
|
||||
@@ -12307,17 +12364,7 @@ static struct iw_statistics *rtw_get_wireless_stats(struct net_device *dev)
|
||||
#ifdef CONFIG_SIGNAL_DISPLAY_DBM
|
||||
tmp_level = translate_percentage_to_dbm(padapter->recvpriv.signal_strength);
|
||||
#else
|
||||
#ifdef CONFIG_SIGNAL_SCALE_MAPPING
|
||||
tmp_level = padapter->recvpriv.signal_strength;
|
||||
#else
|
||||
{
|
||||
/* Do signal scale mapping when using percentage as the unit of signal strength, since the scale mapping is skipped in odm */
|
||||
|
||||
HAL_DATA_TYPE *pHal = GET_HAL_DATA(padapter);
|
||||
|
||||
tmp_level = (u8)phydm_signal_scale_mapping(&pHal->odmpriv, padapter->recvpriv.signal_strength);
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
tmp_qual = padapter->recvpriv.signal_qual;
|
||||
@@ -12777,7 +12824,6 @@ static int rtw_ioctl_compat_wext_private(struct net_device *dev, struct ifreq *r
|
||||
static int rtw_ioctl_standard_wext_private(struct net_device *dev, struct ifreq *rq)
|
||||
{
|
||||
struct iw_point *iwp;
|
||||
struct ifreq ifrq;
|
||||
union iwreq_data wrq_data;
|
||||
int err = 0;
|
||||
iwp = &wrq_data.data;
|
||||
|
||||
@@ -37,9 +37,9 @@ int rtw_mp_write_reg(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
struct iw_point *wrqu, char *extra)
|
||||
{
|
||||
char *pch, *pnext, *ptmp;
|
||||
char *pch, *pnext;
|
||||
char *width_str;
|
||||
char width, buf[5];
|
||||
char width;
|
||||
u32 addr, data;
|
||||
int ret;
|
||||
PADAPTER padapter = rtw_netdev_priv(dev);
|
||||
@@ -130,10 +130,10 @@ int rtw_mp_read_reg(struct net_device *dev,
|
||||
struct iw_point *wrqu, char *extra)
|
||||
{
|
||||
char input[wrqu->length + 1];
|
||||
char *pch, *pnext, *ptmp;
|
||||
char *pch, *pnext;
|
||||
char *width_str;
|
||||
char width;
|
||||
char data[20], tmp[20], buf[3];
|
||||
char data[20], tmp[20];
|
||||
u32 addr = 0, strtout = 0;
|
||||
u32 i = 0, j = 0, ret = 0, data32 = 0;
|
||||
PADAPTER padapter = rtw_netdev_priv(dev);
|
||||
@@ -306,8 +306,8 @@ int rtw_mp_read_rf(struct net_device *dev,
|
||||
struct iw_point *wrqu, char *extra)
|
||||
{
|
||||
char input[wrqu->length];
|
||||
char *pch, *pnext, *ptmp;
|
||||
char data[20], tmp[20], buf[3];
|
||||
char *pch, *pnext;
|
||||
char data[20], tmp[20];
|
||||
u32 path, addr, strtou;
|
||||
u32 ret, i = 0 , j = 0;
|
||||
PADAPTER padapter = rtw_netdev_priv(dev);
|
||||
@@ -367,10 +367,7 @@ int rtw_mp_start(struct net_device *dev,
|
||||
struct iw_point *wrqu, char *extra)
|
||||
{
|
||||
int ret = 0;
|
||||
u8 val8;
|
||||
PADAPTER padapter = rtw_netdev_priv(dev);
|
||||
HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
|
||||
struct hal_ops *pHalFunc = &padapter->hal_func;
|
||||
|
||||
rtw_pm_set_ips(padapter, IPS_NONE);
|
||||
LeaveAllPowerSaveMode(padapter);
|
||||
@@ -396,7 +393,6 @@ int rtw_mp_stop(struct net_device *dev,
|
||||
{
|
||||
int ret = 0;
|
||||
PADAPTER padapter = rtw_netdev_priv(dev);
|
||||
struct hal_ops *pHalFunc = &padapter->hal_func;
|
||||
|
||||
if (rtw_mp_cmd(padapter, MP_STOP, RTW_CMDF_WAIT_ACK) != _SUCCESS)
|
||||
ret = -EPERM;
|
||||
@@ -466,7 +462,6 @@ int rtw_mp_channel(struct net_device *dev,
|
||||
HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
|
||||
u8 input[wrqu->length + 1];
|
||||
u32 channel = 1;
|
||||
int cur_ch_offset;
|
||||
|
||||
_rtw_memset(input, 0, sizeof(input));
|
||||
if (copy_from_user(input, wrqu->pointer, wrqu->length))
|
||||
@@ -492,7 +487,6 @@ int rtw_mp_ch_offset(struct net_device *dev,
|
||||
{
|
||||
|
||||
PADAPTER padapter = rtw_netdev_priv(dev);
|
||||
HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
|
||||
u8 input[wrqu->length + 1];
|
||||
u32 ch_offset = 0;
|
||||
|
||||
@@ -518,7 +512,6 @@ int rtw_mp_bandwidth(struct net_device *dev,
|
||||
struct iw_point *wrqu, char *extra)
|
||||
{
|
||||
u32 bandwidth = 0, sg = 0;
|
||||
int cur_ch_offset;
|
||||
PADAPTER padapter = rtw_netdev_priv(dev);
|
||||
HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
|
||||
u8 input[wrqu->length];
|
||||
@@ -553,6 +546,7 @@ int rtw_mp_txpower_index(struct net_device *dev,
|
||||
struct iw_point *wrqu, char *extra)
|
||||
{
|
||||
PADAPTER padapter = rtw_netdev_priv(dev);
|
||||
HAL_DATA_TYPE *phal_data = GET_HAL_DATA(padapter);
|
||||
char input[wrqu->length + 1];
|
||||
u32 rfpath;
|
||||
u32 txpower_inx;
|
||||
@@ -567,9 +561,26 @@ int rtw_mp_txpower_index(struct net_device *dev,
|
||||
|
||||
input[wrqu->length] = '\0';
|
||||
|
||||
rfpath = rtw_atoi(input);
|
||||
txpower_inx = mpt_ProQueryCalTxPower(padapter, rfpath);
|
||||
sprintf(extra, " %d", txpower_inx);
|
||||
if (wrqu->length == 2) {
|
||||
rfpath = rtw_atoi(input);
|
||||
txpower_inx = mpt_ProQueryCalTxPower(padapter, rfpath);
|
||||
sprintf(extra, " %d", txpower_inx);
|
||||
} else {
|
||||
txpower_inx = mpt_ProQueryCalTxPower(padapter, 0);
|
||||
sprintf(extra, "patha=%d", txpower_inx);
|
||||
if (phal_data->rf_type > RF_1T2R) {
|
||||
txpower_inx = mpt_ProQueryCalTxPower(padapter, 1);
|
||||
sprintf(extra, "%s,pathb=%d", extra, txpower_inx);
|
||||
}
|
||||
if (phal_data->rf_type > RF_2T4R) {
|
||||
txpower_inx = mpt_ProQueryCalTxPower(padapter, 2);
|
||||
sprintf(extra, "%s,pathc=%d", extra, txpower_inx);
|
||||
}
|
||||
if (phal_data->rf_type > RF_3T4R) {
|
||||
txpower_inx = mpt_ProQueryCalTxPower(padapter, 3);
|
||||
sprintf(extra, "%s,pathd=%d", extra, txpower_inx);
|
||||
}
|
||||
}
|
||||
wrqu->length = strlen(extra);
|
||||
|
||||
return 0;
|
||||
@@ -580,7 +591,7 @@ int rtw_mp_txpower(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
struct iw_point *wrqu, char *extra)
|
||||
{
|
||||
u32 idx_a = 0, idx_b = 0, idx_c = 0, idx_d = 0, status = 0;
|
||||
u32 idx_a = 0, idx_b = 0, idx_c = 0, idx_d = 0;
|
||||
int MsetPower = 1;
|
||||
u8 input[wrqu->length];
|
||||
|
||||
@@ -844,10 +855,10 @@ int rtw_mp_disable_bt_coexist(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
union iwreq_data *wrqu, char *extra)
|
||||
{
|
||||
#ifdef CONFIG_BT_COEXIST
|
||||
PADAPTER padapter = (PADAPTER)rtw_netdev_priv(dev);
|
||||
HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
|
||||
struct hal_ops *pHalFunc = &padapter->hal_func;
|
||||
|
||||
#endif
|
||||
u8 input[wrqu->data.length + 1];
|
||||
u32 bt_coexist;
|
||||
|
||||
@@ -884,11 +895,11 @@ int rtw_mp_arx(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
struct iw_point *wrqu, char *extra)
|
||||
{
|
||||
int bStartRx = 0, bStopRx = 0, bQueryPhy = 0, bQueryMac = 0, bSetBssid = 0;
|
||||
int bmac_filter = 0, bfilter_init = 0, bmon = 0, bSmpCfg = 0, bloopbk = 0;
|
||||
int bStartRx = 0, bStopRx = 0, bQueryPhy = 0, bQueryMac = 0, bSetBssid = 0, bSetRxframe = 0;
|
||||
int bmac_filter = 0, bmon = 0, bSmpCfg = 0;
|
||||
u8 input[wrqu->length];
|
||||
char *pch, *ptmp, *token, *tmp[2] = {0x00, 0x00};
|
||||
u32 i = 0, ii = 0, jj = 0, kk = 0, cnts = 0, ret;
|
||||
char *pch, *token, *tmp[2] = {0x00, 0x00};
|
||||
u32 i = 0, jj = 0, kk = 0, cnts = 0, ret;
|
||||
PADAPTER padapter = rtw_netdev_priv(dev);
|
||||
struct mp_priv *pmppriv = &padapter->mppriv;
|
||||
struct dbg_rx_counter rx_counter;
|
||||
@@ -909,6 +920,7 @@ int rtw_mp_arx(struct net_device *dev,
|
||||
bQueryPhy = (strncmp(input, "phy", 3) == 0) ? 1 : 0; /* strncmp TRUE is 0*/
|
||||
bQueryMac = (strncmp(input, "mac", 3) == 0) ? 1 : 0; /* strncmp TRUE is 0*/
|
||||
bSetBssid = (strncmp(input, "setbssid=", 8) == 0) ? 1 : 0; /* strncmp TRUE is 0*/
|
||||
bSetRxframe = (strncmp(input, "frametype", 9) == 0) ? 1 : 0;
|
||||
/*bfilter_init = (strncmp(input, "filter_init",11)==0)?1:0;*/
|
||||
bmac_filter = (strncmp(input, "accept_mac", 10) == 0) ? 1 : 0;
|
||||
bmon = (strncmp(input, "mon=", 4) == 0) ? 1 : 0;
|
||||
@@ -938,6 +950,12 @@ int rtw_mp_arx(struct net_device *dev,
|
||||
|
||||
pmppriv->bSetRxBssid = _TRUE;
|
||||
}
|
||||
if (bSetRxframe) {
|
||||
if (strncmp(input, "frametype beacon", 16) == 0)
|
||||
pmppriv->brx_filter_beacon = _TRUE;
|
||||
else
|
||||
pmppriv->brx_filter_beacon = _FALSE;
|
||||
}
|
||||
|
||||
if (bmac_filter) {
|
||||
pmppriv->bmac_filter = bmac_filter;
|
||||
@@ -1064,7 +1082,6 @@ int rtw_mp_pwrtrk(struct net_device *dev,
|
||||
u32 thermal;
|
||||
s32 ret;
|
||||
PADAPTER padapter = rtw_netdev_priv(dev);
|
||||
HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
|
||||
u8 input[wrqu->length];
|
||||
|
||||
if (copy_from_user(input, wrqu->pointer, wrqu->length))
|
||||
@@ -1134,6 +1151,9 @@ int rtw_mp_thermal(struct net_device *dev,
|
||||
#ifdef CONFIG_RTL8192E
|
||||
u16 addr = EEPROM_THERMAL_METER_8192E;
|
||||
#endif
|
||||
#ifdef CONFIG_RTL8192F
|
||||
u16 addr = EEPROM_THERMAL_METER_8192F;
|
||||
#endif
|
||||
#ifdef CONFIG_RTL8723B
|
||||
u16 addr = EEPROM_THERMAL_METER_8723B;
|
||||
#endif
|
||||
@@ -1146,11 +1166,17 @@ int rtw_mp_thermal(struct net_device *dev,
|
||||
#ifdef CONFIG_RTL8188F
|
||||
u16 addr = EEPROM_THERMAL_METER_8188F;
|
||||
#endif
|
||||
#ifdef CONFIG_RTL8188GTV
|
||||
u16 addr = EEPROM_THERMAL_METER_8188GTV;
|
||||
#endif
|
||||
#ifdef CONFIG_RTL8822B
|
||||
u16 addr = EEPROM_THERMAL_METER_8822B;
|
||||
#endif
|
||||
#ifdef CONFIG_RTL8821C
|
||||
u16 addr = EEPROM_THERMAL_METER_8821C;
|
||||
#endif
|
||||
#ifdef CONFIG_RTL8710B
|
||||
u16 addr = EEPROM_THERMAL_METER_8710B;
|
||||
#endif
|
||||
u16 cnt = 1;
|
||||
u16 max_available_size = 0;
|
||||
@@ -1189,7 +1215,6 @@ int rtw_mp_reset_stats(struct net_device *dev,
|
||||
struct iw_point *wrqu, char *extra)
|
||||
{
|
||||
struct mp_priv *pmp_priv;
|
||||
struct pkt_attrib *pattrib;
|
||||
PADAPTER padapter = rtw_netdev_priv(dev);
|
||||
|
||||
pmp_priv = &padapter->mppriv;
|
||||
@@ -1216,11 +1241,7 @@ int rtw_mp_dump(struct net_device *dev,
|
||||
struct iw_point *wrqu, char *extra)
|
||||
{
|
||||
struct mp_priv *pmp_priv;
|
||||
struct pkt_attrib *pattrib;
|
||||
u32 value;
|
||||
u8 input[wrqu->length];
|
||||
u8 rf_type, path_nums = 0;
|
||||
u32 i, j = 1, path;
|
||||
PADAPTER padapter = rtw_netdev_priv(dev);
|
||||
|
||||
pmp_priv = &padapter->mppriv;
|
||||
@@ -1272,7 +1293,9 @@ int rtw_mp_SetRFPath(struct net_device *dev,
|
||||
PADAPTER padapter = rtw_netdev_priv(dev);
|
||||
char input[wrqu->length];
|
||||
int bMain = 1, bTurnoff = 1;
|
||||
#ifdef CONFIG_ANTENNA_DIVERSITY
|
||||
u8 ret = _TRUE;
|
||||
#endif
|
||||
|
||||
RTW_INFO("%s:iwpriv in=%s\n", __func__, input);
|
||||
|
||||
@@ -1501,7 +1524,7 @@ int rtw_mp_mon(struct net_device *dev,
|
||||
if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) {
|
||||
rtw_disassoc_cmd(padapter, 500, 0);
|
||||
rtw_indicate_disconnect(padapter, 0, _FALSE);
|
||||
/*rtw_free_assoc_resources(padapter, 1);*/
|
||||
/*rtw_free_assoc_resources_cmd(padapter, _TRUE, 0);*/
|
||||
}
|
||||
rtw_pm_set_ips(padapter, IPS_NORMAL);
|
||||
sprintf(extra, "monitor mode Stop\n");
|
||||
@@ -1513,9 +1536,7 @@ int rtw_mp_mon(struct net_device *dev,
|
||||
|
||||
int rtw_mp_pretx_proc(PADAPTER padapter, u8 bStartTest, char *extra)
|
||||
{
|
||||
HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
|
||||
struct mp_priv *pmp_priv = &padapter->mppriv;
|
||||
PMPT_CONTEXT pMptCtx = &(padapter->mppriv.mpt_ctx);
|
||||
char *pextra = extra;
|
||||
|
||||
switch (pmp_priv->mode) {
|
||||
@@ -1571,7 +1592,9 @@ int rtw_mp_pretx_proc(PADAPTER padapter, u8 bStartTest, char *extra)
|
||||
rtw_msleep_os(5);
|
||||
}
|
||||
#ifdef CONFIG_80211N_HT
|
||||
pmp_priv->tx.attrib.ht_en = 1;
|
||||
if(padapter->registrypriv.ht_enable &&
|
||||
is_supported_ht(padapter->registrypriv.wireless_mode))
|
||||
pmp_priv->tx.attrib.ht_en = 1;
|
||||
#endif
|
||||
pmp_priv->tx.stop = 0;
|
||||
pmp_priv->tx.count = 1;
|
||||
@@ -1601,10 +1624,12 @@ int rtw_mp_tx(struct net_device *dev,
|
||||
HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
|
||||
struct mp_priv *pmp_priv = &padapter->mppriv;
|
||||
PMPT_CONTEXT pMptCtx = &(padapter->mppriv.mpt_ctx);
|
||||
struct registry_priv *pregistrypriv = &padapter->registrypriv;
|
||||
char *pextra = extra;
|
||||
u32 bandwidth = 0, sg = 0, channel = 6, txpower = 40, rate = 108, ant = 0, txmode = 1, count = 0;
|
||||
u8 i = 0, j = 0, bStartTest = 1, status = 0, Idx = 0, tmpU1B = 0;
|
||||
u8 bStartTest = 1, status = 0;
|
||||
#ifdef CONFIG_MP_VHT_HW_TX_MODE
|
||||
u8 Idx = 0, tmpU1B;
|
||||
#endif
|
||||
u16 antenna = 0;
|
||||
|
||||
if (copy_from_user(extra, wrqu->data.pointer, wrqu->data.length))
|
||||
@@ -1921,7 +1946,6 @@ int rtw_mp_rx(struct net_device *dev,
|
||||
PADAPTER padapter = rtw_netdev_priv(dev);
|
||||
HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
|
||||
struct mp_priv *pmp_priv = &padapter->mppriv;
|
||||
PMPT_CONTEXT pMptCtx = &(padapter->mppriv.mpt_ctx);
|
||||
char *pextra = extra;
|
||||
u32 bandwidth = 0, sg = 0, channel = 6, ant = 0;
|
||||
u16 antenna = 0;
|
||||
@@ -2042,7 +2066,6 @@ int rtw_mp_hwtx(struct net_device *dev,
|
||||
union iwreq_data *wrqu, char *extra)
|
||||
{
|
||||
PADAPTER padapter = rtw_netdev_priv(dev);
|
||||
HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
|
||||
struct mp_priv *pmp_priv = &padapter->mppriv;
|
||||
PMPT_CONTEXT pMptCtx = &(padapter->mppriv.mpt_ctx);
|
||||
|
||||
@@ -2154,11 +2177,10 @@ int rtw_efuse_mask_file(struct net_device *dev,
|
||||
return 0;
|
||||
}
|
||||
if (strncmp(extra, "data,", 5) == 0) {
|
||||
u8 *pch, *pdata;
|
||||
u8 *pch;
|
||||
char *ptmp, tmp;
|
||||
u8 count = 0;
|
||||
u8 i = 0;
|
||||
u32 datalen = 0;
|
||||
|
||||
ptmp = extra;
|
||||
pch = strsep(&ptmp, ",");
|
||||
|
||||
@@ -96,7 +96,6 @@ void rtw_reset_securitypriv(_adapter *adapter)
|
||||
u32 backupTKIPcountermeasure_time = 0;
|
||||
/* add for CONFIG_IEEE80211W, none 11w also can use */
|
||||
_irqL irqL;
|
||||
struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv;
|
||||
|
||||
_enter_critical_bh(&adapter->security_key_mutex, &irqL);
|
||||
|
||||
@@ -378,9 +377,6 @@ int hostapd_mode_init(_adapter *padapter)
|
||||
|
||||
/* pnetdev->wireless_handlers = NULL; */
|
||||
|
||||
#ifdef CONFIG_TCP_CSUM_OFFLOAD_TX
|
||||
pnetdev->features |= NETIF_F_IP_CSUM;
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -20,7 +20,6 @@ int rtw_os_recvframe_duplicate_skb(_adapter *padapter, union recv_frame *pclonef
|
||||
{
|
||||
int res = _SUCCESS;
|
||||
_pkt *pkt_copy = NULL;
|
||||
struct rx_pkt_attrib *pattrib = &pcloneframe->u.hdr.attrib;
|
||||
|
||||
if (pskb == NULL) {
|
||||
RTW_INFO("%s [WARN] skb == NULL, drop frag frame\n", __func__);
|
||||
@@ -215,8 +214,10 @@ int rtw_os_recvbuf_resource_alloc(_adapter *padapter, struct recv_buf *precvbuf)
|
||||
int res = _SUCCESS;
|
||||
|
||||
#ifdef CONFIG_USB_HCI
|
||||
#ifdef CONFIG_USE_USB_BUFFER_ALLOC_RX
|
||||
struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter);
|
||||
struct usb_device *pusbd = pdvobjpriv->pusbdev;
|
||||
#endif
|
||||
|
||||
precvbuf->irp_pending = _FALSE;
|
||||
precvbuf->purb = usb_alloc_urb(0, GFP_KERNEL);
|
||||
@@ -384,7 +385,11 @@ int rtw_recv_napi_poll(struct napi_struct *napi, int budget)
|
||||
|
||||
work_done = napi_recv(padapter, budget);
|
||||
if (work_done < budget) {
|
||||
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0)) && defined(CONFIG_PCI_HCI)
|
||||
napi_complete_done(napi, work_done);
|
||||
#else
|
||||
napi_complete(napi);
|
||||
#endif
|
||||
if (!skb_queue_empty(&precvpriv->rx_napi_skb_queue))
|
||||
napi_schedule(napi);
|
||||
}
|
||||
@@ -506,6 +511,11 @@ void rtw_os_recv_indicate_pkt(_adapter *padapter, _pkt *pkt, union recv_frame *r
|
||||
pkt->protocol = eth_type_trans(pkt, padapter->pnetdev);
|
||||
pkt->dev = padapter->pnetdev;
|
||||
pkt->ip_summed = CHECKSUM_NONE; /* CONFIG_TCP_CSUM_OFFLOAD_RX */
|
||||
#ifdef CONFIG_TCP_CSUM_OFFLOAD_RX
|
||||
if ((rframe->u.hdr.attrib.csum_valid == 1)
|
||||
&& (rframe->u.hdr.attrib.csum_err == 0))
|
||||
pkt->ip_summed = CHECKSUM_UNNECESSARY;
|
||||
#endif /* CONFIG_TCP_CSUM_OFFLOAD_RX */
|
||||
|
||||
#ifdef CONFIG_RTW_NAPI
|
||||
#ifdef CONFIG_RTW_NAPI_DYNAMIC
|
||||
@@ -543,7 +553,6 @@ void rtw_handle_tkip_mic_err(_adapter *padapter, struct sta_info *sta, u8 bgroup
|
||||
#endif
|
||||
union iwreq_data wrqu;
|
||||
struct iw_michaelmicfailure ev;
|
||||
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
|
||||
struct security_priv *psecuritypriv = &padapter->securitypriv;
|
||||
systime cur_time = 0;
|
||||
|
||||
@@ -632,7 +641,6 @@ int rtw_recv_monitor(_adapter *padapter, union recv_frame *precv_frame)
|
||||
struct recv_priv *precvpriv;
|
||||
_queue *pfree_recv_queue;
|
||||
_pkt *skb;
|
||||
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
|
||||
struct rx_pkt_attrib *pattrib;
|
||||
|
||||
if (NULL == precv_frame)
|
||||
@@ -685,7 +693,6 @@ int rtw_recv_indicatepkt(_adapter *padapter, union recv_frame *precv_frame)
|
||||
{
|
||||
struct recv_priv *precvpriv;
|
||||
_queue *pfree_recv_queue;
|
||||
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
|
||||
|
||||
precvpriv = &(padapter->recvpriv);
|
||||
pfree_recv_queue = &(precvpriv->free_recv_queue);
|
||||
|
||||
@@ -55,6 +55,7 @@ const char *android_wifi_cmd_str[ANDROID_WIFI_CMD_MAX] = {
|
||||
"BTCOEXSCAN-START",
|
||||
"BTCOEXSCAN-STOP",
|
||||
"BTCOEXMODE",
|
||||
"SETSUSPENDMODE",
|
||||
"SETSUSPENDOPT",
|
||||
"P2P_DEV_ADDR",
|
||||
"SETFWPATH",
|
||||
@@ -380,8 +381,6 @@ int rtw_android_get_rssi(struct net_device *net, char *command, int total_len)
|
||||
int rtw_android_get_link_speed(struct net_device *net, char *command, int total_len)
|
||||
{
|
||||
_adapter *padapter = (_adapter *)rtw_netdev_priv(net);
|
||||
struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
|
||||
struct wlan_network *pcur_network = &pmlmepriv->cur_network;
|
||||
int bytes_written = 0;
|
||||
u16 link_speed = 0;
|
||||
|
||||
@@ -393,7 +392,6 @@ int rtw_android_get_link_speed(struct net_device *net, char *command, int total_
|
||||
|
||||
int rtw_android_get_macaddr(struct net_device *net, char *command, int total_len)
|
||||
{
|
||||
_adapter *adapter = (_adapter *)rtw_netdev_priv(net);
|
||||
int bytes_written = 0;
|
||||
|
||||
bytes_written = snprintf(command, total_len, "Macaddr = "MAC_FMT, MAC_ARG(net->dev_addr));
|
||||
@@ -599,6 +597,7 @@ exit:
|
||||
|
||||
int rtw_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd)
|
||||
{
|
||||
#define PRIVATE_COMMAND_MAX_LEN 8192
|
||||
int ret = 0;
|
||||
char *command = NULL;
|
||||
int cmd_num;
|
||||
@@ -650,18 +649,21 @@ int rtw_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd)
|
||||
goto exit;
|
||||
}
|
||||
/*RTW_INFO("%s priv_cmd.buf=%p priv_cmd.total_len=%d priv_cmd.used_len=%d\n",__func__,priv_cmd.buf,priv_cmd.total_len,priv_cmd.used_len);*/
|
||||
command = rtw_zmalloc(priv_cmd.total_len);
|
||||
if (priv_cmd.total_len > PRIVATE_COMMAND_MAX_LEN || priv_cmd.total_len < 0) {
|
||||
RTW_WARN("%s: invalid private command (%d)\n", __FUNCTION__,
|
||||
priv_cmd.total_len);
|
||||
ret = -EFAULT;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
command = rtw_zmalloc(priv_cmd.total_len+1);
|
||||
if (!command) {
|
||||
RTW_INFO("%s: failed to allocate memory\n", __FUNCTION__);
|
||||
ret = -ENOMEM;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 0, 0))
|
||||
if (!access_ok(VERIFY_READ, priv_cmd.buf, priv_cmd.total_len)) {
|
||||
#else
|
||||
if (!access_ok(priv_cmd.buf, priv_cmd.total_len)) {
|
||||
#endif
|
||||
RTW_INFO("%s: failed to access memory\n", __FUNCTION__);
|
||||
ret = -EFAULT;
|
||||
goto exit;
|
||||
@@ -670,7 +672,7 @@ int rtw_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd)
|
||||
ret = -EFAULT;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
command[priv_cmd.total_len] = '\0';
|
||||
RTW_INFO("%s: Android private cmd \"%s\" on %s\n"
|
||||
, __FUNCTION__, command, ifr->ifr_name);
|
||||
|
||||
@@ -773,6 +775,9 @@ int rtw_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd)
|
||||
#endif
|
||||
break;
|
||||
|
||||
case ANDROID_WIFI_CMD_SETSUSPENDMODE:
|
||||
break;
|
||||
|
||||
case ANDROID_WIFI_CMD_SETSUSPENDOPT:
|
||||
/* bytes_written = wl_android_set_suspendopt(net, command, priv_cmd.total_len); */
|
||||
break;
|
||||
@@ -857,7 +862,7 @@ int rtw_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd)
|
||||
/* wpa_cli driver wfd-set-tcpport = 554 */
|
||||
|
||||
if (padapter->wdinfo.driver_interface == DRIVER_CFG80211)
|
||||
rtw_wfd_set_ctrl_port(padapter, (u16)get_int_from_command(priv_cmd.buf));
|
||||
rtw_wfd_set_ctrl_port(padapter, (u16)get_int_from_command(command));
|
||||
break;
|
||||
}
|
||||
case ANDROID_WIFI_CMD_WFD_SET_MAX_TPUT: {
|
||||
@@ -869,7 +874,7 @@ int rtw_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd)
|
||||
|
||||
pwfd_info = &padapter->wfd_info;
|
||||
if (padapter->wdinfo.driver_interface == DRIVER_CFG80211) {
|
||||
pwfd_info->wfd_device_type = (u8) get_int_from_command(priv_cmd.buf);
|
||||
pwfd_info->wfd_device_type = (u8) get_int_from_command(command);
|
||||
pwfd_info->wfd_device_type &= WFD_DEVINFO_DUAL;
|
||||
}
|
||||
break;
|
||||
@@ -878,7 +883,7 @@ int rtw_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd)
|
||||
case ANDROID_WIFI_CMD_CHANGE_DTIM: {
|
||||
#ifdef CONFIG_LPS
|
||||
u8 dtim;
|
||||
u8 *ptr = (u8 *) &priv_cmd.buf;
|
||||
u8 *ptr = (u8 *) command;
|
||||
|
||||
ptr += 9;/* string command length of "SET_DTIM"; */
|
||||
|
||||
@@ -916,10 +921,6 @@ int rtw_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd)
|
||||
#endif /* CONFIG_GTK_OL */
|
||||
case ANDROID_WIFI_CMD_P2P_DISABLE: {
|
||||
#ifdef CONFIG_P2P
|
||||
struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
|
||||
u8 channel, ch_offset;
|
||||
u16 bwmode;
|
||||
|
||||
rtw_p2p_enable(padapter, P2P_ROLE_DISABLE);
|
||||
#endif /* CONFIG_P2P */
|
||||
break;
|
||||
|
||||
@@ -252,8 +252,7 @@ int rtw_dev_get_feature_set(struct net_device *dev)
|
||||
feature_set |= WIFI_FEATURE_INFRA;
|
||||
|
||||
#ifdef CONFIG_IEEE80211_BAND_5GHZ
|
||||
if (is_supported_5g(adapter_to_regsty(adapter)->wireless_mode)
|
||||
&& hal_chk_band_cap(adapter, BAND_CAP_5G)) /* v5.3 has no rtw_init_wireless_mode(), need checking hal spec here */
|
||||
if (is_supported_5g(adapter_to_regsty(adapter)->wireless_mode))
|
||||
feature_set |= WIFI_FEATURE_INFRA_5G;
|
||||
#endif
|
||||
|
||||
@@ -265,6 +264,19 @@ int rtw_dev_get_feature_set(struct net_device *dev)
|
||||
feature_set |= WIFI_FEATURE_LINK_LAYER_STATS;
|
||||
#endif /* CONFIG_RTW_CFGVEDNOR_LLSTATS */
|
||||
|
||||
#ifdef CONFIG_RTW_CFGVEDNOR_RSSIMONITOR
|
||||
feature_set |= WIFI_FEATURE_RSSI_MONITOR;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_RTW_CFGVENDOR_WIFI_LOGGER
|
||||
feature_set |= WIFI_FEATURE_LOGGER;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_RTW_WIFI_HAL
|
||||
feature_set |= WIFI_FEATURE_CONFIG_NDO;
|
||||
feature_set |= WIFI_FEATURE_SCAN_RAND;
|
||||
#endif
|
||||
|
||||
return feature_set;
|
||||
}
|
||||
|
||||
@@ -1179,7 +1191,7 @@ static void LinkLayerStats(_adapter *padapter)
|
||||
trx_total_bytes = tx_bytes + rx_bytes;
|
||||
|
||||
trx_total_time = pwrpriv->on_time - ps_time;
|
||||
|
||||
|
||||
if ( trx_total_bytes == 0) {
|
||||
pwrpriv->tx_time = 0;
|
||||
pwrpriv->rx_time = 0;
|
||||
@@ -1187,7 +1199,7 @@ static void LinkLayerStats(_adapter *padapter)
|
||||
|
||||
/* tx_time = (trx_total_time * tx_total_bytes) / trx_total_bytes; */
|
||||
/* rx_time = (trx_total_time * rx_total_bytes) / trx_total_bytes; */
|
||||
|
||||
|
||||
tmp = (tx_bytes * trx_total_time);
|
||||
tmp = rtw_division64(tmp, trx_total_bytes);
|
||||
pwrpriv->tx_time = tmp;
|
||||
@@ -1197,7 +1209,7 @@ static void LinkLayerStats(_adapter *padapter)
|
||||
pwrpriv->rx_time = tmp;
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
else {
|
||||
pwrpriv->on_time = 0;
|
||||
@@ -1206,12 +1218,12 @@ static void LinkLayerStats(_adapter *padapter)
|
||||
}
|
||||
|
||||
#ifdef CONFIG_RTW_WIFI_HAL_DEBUG
|
||||
RTW_INFO("- tx_bytes : %llu rx_bytes : %llu total bytes : %llu\n", tx_bytes, rx_bytes, trx_total_bytes);
|
||||
RTW_INFO("- netif_up=%s, on_time : %u ms\n", padapter->netif_up ? "1":"0", pwrpriv->on_time);
|
||||
RTW_INFO("- pwr_saving_time : %u (%u) ms\n", pwrpriv->pwr_saving_time, ps_time);
|
||||
RTW_INFO("- trx_total_time : %u ms\n", trx_total_time);
|
||||
RTW_INFO("- tx_time : %u ms\n", pwrpriv->tx_time);
|
||||
RTW_INFO("- rx_time : %u ms\n", pwrpriv->rx_time);
|
||||
RTW_INFO("- tx_bytes : %llu rx_bytes : %llu total bytes : %llu\n", tx_bytes, rx_bytes, trx_total_bytes);
|
||||
RTW_INFO("- netif_up = %s, on_time : %u ms\n", padapter->netif_up ? "1":"0", pwrpriv->on_time);
|
||||
RTW_INFO("- pwr_saving_time : %u (%u) ms\n", pwrpriv->pwr_saving_time, ps_time);
|
||||
RTW_INFO("- trx_total_time : %u ms\n", trx_total_time);
|
||||
RTW_INFO("- tx_time : %u ms\n", pwrpriv->tx_time);
|
||||
RTW_INFO("- rx_time : %u ms\n", pwrpriv->rx_time);
|
||||
#endif /* CONFIG_RTW_WIFI_HAL_DEBUG */
|
||||
|
||||
}
|
||||
@@ -1223,16 +1235,16 @@ static int rtw_cfgvendor_lstats_get_info(struct wiphy *wiphy,
|
||||
int err = 0;
|
||||
_adapter *padapter = GET_PRIMARY_ADAPTER(wiphy_to_adapter(wiphy));
|
||||
struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);
|
||||
wifi_radio_stat *radio;
|
||||
wifi_radio_stat_internal *radio;
|
||||
wifi_iface_stat *iface;
|
||||
char *output;
|
||||
|
||||
output = rtw_malloc(sizeof(wifi_radio_stat) + sizeof(wifi_iface_stat)+1);
|
||||
output = rtw_malloc(sizeof(wifi_radio_stat_internal) + sizeof(wifi_iface_stat));
|
||||
if (output == NULL) {
|
||||
RTW_DBG("Allocate lstats info buffer fail!\n");
|
||||
}
|
||||
}
|
||||
|
||||
radio = (wifi_radio_stat *)output;
|
||||
radio = (wifi_radio_stat_internal *)output;
|
||||
|
||||
radio->num_channels = 0;
|
||||
radio->radio = 1;
|
||||
@@ -1243,12 +1255,6 @@ static int rtw_cfgvendor_lstats_get_info(struct wiphy *wiphy,
|
||||
radio->on_time = pwrpriv->on_time;
|
||||
radio->tx_time = pwrpriv->tx_time;
|
||||
radio->rx_time = pwrpriv->rx_time;
|
||||
|
||||
radio->num_tx_levels = 1;
|
||||
radio->tx_time_per_levels = NULL;
|
||||
radio->tx_time_per_levels = (u32*)(output+sizeof(wifi_radio_stat) + sizeof(wifi_iface_stat));
|
||||
*(radio->tx_time_per_levels) = DUMMY_TIME_STATICS;
|
||||
|
||||
radio->on_time_scan = 0;
|
||||
radio->on_time_nbd = 0;
|
||||
radio->on_time_gscan = 0;
|
||||
@@ -1263,16 +1269,15 @@ static int rtw_cfgvendor_lstats_get_info(struct wiphy *wiphy,
|
||||
RTW_INFO("radio->on_time : %u ms\n", (radio->on_time));
|
||||
RTW_INFO("radio->tx_time : %u ms\n", (radio->tx_time));
|
||||
RTW_INFO("radio->rx_time : %u ms\n", (radio->rx_time));
|
||||
RTW_INFO("radio->tx_time_per_levels value : %u ms\n", *(radio->tx_time_per_levels));
|
||||
#endif /* CONFIG_RTW_WIFI_HAL_DEBUG */
|
||||
|
||||
RTW_DBG(FUNC_NDEV_FMT" %s\n", FUNC_NDEV_ARG(wdev_to_ndev(wdev)), (char*)data);
|
||||
err = rtw_cfgvendor_send_cmd_reply(wiphy, wdev_to_ndev(wdev),
|
||||
output, sizeof(wifi_iface_stat) + sizeof(wifi_radio_stat)+1);
|
||||
output, sizeof(wifi_iface_stat) + sizeof(wifi_radio_stat_internal));
|
||||
if (unlikely(err))
|
||||
RTW_ERR(FUNC_NDEV_FMT"Vendor Command reply failed ret:%d \n"
|
||||
, FUNC_NDEV_ARG(wdev_to_ndev(wdev)), err);
|
||||
rtw_mfree(output, sizeof(wifi_iface_stat) + sizeof(wifi_radio_stat)+1);
|
||||
rtw_mfree(output, sizeof(wifi_iface_stat) + sizeof(wifi_radio_stat_internal));
|
||||
return err;
|
||||
}
|
||||
static int rtw_cfgvendor_lstats_set_info(struct wiphy *wiphy,
|
||||
@@ -1290,6 +1295,450 @@ static int rtw_cfgvendor_lstats_clear_info(struct wiphy *wiphy,
|
||||
return err;
|
||||
}
|
||||
#endif /* CONFIG_RTW_CFGVEDNOR_LLSTATS */
|
||||
#ifdef CONFIG_RTW_CFGVEDNOR_RSSIMONITOR
|
||||
static int rtw_cfgvendor_set_rssi_monitor(struct wiphy *wiphy,
|
||||
struct wireless_dev *wdev, const void *data, int len)
|
||||
{
|
||||
_adapter *padapter = GET_PRIMARY_ADAPTER(wiphy_to_adapter(wiphy));
|
||||
struct rtw_wdev_priv *pwdev_priv = adapter_wdev_data(padapter);
|
||||
|
||||
struct recv_priv *precvpriv = &padapter->recvpriv;
|
||||
int err = 0, rem, type;
|
||||
const struct nlattr *iter;
|
||||
|
||||
RTW_DBG(FUNC_NDEV_FMT" %s\n", FUNC_NDEV_ARG(wdev_to_ndev(wdev)), (char*)data);
|
||||
|
||||
nla_for_each_attr(iter, data, len, rem) {
|
||||
type = nla_type(iter);
|
||||
|
||||
switch (type) {
|
||||
case RSSI_MONITOR_ATTRIBUTE_MAX_RSSI:
|
||||
pwdev_priv->rssi_monitor_max = (s8)nla_get_u32(iter);;
|
||||
break;
|
||||
case RSSI_MONITOR_ATTRIBUTE_MIN_RSSI:
|
||||
pwdev_priv->rssi_monitor_min = (s8)nla_get_u32(iter);
|
||||
break;
|
||||
case RSSI_MONITOR_ATTRIBUTE_START:
|
||||
pwdev_priv->rssi_monitor_enable = (u8)nla_get_u32(iter);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
void rtw_cfgvendor_rssi_monitor_evt(_adapter *padapter) {
|
||||
struct wireless_dev *wdev = padapter->rtw_wdev;
|
||||
struct wiphy *wiphy= wdev->wiphy;
|
||||
struct recv_priv *precvpriv = &padapter->recvpriv;
|
||||
struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
|
||||
struct wlan_network *pcur_network = &pmlmepriv->cur_network;
|
||||
struct rtw_wdev_priv *pwdev_priv = adapter_wdev_data(padapter);
|
||||
struct sk_buff *skb;
|
||||
u32 tot_len = NLMSG_DEFAULT_SIZE;
|
||||
gfp_t kflags;
|
||||
rssi_monitor_evt data ;
|
||||
s8 rssi = precvpriv->rssi;
|
||||
|
||||
if (pwdev_priv->rssi_monitor_enable == 0 || check_fwstate(pmlmepriv, _FW_LINKED) != _TRUE)
|
||||
return;
|
||||
|
||||
if (rssi < pwdev_priv->rssi_monitor_max || rssi > pwdev_priv->rssi_monitor_min)
|
||||
return;
|
||||
|
||||
kflags = in_atomic() ? GFP_ATOMIC : GFP_KERNEL;
|
||||
|
||||
/* Alloc the SKB for vendor_event */
|
||||
skb = rtw_cfg80211_vendor_event_alloc(wiphy, wdev, tot_len, GOOGLE_RSSI_MONITOR_EVENT, kflags);
|
||||
if (!skb) {
|
||||
goto exit;
|
||||
}
|
||||
|
||||
_rtw_memset(&data, 0, sizeof(data));
|
||||
|
||||
data.version = RSSI_MONITOR_EVT_VERSION;
|
||||
data.cur_rssi = rssi;
|
||||
_rtw_memcpy(data.BSSID, pcur_network->network.MacAddress, sizeof(mac_addr));
|
||||
|
||||
nla_append(skb, sizeof(data), &data);
|
||||
|
||||
rtw_cfg80211_vendor_event(skb, kflags);
|
||||
exit:
|
||||
return;
|
||||
}
|
||||
#endif /* CONFIG_RTW_CFGVEDNOR_RSSIMONITR */
|
||||
|
||||
#ifdef CONFIG_RTW_CFGVENDOR_WIFI_LOGGER
|
||||
static int rtw_cfgvendor_logger_start_logging(struct wiphy *wiphy,
|
||||
struct wireless_dev *wdev, const void *data, int len)
|
||||
{
|
||||
int ret = 0, rem, type;
|
||||
char ring_name[32] = {0};
|
||||
int log_level = 0, flags = 0, time_intval = 0, threshold = 0;
|
||||
const struct nlattr *iter;
|
||||
|
||||
nla_for_each_attr(iter, data, len, rem) {
|
||||
type = nla_type(iter);
|
||||
switch (type) {
|
||||
case LOGGER_ATTRIBUTE_RING_NAME:
|
||||
strncpy(ring_name, nla_data(iter),
|
||||
MIN(sizeof(ring_name) -1, nla_len(iter)));
|
||||
break;
|
||||
case LOGGER_ATTRIBUTE_LOG_LEVEL:
|
||||
log_level = nla_get_u32(iter);
|
||||
break;
|
||||
case LOGGER_ATTRIBUTE_RING_FLAGS:
|
||||
flags = nla_get_u32(iter);
|
||||
break;
|
||||
case LOGGER_ATTRIBUTE_LOG_TIME_INTVAL:
|
||||
time_intval = nla_get_u32(iter);
|
||||
break;
|
||||
case LOGGER_ATTRIBUTE_LOG_MIN_DATA_SIZE:
|
||||
threshold = nla_get_u32(iter);
|
||||
break;
|
||||
default:
|
||||
RTW_ERR("Unknown type: %d\n", type);
|
||||
ret = WIFI_ERROR_INVALID_ARGS;
|
||||
goto exit;
|
||||
}
|
||||
}
|
||||
|
||||
exit:
|
||||
return ret;
|
||||
}
|
||||
static int rtw_cfgvendor_logger_get_feature(struct wiphy *wiphy,
|
||||
struct wireless_dev *wdev, const void *data, int len)
|
||||
{
|
||||
int err = 0;
|
||||
u32 supported_features = 0;
|
||||
|
||||
err = rtw_cfgvendor_send_cmd_reply(wiphy, wdev_to_ndev(wdev), &supported_features, sizeof(supported_features));
|
||||
|
||||
if (unlikely(err))
|
||||
RTW_ERR(FUNC_NDEV_FMT" Vendor Command reply failed ret:%d\n"
|
||||
, FUNC_NDEV_ARG(wdev_to_ndev(wdev)), err);
|
||||
|
||||
return err;
|
||||
}
|
||||
static int rtw_cfgvendor_logger_get_version(struct wiphy *wiphy,
|
||||
struct wireless_dev *wdev, const void *data, int len)
|
||||
{
|
||||
_adapter *padapter = GET_PRIMARY_ADAPTER(wiphy_to_adapter(wiphy));
|
||||
HAL_DATA_TYPE *hal = GET_HAL_DATA(padapter);
|
||||
int ret = 0, rem, type;
|
||||
int buf_len = 1024;
|
||||
char *buf_ptr;
|
||||
const struct nlattr *iter;
|
||||
gfp_t kflags;
|
||||
|
||||
kflags = in_atomic() ? GFP_ATOMIC : GFP_KERNEL;
|
||||
buf_ptr = kzalloc(buf_len, kflags);
|
||||
if (!buf_ptr) {
|
||||
RTW_ERR("failed to allocate the buffer for version n");
|
||||
ret = -ENOMEM;
|
||||
goto exit;
|
||||
}
|
||||
nla_for_each_attr(iter, data, len, rem) {
|
||||
type = nla_type(iter);
|
||||
switch (type) {
|
||||
case LOGGER_ATTRIBUTE_GET_DRIVER:
|
||||
memcpy(buf_ptr, DRIVERVERSION, strlen(DRIVERVERSION)+1);
|
||||
break;
|
||||
case LOGGER_ATTRIBUTE_GET_FW:
|
||||
sprintf(buf_ptr, "v%d.%d", hal->firmware_version, hal->firmware_sub_version);
|
||||
break;
|
||||
default:
|
||||
RTW_ERR("Unknown type: %d\n", type);
|
||||
ret = -EINVAL;
|
||||
goto exit;
|
||||
}
|
||||
}
|
||||
if (ret < 0) {
|
||||
RTW_ERR("failed to get the version %d\n", ret);
|
||||
goto exit;
|
||||
}
|
||||
|
||||
|
||||
ret = rtw_cfgvendor_send_cmd_reply(wiphy, wdev_to_ndev(wdev), buf_ptr, strlen(buf_ptr));
|
||||
exit:
|
||||
kfree(buf_ptr);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int rtw_cfgvendor_logger_get_ring_status(struct wiphy *wiphy,
|
||||
struct wireless_dev *wdev, const void *data, int len)
|
||||
{
|
||||
int ret = 0;
|
||||
int ring_id;
|
||||
char ring_buf_name[] = "RTW_RING_BUFFER";
|
||||
|
||||
struct sk_buff *skb;
|
||||
wifi_ring_buffer_status ring_status;
|
||||
|
||||
|
||||
_rtw_memcpy(ring_status.name, ring_buf_name, strlen(ring_buf_name)+1);
|
||||
ring_status.ring_id = 1;
|
||||
/* Alloc the SKB for vendor_event */
|
||||
skb = cfg80211_vendor_cmd_alloc_reply_skb(wiphy,
|
||||
sizeof(wifi_ring_buffer_status));
|
||||
if (!skb) {
|
||||
RTW_ERR("skb allocation is failed\n");
|
||||
ret = FAIL;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
nla_put_u32(skb, LOGGER_ATTRIBUTE_RING_NUM, 1);
|
||||
nla_put(skb, LOGGER_ATTRIBUTE_RING_STATUS, sizeof(wifi_ring_buffer_status),
|
||||
&ring_status);
|
||||
ret = cfg80211_vendor_cmd_reply(skb);
|
||||
|
||||
if (ret) {
|
||||
RTW_ERR("Vendor Command reply failed ret:%d \n", ret);
|
||||
}
|
||||
exit:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int rtw_cfgvendor_logger_get_ring_data(struct wiphy *wiphy,
|
||||
struct wireless_dev *wdev, const void *data, int len)
|
||||
{
|
||||
int ret = 0, rem, type;
|
||||
char ring_name[32] = {0};
|
||||
const struct nlattr *iter;
|
||||
|
||||
nla_for_each_attr(iter, data, len, rem) {
|
||||
type = nla_type(iter);
|
||||
switch (type) {
|
||||
case LOGGER_ATTRIBUTE_RING_NAME:
|
||||
strncpy(ring_name, nla_data(iter),
|
||||
MIN(sizeof(ring_name) -1, nla_len(iter)));
|
||||
RTW_INFO(" %s LOGGER_ATTRIBUTE_RING_NAME : %s\n", __func__, ring_name);
|
||||
break;
|
||||
default:
|
||||
RTW_ERR("Unknown type: %d\n", type);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int rtw_cfgvendor_logger_get_firmware_memory_dump(struct wiphy *wiphy,
|
||||
struct wireless_dev *wdev, const void *data, int len)
|
||||
{
|
||||
int ret = WIFI_ERROR_NOT_SUPPORTED;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int rtw_cfgvendor_logger_start_pkt_fate_monitoring(struct wiphy *wiphy,
|
||||
struct wireless_dev *wdev, const void *data, int len)
|
||||
{
|
||||
int ret = WIFI_SUCCESS;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int rtw_cfgvendor_logger_get_tx_pkt_fates(struct wiphy *wiphy,
|
||||
struct wireless_dev *wdev, const void *data, int len)
|
||||
{
|
||||
int ret = WIFI_SUCCESS;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int rtw_cfgvendor_logger_get_rx_pkt_fates(struct wiphy *wiphy,
|
||||
struct wireless_dev *wdev, const void *data, int len)
|
||||
{
|
||||
int ret = WIFI_SUCCESS;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_RTW_CFGVENDOR_WIFI_LOGGER */
|
||||
#ifdef CONFIG_RTW_WIFI_HAL
|
||||
#ifdef CONFIG_RTW_CFGVENDOR_RANDOM_MAC_OUI
|
||||
|
||||
#ifndef ETHER_ISMULTI
|
||||
#define ETHER_ISMULTI(ea) (((const u8 *)(ea))[0] & 1)
|
||||
#endif
|
||||
|
||||
|
||||
static u8 null_addr[ETH_ALEN] = {0};
|
||||
static void rtw_hal_random_gen_mac_addr(u8 *mac_addr)
|
||||
{
|
||||
do {
|
||||
get_random_bytes(&mac_addr[3], ETH_ALEN-3);
|
||||
if (memcmp(mac_addr, null_addr, ETH_ALEN) != 0)
|
||||
break;
|
||||
} while(1);
|
||||
}
|
||||
|
||||
void rtw_hal_pno_random_gen_mac_addr(PADAPTER adapter)
|
||||
{
|
||||
u8 mac_addr[ETH_ALEN];
|
||||
struct rtw_wdev_priv *pwdev_priv = adapter_wdev_data(adapter);
|
||||
|
||||
memcpy(mac_addr, pwdev_priv->pno_mac_addr, ETH_ALEN);
|
||||
if (mac_addr[0] == 0xFF) return;
|
||||
rtw_hal_random_gen_mac_addr(mac_addr);
|
||||
memcpy(pwdev_priv->pno_mac_addr, mac_addr, ETH_ALEN);
|
||||
#ifdef CONFIG_RTW_DEBUG
|
||||
print_hex_dump(KERN_DEBUG, "pno_mac_addr: ",
|
||||
DUMP_PREFIX_OFFSET, 16, 1, pwdev_priv->pno_mac_addr,
|
||||
ETH_ALEN, 1);
|
||||
#endif
|
||||
}
|
||||
|
||||
void rtw_hal_set_hw_mac_addr(PADAPTER adapter, u8 *mac_addr)
|
||||
{
|
||||
rtw_ps_deny(adapter, PS_DENY_IOCTL);
|
||||
LeaveAllPowerSaveModeDirect(adapter);
|
||||
|
||||
rtw_hal_set_hwreg(adapter, HW_VAR_MAC_ADDR, mac_addr);
|
||||
#ifdef CONFIG_RTW_DEBUG
|
||||
rtw_hal_dump_macaddr(RTW_DBGDUMP, adapter);
|
||||
#endif
|
||||
rtw_ps_deny_cancel(adapter, PS_DENY_IOCTL);
|
||||
}
|
||||
|
||||
static int rtw_cfgvendor_set_rand_mac_oui(struct wiphy *wiphy,
|
||||
struct wireless_dev *wdev, const void *data, int len)
|
||||
{
|
||||
int err = 0;
|
||||
PADAPTER adapter;
|
||||
void *devaddr;
|
||||
struct net_device *netdev;
|
||||
int type, mac_len;
|
||||
u8 pno_random_mac_oui[3];
|
||||
u8 mac_addr[ETH_ALEN] = {0};
|
||||
struct pwrctrl_priv *pwrctl;
|
||||
struct rtw_wdev_priv *pwdev_priv;
|
||||
|
||||
type = nla_type(data);
|
||||
mac_len = nla_len(data);
|
||||
if (mac_len != 3) {
|
||||
RTW_ERR("%s oui len error %d != 3\n", __func__, mac_len);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (type == ANDR_WIFI_ATTRIBUTE_RANDOM_MAC_OUI) {
|
||||
memcpy(pno_random_mac_oui, nla_data(data), 3);
|
||||
print_hex_dump(KERN_DEBUG, "pno_random_mac_oui: ",
|
||||
DUMP_PREFIX_OFFSET, 16, 1, pno_random_mac_oui,
|
||||
3, 1);
|
||||
|
||||
if (ETHER_ISMULTI(pno_random_mac_oui)) {
|
||||
pr_err("%s: oui is multicast address\n", __func__);
|
||||
return -1;
|
||||
}
|
||||
|
||||
adapter = wiphy_to_adapter(wiphy);
|
||||
if (adapter == NULL) {
|
||||
pr_err("%s: wiphy_to_adapter == NULL\n", __func__);
|
||||
return -1;
|
||||
}
|
||||
|
||||
pwdev_priv = adapter_wdev_data(adapter);
|
||||
|
||||
memcpy(mac_addr, pno_random_mac_oui, 3);
|
||||
rtw_hal_random_gen_mac_addr(mac_addr);
|
||||
memcpy(pwdev_priv->pno_mac_addr, mac_addr, ETH_ALEN);
|
||||
#ifdef CONFIG_RTW_DEBUG
|
||||
print_hex_dump(KERN_DEBUG, "pno_mac_addr: ",
|
||||
DUMP_PREFIX_OFFSET, 16, 1, pwdev_priv->pno_mac_addr,
|
||||
ETH_ALEN, 1);
|
||||
#endif
|
||||
} else {
|
||||
RTW_ERR("%s oui type error %x != 0x2\n", __func__, type);
|
||||
err = -1;
|
||||
}
|
||||
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
static int rtw_cfgvendor_set_nodfs_flag(struct wiphy *wiphy,
|
||||
struct wireless_dev *wdev, const void *data, int len)
|
||||
{
|
||||
int err = 0;
|
||||
int type;
|
||||
u32 nodfs = 0;
|
||||
_adapter *padapter = GET_PRIMARY_ADAPTER(wiphy_to_adapter(wiphy));
|
||||
|
||||
RTW_DBG(FUNC_NDEV_FMT" %s\n", FUNC_NDEV_ARG(wdev_to_ndev(wdev)), (char*)data);
|
||||
|
||||
type = nla_type(data);
|
||||
if (type == ANDR_WIFI_ATTRIBUTE_NODFS_SET) {
|
||||
nodfs = nla_get_u32(data);
|
||||
adapter_to_dvobj(padapter)->nodfs = nodfs;
|
||||
} else {
|
||||
err = -EINVAL;
|
||||
}
|
||||
|
||||
RTW_INFO("%s nodfs=%d, err=%d\n", __func__, nodfs, err);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
static int rtw_cfgvendor_set_country(struct wiphy *wiphy,
|
||||
struct wireless_dev *wdev, const void *data, int len)
|
||||
{
|
||||
#define CNTRY_BUF_SZ 4 /* Country string is 3 bytes + NUL */
|
||||
int err = 0, rem, type;
|
||||
char country_code[CNTRY_BUF_SZ] = {0};
|
||||
const struct nlattr *iter;
|
||||
_adapter *padapter = GET_PRIMARY_ADAPTER(wiphy_to_adapter(wiphy));
|
||||
|
||||
RTW_DBG(FUNC_NDEV_FMT" %s\n", FUNC_NDEV_ARG(wdev_to_ndev(wdev)), (char*)data);
|
||||
|
||||
nla_for_each_attr(iter, data, len, rem) {
|
||||
type = nla_type(iter);
|
||||
switch (type) {
|
||||
case ANDR_WIFI_ATTRIBUTE_COUNTRY:
|
||||
_rtw_memcpy(country_code, nla_data(iter),
|
||||
MIN(nla_len(iter), CNTRY_BUF_SZ));
|
||||
break;
|
||||
default:
|
||||
RTW_ERR("Unknown type: %d\n", type);
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
RTW_INFO("%s country_code:\"%c%c\" \n", __func__, country_code[0], country_code[1]);
|
||||
|
||||
rtw_set_country(padapter, country_code);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
static int rtw_cfgvendor_set_nd_offload(struct wiphy *wiphy,
|
||||
struct wireless_dev *wdev, const void *data, int len)
|
||||
{
|
||||
int err = 0;
|
||||
int type;
|
||||
u8 nd_en = 0;
|
||||
_adapter *padapter = GET_PRIMARY_ADAPTER(wiphy_to_adapter(wiphy));
|
||||
|
||||
RTW_DBG(FUNC_NDEV_FMT" %s\n", FUNC_NDEV_ARG(wdev_to_ndev(wdev)), (char*)data);
|
||||
|
||||
type = nla_type(data);
|
||||
if (type == ANDR_WIFI_ATTRIBUTE_ND_OFFLOAD_VALUE) {
|
||||
nd_en = nla_get_u8(data);
|
||||
/* ND has been enabled when wow is enabled */
|
||||
} else {
|
||||
err = -EINVAL;
|
||||
}
|
||||
|
||||
RTW_INFO("%s nd_en=%d, err=%d\n", __func__, nd_en, err);
|
||||
|
||||
return err;
|
||||
}
|
||||
#endif /* CONFIG_RTW_WIFI_HAL */
|
||||
|
||||
static const struct wiphy_vendor_command rtw_vendor_cmds[] = {
|
||||
#if defined(GSCAN_SUPPORT) && 0
|
||||
@@ -1299,9 +1748,6 @@ static const struct wiphy_vendor_command rtw_vendor_cmds[] = {
|
||||
.subcmd = GSCAN_SUBCMD_GET_CAPABILITIES
|
||||
},
|
||||
.flags = WIPHY_VENDOR_CMD_NEED_WDEV | WIPHY_VENDOR_CMD_NEED_NETDEV,
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,3,0)
|
||||
.policy = VENDOR_CMD_RAW_DATA,
|
||||
#endif
|
||||
.doit = rtw_cfgvendor_gscan_get_capabilities
|
||||
},
|
||||
{
|
||||
@@ -1310,9 +1756,6 @@ static const struct wiphy_vendor_command rtw_vendor_cmds[] = {
|
||||
.subcmd = GSCAN_SUBCMD_SET_CONFIG
|
||||
},
|
||||
.flags = WIPHY_VENDOR_CMD_NEED_WDEV | WIPHY_VENDOR_CMD_NEED_NETDEV,
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,3,0)
|
||||
.policy = VENDOR_CMD_RAW_DATA,
|
||||
#endif
|
||||
.doit = rtw_cfgvendor_set_scan_cfg
|
||||
},
|
||||
{
|
||||
@@ -1321,9 +1764,6 @@ static const struct wiphy_vendor_command rtw_vendor_cmds[] = {
|
||||
.subcmd = GSCAN_SUBCMD_SET_SCAN_CONFIG
|
||||
},
|
||||
.flags = WIPHY_VENDOR_CMD_NEED_WDEV | WIPHY_VENDOR_CMD_NEED_NETDEV,
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,3,0)
|
||||
.policy = VENDOR_CMD_RAW_DATA,
|
||||
#endif
|
||||
.doit = rtw_cfgvendor_set_batch_scan_cfg
|
||||
},
|
||||
{
|
||||
@@ -1332,9 +1772,6 @@ static const struct wiphy_vendor_command rtw_vendor_cmds[] = {
|
||||
.subcmd = GSCAN_SUBCMD_ENABLE_GSCAN
|
||||
},
|
||||
.flags = WIPHY_VENDOR_CMD_NEED_WDEV | WIPHY_VENDOR_CMD_NEED_NETDEV,
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,3,0)
|
||||
.policy = VENDOR_CMD_RAW_DATA,
|
||||
#endif
|
||||
.doit = rtw_cfgvendor_initiate_gscan
|
||||
},
|
||||
{
|
||||
@@ -1343,9 +1780,6 @@ static const struct wiphy_vendor_command rtw_vendor_cmds[] = {
|
||||
.subcmd = GSCAN_SUBCMD_ENABLE_FULL_SCAN_RESULTS
|
||||
},
|
||||
.flags = WIPHY_VENDOR_CMD_NEED_WDEV | WIPHY_VENDOR_CMD_NEED_NETDEV,
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,3,0)
|
||||
.policy = VENDOR_CMD_RAW_DATA,
|
||||
#endif
|
||||
.doit = rtw_cfgvendor_enable_full_scan_result
|
||||
},
|
||||
{
|
||||
@@ -1354,9 +1788,6 @@ static const struct wiphy_vendor_command rtw_vendor_cmds[] = {
|
||||
.subcmd = GSCAN_SUBCMD_SET_HOTLIST
|
||||
},
|
||||
.flags = WIPHY_VENDOR_CMD_NEED_WDEV | WIPHY_VENDOR_CMD_NEED_NETDEV,
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,3,0)
|
||||
.policy = VENDOR_CMD_RAW_DATA,
|
||||
#endif
|
||||
.doit = rtw_cfgvendor_hotlist_cfg
|
||||
},
|
||||
{
|
||||
@@ -1365,9 +1796,6 @@ static const struct wiphy_vendor_command rtw_vendor_cmds[] = {
|
||||
.subcmd = GSCAN_SUBCMD_SET_SIGNIFICANT_CHANGE_CONFIG
|
||||
},
|
||||
.flags = WIPHY_VENDOR_CMD_NEED_WDEV | WIPHY_VENDOR_CMD_NEED_NETDEV,
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,3,0)
|
||||
.policy = VENDOR_CMD_RAW_DATA,
|
||||
#endif
|
||||
.doit = rtw_cfgvendor_significant_change_cfg
|
||||
},
|
||||
{
|
||||
@@ -1376,9 +1804,6 @@ static const struct wiphy_vendor_command rtw_vendor_cmds[] = {
|
||||
.subcmd = GSCAN_SUBCMD_GET_SCAN_RESULTS
|
||||
},
|
||||
.flags = WIPHY_VENDOR_CMD_NEED_WDEV | WIPHY_VENDOR_CMD_NEED_NETDEV,
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,3,0)
|
||||
.policy = VENDOR_CMD_RAW_DATA,
|
||||
#endif
|
||||
.doit = rtw_cfgvendor_gscan_get_batch_results
|
||||
},
|
||||
{
|
||||
@@ -1387,9 +1812,6 @@ static const struct wiphy_vendor_command rtw_vendor_cmds[] = {
|
||||
.subcmd = GSCAN_SUBCMD_GET_CHANNEL_LIST
|
||||
},
|
||||
.flags = WIPHY_VENDOR_CMD_NEED_WDEV | WIPHY_VENDOR_CMD_NEED_NETDEV,
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,3,0)
|
||||
.policy = VENDOR_CMD_RAW_DATA,
|
||||
#endif
|
||||
.doit = rtw_cfgvendor_gscan_get_channel_list
|
||||
},
|
||||
#endif /* GSCAN_SUPPORT */
|
||||
@@ -1400,9 +1822,6 @@ static const struct wiphy_vendor_command rtw_vendor_cmds[] = {
|
||||
.subcmd = RTT_SUBCMD_SET_CONFIG
|
||||
},
|
||||
.flags = WIPHY_VENDOR_CMD_NEED_WDEV | WIPHY_VENDOR_CMD_NEED_NETDEV,
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,3,0)
|
||||
.policy = VENDOR_CMD_RAW_DATA,
|
||||
#endif
|
||||
.doit = rtw_cfgvendor_rtt_set_config
|
||||
},
|
||||
{
|
||||
@@ -1411,9 +1830,6 @@ static const struct wiphy_vendor_command rtw_vendor_cmds[] = {
|
||||
.subcmd = RTT_SUBCMD_CANCEL_CONFIG
|
||||
},
|
||||
.flags = WIPHY_VENDOR_CMD_NEED_WDEV | WIPHY_VENDOR_CMD_NEED_NETDEV,
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,3,0)
|
||||
.policy = VENDOR_CMD_RAW_DATA,
|
||||
#endif
|
||||
.doit = rtw_cfgvendor_rtt_cancel_config
|
||||
},
|
||||
{
|
||||
@@ -1422,9 +1838,6 @@ static const struct wiphy_vendor_command rtw_vendor_cmds[] = {
|
||||
.subcmd = RTT_SUBCMD_GETCAPABILITY
|
||||
},
|
||||
.flags = WIPHY_VENDOR_CMD_NEED_WDEV | WIPHY_VENDOR_CMD_NEED_NETDEV,
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,3,0)
|
||||
.policy = VENDOR_CMD_RAW_DATA,
|
||||
#endif
|
||||
.doit = rtw_cfgvendor_rtt_get_capability
|
||||
},
|
||||
#endif /* RTT_SUPPORT */
|
||||
@@ -1435,9 +1848,6 @@ static const struct wiphy_vendor_command rtw_vendor_cmds[] = {
|
||||
.subcmd = LSTATS_SUBCMD_GET_INFO
|
||||
},
|
||||
.flags = WIPHY_VENDOR_CMD_NEED_WDEV | WIPHY_VENDOR_CMD_NEED_NETDEV,
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,3,0)
|
||||
.policy = VENDOR_CMD_RAW_DATA,
|
||||
#endif
|
||||
.doit = rtw_cfgvendor_lstats_get_info
|
||||
},
|
||||
{
|
||||
@@ -1446,9 +1856,6 @@ static const struct wiphy_vendor_command rtw_vendor_cmds[] = {
|
||||
.subcmd = LSTATS_SUBCMD_SET_INFO
|
||||
},
|
||||
.flags = WIPHY_VENDOR_CMD_NEED_WDEV | WIPHY_VENDOR_CMD_NEED_NETDEV,
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,3,0)
|
||||
.policy = VENDOR_CMD_RAW_DATA,
|
||||
#endif
|
||||
.doit = rtw_cfgvendor_lstats_set_info
|
||||
},
|
||||
{
|
||||
@@ -1457,21 +1864,136 @@ static const struct wiphy_vendor_command rtw_vendor_cmds[] = {
|
||||
.subcmd = LSTATS_SUBCMD_CLEAR_INFO
|
||||
},
|
||||
.flags = WIPHY_VENDOR_CMD_NEED_WDEV | WIPHY_VENDOR_CMD_NEED_NETDEV,
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,3,0)
|
||||
.policy = VENDOR_CMD_RAW_DATA,
|
||||
#endif
|
||||
.doit = rtw_cfgvendor_lstats_clear_info
|
||||
},
|
||||
#endif /* CONFIG_RTW_CFGVEDNOR_LLSTATS */
|
||||
#ifdef CONFIG_RTW_CFGVEDNOR_RSSIMONITOR
|
||||
{
|
||||
{
|
||||
.vendor_id = OUI_GOOGLE,
|
||||
.subcmd = WIFI_SUBCMD_SET_RSSI_MONITOR
|
||||
},
|
||||
.flags = WIPHY_VENDOR_CMD_NEED_WDEV | WIPHY_VENDOR_CMD_NEED_NETDEV,
|
||||
.doit = rtw_cfgvendor_set_rssi_monitor
|
||||
},
|
||||
#endif /* CONFIG_RTW_CFGVEDNOR_RSSIMONITOR */
|
||||
#ifdef CONFIG_RTW_CFGVENDOR_WIFI_LOGGER
|
||||
{
|
||||
{
|
||||
.vendor_id = OUI_GOOGLE,
|
||||
.subcmd = LOGGER_START_LOGGING
|
||||
},
|
||||
.flags = WIPHY_VENDOR_CMD_NEED_WDEV | WIPHY_VENDOR_CMD_NEED_NETDEV,
|
||||
.doit = rtw_cfgvendor_logger_start_logging
|
||||
},
|
||||
{
|
||||
{
|
||||
.vendor_id = OUI_GOOGLE,
|
||||
.subcmd = LOGGER_GET_FEATURE
|
||||
},
|
||||
.flags = WIPHY_VENDOR_CMD_NEED_WDEV | WIPHY_VENDOR_CMD_NEED_NETDEV,
|
||||
.doit = rtw_cfgvendor_logger_get_feature
|
||||
},
|
||||
{
|
||||
{
|
||||
.vendor_id = OUI_GOOGLE,
|
||||
.subcmd = LOGGER_GET_VER
|
||||
},
|
||||
.flags = WIPHY_VENDOR_CMD_NEED_WDEV | WIPHY_VENDOR_CMD_NEED_NETDEV,
|
||||
.doit = rtw_cfgvendor_logger_get_version
|
||||
},
|
||||
{
|
||||
{
|
||||
.vendor_id = OUI_GOOGLE,
|
||||
.subcmd = LOGGER_GET_RING_STATUS
|
||||
},
|
||||
.flags = WIPHY_VENDOR_CMD_NEED_WDEV | WIPHY_VENDOR_CMD_NEED_NETDEV,
|
||||
.doit = rtw_cfgvendor_logger_get_ring_status
|
||||
},
|
||||
{
|
||||
{
|
||||
.vendor_id = OUI_GOOGLE,
|
||||
.subcmd = LOGGER_GET_RING_DATA
|
||||
},
|
||||
.flags = WIPHY_VENDOR_CMD_NEED_WDEV | WIPHY_VENDOR_CMD_NEED_NETDEV,
|
||||
.doit = rtw_cfgvendor_logger_get_ring_data
|
||||
},
|
||||
{
|
||||
{
|
||||
.vendor_id = OUI_GOOGLE,
|
||||
.subcmd = LOGGER_TRIGGER_MEM_DUMP
|
||||
},
|
||||
.flags = WIPHY_VENDOR_CMD_NEED_WDEV | WIPHY_VENDOR_CMD_NEED_NETDEV,
|
||||
.doit = rtw_cfgvendor_logger_get_firmware_memory_dump
|
||||
},
|
||||
{
|
||||
{
|
||||
.vendor_id = OUI_GOOGLE,
|
||||
.subcmd = LOGGER_START_PKT_FATE_MONITORING
|
||||
},
|
||||
.flags = WIPHY_VENDOR_CMD_NEED_WDEV | WIPHY_VENDOR_CMD_NEED_NETDEV,
|
||||
.doit = rtw_cfgvendor_logger_start_pkt_fate_monitoring
|
||||
},
|
||||
{
|
||||
{
|
||||
.vendor_id = OUI_GOOGLE,
|
||||
.subcmd = LOGGER_GET_TX_PKT_FATES
|
||||
},
|
||||
.flags = WIPHY_VENDOR_CMD_NEED_WDEV | WIPHY_VENDOR_CMD_NEED_NETDEV,
|
||||
.doit = rtw_cfgvendor_logger_get_tx_pkt_fates
|
||||
},
|
||||
{
|
||||
{
|
||||
.vendor_id = OUI_GOOGLE,
|
||||
.subcmd = LOGGER_GET_RX_PKT_FATES
|
||||
},
|
||||
.flags = WIPHY_VENDOR_CMD_NEED_WDEV | WIPHY_VENDOR_CMD_NEED_NETDEV,
|
||||
.doit = rtw_cfgvendor_logger_get_rx_pkt_fates
|
||||
},
|
||||
#endif /* CONFIG_RTW_CFGVENDOR_WIFI_LOGGER */
|
||||
#ifdef CONFIG_RTW_WIFI_HAL
|
||||
#ifdef CONFIG_RTW_CFGVENDOR_RANDOM_MAC_OUI
|
||||
{
|
||||
{
|
||||
.vendor_id = OUI_GOOGLE,
|
||||
.subcmd = WIFI_SUBCMD_SET_PNO_RANDOM_MAC_OUI
|
||||
},
|
||||
.flags = WIPHY_VENDOR_CMD_NEED_WDEV | WIPHY_VENDOR_CMD_NEED_NETDEV,
|
||||
.doit = rtw_cfgvendor_set_rand_mac_oui
|
||||
},
|
||||
#endif
|
||||
{
|
||||
{
|
||||
.vendor_id = OUI_GOOGLE,
|
||||
.subcmd = WIFI_SUBCMD_NODFS_SET
|
||||
},
|
||||
.flags = WIPHY_VENDOR_CMD_NEED_WDEV | WIPHY_VENDOR_CMD_NEED_NETDEV,
|
||||
.doit = rtw_cfgvendor_set_nodfs_flag
|
||||
|
||||
},
|
||||
{
|
||||
{
|
||||
.vendor_id = OUI_GOOGLE,
|
||||
.subcmd = WIFI_SUBCMD_SET_COUNTRY_CODE
|
||||
},
|
||||
.flags = WIPHY_VENDOR_CMD_NEED_WDEV | WIPHY_VENDOR_CMD_NEED_NETDEV,
|
||||
.doit = rtw_cfgvendor_set_country
|
||||
},
|
||||
{
|
||||
{
|
||||
.vendor_id = OUI_GOOGLE,
|
||||
.subcmd = WIFI_SUBCMD_CONFIG_ND_OFFLOAD
|
||||
},
|
||||
.flags = WIPHY_VENDOR_CMD_NEED_WDEV | WIPHY_VENDOR_CMD_NEED_NETDEV,
|
||||
.doit = rtw_cfgvendor_set_nd_offload
|
||||
},
|
||||
#endif /* CONFIG_RTW_WIFI_HAL */
|
||||
{
|
||||
{
|
||||
.vendor_id = OUI_GOOGLE,
|
||||
.subcmd = WIFI_SUBCMD_GET_FEATURE_SET
|
||||
},
|
||||
.flags = WIPHY_VENDOR_CMD_NEED_WDEV | WIPHY_VENDOR_CMD_NEED_NETDEV,
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,3,0)
|
||||
.policy = VENDOR_CMD_RAW_DATA,
|
||||
#endif
|
||||
.doit = rtw_cfgvendor_get_feature_set
|
||||
},
|
||||
{
|
||||
@@ -1480,9 +2002,6 @@ static const struct wiphy_vendor_command rtw_vendor_cmds[] = {
|
||||
.subcmd = WIFI_SUBCMD_GET_FEATURE_SET_MATRIX
|
||||
},
|
||||
.flags = WIPHY_VENDOR_CMD_NEED_WDEV | WIPHY_VENDOR_CMD_NEED_NETDEV,
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,3,0)
|
||||
.policy = VENDOR_CMD_RAW_DATA,
|
||||
#endif
|
||||
.doit = rtw_cfgvendor_get_feature_set_matrix
|
||||
}
|
||||
};
|
||||
@@ -1497,6 +2016,11 @@ static const struct nl80211_vendor_cmd_info rtw_vendor_events[] = {
|
||||
#if defined(RTT_SUPPORT) && 0
|
||||
{ OUI_GOOGLE, RTT_EVENT_COMPLETE },
|
||||
#endif /* RTT_SUPPORT */
|
||||
|
||||
#ifdef CONFIG_RTW_CFGVEDNOR_RSSIMONITOR
|
||||
{ OUI_GOOGLE, GOOGLE_RSSI_MONITOR_EVENT },
|
||||
#endif /* RTW_CFGVEDNOR_RSSIMONITR */
|
||||
|
||||
#if defined(GSCAN_SUPPORT) && 0
|
||||
{ OUI_GOOGLE, GSCAN_EVENT_COMPLETE_SCAN },
|
||||
{ OUI_GOOGLE, GSCAN_EVENT_HOTLIST_RESULTS_LOST }
|
||||
|
||||
@@ -122,6 +122,22 @@ enum rtw_vendor_subcmd {
|
||||
|
||||
APF_SUBCMD_GET_CAPABILITIES = ANDROID_NL80211_SUBCMD_PKT_FILTER_RANGE_START,
|
||||
APF_SUBCMD_SET_FILTER,
|
||||
|
||||
LOGGER_START_LOGGING = ANDROID_NL80211_SUBCMD_DEBUG_RANGE_START,
|
||||
LOGGER_TRIGGER_MEM_DUMP,
|
||||
LOGGER_GET_MEM_DUMP,
|
||||
LOGGER_GET_VER,
|
||||
LOGGER_GET_RING_STATUS,
|
||||
LOGGER_GET_RING_DATA,
|
||||
LOGGER_GET_FEATURE,
|
||||
LOGGER_RESET_LOGGING,
|
||||
LOGGER_TRIGGER_DRIVER_MEM_DUMP,
|
||||
LOGGER_GET_DRIVER_MEM_DUMP,
|
||||
LOGGER_START_PKT_FATE_MONITORING,
|
||||
LOGGER_GET_TX_PKT_FATES,
|
||||
LOGGER_GET_RX_PKT_FATES,
|
||||
|
||||
VENDOR_SUBCMD_MAX
|
||||
};
|
||||
|
||||
enum gscan_attributes {
|
||||
@@ -199,6 +215,13 @@ enum gscan_ch_attributes {
|
||||
GSCAN_ATTRIBUTE_CH_ID_7
|
||||
};
|
||||
|
||||
enum wifi_rssi_monitor_attr {
|
||||
RSSI_MONITOR_ATTRIBUTE_MAX_RSSI,
|
||||
RSSI_MONITOR_ATTRIBUTE_MIN_RSSI,
|
||||
RSSI_MONITOR_ATTRIBUTE_START,
|
||||
};
|
||||
|
||||
|
||||
enum rtt_attributes {
|
||||
RTT_ATTRIBUTE_TARGET_CNT,
|
||||
RTT_ATTRIBUTE_TARGET_INFO,
|
||||
@@ -213,6 +236,21 @@ enum rtt_attributes {
|
||||
RTT_ATTRIBUTE_TARGET_NUM_RETRY
|
||||
};
|
||||
|
||||
enum logger_attributes {
|
||||
LOGGER_ATTRIBUTE_GET_DRIVER,
|
||||
LOGGER_ATTRIBUTE_GET_FW,
|
||||
LOGGER_ATTRIBUTE_RING_ID,
|
||||
LOGGER_ATTRIBUTE_RING_NAME,
|
||||
LOGGER_ATTRIBUTE_RING_FLAGS,
|
||||
LOGGER_ATTRIBUTE_LOG_LEVEL,
|
||||
LOGGER_ATTRIBUTE_LOG_TIME_INTVAL,
|
||||
LOGGER_ATTRIBUTE_LOG_MIN_DATA_SIZE,
|
||||
LOGGER_ATTRIBUTE_FW_DUMP_LEN,
|
||||
LOGGER_ATTRIBUTE_FW_DUMP_DATA,
|
||||
LOGGERG_ATTRIBUTE_RING_DATA,
|
||||
LOGGER_ATTRIBUTE_RING_STATUS,
|
||||
LOGGER_ATTRIBUTE_RING_NUM
|
||||
};
|
||||
typedef enum rtw_vendor_event {
|
||||
RTK_RESERVED1,
|
||||
RTK_RESERVED2,
|
||||
@@ -232,7 +270,12 @@ typedef enum rtw_vendor_event {
|
||||
|
||||
enum andr_wifi_feature_set_attr {
|
||||
ANDR_WIFI_ATTRIBUTE_NUM_FEATURE_SET,
|
||||
ANDR_WIFI_ATTRIBUTE_FEATURE_SET
|
||||
ANDR_WIFI_ATTRIBUTE_FEATURE_SET,
|
||||
ANDR_WIFI_ATTRIBUTE_RANDOM_MAC_OUI,
|
||||
ANDR_WIFI_ATTRIBUTE_NODFS_SET,
|
||||
ANDR_WIFI_ATTRIBUTE_COUNTRY,
|
||||
ANDR_WIFI_ATTRIBUTE_ND_OFFLOAD_VALUE
|
||||
// Add more attribute here
|
||||
};
|
||||
|
||||
typedef enum rtw_vendor_gscan_attribute {
|
||||
@@ -314,6 +357,29 @@ typedef enum {
|
||||
WIFI_ERROR_BUSY = -10,
|
||||
} wifi_error;
|
||||
|
||||
typedef int wifi_ring_buffer_id;
|
||||
/* ring buffer params */
|
||||
/**
|
||||
* written_bytes and read_bytes implement a producer consumer API
|
||||
* hence written_bytes >= read_bytes
|
||||
* a modulo arithmetic of the buffer size has to be applied to those counters:
|
||||
* actual offset into ring buffer = written_bytes % ring_buffer_byte_size
|
||||
*
|
||||
*/
|
||||
typedef struct {
|
||||
u8 name[32];
|
||||
u32 flags;
|
||||
wifi_ring_buffer_id ring_id; // unique integer representing the ring
|
||||
u32 ring_buffer_byte_size; // total memory size allocated for the buffer
|
||||
u32 verbose_level; // verbose level for ring buffer
|
||||
u32 written_bytes; // number of bytes that was written to the buffer by driver,
|
||||
// monotonously increasing integer
|
||||
u32 read_bytes; // number of bytes that was read from the buffer by user land,
|
||||
// monotonously increasing integer
|
||||
u32 written_records; // number of records that was written to the buffer by driver,
|
||||
// monotonously increasing integer
|
||||
} wifi_ring_buffer_status;
|
||||
|
||||
#ifdef CONFIG_RTW_CFGVEDNOR_LLSTATS
|
||||
#define STATS_MAJOR_VERSION 1
|
||||
#define STATS_MINOR_VERSION 0
|
||||
@@ -392,14 +458,11 @@ typedef struct {
|
||||
// Max number of tx power levels. The actual number vary per device and is specified by |num_tx_levels|
|
||||
#define RADIO_STAT_MAX_TX_LEVELS 256
|
||||
|
||||
/* radio statistics */
|
||||
/* Internal radio statistics structure in the driver */
|
||||
typedef struct {
|
||||
wifi_radio radio; // wifi radio (if multiple radio supported)
|
||||
u32 on_time; // msecs the radio is awake (32 bits number accruing over time)
|
||||
u32 tx_time; // msecs the radio is transmitting (32 bits number accruing over time)
|
||||
u32 num_tx_levels; // number of radio transmit power levels
|
||||
u32* tx_time_per_levels; // pointer to an array of radio transmit per power levels in
|
||||
// msecs accured over time
|
||||
u32 rx_time; // msecs the radio is in active receive (32 bits number accruing over time)
|
||||
u32 on_time_scan; // msecs the radio is awake due to all scan (32 bits number accruing over time)
|
||||
u32 on_time_nbd; // msecs the radio is awake due to NAN (32 bits number accruing over time)
|
||||
@@ -409,7 +472,7 @@ typedef struct {
|
||||
u32 on_time_hs20; // msecs the radio is awake due to HS2.0 scans and GAS exchange (32 bits number accruing over time)
|
||||
u32 num_channels; // number of channels
|
||||
wifi_channel_stat channels[]; // channel statistics
|
||||
} wifi_radio_stat;
|
||||
} wifi_radio_stat_internal;
|
||||
|
||||
/**
|
||||
* Packet statistics reporting by firmware is performed on MPDU basi (i.e. counters increase by 1 for each MPDU)
|
||||
@@ -525,11 +588,12 @@ typedef struct {
|
||||
u32 aggressive_statistics_gathering; // set for field debug mode. Driver should collect all statistics regardless of performance impact.
|
||||
} wifi_link_layer_params;
|
||||
|
||||
/* callback for reporting link layer stats */
|
||||
#define RSSI_MONITOR_EVT_VERSION 1
|
||||
typedef struct {
|
||||
void (*on_link_stats_results) (wifi_request_id id, wifi_iface_stat *iface_stat,
|
||||
int num_radios, wifi_radio_stat *radio_stat);
|
||||
} wifi_stats_result_handler;
|
||||
u8 version;
|
||||
s8 cur_rssi;
|
||||
mac_addr BSSID;
|
||||
} rssi_monitor_evt;
|
||||
|
||||
|
||||
/* wifi statistics bitmap */
|
||||
@@ -556,4 +620,14 @@ extern int rtw_cfgvendor_send_hotlist_event(struct wiphy *wiphy,
|
||||
#endif
|
||||
#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)) || defined(RTW_VENDOR_EXT_SUPPORT) */
|
||||
|
||||
#ifdef CONFIG_RTW_CFGVEDNOR_RSSIMONITOR
|
||||
void rtw_cfgvendor_rssi_monitor_evt(_adapter *padapter);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_RTW_CFGVENDOR_RANDOM_MAC_OUI
|
||||
void rtw_hal_pno_random_gen_mac_addr(PADAPTER adapter);
|
||||
void rtw_hal_set_hw_mac_addr(PADAPTER adapter, u8 *mac_addr);
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* _RTW_CFGVENDOR_H_ */
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -51,7 +51,6 @@ static void rtw_dev_shutdown(struct device *dev)
|
||||
struct usb_interface *usb_intf = container_of(dev, struct usb_interface, dev);
|
||||
struct dvobj_priv *dvobj = NULL;
|
||||
_adapter *adapter = NULL;
|
||||
int i;
|
||||
|
||||
RTW_INFO("%s\n", __func__);
|
||||
|
||||
@@ -61,8 +60,9 @@ static void rtw_dev_shutdown(struct device *dev)
|
||||
adapter = dvobj_get_primary_adapter(dvobj);
|
||||
if (adapter) {
|
||||
if (!rtw_is_surprise_removed(adapter)) {
|
||||
struct pwrctrl_priv *pwrctl = adapter_to_pwrctl(adapter);
|
||||
#ifdef CONFIG_WOWLAN
|
||||
struct pwrctrl_priv *pwrctl = adapter_to_pwrctl(adapter);
|
||||
|
||||
#ifdef CONFIG_GPIO_WAKEUP
|
||||
/*default wake up pin change to BT*/
|
||||
RTW_INFO("%s:default wake up pin change to BT\n", __FUNCTION__);
|
||||
@@ -195,6 +195,7 @@ static struct usb_device_id rtw_usb_id_tbl[] = {
|
||||
{USB_DEVICE(0x0E66, 0x0023), .driver_info = RTL8821}, /* HAWKING - Edimax */
|
||||
{USB_DEVICE(0x056E, 0x400E) , .driver_info = RTL8821}, /* ELECOM - ELECOM */
|
||||
{USB_DEVICE(0x056E, 0x400F) , .driver_info = RTL8821}, /* ELECOM - ELECOM */
|
||||
{USB_DEVICE(0x20f4, 0x804b), .driver_info = RTL8821}, /* TRENDnet */
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_RTL8192E
|
||||
@@ -230,18 +231,17 @@ static struct usb_device_id rtw_usb_id_tbl[] = {
|
||||
{USB_DEVICE_AND_INTERFACE_INFO(USB_VENDER_ID_REALTEK, 0xF179, 0xff, 0xff, 0xff), .driver_info = RTL8188F}, /* 8188FU 1*1 */
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_RTL8188GTV
|
||||
/*=== Realtek demoboard ===*/
|
||||
{USB_DEVICE_AND_INTERFACE_INFO(USB_VENDER_ID_REALTEK, 0x018C, 0xff, 0xff, 0xff), .driver_info = RTL8188GTV}, /* 8188GTV 1*1 */
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_RTL8822B
|
||||
/*=== Realtek demoboard ===*/
|
||||
{USB_DEVICE_AND_INTERFACE_INFO(USB_VENDER_ID_REALTEK, 0xB82C, 0xff, 0xff, 0xff), .driver_info = RTL8822B}, /* Default ID for USB multi-function */
|
||||
{USB_DEVICE_AND_INTERFACE_INFO(USB_VENDER_ID_REALTEK, 0xB812, 0xff, 0xff, 0xff), .driver_info = RTL8822B}, /* Default ID for USB Single-function, WiFi only */
|
||||
/*=== Customer ID ===*/
|
||||
{USB_DEVICE_AND_INTERFACE_INFO(0x13b1, 0x0043, 0xff, 0xff, 0xff), .driver_info = RTL8822B}, /* Alpha - Alpha*/
|
||||
{USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x331c, 0xff, 0xff, 0xff), .driver_info = RTL8822B}, /* Dlink DWA-182*/
|
||||
{USB_DEVICE_AND_INTERFACE_INFO(0x2357, 0x0115, 0xff, 0xff, 0xff), .driver_info = RTL8822B}, /* TP-Link Archer T4U V3 */
|
||||
{USB_DEVICE_AND_INTERFACE_INFO(0x7392, 0xB822, 0xff, 0xff, 0xff), .driver_info = RTL8822B}, /* Edimax EW-7822ULC */
|
||||
{USB_DEVICE_AND_INTERFACE_INFO(0x7392, 0xC822, 0xff, 0xff, 0xff), .driver_info = RTL8822B}, /* Edimax EW-7822UTC */
|
||||
{USB_DEVICE_AND_INTERFACE_INFO(0x0b05, 0x1841, 0xff, 0xff, 0xff), .driver_info = RTL8822B}, /* ASUS AC1300 USB-AC55 B1 */
|
||||
{USB_DEVICE_AND_INTERFACE_INFO(0x0b05, 0x184C, 0xff, 0xff, 0xff), .driver_info = RTL8822B}, /* ASUS U2 */
|
||||
#endif /* CONFIG_RTL8822B */
|
||||
|
||||
#ifdef CONFIG_RTL8723D
|
||||
@@ -249,6 +249,11 @@ static struct usb_device_id rtw_usb_id_tbl[] = {
|
||||
{USB_DEVICE_AND_INTERFACE_INFO(USB_VENDER_ID_REALTEK, 0xD723, 0xff, 0xff, 0xff), .driver_info = RTL8723D}, /* 8723DU 1*1 */
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_RTL8192F
|
||||
/*=== Realtek demoboard ===*/
|
||||
{USB_DEVICE_AND_INTERFACE_INFO(USB_VENDER_ID_REALTEK, 0xF192, 0xff, 0xff, 0xff), .driver_info = RTL8192F}, /* 8192FU 2*2 */
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_RTL8821C
|
||||
/*=== Realtek demoboard ===*/
|
||||
{USB_DEVICE_AND_INTERFACE_INFO(USB_VENDER_ID_REALTEK, 0xb82b, 0xff, 0xff, 0xff), .driver_info = RTL8821C}, /* 8821CU */
|
||||
@@ -262,6 +267,11 @@ static struct usb_device_id rtw_usb_id_tbl[] = {
|
||||
/*=== Customer ID ===*/
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_RTL8710B
|
||||
/*=== Realtek dongle ===*/
|
||||
{USB_DEVICE_AND_INTERFACE_INFO(USB_VENDER_ID_REALTEK, 0xB711, 0xff, 0xff, 0xff), .driver_info = RTL8710B}, /* 8710B = 8188GU 1*1 */
|
||||
#endif
|
||||
|
||||
{} /* Terminating entry */
|
||||
};
|
||||
|
||||
@@ -423,6 +433,11 @@ static void rtw_decide_chip_type_by_usb_info(struct dvobj_priv *pdvobjpriv, cons
|
||||
rtl8188fu_set_hw_type(pdvobjpriv);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_RTL8188GTV
|
||||
if (pdvobjpriv->chip_type == RTL8188GTV)
|
||||
rtl8188gtvu_set_hw_type(pdvobjpriv);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_RTL8703B
|
||||
if (pdvobjpriv->chip_type == RTL8703B)
|
||||
rtl8703bu_set_hw_type(pdvobjpriv);
|
||||
@@ -442,12 +457,21 @@ static void rtw_decide_chip_type_by_usb_info(struct dvobj_priv *pdvobjpriv, cons
|
||||
if (pdvobjpriv->chip_type == RTL8821C)
|
||||
rtl8821cu_set_hw_type(pdvobjpriv);
|
||||
#endif /* CONFIG_RTL8821C */
|
||||
|
||||
#ifdef CONFIG_RTL8710B
|
||||
if (pdvobjpriv->chip_type == RTL8710B)
|
||||
rtl8710bu_set_hw_type(pdvobjpriv);
|
||||
#endif /* CONFIG_RTL8710B */
|
||||
|
||||
#ifdef CONFIG_RTL8192F
|
||||
if (pdvobjpriv->chip_type == RTL8192F)
|
||||
rtl8192fu_set_hw_type(pdvobjpriv);
|
||||
#endif /* CONFIG_RTL8192F */
|
||||
}
|
||||
|
||||
static struct dvobj_priv *usb_dvobj_init(struct usb_interface *usb_intf, const struct usb_device_id *pdid)
|
||||
{
|
||||
int i;
|
||||
u8 val8;
|
||||
int status = _FAIL;
|
||||
struct dvobj_priv *pdvobjpriv;
|
||||
struct usb_device_descriptor *pdev_desc;
|
||||
@@ -709,6 +733,11 @@ u8 rtw_set_hal_ops(_adapter *padapter)
|
||||
rtl8188fu_set_hal_ops(padapter);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_RTL8188GTV
|
||||
if (rtw_get_chip_type(padapter) == RTL8188GTV)
|
||||
rtl8188gtvu_set_hal_ops(padapter);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_RTL8703B
|
||||
if (rtw_get_chip_type(padapter) == RTL8703B)
|
||||
rtl8703bu_set_hal_ops(padapter);
|
||||
@@ -732,6 +761,17 @@ u8 rtw_set_hal_ops(_adapter *padapter)
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_RTL8710B
|
||||
if (rtw_get_chip_type(padapter) == RTL8710B)
|
||||
rtl8710bu_set_hal_ops(padapter);
|
||||
#endif /* CONFIG_RTL8710B */
|
||||
|
||||
|
||||
#ifdef CONFIG_RTL8192F
|
||||
if (rtw_get_chip_type(padapter) == RTL8192F)
|
||||
rtl8192fu_set_hal_ops(padapter);
|
||||
#endif
|
||||
|
||||
if (_FAIL == rtw_hal_ops_check(padapter))
|
||||
return _FAIL;
|
||||
|
||||
@@ -860,7 +900,7 @@ int rtw_hw_suspend(_adapter *padapter)
|
||||
}
|
||||
}
|
||||
/* s2-3. */
|
||||
rtw_free_assoc_resources(padapter, 1);
|
||||
rtw_free_assoc_resources(padapter, _TRUE);
|
||||
|
||||
/* s2-4. */
|
||||
rtw_free_network_queue(padapter, _TRUE);
|
||||
@@ -957,7 +997,10 @@ exit:
|
||||
|
||||
int rtw_resume_process(_adapter *padapter)
|
||||
{
|
||||
int ret, pm_cnt = 0;
|
||||
int ret;
|
||||
#if defined(CONFIG_BT_COEXIST) && defined(CONFIG_AUTOSUSPEND)
|
||||
int pm_cnt = 0;
|
||||
#endif
|
||||
struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);
|
||||
struct dvobj_priv *pdvobj = padapter->dvobj;
|
||||
struct debug_priv *pdbgpriv = &pdvobj->drv_dbg;
|
||||
@@ -1341,6 +1384,9 @@ free_hal_data:
|
||||
rtw_hal_free_data(padapter);
|
||||
free_adapter:
|
||||
if (status != _SUCCESS && padapter) {
|
||||
#ifdef RTW_HALMAC
|
||||
rtw_halmac_deinit_adapter(dvobj);
|
||||
#endif
|
||||
rtw_vmfree((u8 *)padapter, sizeof(*padapter));
|
||||
padapter = NULL;
|
||||
}
|
||||
@@ -1350,7 +1396,9 @@ exit:
|
||||
|
||||
static void rtw_usb_primary_adapter_deinit(_adapter *padapter)
|
||||
{
|
||||
#if defined(CONFIG_WOWLAN) || defined(CONFIG_BT_COEXIST)
|
||||
struct pwrctrl_priv *pwrctl = adapter_to_pwrctl(padapter);
|
||||
#endif
|
||||
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
|
||||
|
||||
RTW_INFO(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(padapter));
|
||||
@@ -1507,11 +1555,10 @@ exit:
|
||||
static void rtw_dev_remove(struct usb_interface *pusb_intf)
|
||||
{
|
||||
struct dvobj_priv *dvobj = usb_get_intfdata(pusb_intf);
|
||||
#if defined(CONFIG_HAS_EARLYSUSPEND) || defined(CONFIG_ANDROID_POWER)
|
||||
struct pwrctrl_priv *pwrctl = dvobj_to_pwrctl(dvobj);
|
||||
#endif
|
||||
_adapter *padapter = dvobj_get_primary_adapter(dvobj);
|
||||
struct net_device *pnetdev = padapter->pnetdev;
|
||||
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
|
||||
|
||||
|
||||
RTW_INFO("+rtw_dev_remove\n");
|
||||
|
||||
|
||||
@@ -27,12 +27,13 @@ int usbctrl_vendorreq(struct intf_hdl *pintfhdl, u8 request, u16 value, u16 inde
|
||||
{
|
||||
_adapter *padapter = pintfhdl->padapter;
|
||||
struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter);
|
||||
struct pwrctrl_priv *pwrctl = dvobj_to_pwrctl(pdvobjpriv);
|
||||
struct usb_device *udev = pdvobjpriv->pusbdev;
|
||||
|
||||
unsigned int pipe;
|
||||
int status = 0;
|
||||
#ifdef CONFIG_USB_VENDOR_REQ_BUFFER_DYNAMIC_ALLOCATE
|
||||
u32 tmp_buflen = 0;
|
||||
#endif
|
||||
u8 reqtype;
|
||||
u8 *pIo_buf;
|
||||
int vendorreq_times = 0;
|
||||
@@ -47,7 +48,9 @@ int usbctrl_vendorreq(struct intf_hdl *pintfhdl, u8 request, u16 value, u16 inde
|
||||
#ifdef CONFIG_USB_VENDOR_REQ_BUFFER_DYNAMIC_ALLOCATE
|
||||
u8 *tmp_buf;
|
||||
#else /* use stack memory */
|
||||
#ifndef CONFIG_USB_VENDOR_REQ_BUFFER_PREALLOC
|
||||
u8 tmp_buf[MAX_USB_IO_CTL_SIZE];
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* RTW_INFO("%s %s:%d\n",__FUNCTION__, current->comm, current->pid); */
|
||||
@@ -273,15 +276,19 @@ unsigned int ffaddr2pipehdl(struct dvobj_priv *pdvobj, u32 addr)
|
||||
else if (addr == RECV_INT_IN_ADDR)
|
||||
pipe = usb_rcvintpipe(pusbd, pdvobj->RtInPipe[1]);
|
||||
|
||||
else if (addr < HW_QUEUE_ENTRY) {
|
||||
#ifdef RTW_HALMAC
|
||||
/* halmac already translate queue id to bulk out id */
|
||||
ep_num = pdvobj->RtOutPipe[addr];
|
||||
/* halmac already translate queue id to bulk out id (addr 0~3) */
|
||||
else if (addr < 4) {
|
||||
ep_num = pdvobj->RtOutPipe[addr];
|
||||
pipe = usb_sndbulkpipe(pusbd, ep_num);
|
||||
}
|
||||
#else
|
||||
ep_num = pdvobj->Queue2Pipe[addr];
|
||||
else if (addr < HW_QUEUE_ENTRY) {
|
||||
ep_num = pdvobj->Queue2Pipe[addr];
|
||||
pipe = usb_sndbulkpipe(pusbd, ep_num);
|
||||
}
|
||||
#endif
|
||||
pipe = usb_sndbulkpipe(pusbd, ep_num);
|
||||
}
|
||||
|
||||
|
||||
return pipe;
|
||||
}
|
||||
@@ -322,7 +329,6 @@ static u32 usb_bulkout_zero(struct intf_hdl *pintfhdl, u32 addr)
|
||||
PURB purb = NULL;
|
||||
_adapter *padapter = (_adapter *)pintfhdl->padapter;
|
||||
struct dvobj_priv *pdvobj = adapter_to_dvobj(padapter);
|
||||
struct pwrctrl_priv *pwrctl = dvobj_to_pwrctl(pdvobj);
|
||||
struct usb_device *pusbd = pdvobj->pusbdev;
|
||||
|
||||
/* RTW_INFO("%s\n", __func__); */
|
||||
@@ -407,7 +413,6 @@ void usb_read_port_cancel(struct intf_hdl *pintfhdl)
|
||||
static void usb_write_port_complete(struct urb *purb, struct pt_regs *regs)
|
||||
{
|
||||
_irqL irqL;
|
||||
int i;
|
||||
struct xmit_buf *pxmitbuf = (struct xmit_buf *)purb->context;
|
||||
/* struct xmit_frame *pxmitframe = (struct xmit_frame *)pxmitbuf->priv_data; */
|
||||
/* _adapter *padapter = pxmitframe->padapter; */
|
||||
@@ -545,18 +550,14 @@ u32 usb_write_port(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *wmem)
|
||||
_irqL irqL;
|
||||
unsigned int pipe;
|
||||
int status;
|
||||
u32 ret = _FAIL, bwritezero = _FALSE;
|
||||
u32 ret = _FAIL;
|
||||
PURB purb = NULL;
|
||||
_adapter *padapter = (_adapter *)pintfhdl->padapter;
|
||||
struct dvobj_priv *pdvobj = adapter_to_dvobj(padapter);
|
||||
struct pwrctrl_priv *pwrctl = dvobj_to_pwrctl(pdvobj);
|
||||
struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
|
||||
struct xmit_buf *pxmitbuf = (struct xmit_buf *)wmem;
|
||||
struct xmit_frame *pxmitframe = (struct xmit_frame *)pxmitbuf->priv_data;
|
||||
struct usb_device *pusbd = pdvobj->pusbdev;
|
||||
struct pkt_attrib *pattrib = &pxmitframe->attrib;
|
||||
|
||||
|
||||
|
||||
if (RTW_CANNOT_TX(padapter)) {
|
||||
#ifdef DBG_TX
|
||||
@@ -985,7 +986,6 @@ u32 usb_read_port(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *rmem)
|
||||
struct recv_buf *precvbuf = (struct recv_buf *)rmem;
|
||||
_adapter *adapter = pintfhdl->padapter;
|
||||
struct dvobj_priv *pdvobj = adapter_to_dvobj(adapter);
|
||||
struct pwrctrl_priv *pwrctl = dvobj_to_pwrctl(pdvobj);
|
||||
struct recv_priv *precvpriv = &adapter->recvpriv;
|
||||
struct usb_device *pusbd = pdvobj->pusbdev;
|
||||
|
||||
|
||||
@@ -252,66 +252,10 @@ static void _rtw_reg_apply_active_scan_flags(struct wiphy *wiphy,
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Always apply Radar/DFS rules on
|
||||
* freq range 5260 MHz - 5700 MHz
|
||||
*/
|
||||
static void _rtw_reg_apply_radar_flags(struct wiphy *wiphy)
|
||||
void rtw_regd_apply_flags(struct wiphy *wiphy)
|
||||
{
|
||||
struct ieee80211_supported_band *sband;
|
||||
struct ieee80211_channel *ch;
|
||||
unsigned int i;
|
||||
|
||||
if (!wiphy->bands[NL80211_BAND_5GHZ])
|
||||
return;
|
||||
|
||||
sband = wiphy->bands[NL80211_BAND_5GHZ];
|
||||
|
||||
for (i = 0; i < sband->n_channels; i++) {
|
||||
ch = &sband->channels[i];
|
||||
if (!rtw_is_dfs_ch(ch->hw_value))
|
||||
continue;
|
||||
#ifdef CONFIG_DFS
|
||||
if (!(ch->flags & IEEE80211_CHAN_DISABLED)
|
||||
#if defined(CONFIG_DFS_MASTER)
|
||||
&& rtw_odm_dfs_domain_unknown(wiphy_to_adapter(wiphy))
|
||||
#endif
|
||||
) {
|
||||
ch->flags |= IEEE80211_CHAN_RADAR;
|
||||
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 14, 0))
|
||||
ch->flags |= (IEEE80211_CHAN_NO_IBSS | IEEE80211_CHAN_PASSIVE_SCAN);
|
||||
#else
|
||||
ch->flags |= IEEE80211_CHAN_NO_IR;
|
||||
#endif
|
||||
}
|
||||
#endif /* CONFIG_DFS */
|
||||
|
||||
#if 0
|
||||
/*
|
||||
* We always enable radar detection/DFS on this
|
||||
* frequency range. Additionally we also apply on
|
||||
* this frequency range:
|
||||
* - If STA mode does not yet have DFS supports disable
|
||||
* active scanning
|
||||
* - If adhoc mode does not support DFS yet then disable
|
||||
* adhoc in the frequency.
|
||||
* - If AP mode does not yet support radar detection/DFS
|
||||
* do not allow AP mode
|
||||
*/
|
||||
if (!(ch->flags & IEEE80211_CHAN_DISABLED))
|
||||
ch->flags |= IEEE80211_CHAN_RADAR |
|
||||
IEEE80211_CHAN_NO_IBSS |
|
||||
IEEE80211_CHAN_PASSIVE_SCAN;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
static void _rtw_reg_apply_flags(struct wiphy *wiphy)
|
||||
{
|
||||
#if 1 /* by channel plan */
|
||||
_adapter *padapter = wiphy_to_adapter(wiphy);
|
||||
struct rf_ctl_t *rfctl = adapter_to_rfctl(padapter);
|
||||
u8 channel_plan = rfctl->ChannelPlan;
|
||||
struct dvobj_priv *dvobj = wiphy_to_dvobj(wiphy);
|
||||
struct rf_ctl_t *rfctl = dvobj_to_rfctl(dvobj);
|
||||
RT_CHANNEL_INFO *channel_set = rfctl->channel_set;
|
||||
u8 max_chan_nums = rfctl->max_chan_nums;
|
||||
|
||||
@@ -341,109 +285,37 @@ static void _rtw_reg_apply_flags(struct wiphy *wiphy)
|
||||
freq = rtw_ch2freq(channel);
|
||||
|
||||
ch = ieee80211_get_channel(wiphy, freq);
|
||||
if (ch) {
|
||||
if (channel_set[i].ScanType == SCAN_PASSIVE
|
||||
#if defined(CONFIG_DFS_MASTER)
|
||||
&& rtw_odm_dfs_domain_unknown(wiphy_to_adapter(wiphy))
|
||||
#endif
|
||||
) {
|
||||
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 14, 0))
|
||||
ch->flags = (IEEE80211_CHAN_NO_IBSS | IEEE80211_CHAN_PASSIVE_SCAN);
|
||||
#else
|
||||
ch->flags = IEEE80211_CHAN_NO_IR;
|
||||
#endif
|
||||
} else
|
||||
ch->flags = 0;
|
||||
if (!ch)
|
||||
continue;
|
||||
|
||||
if (channel_set[i].ScanType == SCAN_PASSIVE
|
||||
#if defined(CONFIG_DFS_MASTER)
|
||||
&& rtw_odm_dfs_domain_unknown(dvobj)
|
||||
#endif
|
||||
) {
|
||||
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 14, 0))
|
||||
ch->flags = (IEEE80211_CHAN_NO_IBSS | IEEE80211_CHAN_PASSIVE_SCAN);
|
||||
#else
|
||||
ch->flags = IEEE80211_CHAN_NO_IR;
|
||||
#endif
|
||||
} else
|
||||
ch->flags = 0;
|
||||
|
||||
#ifdef CONFIG_DFS
|
||||
if (rtw_is_dfs_ch(ch->hw_value)
|
||||
#if defined(CONFIG_DFS_MASTER)
|
||||
&& rtw_odm_dfs_domain_unknown(dvobj)
|
||||
#endif
|
||||
) {
|
||||
ch->flags |= IEEE80211_CHAN_RADAR;
|
||||
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 14, 0))
|
||||
ch->flags |= (IEEE80211_CHAN_NO_IBSS | IEEE80211_CHAN_PASSIVE_SCAN);
|
||||
#else
|
||||
ch->flags |= IEEE80211_CHAN_NO_IR;
|
||||
#endif
|
||||
}
|
||||
#endif /* CONFIG_DFS */
|
||||
}
|
||||
|
||||
#else
|
||||
struct ieee80211_supported_band *sband;
|
||||
struct ieee80211_channel *ch;
|
||||
unsigned int i, j;
|
||||
u16 channels[37] = {
|
||||
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 36, 40, 44, 48, 52, 56,
|
||||
60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140,
|
||||
149, 153,
|
||||
157, 161, 165
|
||||
};
|
||||
u16 channel;
|
||||
u32 freq;
|
||||
|
||||
for (i = 0; i < NUM_NL80211_BANDS; i++) {
|
||||
sband = wiphy->bands[i];
|
||||
|
||||
if (sband)
|
||||
for (j = 0; j < sband->n_channels; j++) {
|
||||
ch = &sband->channels[j];
|
||||
|
||||
if (ch)
|
||||
ch->flags = IEEE80211_CHAN_DISABLED;
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < 37; i++) {
|
||||
channel = channels[i];
|
||||
freq = rtw_ch2freq(channel);
|
||||
|
||||
ch = ieee80211_get_channel(wiphy, freq);
|
||||
if (ch) {
|
||||
if (channel <= 11)
|
||||
ch->flags = 0;
|
||||
else
|
||||
ch->flags = 0; /* IEEE80211_CHAN_PASSIVE_SCAN; */
|
||||
}
|
||||
/* printk("%s: freq %d(%d) flag 0x%02X\n", __func__, freq, channel, ch->flags); */
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
static void _rtw_reg_apply_world_flags(struct wiphy *wiphy,
|
||||
enum nl80211_reg_initiator initiator,
|
||||
struct rtw_regulatory *reg)
|
||||
{
|
||||
/* _rtw_reg_apply_beaconing_flags(wiphy, initiator); */
|
||||
/* _rtw_reg_apply_active_scan_flags(wiphy, initiator); */
|
||||
return;
|
||||
}
|
||||
|
||||
static int _rtw_reg_notifier_apply(struct wiphy *wiphy,
|
||||
struct regulatory_request *request,
|
||||
struct rtw_regulatory *reg)
|
||||
{
|
||||
|
||||
/* Hard code flags */
|
||||
_rtw_reg_apply_flags(wiphy);
|
||||
|
||||
/* We always apply this */
|
||||
_rtw_reg_apply_radar_flags(wiphy);
|
||||
|
||||
switch (request->initiator) {
|
||||
case NL80211_REGDOM_SET_BY_DRIVER:
|
||||
RTW_INFO("%s: %s\n", __func__, "NL80211_REGDOM_SET_BY_DRIVER");
|
||||
_rtw_reg_apply_world_flags(wiphy, NL80211_REGDOM_SET_BY_DRIVER,
|
||||
reg);
|
||||
break;
|
||||
case NL80211_REGDOM_SET_BY_CORE:
|
||||
RTW_INFO("%s: %s\n", __func__,
|
||||
"NL80211_REGDOM_SET_BY_CORE to DRV");
|
||||
_rtw_reg_apply_world_flags(wiphy, NL80211_REGDOM_SET_BY_DRIVER,
|
||||
reg);
|
||||
break;
|
||||
case NL80211_REGDOM_SET_BY_USER:
|
||||
RTW_INFO("%s: %s\n", __func__,
|
||||
"NL80211_REGDOM_SET_BY_USER to DRV");
|
||||
_rtw_reg_apply_world_flags(wiphy, NL80211_REGDOM_SET_BY_DRIVER,
|
||||
reg);
|
||||
break;
|
||||
case NL80211_REGDOM_SET_BY_COUNTRY_IE:
|
||||
RTW_INFO("%s: %s\n", __func__,
|
||||
"NL80211_REGDOM_SET_BY_COUNTRY_IE");
|
||||
_rtw_reg_apply_world_flags(wiphy, request->initiator, reg);
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct ieee80211_regdomain *_rtw_regdomain_select(struct
|
||||
@@ -461,41 +333,45 @@ static const struct ieee80211_regdomain *_rtw_regdomain_select(struct
|
||||
#endif
|
||||
}
|
||||
|
||||
void _rtw_reg_notifier(struct wiphy *wiphy, struct regulatory_request *request)
|
||||
static void rtw_reg_notifier(struct wiphy *wiphy, struct regulatory_request *request)
|
||||
{
|
||||
struct rtw_regulatory *reg = NULL;
|
||||
|
||||
RTW_INFO("%s\n", __func__);
|
||||
|
||||
_rtw_reg_notifier_apply(wiphy, request, reg);
|
||||
}
|
||||
|
||||
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 9, 0))
|
||||
int rtw_reg_notifier(struct wiphy *wiphy, struct regulatory_request *request)
|
||||
#else
|
||||
void rtw_reg_notifier(struct wiphy *wiphy, struct regulatory_request *request)
|
||||
#endif
|
||||
{
|
||||
_rtw_reg_notifier(wiphy, request);
|
||||
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 9, 0))
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
void rtw_reg_notify_by_driver(_adapter *adapter)
|
||||
{
|
||||
if ((adapter->rtw_wdev != NULL) && (adapter->rtw_wdev->wiphy)) {
|
||||
struct regulatory_request request;
|
||||
request.initiator = NL80211_REGDOM_SET_BY_DRIVER;
|
||||
rtw_reg_notifier(adapter->rtw_wdev->wiphy, &request);
|
||||
switch (request->initiator) {
|
||||
case NL80211_REGDOM_SET_BY_DRIVER:
|
||||
RTW_INFO("%s: %s\n", __func__, "NL80211_REGDOM_SET_BY_DRIVER");
|
||||
break;
|
||||
case NL80211_REGDOM_SET_BY_CORE:
|
||||
RTW_INFO("%s: %s\n", __func__, "NL80211_REGDOM_SET_BY_CORE");
|
||||
break;
|
||||
case NL80211_REGDOM_SET_BY_USER:
|
||||
RTW_INFO("%s: %s alpha2:%c%c\n", __func__, "NL80211_REGDOM_SET_BY_USER"
|
||||
, request->alpha2[0], request->alpha2[1]);
|
||||
rtw_set_country(wiphy_to_adapter(wiphy), request->alpha2);
|
||||
break;
|
||||
case NL80211_REGDOM_SET_BY_COUNTRY_IE:
|
||||
RTW_INFO("%s: %s\n", __func__, "NL80211_REGDOM_SET_BY_COUNTRY_IE");
|
||||
break;
|
||||
}
|
||||
|
||||
rtw_regd_apply_flags(wiphy);
|
||||
}
|
||||
|
||||
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 9, 0))
|
||||
static int rtw_reg_notifier_return(struct wiphy *wiphy, struct regulatory_request *request)
|
||||
{
|
||||
rtw_reg_notifier(wiphy, request);
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
static void _rtw_regd_init_wiphy(struct rtw_regulatory *reg, struct wiphy *wiphy)
|
||||
{
|
||||
const struct ieee80211_regdomain *regd;
|
||||
|
||||
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 9, 0))
|
||||
wiphy->reg_notifier = rtw_reg_notifier_return;
|
||||
#else
|
||||
wiphy->reg_notifier = rtw_reg_notifier;
|
||||
#endif
|
||||
|
||||
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 14, 0))
|
||||
wiphy->flags |= WIPHY_FLAG_CUSTOM_REGULATORY;
|
||||
@@ -510,10 +386,7 @@ static void _rtw_regd_init_wiphy(struct rtw_regulatory *reg, struct wiphy *wiphy
|
||||
regd = _rtw_regdomain_select(reg);
|
||||
wiphy_apply_custom_regulatory(wiphy, regd);
|
||||
|
||||
/* Hard code flags */
|
||||
_rtw_reg_apply_flags(wiphy);
|
||||
_rtw_reg_apply_radar_flags(wiphy);
|
||||
_rtw_reg_apply_world_flags(wiphy, NL80211_REGDOM_SET_BY_DRIVER, reg);
|
||||
rtw_regd_apply_flags(wiphy);
|
||||
}
|
||||
|
||||
static struct country_code_to_enum_rd *_rtw_regd_find_country(u16 countrycode)
|
||||
@@ -527,10 +400,8 @@ static struct country_code_to_enum_rd *_rtw_regd_find_country(u16 countrycode)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int rtw_regd_init(_adapter *padapter)
|
||||
int rtw_regd_init(struct wiphy *wiphy)
|
||||
{
|
||||
struct wiphy *wiphy = padapter->rtw_wdev->wiphy;
|
||||
|
||||
#if 0
|
||||
if (rtw_regd == NULL) {
|
||||
rtw_regd = (struct rtw_regulatory *)
|
||||
|
||||
@@ -65,36 +65,41 @@ sint rtw_endofpktfile(struct pkt_file *pfile)
|
||||
|
||||
void rtw_set_tx_chksum_offload(_pkt *pkt, struct pkt_attrib *pattrib)
|
||||
{
|
||||
|
||||
#ifdef CONFIG_TCP_CSUM_OFFLOAD_TX
|
||||
#ifdef CONFIG_TX_CSUM_OFFLOAD
|
||||
struct sk_buff *skb = (struct sk_buff *)pkt;
|
||||
pattrib->hw_tcp_csum = 0;
|
||||
struct iphdr *iph = NULL;
|
||||
struct ipv6hdr *i6ph = NULL;
|
||||
struct udphdr *uh = NULL;
|
||||
struct tcphdr *th = NULL;
|
||||
u8 protocol = 0xFF;
|
||||
|
||||
if (skb->ip_summed == CHECKSUM_PARTIAL) {
|
||||
if (skb_shinfo(skb)->nr_frags == 0) {
|
||||
const struct iphdr *ip = ip_hdr(skb);
|
||||
if (ip->protocol == IPPROTO_TCP) {
|
||||
/* TCP checksum offload by HW */
|
||||
RTW_INFO("CHECKSUM_PARTIAL TCP\n");
|
||||
pattrib->hw_tcp_csum = 1;
|
||||
/* skb_checksum_help(skb); */
|
||||
} else if (ip->protocol == IPPROTO_UDP) {
|
||||
/* RTW_INFO("CHECKSUM_PARTIAL UDP\n"); */
|
||||
#if 1
|
||||
skb_checksum_help(skb);
|
||||
#else
|
||||
/* Set UDP checksum = 0 to skip checksum check */
|
||||
struct udphdr *udp = skb_transport_header(skb);
|
||||
udp->check = 0;
|
||||
#endif
|
||||
} else {
|
||||
RTW_INFO("%s-%d TCP CSUM offload Error!!\n", __FUNCTION__, __LINE__);
|
||||
WARN_ON(1); /* we need a WARN() */
|
||||
}
|
||||
} else { /* IP fragmentation case */
|
||||
RTW_INFO("%s-%d nr_frags != 0, using skb_checksum_help(skb);!!\n", __FUNCTION__, __LINE__);
|
||||
skb_checksum_help(skb);
|
||||
}
|
||||
if (skb->protocol == htons(ETH_P_IP)) {
|
||||
iph = (struct iphdr *)skb_network_header(skb);
|
||||
protocol = iph->protocol;
|
||||
} else if (skb->protocol == htons(ETH_P_IPV6)) {
|
||||
i6ph = (struct ipv6hdr *)skb_network_header(skb);
|
||||
protocol = i6ph->nexthdr;
|
||||
} else
|
||||
{}
|
||||
|
||||
/* For HW rule, clear ipv4_csum & UDP/TCP_csum if it is UDP/TCP packet */
|
||||
switch (protocol) {
|
||||
case IPPROTO_UDP:
|
||||
uh = (struct udphdr *)skb_transport_header(skb);
|
||||
uh->check = 0;
|
||||
if (iph)
|
||||
iph->check = 0;
|
||||
pattrib->hw_csum = _TRUE;
|
||||
break;
|
||||
case IPPROTO_TCP:
|
||||
th = (struct tcphdr *)skb_transport_header(skb);
|
||||
th->check = 0;
|
||||
if (iph)
|
||||
iph->check = 0;
|
||||
pattrib->hw_csum = _TRUE;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -313,7 +318,6 @@ void rtw_os_xmit_schedule(_adapter *padapter)
|
||||
static bool rtw_check_xmit_resource(_adapter *padapter, _pkt *pkt)
|
||||
{
|
||||
bool busy = _FALSE;
|
||||
struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
|
||||
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35))
|
||||
u16 qidx;
|
||||
|
||||
@@ -404,9 +408,9 @@ int rtw_mlcst2unicst(_adapter *padapter, struct sk_buff *skb)
|
||||
}
|
||||
|
||||
/* avoid come from STA1 and send back STA1 */
|
||||
if (_rtw_memcmp(psta->cmn.mac_addr, &skb->data[6], 6) == _TRUE
|
||||
|| _rtw_memcmp(psta->cmn.mac_addr, null_addr, 6) == _TRUE
|
||||
|| _rtw_memcmp(psta->cmn.mac_addr, bc_addr, 6) == _TRUE
|
||||
if (_rtw_memcmp(psta->cmn.mac_addr, &skb->data[6], ETH_ALEN) == _TRUE
|
||||
|| _rtw_memcmp(psta->cmn.mac_addr, null_addr, ETH_ALEN) == _TRUE
|
||||
|| _rtw_memcmp(psta->cmn.mac_addr, bc_addr, ETH_ALEN) == _TRUE
|
||||
) {
|
||||
DBG_COUNTER(padapter->tx_logs.os_tx_m2u_ignore_self);
|
||||
continue;
|
||||
@@ -417,7 +421,7 @@ int rtw_mlcst2unicst(_adapter *padapter, struct sk_buff *skb)
|
||||
newskb = rtw_skb_copy(skb);
|
||||
|
||||
if (newskb) {
|
||||
_rtw_memcpy(newskb->data, psta->cmn.mac_addr, 6);
|
||||
_rtw_memcpy(newskb->data, psta->cmn.mac_addr, ETH_ALEN);
|
||||
res = rtw_xmit(padapter, &newskb);
|
||||
if (res < 0) {
|
||||
DBG_COUNTER(padapter->tx_logs.os_tx_m2u_entry_err_xmit);
|
||||
@@ -445,14 +449,14 @@ int _rtw_xmit_entry(_pkt *pkt, _nic_hdl pnetdev)
|
||||
_adapter *padapter = (_adapter *)rtw_netdev_priv(pnetdev);
|
||||
struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
|
||||
#ifdef CONFIG_TX_MCAST2UNI
|
||||
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
|
||||
extern int rtw_mc2u_disable;
|
||||
#endif /* CONFIG_TX_MCAST2UNI */
|
||||
s32 res = 0;
|
||||
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35))
|
||||
u16 queue;
|
||||
#ifdef CONFIG_TX_CSUM_OFFLOAD
|
||||
struct sk_buff *skb = pkt;
|
||||
struct sk_buff *segs, *nskb;
|
||||
netdev_features_t features = padapter->pnetdev->features;
|
||||
#endif
|
||||
|
||||
s32 res = 0;
|
||||
|
||||
if (padapter->registrypriv.mp_mode) {
|
||||
RTW_INFO("MP_TX_DROP_OS_FRAME\n");
|
||||
@@ -493,6 +497,33 @@ int _rtw_xmit_entry(_pkt *pkt, _nic_hdl pnetdev)
|
||||
}
|
||||
#endif /* CONFIG_TX_MCAST2UNI */
|
||||
|
||||
#ifdef CONFIG_TX_CSUM_OFFLOAD
|
||||
if (skb_shinfo(skb)->gso_size) {
|
||||
/* split a big(65k) skb into several small(1.5k) skbs */
|
||||
features &= ~(NETIF_F_TSO | NETIF_F_TSO6);
|
||||
segs = skb_gso_segment(skb, features);
|
||||
if (IS_ERR(segs) || !segs)
|
||||
goto drop_packet;
|
||||
|
||||
do {
|
||||
nskb = segs;
|
||||
segs = segs->next;
|
||||
nskb->next = NULL;
|
||||
rtw_mstat_update( MSTAT_TYPE_SKB, MSTAT_ALLOC_SUCCESS, nskb->truesize);
|
||||
res = rtw_xmit(padapter, &nskb);
|
||||
if (res < 0) {
|
||||
#ifdef DBG_TX_DROP_FRAME
|
||||
RTW_INFO("DBG_TX_DROP_FRAME %s rtw_xmit fail\n", __FUNCTION__);
|
||||
#endif
|
||||
pxmitpriv->tx_drop++;
|
||||
rtw_os_pkt_complete(padapter, nskb);
|
||||
}
|
||||
} while (segs);
|
||||
rtw_os_pkt_complete(padapter, skb);
|
||||
goto exit;
|
||||
}
|
||||
#endif
|
||||
|
||||
res = rtw_xmit(padapter, &pkt);
|
||||
if (res < 0) {
|
||||
#ifdef DBG_TX_DROP_FRAME
|
||||
|
||||
@@ -1808,6 +1808,20 @@ void rtw_yield_os(void)
|
||||
#endif
|
||||
}
|
||||
|
||||
bool rtw_macaddr_is_larger(const u8 *a, const u8 *b)
|
||||
{
|
||||
u32 va, vb;
|
||||
|
||||
va = be32_to_cpu(*((u32 *)a));
|
||||
vb = be32_to_cpu(*((u32 *)b));
|
||||
if (va > vb)
|
||||
return 1;
|
||||
else if (va < vb)
|
||||
return 0;
|
||||
|
||||
return be16_to_cpu(*((u16 *)(a + 4))) > be16_to_cpu(*((u16 *)(b + 4)));
|
||||
}
|
||||
|
||||
#define RTW_SUSPEND_LOCK_NAME "rtw_wifi"
|
||||
#define RTW_SUSPEND_TRAFFIC_LOCK_NAME "rtw_wifi_traffic"
|
||||
#define RTW_SUSPEND_RESUME_LOCK_NAME "rtw_wifi_resume"
|
||||
@@ -2187,12 +2201,7 @@ static int isFileReadable(const char *path, u32 *sz)
|
||||
ret = PTR_ERR(fp);
|
||||
else {
|
||||
oldfs = get_fs();
|
||||
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 1, 0))
|
||||
set_fs(KERNEL_DS);
|
||||
#else
|
||||
set_fs(get_ds());
|
||||
#endif
|
||||
|
||||
set_fs(get_ds());
|
||||
|
||||
if (1 != readFile(fp, &buf, 1))
|
||||
ret = PTR_ERR(fp);
|
||||
@@ -2230,12 +2239,7 @@ static int retriveFromFile(const char *path, u8 *buf, u32 sz)
|
||||
RTW_INFO("%s openFile path:%s fp=%p\n", __FUNCTION__, path , fp);
|
||||
|
||||
oldfs = get_fs();
|
||||
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 1, 0))
|
||||
set_fs(KERNEL_DS);
|
||||
#else
|
||||
set_fs(get_ds());
|
||||
#endif
|
||||
|
||||
set_fs(get_ds());
|
||||
ret = readFile(fp, buf, sz);
|
||||
set_fs(oldfs);
|
||||
closeFile(fp);
|
||||
@@ -2270,11 +2274,7 @@ static int storeToFile(const char *path, u8 *buf, u32 sz)
|
||||
RTW_INFO("%s openFile path:%s fp=%p\n", __FUNCTION__, path , fp);
|
||||
|
||||
oldfs = get_fs();
|
||||
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 1, 0))
|
||||
set_fs(KERNEL_DS);
|
||||
#else
|
||||
set_fs(get_ds());
|
||||
#endif
|
||||
set_fs(get_ds());
|
||||
ret = writeFile(fp, buf, sz);
|
||||
set_fs(oldfs);
|
||||
closeFile(fp);
|
||||
|
||||
Reference in New Issue
Block a user