Update to 5.6.1

This commit is contained in:
Rin Cat
2019-09-21 05:30:30 -04:00
parent 953142179e
commit 0644d0b316
413 changed files with 179115 additions and 110562 deletions

625
os_dep/linux/ioctl_cfg80211.c Normal file → Executable file

File diff suppressed because it is too large Load Diff

View File

@@ -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) \

View File

@@ -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 *)&param->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;

View File

@@ -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, ",");

View File

@@ -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

View File

@@ -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);

View File

@@ -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;

View File

@@ -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 }

View File

@@ -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

View File

@@ -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");

View File

@@ -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;

View File

@@ -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 *)

View File

@@ -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

View File

@@ -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);