ifeq ($(CONFIG_EFUSE_CONFIG_FILE), y)
EXTRA_CFLAGS += -DCONFIG_EFUSE_CONFIG_FILE
+EXTRA_CFLAGS += -DEFUSE_MAP_PATH=\"/system/etc/wifi/wifi_efuse_$(MODULE_NAME).map\"
+EXTRA_CFLAGS += -DWIFIMAC_PATH=\"/data/wifimac.txt\"
endif
ifeq ($(CONFIG_EXT_CLK), y)
EXTRA_CFLAGS += -DCONFIG_ODM_ADAPTIVITY
endif
+ifeq ($(CONFIG_SKIP_SIGNAL_SCALE_MAPPING), y)
+EXTRA_CFLAGS += -DCONFIG_SKIP_SIGNAL_SCALE_MAPPING
+endif
+
ifeq ($(CONFIG_MMC_PM_KEEP_POWER), y)
EXTRA_CFLAGS += -DCONFIG_MMC_PM_KEEP_POWER
endif
ARCH := arm
CROSS_COMPILE := /usr/src/release_fae_version/toolchain/arm-eabi-4.4.0/bin/arm-eabi-
KSRC := /usr/src/release_fae_version/kernel25_A7_281x
-MODULE_NAME := 8723au
+MODULE_NAME := wlan
endif
ifeq ($(CONFIG_PLATFORM_ARM_RK3066), y)
#Android-JB42
#CROSS_COMPILE := /home/android_sdk/Allwinner/a31/android-jb42/lichee/buildroot/output/external-toolchain/bin/arm-linux-gnueabi-
#KSRC :=/home/android_sdk/Allwinner/a31/android-jb42/lichee/linux-3.3
-
-#Android-KK44
-CROSS_COMPILE := /home/android_sdk/Allwinner/a31/android-kk44/A3x-KK-SDK/lichee/buildroot/output/external-toolchain/bin/arm-linux-gnueabi-
-KSRC :=/home/android_sdk/Allwinner/a31/android-kk44/A3x-KK-SDK/lichee/linux-3.3
-
-ifeq ($(CONFIG_USB_HCI), y)
-MODULE_NAME := 8188eu_sw
-endif
+# ==== Cross compile setting for kitkat-a3x_v4.5 =====
+CROSS_COMPILE := /home/android_sdk/Allwinner/a31/kitkat-a3x_v4.5/lichee/buildroot/output/external-toolchain/bin/arm-linux-gnueabi-
+KSRC :=/home/android_sdk/Allwinner/a31/kitkat-a3x_v4.5/lichee/linux-3.3
+MODULE_NAME := 8192eu
endif
ifeq ($(CONFIG_PLATFORM_ARM_SUN7I), y)
pnetwork_mlmeext->IELength = offset + remainder_ielen;\r
\r
}\r
-\r
-#ifndef CONFIG_INTERRUPT_BASED_TXBCN \r
-#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)\r
- set_tx_beacon_cmd(padapter);\r
-#endif\r
-#endif //!CONFIG_INTERRUPT_BASED_TXBCN\r
-\r
-\r
}\r
\r
void rtw_add_bcn_ie(_adapter *padapter, WLAN_BSSID_EX *pnetwork, u8 index, u8 *data, u8 len)\r
\r
//to update bcn with tim_bitmap for this station\r
pstapriv->tim_bitmap |= BIT(psta->aid);\r
- update_beacon(padapter, _TIM_IE_, NULL, _FALSE);\r
+ update_beacon(padapter, _TIM_IE_, NULL, _TRUE);\r
\r
if(!pmlmeext->active_keep_alive_check)\r
continue;\r
\r
if(_TRUE == pmlmeext->bstart_bss)\r
{\r
- update_beacon(padapter, _TIM_IE_, NULL, _FALSE);\r
+ update_beacon(padapter, _TIM_IE_, NULL, _TRUE);\r
\r
#ifndef CONFIG_INTERRUPT_BASED_TXBCN //other case will tx beacon when bcn interrupt coming in.\r
#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)\r
\r
}\r
\r
-void update_beacon(_adapter *padapter, u8 ie_id, u8 *oui, u8 tx)\r
+void _update_beacon(_adapter *padapter, u8 ie_id, u8 *oui, u8 tx, const char *tag)\r
{\r
_irqL irqL;\r
struct mlme_priv *pmlmepriv;\r
if(tx)\r
{\r
//send_beacon(padapter);//send_beacon must execute on TSR level\r
+ if (0)\r
+ DBG_871X(FUNC_ADPT_FMT" ie_id:%u - %s\n", FUNC_ADPT_ARG(padapter), ie_id, tag);\r
set_tx_beacon_cmd(padapter);\r
}\r
#else\r
//report_del_sta_event(padapter, psta->hwaddr, reason);\r
\r
//clear cam entry / key\r
- //clear_cam_entry(padapter, (psta->mac_id + 3));\r
- rtw_clearstakey_cmd(padapter, (u8*)psta, (u8)rtw_get_camid(psta->mac_id), _TRUE);\r
+ rtw_clearstakey_cmd(padapter, psta, _TRUE);\r
\r
\r
_enter_critical_bh(&psta->lock, &irqL);\r
if( (padapter->securitypriv.dot11PrivacyAlgrthm == _TKIP_) ||\r
(padapter->securitypriv.dot11PrivacyAlgrthm == _AES_))\r
{\r
- rtw_setstakey_cmd(padapter, (unsigned char *)psta, _TRUE,_FALSE);\r
+ rtw_setstakey_cmd(padapter, psta, _TRUE,_FALSE);\r
} \r
}\r
}\r
return res;
}
-u8 rtw_setstakey_cmd(_adapter *padapter, u8 *psta, u8 unicast_key, bool enqueue)
+u8 rtw_setstakey_cmd(_adapter *padapter, struct sta_info *sta, u8 unicast_key, bool enqueue)
{
struct cmd_obj* ph2c;
struct set_stakey_parm *psetstakey_para;
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
struct security_priv *psecuritypriv = &padapter->securitypriv;
- struct sta_info* sta = (struct sta_info* )psta;
u8 res=_SUCCESS;
_func_enter_;
return res;
}
-u8 rtw_clearstakey_cmd(_adapter *padapter, u8 *psta, u8 entry, u8 enqueue)
+u8 rtw_clearstakey_cmd(_adapter *padapter, struct sta_info *sta, u8 enqueue)
{
struct cmd_obj* ph2c;
struct set_stakey_parm *psetstakey_para;
struct set_stakey_rsp *psetstakey_rsp = NULL;
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
struct security_priv *psecuritypriv = &padapter->securitypriv;
- struct sta_info* sta = (struct sta_info* )psta;
+ s16 cam_id = 0;
u8 res=_SUCCESS;
_func_enter_;
if(!enqueue)
{
- clear_cam_entry(padapter, entry);
+ while((cam_id = rtw_camid_search(padapter, sta->hwaddr, -1)) >= 0) {
+ DBG_871X_LEVEL(_drv_always_, "clear key for addr:"MAC_FMT", camid:%d\n", MAC_ARG(sta->hwaddr), cam_id);
+ clear_cam_entry(padapter, cam_id);
+ rtw_camid_free(padapter, cam_id);
+ }
}
else
{
_rtw_memcpy(psetstakey_para->addr, sta->hwaddr, ETH_ALEN);
psetstakey_para->algorithm = _NO_PRIVACY_;
-
- psetstakey_para->id = entry;
res = rtw_enqueue_cmd(pcmdpriv, ph2c);
pmlmepriv->LinkDetectInfo.bHigherBusyRxTraffic = bHigherBusyRxTraffic;
pmlmepriv->LinkDetectInfo.bHigherBusyTxTraffic = bHigherBusyTxTraffic;
#ifdef CONFIG_BT_COEXIST
- pHalData->bt_coexist.halCoex8723.bBusyTrafficForCoex = bBusyTrafficForCoex;
+ pmlmepriv->LinkDetectInfo.bBusyTrafficForCoex = bBusyTrafficForCoex;
#endif
}
static void rtw_chk_hi_queue_hdl(_adapter *padapter)
{
- int cnt=0;
struct sta_info *psta_bmc;
struct sta_priv *pstapriv = &padapter->stapriv;
+ u32 start = rtw_get_current_time();
+ u8 empty = _FALSE;
psta_bmc = rtw_get_bcmc_stainfo(padapter);
if(!psta_bmc)
return;
- if(psta_bmc->sleepq_len==0)
- {
- u8 val = 0;
+ rtw_hal_get_hwreg(padapter, HW_VAR_CHK_HI_QUEUE_EMPTY, &empty);
- //while((rtw_read32(padapter, 0x414)&0x00ffff00)!=0)
- //while((rtw_read32(padapter, 0x414)&0x0000ff00)!=0)
-
- rtw_hal_get_hwreg(padapter, HW_VAR_CHK_HI_QUEUE_EMPTY, &val);
-
- while(_FALSE == val)
- {
- rtw_msleep_os(100);
+ while(_FALSE == empty && rtw_get_passing_time_ms(start) < rtw_get_wait_hiq_empty_ms())
+ {
+ rtw_msleep_os(100);
+ rtw_hal_get_hwreg(padapter, HW_VAR_CHK_HI_QUEUE_EMPTY, &empty);
+ }
- cnt++;
-
- if(cnt>10)
- break;
+ if(psta_bmc->sleepq_len==0)
+ {
+ if(empty == _SUCCESS)
+ {
+ bool update_tim = _FALSE;
- rtw_hal_get_hwreg(padapter, HW_VAR_CHK_HI_QUEUE_EMPTY, &val);
- }
+ if (pstapriv->tim_bitmap & BIT(0))
+ update_tim = _TRUE;
- if(cnt<=10)
- {
pstapriv->tim_bitmap &= ~BIT(0);
pstapriv->sta_dz_bitmap &= ~BIT(0);
-
- update_beacon(padapter, _TIM_IE_, NULL, _FALSE);
+
+ if (update_tim == _TRUE)
+ _update_beacon(padapter, _TIM_IE_, NULL, _TRUE, "bmc sleepq and HIQ empty");
}
else //re check again
{
rtw_chk_hi_queue_cmd(padapter);
}
-
- }
-
+ }
}
u8 rtw_chk_hi_queue_cmd(_adapter*padapter)
}
}
+static u8 fwdl_test_chksum_fail = 0;
+static u8 fwdl_test_wintint_rdy_fail = 0;
+
+bool rtw_fwdl_test_trigger_chksum_fail()
+{
+ if (fwdl_test_chksum_fail) {
+ DBG_871X_LEVEL(_drv_always_, "fwdl test case: trigger chksum_fail\n");
+ fwdl_test_chksum_fail--;
+ return _TRUE;
+ }
+ return _FALSE;
+}
+
+bool rtw_fwdl_test_trigger_wintint_rdy_fail()
+{
+ if (fwdl_test_wintint_rdy_fail) {
+ DBG_871X_LEVEL(_drv_always_, "fwdl test case: trigger wintint_rdy_fail\n");
+ fwdl_test_wintint_rdy_fail--;
+ return _TRUE;
+ }
+ return _FALSE;
+}
+
+static u32 g_wait_hiq_empty_ms = 0;
+
+u32 rtw_get_wait_hiq_empty_ms()
+{
+ return g_wait_hiq_empty_ms;
+}
+
#ifdef CONFIG_PROC_DEBUG
ssize_t proc_set_write_reg(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
{
{
struct net_device *dev = m->private;
_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
- struct security_priv *psecuritypriv = &padapter->securitypriv;
+ struct security_priv *sec = &padapter->securitypriv;
DBG_871X_SEL_NL(m, "auth_alg=0x%x, enc_alg=0x%x, auth_type=0x%x, enc_type=0x%x\n",
- psecuritypriv->dot11AuthAlgrthm, psecuritypriv->dot11PrivacyAlgrthm,
- psecuritypriv->ndisauthtype, psecuritypriv->ndisencryptstatus);
+ sec->dot11AuthAlgrthm, sec->dot11PrivacyAlgrthm,
+ sec->ndisauthtype, sec->ndisencryptstatus);
+
+ DBG_871X_SEL_NL(m, "hw_decrypted=%d\n", sec->hw_decrypted);
+
+#ifdef DBG_SW_SEC_CNT
+ DBG_871X_SEL_NL(m, "wep_sw_enc_cnt=%llu, %llu, %llu\n"
+ , sec->wep_sw_enc_cnt_bc , sec->wep_sw_enc_cnt_mc, sec->wep_sw_enc_cnt_uc);
+ DBG_871X_SEL_NL(m, "wep_sw_dec_cnt=%llu, %llu, %llu\n"
+ , sec->wep_sw_dec_cnt_bc , sec->wep_sw_dec_cnt_mc, sec->wep_sw_dec_cnt_uc);
+
+ DBG_871X_SEL_NL(m, "tkip_sw_enc_cnt=%llu, %llu, %llu\n"
+ , sec->tkip_sw_enc_cnt_bc , sec->tkip_sw_enc_cnt_mc, sec->tkip_sw_enc_cnt_uc);
+ DBG_871X_SEL_NL(m, "tkip_sw_dec_cnt=%llu, %llu, %llu\n"
+ , sec->tkip_sw_dec_cnt_bc , sec->tkip_sw_dec_cnt_mc, sec->tkip_sw_dec_cnt_uc);
+
+ DBG_871X_SEL_NL(m, "aes_sw_enc_cnt=%llu, %llu, %llu\n"
+ , sec->aes_sw_enc_cnt_bc , sec->aes_sw_enc_cnt_mc, sec->aes_sw_enc_cnt_uc);
+ DBG_871X_SEL_NL(m, "aes_sw_dec_cnt=%llu, %llu, %llu\n"
+ , sec->aes_sw_dec_cnt_bc , sec->aes_sw_dec_cnt_mc, sec->aes_sw_dec_cnt_uc);
+#endif /* DBG_SW_SEC_CNT */
return 0;
}
index_5G = i;
}
- for (i=0; pmlmeext->channel_set[i].ChannelNum !=0; i++) {
+ for (i=0; (pmlmeext->channel_set[i].ChannelNum !=0) && (i < MAX_CHANNEL_NUM); i++) {
// 2.4G
if ( pmlmeext->channel_set[i].ChannelNum == 6 ) {
if ( pmlmeext->channel_set[i].rx_count < pmlmeext->channel_set[index_24G].rx_count ) {
}
#endif /* DBG_CONFIG_ERROR_DETECT */
-u8 g_fwdl_chksum_fail = 0;
-u8 g_fwdl_wintint_rdy_fail = 0;
ssize_t proc_set_fwdl_test_case(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
{
struct net_device *dev = (struct net_device *)data;
return -EFAULT;
if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {
- int num = sscanf(tmp, "%hhu %hhu", &g_fwdl_chksum_fail, &g_fwdl_wintint_rdy_fail);
+ int num = sscanf(tmp, "%hhu %hhu", &fwdl_test_chksum_fail, &fwdl_test_wintint_rdy_fail);
+ }
+
+ return count;
+}
+
+ssize_t proc_set_wait_hiq_empty(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
+{
+ struct net_device *dev = data;
+ _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
+ char tmp[32];
+
+ if (count < 1)
+ return -EFAULT;
+
+ if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {
+ int num = sscanf(tmp, "%u", &g_wait_hiq_empty_ms);
}
return count;
#include <linux/rfkill-wlan.h>
void rtw_macaddr_cfg(u8 *mac_addr)
{
- u8 mac[ETH_ALEN];
-
- if(mac_addr == NULL) return;
-
- if ( rtw_initmac )
- { // Users specify the mac address
- int jj,kk;
+ u8 mac[ETH_ALEN];
+ if(mac_addr == NULL) return;
+
+ if ( rtw_initmac )
+ { // Users specify the mac address
+ int jj,kk;
for( jj = 0, kk = 0; jj < ETH_ALEN; jj++, kk += 3 )
{
DBG_871X("MAC Address from efuse error, assign default one !!!\n");
}
- DBG_871X("rtw_macaddr_cfg MAC Address = "MAC_FMT"\n", MAC_ARG(mac_addr));
+ DBG_871X("rtw_macaddr_cfg MAC Address = "MAC_FMT"\n", MAC_ARG(mac_addr));
}
void dump_ies(u8 *buf, u32 buf_len)
//Set key to CAM through H2C command
if(bgrouptkey)//never go to here
{
- res=rtw_setstakey_cmd(padapter, (unsigned char *)stainfo, _FALSE, _TRUE);
+ res=rtw_setstakey_cmd(padapter, stainfo, _FALSE, _TRUE);
RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("\n rtw_set_802_11_add_key:rtw_setstakey_cmd(group)\n"));
}
else{
- res=rtw_setstakey_cmd(padapter, (unsigned char *)stainfo, _TRUE, _TRUE);
+ res=rtw_setstakey_cmd(padapter, stainfo, _TRUE, _TRUE);
RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("\n rtw_set_802_11_add_key:rtw_setstakey_cmd(unicast)\n"));
}
WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network);
struct sta_info *psta;
struct sta_priv *pstapriv = &padapter->stapriv;
+ u8 *wps_ie=NULL;
+ uint wpsie_len=0;
_func_enter_;
_clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING|WIFI_UNDER_WPS);
- //DBG_871X("clear wps when %s\n", __func__);
+ // force to clear cur_network_scanned's SELECTED REGISTRAR
+ if (pmlmepriv->cur_network_scanned) {
+ WLAN_BSSID_EX *current_joined_bss = &(pmlmepriv->cur_network_scanned->network);
+ if (current_joined_bss) {
+ wps_ie=rtw_get_wps_ie(current_joined_bss->IEs +_FIXED_IE_LENGTH_,
+ current_joined_bss->IELength-_FIXED_IE_LENGTH_, NULL, &wpsie_len);
+ if (wps_ie && wpsie_len>0) {
+ u8 *attr = NULL;
+ u32 attr_len;
+ attr=rtw_get_wps_attr(wps_ie, wpsie_len, WPS_ATTR_SELECTED_REGISTRAR,
+ NULL, &attr_len);
+ if (attr)
+ *(attr + 4) = 0;
+ }
+ }
+ }
if(rtw_to_roaming(padapter) > 0)
_clr_fwstate_(pmlmepriv, _FW_LINKED);
_rtw_memset((u8 *)&psta->dot11tkiptxmickey, 0, sizeof (union Keytype));
_rtw_memset((u8 *)&psta->dot11txpn, 0, sizeof (union pn48));
+ psta->dot11txpn.val = psta->dot11txpn.val + 1;
#ifdef CONFIG_IEEE80211W
_rtw_memset((u8 *)&psta->dot11wtxpn, 0, sizeof (union pn48));
#endif //CONFIG_IEEE80211W
#ifdef CONFIG_RTL8711
//submit SetStaKey_cmd to tell fw, fw will allocate an CAM entry for this sta
- rtw_setstakey_cmd(adapter, (unsigned char*)psta, _FALSE, _TRUE);
+ rtw_setstakey_cmd(adapter, psta, _FALSE, _TRUE);
#endif
exit:
// 13th element in the array is the IE length
//
-static int rtw_append_pmkid(_adapter *Adapter,int iEntry, u8 *ie, uint ie_len)
+static int rtw_append_pmkid(_adapter *adapter,int iEntry, u8 *ie, uint ie_len)
{
- struct security_priv *psecuritypriv=&Adapter->securitypriv;
+ struct security_priv *sec=&adapter->securitypriv;
- if(ie[13]<=20){
- // The RSN IE didn't include the PMK ID, append the PMK information
- ie[ie_len]=1;
- ie_len++;
- ie[ie_len]=0; //PMKID count = 0x0100
- ie_len++;
- _rtw_memcpy( &ie[ie_len], &psecuritypriv->PMKIDList[iEntry].PMKID, 16);
-
- ie_len+=16;
- ie[13]+=18;//PMKID length = 2+16
+ if (ie[13] > 20) {
+ int i;
+ u16 pmkid_cnt = RTW_GET_LE16(ie+14+20);
+ if (pmkid_cnt == 1 && _rtw_memcmp(ie+14+20+2, &sec->PMKIDList[iEntry].PMKID, 16)) {
+ DBG_871X(FUNC_ADPT_FMT" has carried the same PMKID:"KEY_FMT"\n"
+ , FUNC_ADPT_ARG(adapter), KEY_ARG(&sec->PMKIDList[iEntry].PMKID));
+ goto exit;
+ }
+
+ DBG_871X(FUNC_ADPT_FMT" remove original PMKID, count:%u\n"
+ , FUNC_ADPT_ARG(adapter), pmkid_cnt);
+ for (i=0;i<pmkid_cnt;i++)
+ DBG_871X(" "KEY_FMT"\n", KEY_ARG(ie+14+20+2+i*16));
+
+ ie_len -= 2+pmkid_cnt*16;
+ ie[13] = 20;
+ }
+
+ if (ie[13] <= 20) {
+ /* The RSN IE didn't include the PMK ID, append the PMK information */
+
+ DBG_871X(FUNC_ADPT_FMT" append PMKID:"KEY_FMT"\n"
+ , FUNC_ADPT_ARG(adapter), KEY_ARG(&sec->PMKIDList[iEntry].PMKID));
+
+ RTW_PUT_LE16(&ie[ie_len], 1);
+ ie_len += 2;
+
+ _rtw_memcpy(&ie[ie_len], &sec->PMKIDList[iEntry].PMKID, 16);
+ ie_len += 16;
+
+ ie[13] += 18;//PMKID length = 2+16
}
+
+exit:
return (ie_len);
}
+
+static int rtw_remove_pmkid(_adapter *adapter, u8 *ie, uint ie_len)
+{
+ struct security_priv *sec=&adapter->securitypriv;
+ int i;
+ u16 pmkid_cnt = RTW_GET_LE16(ie+14+20);
+
+ if (ie[13] <= 20)
+ goto exit;
+
+ DBG_871X(FUNC_ADPT_FMT" remove original PMKID, count:%u\n"
+ , FUNC_ADPT_ARG(adapter), pmkid_cnt);
+
+ for (i=0;i<pmkid_cnt;i++)
+ DBG_871X(" "KEY_FMT"\n", KEY_ARG(ie+14+20+2+i*16));
+
+ ie_len -= 2+pmkid_cnt*16;
+ ie[13] = 20;
+
+exit:
+ return (ie_len);
+}
+
sint rtw_restruct_sec_ie(_adapter *adapter,u8 *in_ie, u8 *out_ie, uint in_len)
{
u8 authmode, securitytype, match;
iEntry = SecIsInPMKIDList(adapter, pmlmepriv->assoc_bssid);
if(iEntry<0)
{
- return ielength;
+ if(authmode == _WPA2_IE_ID_)
+ ielength = rtw_remove_pmkid(adapter, out_ie, ielength);
}
else
{
if(authmode == _WPA2_IE_ID_)
- {
ielength=rtw_append_pmkid(adapter, iEntry, out_ie, ielength);
- }
}
_func_exit_;
result = process_p2p_group_negotation_req( pwdinfo, frame_body, len );
issue_p2p_GO_response( padapter, GetAddr2Ptr(pframe), frame_body, len, result );
#ifdef CONFIG_INTEL_WIDI
- if( (padapter->mlmepriv.widi_state == INTEL_WIDI_STATE_LISTEN) && (padapter->mlmepriv.widi_state != INTEL_WIDI_STATE_WFD_CONNECTION) )
- {
+ if (padapter->mlmepriv.widi_state == INTEL_WIDI_STATE_LISTEN) {
padapter->mlmepriv.widi_state = INTEL_WIDI_STATE_WFD_CONNECTION;
_cancel_timer_ex(&(padapter->mlmepriv.listen_timer));
intel_widi_wk_cmd(padapter, INTEL_WIDI_LISTEN_STOP_WK, NULL);
_set_timer( &pwdinfo->restore_p2p_state_timer, 3000 );
}
#ifdef CONFIG_INTEL_WIDI
- if( (padapter->mlmepriv.widi_state == INTEL_WIDI_STATE_LISTEN) && (padapter->mlmepriv.widi_state != INTEL_WIDI_STATE_WFD_CONNECTION) )
- {
+ if (padapter->mlmepriv.widi_state == INTEL_WIDI_STATE_LISTEN) {
padapter->mlmepriv.widi_state = INTEL_WIDI_STATE_WFD_CONNECTION;
_cancel_timer_ex(&(padapter->mlmepriv.listen_timer));
intel_widi_wk_cmd(padapter, INTEL_WIDI_LISTEN_STOP_WK, NULL);
rtw_p2p_set_state(pwdinfo, P2P_STATE_RX_PROVISION_DIS_REQ);
_set_timer( &pwdinfo->restore_p2p_state_timer, P2P_PROVISION_TIMEOUT );
#ifdef CONFIG_INTEL_WIDI
- if( (padapter->mlmepriv.widi_state == INTEL_WIDI_STATE_LISTEN) && (padapter->mlmepriv.widi_state != INTEL_WIDI_STATE_WFD_CONNECTION) )
- {
+ if (padapter->mlmepriv.widi_state == INTEL_WIDI_STATE_LISTEN) {
padapter->mlmepriv.widi_state = INTEL_WIDI_STATE_WFD_CONNECTION;
_cancel_timer_ex(&(padapter->mlmepriv.listen_timer));
intel_widi_wk_cmd(padapter, INTEL_WIDI_LISTEN_STOP_WK, NULL);
u8 *pframe = precv_frame->u.hdr.rx_data;
uint len = precv_frame->u.hdr.len;
struct wifidirect_info *pwdinfo = &( padapter->wdinfo );
-
- DBG_871X("%s\n", __FUNCTION__);
-
//check RA matches or not
if (!_rtw_memcmp(myid(&(padapter->eeprompriv)), GetAddr1Ptr(pframe), ETH_ALEN))//for if1, sta/ap mode
return _SUCCESS;
struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
int bssrate_len = 0, sta_bssrate_len = 0;
+ u8 vs_ie_length = 0;
#ifdef CONFIG_P2P
struct wifidirect_info *pwdinfo = &(padapter->wdinfo);
u8 p2pie[ 255 ] = { 0x00 };
if ((_rtw_memcmp(pIE->data, RTW_WPA_OUI, 4)) ||
(_rtw_memcmp(pIE->data, WMM_OUI, 4)) ||
(_rtw_memcmp(pIE->data, WPS_OUI, 4)))
- {
- if(!padapter->registrypriv.wifi_spec)
+ {
+ vs_ie_length = pIE->Length;
+ if((!padapter->registrypriv.wifi_spec) && (_rtw_memcmp(pIE->data, WPS_OUI, 4)))
{
//Commented by Kurt 20110629
//In some older APs, WPS handshake
//would be fail if we append vender extensions informations to AP
- if(_rtw_memcmp(pIE->data, WPS_OUI, 4)){
- pIE->Length=14;
- }
+
+ vs_ie_length = 14;
}
- pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, pIE->Length, pIE->data, &(pattrib->pktlen));
+
+ pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, vs_ie_length, pIE->data, &(pattrib->pktlen));
}
break;
return ret;
}
-
-//when wait_ms >0 , this function shoule be called at process context
-//da == NULL for station mode
+/*
+ * [IMPORTANT] Don't call this function in interrupt context
+ *
+ * When wait_ms > 0, this function shoule be called at process context
+ * da == NULL for station mode
+ */
int issue_nulldata(_adapter *padapter, unsigned char *da, unsigned int power_mode, int try_cnt, int wait_ms)
{
int ret;
u32 start = rtw_get_current_time();
struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
+ struct sta_info *psta;
+
/* da == NULL, assum it's null data for sta to ap*/
if (da == NULL)
da = get_my_bssid(&(pmlmeinfo->network));
- do
- {
+ psta = rtw_get_stainfo(&padapter->stapriv, da);
+ if (psta) {
+ if (power_mode)
+ rtw_hal_macid_sleep(padapter, psta->mac_id);
+ else
+ rtw_hal_macid_wakeup(padapter, psta->mac_id);
+ } else {
+ DBG_871X(FUNC_ADPT_FMT ": Can't find sta info for " MAC_FMT ", skip macid %s!!\n",
+ FUNC_ADPT_ARG(padapter), MAC_ARG(da), power_mode?"sleep":"wakeup");
+ rtw_warn_on(1);
+ }
+
+ do {
ret = _issue_nulldata(padapter, da, power_mode, wait_ms>0?_TRUE:_FALSE);
i++;
return ret;
}
+/*
+ * [IMPORTANT] This function run in interrupt context
+ *
+ * The null data packet would be sent without power bit,
+ * and not guarantee success.
+ */
+s32 issue_nulldata_in_interrupt(PADAPTER padapter, u8 *da)
+{
+ int ret;
+ struct mlme_ext_priv *pmlmeext;
+ struct mlme_ext_info *pmlmeinfo;
+
+
+ pmlmeext = &padapter->mlmeextpriv;
+ pmlmeinfo = &pmlmeext->mlmext_info;
+
+ /* da == NULL, assum it's null data for sta to ap*/
+ if (da == NULL)
+ da = get_my_bssid(&(pmlmeinfo->network));
+
+ ret = _issue_nulldata(padapter, da, 0, _FALSE);
+
+ return ret;
+}
+
//when wait_ack is ture, this function shoule be called at process context
static int _issue_qos_nulldata(_adapter *padapter, unsigned char *da, u16 tid, int wait_ack)
{
set_sta_rate(padapter, psta);
rtw_sta_media_status_rpt(padapter, psta, 1);
+
+ /* wakeup macid after join bss successfully to ensure
+ the subsequent data frames can be sent out normally */
+ rtw_hal_macid_wakeup(padapter, psta->mac_id);
}
join_type = 2;
if (is_client_associated_to_ap(padapter) || is_IBSS_empty(padapter))
{
//set_opmode_cmd(padapter, infra_client_with_mlme);
+ {
+ struct sta_info *psta;
+ WLAN_BSSID_EX *pnetwork = (WLAN_BSSID_EX*)(&(pmlmeinfo->network));
+
+ psta = rtw_get_stainfo(&padapter->stapriv, get_my_bssid(pnetwork));
+ if (psta)
+ rtw_hal_macid_wakeup(padapter, psta->mac_id);
+ }
rtw_hal_set_hwreg(padapter, HW_VAR_MLME_DISCONNECT, 0);
rtw_hal_set_hwreg(padapter, HW_VAR_BSSID, null_addr);
#ifdef DBG_EXPIRATION_CHK
DBG_871X("%s issue_nulldata 0\n", __FUNCTION__);
#endif
- tx_chk = issue_nulldata(padapter, NULL, 0, 1, 0);
+ tx_chk = issue_nulldata_in_interrupt(padapter, NULL);
}
}
{
if (tx_cnt == pxmitpriv->tx_pkts)
{
- issue_nulldata(padapter, NULL, 0, 0, 0);
+ issue_nulldata_in_interrupt(padapter, NULL);
}
tx_cnt = pxmitpriv->tx_pkts;
_cancel_timer_ex(&pmlmeext->link_timer);
+ {
+ struct sta_info *psta;
+ WLAN_BSSID_EX *pnetwork = (WLAN_BSSID_EX*)(&(pmlmeinfo->network));
+
+ psta = rtw_get_stainfo(&padapter->stapriv, get_my_bssid(pnetwork));
+ if (psta)
+ rtw_hal_macid_wakeup(padapter, psta->mac_id);
+ }
+
rtw_free_uc_swdec_pending_queue(padapter);
return H2C_SUCCESS;
u8 setkey_hdl(_adapter *padapter, u8 *pbuf)
{
- unsigned short ctrl;
+ u16 ctrl = 0;
+ s16 cam_id = 0;
struct setkey_parm *pparm = (struct setkey_parm *)pbuf;
struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
- unsigned char null_sta[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+ unsigned char null_addr[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+ u8 *addr;
//main tx key for wep.
if(pparm->set_tx)
pmlmeinfo->key_index = pparm->keyid;
-
- //write cam
- ctrl = BIT(15) | ((pparm->algorithm) << 2) | pparm->keyid;
- DBG_871X_LEVEL(_drv_always_, "set group key to hw: alg:%d(WEP40-1 WEP104-5 TKIP-2 AES-4) "
- "keyid:%d\n", pparm->algorithm, pparm->keyid);
- write_cam(padapter, pparm->keyid, ctrl, null_sta, pparm->key);
-
+ cam_id = rtw_camid_alloc(padapter, NULL, pparm->keyid);
+
+ if (cam_id < 0){
+ } else {
+ if (cam_id > 3) /* not default key, searched by A2 */
+ addr = get_bssid(&padapter->mlmepriv);
+ else
+ addr = null_addr;
+
+ ctrl = BIT(15) | BIT(6) |((pparm->algorithm) << 2) | pparm->keyid;
+ write_cam(padapter, cam_id, ctrl, addr, pparm->key);
+ DBG_871X_LEVEL(_drv_always_, "set group key camid:%d, addr:"MAC_FMT", kid:%d, type:%s\n"
+ ,cam_id, MAC_ARG(addr), pparm->keyid, security_type_str(pparm->algorithm));
+ }
+
+ #ifdef DYNAMIC_CAMID_ALLOC
+ if (cam_id >=0 && cam_id <=3)
+ rtw_hal_set_hwreg(padapter, HW_VAR_SEC_DK_CFG, (u8*)_TRUE);
+ #endif
+
//allow multicast packets to driver
- padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_ON_RCR_AM, null_addr);
+ padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_ON_RCR_AM, null_addr);
return H2C_SUCCESS;
}
u8 set_stakey_hdl(_adapter *padapter, u8 *pbuf)
{
- u16 ctrl=0;
- u8 cam_id = 0;//cam_entry
+ u16 ctrl = 0;
+ s16 cam_id = 0;
u8 ret = H2C_SUCCESS;
struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
struct tdls_info *ptdlsinfo = &padapter->tdlsinfo;
#endif //CONFIG_TDLS
- //cam_entry:
- //0~3 for default key
-
- //for concurrent mode (ap+sta, sta+sta):
- //default key is disable, using sw encrypt/decrypt
- //camid 0, 1, 2, 3 is default entry for default key/group key
- //macid = 1 is for bc/mc stainfo, no mapping to camid
- //macid = 0 mapping to camid 4
- //for macid >=2, camid = macid+3;
+ if(pparm->algorithm == _NO_PRIVACY_)
+ goto write_to_cam;
-
- if(pparm->algorithm == _NO_PRIVACY_) // clear cam entry
- {
- clear_cam_entry(padapter, pparm->id);
- ret = H2C_SUCCESS;
- goto exit_set_stakey_hdl;
+ psta = rtw_get_stainfo(pstapriv, pparm->addr);
+ if (!psta) {
+ DBG_871X_LEVEL(_drv_always_, "%s sta:"MAC_FMT" not found\n", __func__, MAC_ARG(pparm->addr));
+ ret = H2C_REJECTED;
+ goto exit;
}
- if((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE)
- {
- psta = rtw_get_stainfo(pstapriv, pparm->addr);
- if(psta)
- {
- ctrl = (BIT(15) | ((pparm->algorithm) << 2));
-
- DBG_871X("r871x_set_stakey_hdl(): enc_algorithm=%d\n", pparm->algorithm);
-
- if((psta->mac_id == 1) || (psta->mac_id>(NUM_STA-4)))
- {
- DBG_871X("r871x_set_stakey_hdl():set_stakey failed, mac_id(aid)=%d\n", psta->mac_id);
- ret = H2C_REJECTED;
- goto exit_set_stakey_hdl;
- }
-
- cam_id = (u8)rtw_get_camid(psta->mac_id);//0~3 for default key, cmd_id=macid + 3;
-
- DBG_871X("Write CAM, mac_addr=%x:%x:%x:%x:%x:%x, cam_entry=%d\n", pparm->addr[0],
- pparm->addr[1], pparm->addr[2], pparm->addr[3], pparm->addr[4],
- pparm->addr[5], cam_id);
-
- write_cam(padapter, cam_id, ctrl, pparm->addr, pparm->key);
-
- ret = H2C_SUCCESS_RSP;
- goto exit_set_stakey_hdl;
+ pmlmeinfo->enc_algo = pparm->algorithm;
+ cam_id = rtw_camid_alloc(padapter, psta, 0);
+ if (cam_id < 0)
+ goto exit;
+write_to_cam:
+ if(pparm->algorithm == _NO_PRIVACY_) {
+ while((cam_id = rtw_camid_search(padapter, pparm->addr, -1)) >= 0) {
+ DBG_871X_LEVEL(_drv_always_, "clear key for addr:"MAC_FMT", camid:%d\n", MAC_ARG(pparm->addr), cam_id);
+ clear_cam_entry(padapter, cam_id);
+ rtw_camid_free(padapter,cam_id);
}
- else
- {
- DBG_871X("r871x_set_stakey_hdl(): sta has been free\n");
- ret = H2C_REJECTED;
- goto exit_set_stakey_hdl;
- }
-
- }
-
-
- //below for sta mode
-
- if((psta = rtw_get_stainfo(pstapriv, pmlmeinfo->network.MacAddress)))
- cam_id = (u8)rtw_get_camid(psta->mac_id);
- else
- cam_id = 4;
-
- ctrl = BIT(15) | ((pparm->algorithm) << 2);
-
-#ifdef CONFIG_TDLS
- if(ptdlsinfo->clear_cam!=0){
- clear_cam_entry(padapter, ptdlsinfo->clear_cam);
- ptdlsinfo->clear_cam=0;
- ret = H2C_SUCCESS;
- goto exit_set_stakey_hdl;
- }
-
- psta = rtw_get_stainfo(pstapriv, pparm->addr);//Get TDLS Peer STA
- if( psta->tdls_sta_state&TDLS_LINKED_STATE ){
- write_cam(padapter, psta->mac_id, ctrl, pparm->addr, pparm->key);
- }
- else
-#endif //CONFIG_TDLS
+ } else {
+ DBG_871X_LEVEL(_drv_always_, "set pairwise key camid:%d, addr:"MAC_FMT", kid:%d, type:%s\n",
+ cam_id, MAC_ARG(pparm->addr), pparm->keyid, security_type_str(pparm->algorithm));
+ ctrl = BIT(15) | ((pparm->algorithm) << 2) | pparm->keyid;
write_cam(padapter, cam_id, ctrl, pparm->addr, pparm->key);
+ }
+ ret = H2C_SUCCESS_RSP;
- pmlmeinfo->enc_algo = pparm->algorithm;
-
-exit_set_stakey_hdl:
-
- DBG_871X_LEVEL(_drv_always_, "set pairwise key to hw: alg:%d(WEP40-1 WEP104-5 TKIP-2 AES-4) camid:%d\n",
- pparm->algorithm, cam_id);
-
+exit:
return ret;
-
}
u8 add_ba_hdl(_adapter *padapter, unsigned char *pbuf)
return H2C_SUCCESS;
}
+u8 chk_bmc_sleepq_cmd(_adapter* padapter)
+{
+ struct cmd_obj *ph2c;
+ struct cmd_priv *pcmdpriv = &(padapter->cmdpriv);
+ u8 res = _SUCCESS;
+
+_func_enter_;
+
+ if ((ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj))) == NULL)
+ {
+ res= _FAIL;
+ goto exit;
+ }
+
+ init_h2fwcmd_w_parm_no_parm_rsp(ph2c, GEN_CMD_CODE(_ChkBMCSleepq));
+
+ res = rtw_enqueue_cmd(pcmdpriv, ph2c);
+
+exit:
+
+_func_exit_;
+
+ return res;
+}
+
u8 set_tx_beacon_cmd(_adapter* padapter)
{
struct cmd_obj *ph2c;
struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
u8 res = _SUCCESS;
int len_diff = 0;
-
-_func_enter_;
-
+
+_func_enter_;
+
if ((ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj))) == NULL)
{
res= _FAIL;
goto exit;
}
-
+
if ((ptxBeacon_parm = (struct Tx_Beacon_param *)rtw_zmalloc(sizeof(struct Tx_Beacon_param))) == NULL)
{
rtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj));
}
_rtw_memcpy(&(ptxBeacon_parm->network), &(pmlmeinfo->network), sizeof(WLAN_BSSID_EX));
-
+
len_diff = update_hidden_ssid(
ptxBeacon_parm->network.IEs+_BEACON_IE_OFFSET_
, ptxBeacon_parm->network.IELength-_BEACON_IE_OFFSET_
, pmlmeinfo->hidden_ssid_mode
);
ptxBeacon_parm->network.IELength += len_diff;
-
+
init_h2fwcmd_w_parm_no_rsp(ph2c, ptxBeacon_parm, GEN_CMD_CODE(_TX_Beacon));
res = rtw_enqueue_cmd(pcmdpriv, ph2c);
-
exit:
-
+
_func_exit_;
return res;
return H2C_SUCCESS;
}
-u8 tx_beacon_hdl(_adapter *padapter, unsigned char *pbuf)
+u8 chk_bmc_sleepq_hdl(_adapter *padapter, unsigned char *pbuf)
{
- if(send_beacon(padapter)==_FAIL)
- {
- DBG_871X("issue_beacon, fail!\n");
- return H2C_PARAMETERS_ERROR;
- }
#ifdef CONFIG_AP_MODE
- else //tx bc/mc frames after update TIM
- {
- _irqL irqL;
- struct sta_info *psta_bmc;
- _list *xmitframe_plist, *xmitframe_phead;
- struct xmit_frame *pxmitframe=NULL;
- struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
- struct sta_priv *pstapriv = &padapter->stapriv;
-
- //for BC/MC Frames
- psta_bmc = rtw_get_bcmc_stainfo(padapter);
- if(!psta_bmc)
- return H2C_SUCCESS;
-
- if((pstapriv->tim_bitmap&BIT(0)) && (psta_bmc->sleepq_len>0))
- {
+ _irqL irqL;
+ struct sta_info *psta_bmc;
+ _list *xmitframe_plist, *xmitframe_phead;
+ struct xmit_frame *pxmitframe=NULL;
+ struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
+ struct sta_priv *pstapriv = &padapter->stapriv;
+
+ //for BC/MC Frames
+ psta_bmc = rtw_get_bcmc_stainfo(padapter);
+ if(!psta_bmc)
+ return H2C_SUCCESS;
+
+ if((pstapriv->tim_bitmap&BIT(0)) && (psta_bmc->sleepq_len>0))
+ {
#ifndef CONFIG_PCI_HCI
- rtw_msleep_os(10);// 10ms, ATIM(HIQ) Windows
+ rtw_msleep_os(10);// 10ms, ATIM(HIQ) Windows
#endif
- //_enter_critical_bh(&psta_bmc->sleep_q.lock, &irqL);
- _enter_critical_bh(&pxmitpriv->lock, &irqL);
+ //_enter_critical_bh(&psta_bmc->sleep_q.lock, &irqL);
+ _enter_critical_bh(&pxmitpriv->lock, &irqL);
- xmitframe_phead = get_list_head(&psta_bmc->sleep_q);
- xmitframe_plist = get_next(xmitframe_phead);
+ xmitframe_phead = get_list_head(&psta_bmc->sleep_q);
+ xmitframe_plist = get_next(xmitframe_phead);
- while ((rtw_end_of_queue_search(xmitframe_phead, xmitframe_plist)) == _FALSE)
- {
- pxmitframe = LIST_CONTAINOR(xmitframe_plist, struct xmit_frame, list);
+ while ((rtw_end_of_queue_search(xmitframe_phead, xmitframe_plist)) == _FALSE)
+ {
+ pxmitframe = LIST_CONTAINOR(xmitframe_plist, struct xmit_frame, list);
- xmitframe_plist = get_next(xmitframe_plist);
+ xmitframe_plist = get_next(xmitframe_plist);
- rtw_list_delete(&pxmitframe->list);
+ rtw_list_delete(&pxmitframe->list);
- psta_bmc->sleepq_len--;
- if(psta_bmc->sleepq_len>0)
- pxmitframe->attrib.mdata = 1;
- else
- pxmitframe->attrib.mdata = 0;
+ psta_bmc->sleepq_len--;
+ if(psta_bmc->sleepq_len>0)
+ pxmitframe->attrib.mdata = 1;
+ else
+ pxmitframe->attrib.mdata = 0;
- pxmitframe->attrib.triggered=1;
+ pxmitframe->attrib.triggered=1;
+ if (xmitframe_hiq_filter(pxmitframe) == _TRUE)
pxmitframe->attrib.qsel = 0x11;//HIQ
-#if 0
- _exit_critical_bh(&psta_bmc->sleep_q.lock, &irqL);
- if(rtw_hal_xmit(padapter, pxmitframe) == _TRUE)
- {
- rtw_os_xmit_complete(padapter, pxmitframe);
- }
- _enter_critical_bh(&psta_bmc->sleep_q.lock, &irqL);
-
-#endif
- rtw_hal_xmitframe_enqueue(padapter, pxmitframe);
+ #if 0
+ _exit_critical_bh(&psta_bmc->sleep_q.lock, &irqL);
+ if(rtw_hal_xmit(padapter, pxmitframe) == _TRUE)
+ {
+ rtw_os_xmit_complete(padapter, pxmitframe);
+ }
+ _enter_critical_bh(&psta_bmc->sleep_q.lock, &irqL);
+ #endif
+ rtw_hal_xmitframe_enqueue(padapter, pxmitframe);
+ }
- //pstapriv->tim_bitmap &= ~BIT(0);
-
- }
-
- //_exit_critical_bh(&psta_bmc->sleep_q.lock, &irqL);
- _exit_critical_bh(&pxmitpriv->lock, &irqL);
+ //_exit_critical_bh(&psta_bmc->sleep_q.lock, &irqL);
+ _exit_critical_bh(&pxmitpriv->lock, &irqL);
-//#if defined(CONFIG_PCI_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
-#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
+ if (padapter->interface_type != RTW_PCIE) {
+ /* check hi queue and bmc_sleepq */
rtw_chk_hi_queue_cmd(padapter);
+ }
+ }
#endif
- }
+ return H2C_SUCCESS;
+}
+u8 tx_beacon_hdl(_adapter *padapter, unsigned char *pbuf)
+{
+ if(send_beacon(padapter)==_FAIL)
+ {
+ DBG_871X("issue_beacon, fail!\n");
+ return H2C_PARAMETERS_ERROR;
}
-#endif
+
+ /* tx bc/mc frames after update TIM */
+ chk_bmc_sleepq_hdl(padapter, NULL);
return H2C_SUCCESS;
-
}
#ifdef CONFIG_DUALMAC_CONCURRENT
void p2p_concurrent_handler( _adapter* padapter )
{
struct wifidirect_info *pwdinfo = &padapter->wdinfo;
+ struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
+ struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
//_adapter *pbuddy_adapter = padapter->pbuddy_adapter;
//struct wifidirect_info *pbuddy_wdinfo = &pbuddy_adapter->wdinfo;
//struct mlme_priv *pbuddy_mlmepriv = &pbuddy_adapter->mlmepriv;
}
rtw_p2p_set_state(pwdinfo, P2P_STATE_LISTEN);
- val8 = 1;
- rtw_hal_set_hwreg(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8));
-
+ if(!check_buddy_mlmeinfo_state(padapter, WIFI_FW_AP_STATE) &&
+ !(pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE)
+ {
+ val8 = 1;
+ rtw_hal_set_hwreg(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8));
+ }
// Todo: To check the value of pwdinfo->ext_listen_period is equal to 0 or not.
_set_timer( &pwdinfo->ap_p2p_switch_timer, pwdinfo->ext_listen_period );
}
if ( pbuddy_mlmeext->cur_channel != pwdinfo->listen_channel )
{
set_channel_bwmode(padapter, pbuddy_mlmeext->cur_channel, pbuddy_mlmeext->cur_ch_offset, pbuddy_mlmeext->cur_bwmode);
- val8 = 0;
- padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8));
+ if(!check_buddy_mlmeinfo_state(padapter, WIFI_FW_AP_STATE) &&
+ !(pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE)
+ {
+ val8 = 0;
+ padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8));
+ }
rtw_p2p_set_state(pwdinfo, P2P_STATE_IDLE);
issue_nulldata(pbuddy_adapter, NULL, 0, 3, 500);
}
pcfg80211_wdinfo->is_ro_ch = _FALSE;
+ if (pcfg80211_wdinfo->not_indic_ro_ch_exp == _TRUE)
+ return;
+
DBG_871X("cfg80211_remain_on_channel_expired\n");
rtw_cfg80211_remain_on_channel_expired(padapter,
rtw_p2p_set_pre_state(pwdinfo, P2P_STATE_NONE);
rtw_p2p_set_role(pwdinfo, P2P_ROLE_DISABLE);
_rtw_memset(&pwdinfo->rx_prov_disc_info, 0x00, sizeof(struct rx_provdisc_req_info));
+
+ /* Remove profiles in wifidirect_info structure. */
+ _rtw_memset( &pwdinfo->profileinfo[ 0 ], 0x00, sizeof( struct profile_info ) * P2P_MAX_PERSISTENT_GROUP_NUM );
+ pwdinfo->profileindex = 0;
+
}
rtw_hal_set_odm_var(padapter,HAL_ODM_P2P_STATE,NULL,_FALSE);
if(psta->sleepq_len>0)
pxmitframe->attrib.mdata = 1;
- else
+ else
pxmitframe->attrib.mdata = 0;
pxmitframe->attrib.triggered = 1;
- //DBG_871X("handling ps-poll, q_len=%d, tim=%x\n", psta->sleepq_len, pstapriv->tim_bitmap);
+ //DBG_871X("handling ps-poll, q_len=%d, tim=%x\n", psta->sleepq_len, pstapriv->tim_bitmap);
#if 0
_exit_critical_bh(&psta->sleep_q.lock, &irqL);
//upate BCN for TIM IE
//update_BCNTIM(padapter);
- update_beacon(padapter, _TIM_IE_, NULL, _FALSE);
+ update_beacon(padapter, _TIM_IE_, NULL, _TRUE);
}
//_exit_critical_bh(&psta->sleep_q.lock, &irqL);
DBG_871X("no buffered packets to xmit\n");
//issue nulldata with More data bit = 0 to indicate we have no buffered packets
- issue_nulldata(padapter, psta->hwaddr, 0, 0, 0);
+ issue_nulldata_in_interrupt(padapter, psta->hwaddr);
}
else
{
//upate BCN for TIM IE
//update_BCNTIM(padapter);
- update_beacon(padapter, _TIM_IE_, NULL, _FALSE);
+ update_beacon(padapter, _TIM_IE_, NULL, _TRUE);
}
}
#include <wifi.h>
#include <osdep_intf.h>
+static const char *_security_type_str[] = {
+ "N/A",
+ "WEP40",
+ "TKIP",
+ "TKIP_WM",
+ "AES",
+ "WEP104",
+ "SMS4",
+ "WEP_WPA",
+ "BIP",
+};
+
+const char *security_type_str(u8 value)
+{
+#ifdef CONFIG_IEEE80211W
+ if (value <= _BIP_)
+#else
+ if (value <= _WEP_WPA_MIXED_)
+#endif
+ return _security_type_str[value];
+ return NULL;
+}
+
+#ifdef DBG_SW_SEC_CNT
+#define WEP_SW_ENC_CNT_INC(sec, ra) \
+ if (is_broadcast_mac_addr(ra)) \
+ sec->wep_sw_enc_cnt_bc++; \
+ else if (is_multicast_mac_addr(ra)) \
+ sec->wep_sw_enc_cnt_mc++; \
+ else \
+ sec->wep_sw_enc_cnt_uc++;
+
+#define WEP_SW_DEC_CNT_INC(sec, ra) \
+ if (is_broadcast_mac_addr(ra)) \
+ sec->wep_sw_dec_cnt_bc++; \
+ else if (is_multicast_mac_addr(ra)) \
+ sec->wep_sw_dec_cnt_mc++; \
+ else \
+ sec->wep_sw_dec_cnt_uc++;
+
+#define TKIP_SW_ENC_CNT_INC(sec, ra) \
+ if (is_broadcast_mac_addr(ra)) \
+ sec->tkip_sw_enc_cnt_bc++; \
+ else if (is_multicast_mac_addr(ra)) \
+ sec->tkip_sw_enc_cnt_mc++; \
+ else \
+ sec->tkip_sw_enc_cnt_uc++;
+
+#define TKIP_SW_DEC_CNT_INC(sec, ra) \
+ if (is_broadcast_mac_addr(ra)) \
+ sec->tkip_sw_dec_cnt_bc++; \
+ else if (is_multicast_mac_addr(ra)) \
+ sec->tkip_sw_dec_cnt_mc++; \
+ else \
+ sec->tkip_sw_dec_cnt_uc++;
+
+#define AES_SW_ENC_CNT_INC(sec, ra) \
+ if (is_broadcast_mac_addr(ra)) \
+ sec->aes_sw_enc_cnt_bc++; \
+ else if (is_multicast_mac_addr(ra)) \
+ sec->aes_sw_enc_cnt_mc++; \
+ else \
+ sec->aes_sw_enc_cnt_uc++;
+
+#define AES_SW_DEC_CNT_INC(sec, ra) \
+ if (is_broadcast_mac_addr(ra)) \
+ sec->aes_sw_dec_cnt_bc++; \
+ else if (is_multicast_mac_addr(ra)) \
+ sec->aes_sw_dec_cnt_mc++; \
+ else \
+ sec->aes_sw_dec_cnt_uc++;
+#else
+#define WEP_SW_ENC_CNT_INC(sec, ra)
+#define WEP_SW_DEC_CNT_INC(sec, ra)
+#define TKIP_SW_ENC_CNT_INC(sec, ra)
+#define TKIP_SW_DEC_CNT_INC(sec, ra)
+#define AES_SW_ENC_CNT_INC(sec, ra)
+#define AES_SW_DEC_CNT_INC(sec, ra)
+#endif /* DBG_SW_SEC_CNT */
//=====WEP related=====
}
}
-
+
+ WEP_SW_ENC_CNT_INC(psecuritypriv, pattrib->ra);
}
_func_exit_;
{
RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("rtw_wep_decrypt:icv error crc[3](%x)!=payload[length-1](%x) || crc[2](%x)!=payload[length-2](%x) || crc[1](%x)!=payload[length-3](%x) || crc[0](%x)!=payload[length-4](%x)\n",
crc[3],payload[length-1],crc[2],payload[length-2],crc[1],payload[length-3],crc[0],payload[length-4]));
- }
-
+ }
+
+ WEP_SW_DEC_CNT_INC(psecuritypriv, prxattrib->ra);
}
_func_exit_;
}
}
-
+ TKIP_SW_ENC_CNT_INC(psecuritypriv,pattrib->ra);
}
else{
RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("rtw_tkip_encrypt: stainfo==NULL!!!\n"));
}
else
{
- RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("rtw_tkip_decrypt: stainfo!=NULL!!!\n"));
prwskey=&stainfo->dot118021x_UncstKey.skey[0];
prwskeylen=16;
}
crc[3],payload[length-1],crc[2],payload[length-2],crc[1],payload[length-3],crc[0],payload[length-4]));
res=_FAIL;
}
-
-
+
+ TKIP_SW_DEC_CNT_INC(psecuritypriv, prxattrib->ra);
}
else{
RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("rtw_tkip_decrypt: stainfo==NULL!!!\n"));
}
}
-
+ AES_SW_ENC_CNT_INC(psecuritypriv, pattrib->ra);
}
else{
RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("rtw_aes_encrypt: stainfo==NULL!!!\n"));
static u32 no_gkey_bc_cnt = 0;
static u32 no_gkey_mc_cnt = 0;
- //in concurrent we should use sw descrypt in group key, so we remove this message
//DBG_871X("rx bc/mc packets, to perform sw rtw_aes_decrypt\n");
//prwskey = psecuritypriv->dot118021XGrpKey[psecuritypriv->dot118021XGrpKeyid].skey;
if(psecuritypriv->binstallGrpkey==_FALSE)
res= aes_decipher(prwskey,prxattrib->hdrlen,pframe, length);
-
+ AES_SW_DEC_CNT_INC(psecuritypriv, prxattrib->ra);
}
else{
- RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("rtw_aes_encrypt: stainfo==NULL!!!\n"));
+ RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("rtw_aes_decrypt: stainfo==NULL!!!\n"));
res=_FAIL;
}
for(keyid=0;keyid<4;keyid++){
if(securitypriv->key_mask & BIT(keyid)){
if(keyid == securitypriv->dot11PrivacyKeyIndex)
- rtw_set_key(adapter,securitypriv, keyid, 1, _TRUE);
+ rtw_set_key(adapter,securitypriv, keyid, 1, _FALSE);
else
- rtw_set_key(adapter,securitypriv, keyid, 0, _TRUE);
+ rtw_set_key(adapter,securitypriv, keyid, 0, _FALSE);
}
}
}
else\r
{\r
//pairwise key\r
- rtw_setstakey_cmd(padapter, (unsigned char *)psta, _TRUE,_FALSE);\r
+ rtw_setstakey_cmd(padapter, psta, _TRUE,_FALSE);\r
//group key\r
rtw_set_key(padapter,&padapter->securitypriv,padapter->securitypriv.dot118021XGrpKeyid, 0,_FALSE);\r
}\r
if(prx_pkt_attrib->encrypt)\r
{\r
ptdls_sta->dot118021XPrivacy=_AES_;\r
- rtw_setstakey_cmd(adapter, (u8*)ptdls_sta, _TRUE, _TRUE);\r
+ rtw_setstakey_cmd(adapter, ptdls_sta, _TRUE, _TRUE);\r
}\r
}\r
\r
#define WAIT_FOR_BCN_TO_MIN (6000)
#define WAIT_FOR_BCN_TO_MAX (20000)
+#define DISCONNECT_BY_CHK_BCN_FAIL_OBSERV_PERIOD_IN_MS 1000
+#define DISCONNECT_BY_CHK_BCN_FAIL_THRESHOLD 3
+
static u8 rtw_basic_rate_cck[4] = {
IEEE80211_CCK_RATE_1MB|IEEE80211_BASIC_RATE_MASK, IEEE80211_CCK_RATE_2MB|IEEE80211_BASIC_RATE_MASK,
IEEE80211_CCK_RATE_5MB|IEEE80211_BASIC_RATE_MASK, IEEE80211_CCK_RATE_11MB|IEEE80211_BASIC_RATE_MASK
rtw_hal_set_hwreg(Adapter, HW_VAR_CAM_EMPTY_ENTRY, (u8 *)(&ucIndex));
}
+#ifdef CONFIG_RTL8192C
+#include <rtl8192c_hal.h>
+#endif
+
+#ifdef CONFIG_RTL8192D
+#include <rtl8192d_hal.h>
+#endif
+
+#ifdef CONFIG_RTL8723A
+#include <rtl8723a_hal.h>
+#endif
+
+#ifdef CONFIG_RTL8188E
+#include <rtl8188e_hal.h>
+#endif
+
void invalidate_cam_all(_adapter *padapter)
{
+ struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
+ struct cam_ctl_t *cam_ctl = &dvobj->cam_ctl;
+ _irqL irqL;
+
rtw_hal_set_hwreg(padapter, HW_VAR_CAM_INVALID_ALL, 0);
+
+ _enter_critical_bh(&cam_ctl->lock, &irqL);
+ cam_ctl->bitmap = 0;
+ _rtw_memset(dvobj->cam_cache, 0, sizeof(struct cam_entry_cache)*TOTAL_CAM_ENTRY);
+ _exit_critical_bh(&cam_ctl->lock, &irqL);
}
#if 0
static u32 _ReadCAM(_adapter *padapter ,u32 addr)
DBG_8192C("*********************************\n");
}
-
-void write_cam(_adapter *padapter, u8 entry, u16 ctrl, u8 *mac, u8 *key)
+void _write_cam(_adapter *padapter, u8 entry, u16 ctrl, u8 *mac, u8 *key)
{
- unsigned int i, val, addr;
- //unsigned int cmd;
+ unsigned int i, val, addr;
int j;
u32 cam_val[2];
addr = entry << 3;
- for (j = 5; j >= 0; j--)
- {
- switch (j)
- {
- case 0:
- val = (ctrl | (mac[0] << 16) | (mac[1] << 24) );
- break;
-
- case 1:
- val = (mac[2] | ( mac[3] << 8) | (mac[4] << 16) | (mac[5] << 24));
- break;
-
- default:
- i = (j - 2) << 2;
- val = (key[i] | (key[i+1] << 8) | (key[i+2] << 16) | (key[i+3] << 24));
- break;
-
+ for (j = 5; j >= 0; j--) {
+ switch (j) {
+ case 0:
+ val = (ctrl | (mac[0] << 16) | (mac[1] << 24) );
+ break;
+ case 1:
+ val = (mac[2] | ( mac[3] << 8) | (mac[4] << 16) | (mac[5] << 24));
+ break;
+ default:
+ i = (j - 2) << 2;
+ val = (key[i] | (key[i+1] << 8) | (key[i+2] << 16) | (key[i+3] << 24));
+ break;
}
cam_val[0] = val;
cam_val[1] = addr + (unsigned int)j;
rtw_hal_set_hwreg(padapter, HW_VAR_CAM_WRITE, (u8 *)cam_val);
-
- //rtw_write32(padapter, WCAMI, val);
-
- //cmd = CAM_POLLINIG | CAM_WRITE | (addr + j);
- //rtw_write32(padapter, RWCAM, cmd);
-
- //DBG_871X("%s=> cam write: %x, %x\n",__FUNCTION__, cmd, val);
-
}
+}
+void _clear_cam_entry(_adapter *padapter, u8 entry)
+{
+ unsigned char null_sta[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+ unsigned char null_key[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00};
+
+ _write_cam(padapter, entry, 0, null_sta, null_key);
}
-void clear_cam_entry(_adapter *padapter, u8 entry)
-{
-#if 0
- u32 addr, val=0;
- u32 cam_val[2];
+inline void write_cam(_adapter *adapter, u8 id, u16 ctrl, u8 *mac, u8 *key)
+{
+#ifdef CONFIG_WRITE_CACHE_ONLY
+ write_cam_cache(adapter, id ,ctrl, mac, key);
+#else
+ _write_cam(adapter, id, ctrl, mac, key);
+ write_cam_cache(adapter, id ,ctrl, mac, key);
+#endif
+}
- addr = entry << 3;
+inline void clear_cam_entry(_adapter *adapter, u8 id)
+{
+ _clear_cam_entry(adapter, id);
+ clear_cam_cache(adapter, id);
+}
+
+inline void write_cam_from_cache(_adapter *adapter, u8 id)
+{
+ struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
+ struct cam_ctl_t *cam_ctl = &dvobj->cam_ctl;
+ _irqL irqL;
+ struct cam_entry_cache cache;
+
+ _enter_critical_bh(&cam_ctl->lock, &irqL);
+ _rtw_memcpy(&cache, &dvobj->cam_cache[id], sizeof(struct cam_entry_cache));
+ _exit_critical_bh(&cam_ctl->lock, &irqL);
+
+ _write_cam(adapter, id, cache.ctrl, cache.mac, cache.key);
+}
+
+void write_cam_cache(_adapter *adapter, u8 id, u16 ctrl, u8 *mac, u8 *key)
+{
+ struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
+ struct cam_ctl_t *cam_ctl = &dvobj->cam_ctl;
+ _irqL irqL;
+
+ _enter_critical_bh(&cam_ctl->lock, &irqL);
+
+ dvobj->cam_cache[id].ctrl = ctrl;
+ _rtw_memcpy(dvobj->cam_cache[id].mac, mac, ETH_ALEN);
+ _rtw_memcpy(dvobj->cam_cache[id].key, key, 16);
+
+ _exit_critical_bh(&cam_ctl->lock, &irqL);
+}
+
+void clear_cam_cache(_adapter *adapter, u8 id)
+{
+ struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
+ struct cam_ctl_t *cam_ctl = &dvobj->cam_ctl;
+ _irqL irqL;
+
+ _enter_critical_bh(&cam_ctl->lock, &irqL);
+
+ _rtw_memset(&(dvobj->cam_cache[id]), 0, sizeof(struct cam_entry_cache));
+
+ _exit_critical_bh(&cam_ctl->lock, &irqL);
+}
+
+s16 rtw_get_camid(_adapter *adapter, struct sta_info *sta, s16 kid)
+{
+ u8 macid;
+ s16 camid;
+
+ //cam_entry:
+ //0~3 for default key
+
+ //for concurrent mode (ap+sta, sta+sta):
+ //default key is disable, using sw encrypt/decrypt
+ //camid 0, 1, 2, 3 is default entry for default key/group key
+ //macid = 1 is for bc/mc stainfo, no mapping to camid
+ //macid = 0 mapping to camid 4
+ //for macid >=2, camid = macid+3;
+
+ if (sta) {
+ struct mlme_ext_info *mlmeinfo = &adapter->mlmeextpriv.mlmext_info;
+ macid = sta->mac_id;
+
+ if((mlmeinfo->state&0x03) == WIFI_FW_AP_STATE) {
+ if((macid == 1) || (macid>(NUM_STA-4))){
+ DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" failed, mac_id=%d\n", FUNC_ADPT_ARG(adapter), macid);
+ camid = -1;
+ goto exit;
+ }
+ }
+
+ if(macid==0)
+ camid = 4;
+ else if(macid >=2)
+ camid = macid + 3;
+ else
+ camid = 4;
+ }
+ else {
+ /* default key is disabled */
+ camid = -1;
+ }
+
+exit:
+ return (s16)camid;
+}
+
+bool _rtw_camid_is_gk(_adapter *adapter, u8 cam_id)
+{
+ struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
+ struct cam_ctl_t *cam_ctl = &dvobj->cam_ctl;
+ bool ret = _FALSE;
+
+ if (cam_id >= TOTAL_CAM_ENTRY)
+ goto exit;
+
+ if (!(cam_ctl->bitmap & BIT(cam_id)))
+ goto exit;
+ ret = (dvobj->cam_cache[cam_id].ctrl&BIT6)?_TRUE:_FALSE;
+
+exit:
+ return ret;
+}
+
+bool rtw_camid_is_gk(_adapter *adapter, u8 cam_id)
+{
+ struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
+ struct cam_ctl_t *cam_ctl = &dvobj->cam_ctl;
+ _irqL irqL;
+ bool ret;
+
+ _enter_critical_bh(&cam_ctl->lock, &irqL);
+ ret = _rtw_camid_is_gk(adapter, cam_id);
+ _exit_critical_bh(&cam_ctl->lock, &irqL);
+
+ return ret;
+}
+
+s16 _rtw_camid_search(_adapter *adapter, u8 *addr, s16 kid)
+{
+ struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
+ struct cam_ctl_t *cam_ctl = &dvobj->cam_ctl;
+ int i;
+ s16 cam_id = -1;
- cam_val[0] = val;
- cam_val[1] = addr + (unsigned int)0;
+ for (i=0;i<TOTAL_CAM_ENTRY;i++) {
+ if (addr && _rtw_memcmp(dvobj->cam_cache[i].mac, addr, ETH_ALEN) == _FALSE)
+ continue;
+ if (kid >= 0 && kid != (dvobj->cam_cache[i].ctrl&0x03))
+ continue;
- rtw_hal_set_hwreg(padapter, HW_VAR_CAM_WRITE, (u8 *)cam_val);
+ cam_id = i;
+ break;
+ }
+
+ if (0) {
+ if (addr)
+ DBG_871X(FUNC_ADPT_FMT" addr:"MAC_FMT" kid:%d, return cam_id:%d\n"
+ , FUNC_ADPT_ARG(adapter), MAC_ARG(addr), kid, cam_id);
+ else
+ DBG_871X(FUNC_ADPT_FMT" addr:%p kid:%d, return cam_id:%d\n"
+ , FUNC_ADPT_ARG(adapter), addr, kid, cam_id);
+ }
+
+ return cam_id;
+}
+
+s16 rtw_camid_search(_adapter *adapter, u8 *addr, s16 kid)
+{
+ struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
+ struct cam_ctl_t *cam_ctl = &dvobj->cam_ctl;
+ _irqL irqL;
+ s16 cam_id = -1;
+
+ _enter_critical_bh(&cam_ctl->lock, &irqL);
+ cam_id = _rtw_camid_search(adapter, addr, kid);
+ _exit_critical_bh(&cam_ctl->lock, &irqL);
+
+ return cam_id;
+}
+
+s16 rtw_camid_alloc(_adapter *adapter, struct sta_info *sta, u8 kid)
+{
+ struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
+ struct cam_ctl_t *cam_ctl = &dvobj->cam_ctl;
+ _irqL irqL;
+ s16 cam_id = -1;
+
+ _enter_critical_bh(&cam_ctl->lock, &irqL);
+
+#ifdef DYNAMIC_CAMID_ALLOC
+ {
+ struct mlme_ext_info *mlmeinfo = &adapter->mlmeextpriv.mlmext_info;
+
+ if((((mlmeinfo->state&0x03) == WIFI_FW_AP_STATE) || ((mlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE))
+ && !sta) {
+ /* AP/Ad-hoc mode group key: static alloction to default key by key ID */
+ if (kid > 3) {
+ DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" group key with invalid key id:%u\n"
+ , FUNC_ADPT_ARG(adapter), kid);
+ rtw_warn_on(1);
+ goto bitmap_handle;
+ }
+ cam_id = kid;
+ }
+ else {
+ int i;
+ u8 *addr = sta?sta->hwaddr:NULL;
+
+ if(!sta) {
+ if (!(mlmeinfo->state & WIFI_FW_ASSOC_SUCCESS)) {
+ /* bypass STA mode group key setting before connected(ex:WEP) because bssid is not ready */
+ goto bitmap_handle;
+ }
+
+ addr = get_bssid(&adapter->mlmepriv);
+ }
+
+ if ((i = _rtw_camid_search(adapter, addr, kid)) >= 0) {
+ /* Fix issue that pairwise and group key have same key id. Pairwise key first, group key can overwirte group only(ex: rekey) */
+ if (sta || _rtw_camid_is_gk(adapter, i) == _TRUE)
+ cam_id = i;
+ else
+ DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" group key id:%u the same key id as pairwise key\n"
+ , FUNC_ADPT_ARG(adapter), kid);
+ goto bitmap_handle;
+ }
+ for (i=4;i<TOTAL_CAM_ENTRY;i++)
+ if (!(cam_ctl->bitmap & BIT(i)))
+ break;
- cam_val[0] = val;
- cam_val[1] = addr + (unsigned int)1;
+ if (i == TOTAL_CAM_ENTRY) {
+ if (sta)
+ DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" pairwise key with "MAC_FMT" id:%u no room\n"
+ , FUNC_ADPT_ARG(adapter), MAC_ARG(sta->hwaddr), kid);
+ else
+ DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" group key id:%u no room\n"
+ , FUNC_ADPT_ARG(adapter), kid);
+ rtw_warn_on(1);
+ goto bitmap_handle;
+ }
- rtw_hal_set_hwreg(padapter, HW_VAR_CAM_WRITE, (u8 *)cam_val);
+ cam_id = i;
+ }
+ }
#else
+ cam_id = rtw_get_camid(adapter, sta, kid);
+#endif /* DYNAMIC_CAMID_ALLOC */
- unsigned char null_sta[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+bitmap_handle:
+ if (cam_id >= 0)
+ cam_ctl->bitmap |= BIT(cam_id);
- unsigned char null_key[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00};
+ _exit_critical_bh(&cam_ctl->lock, &irqL);
- write_cam(padapter, entry, 0, null_sta, null_key);
+ return cam_id;
+}
-#endif
+void rtw_camid_free(_adapter *adapter, u8 cam_id)
+{
+ struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
+ struct cam_ctl_t *cam_ctl = &dvobj->cam_ctl;
+ _irqL irqL;
+
+ _enter_critical_bh(&cam_ctl->lock, &irqL);
+
+ if (cam_id < TOTAL_CAM_ENTRY)
+ cam_ctl->bitmap &= ~(BIT(cam_id));
+
+ _exit_critical_bh(&cam_ctl->lock, &irqL);
}
int allocate_fw_sta_entry(_adapter *padapter)
void flush_all_cam_entry(_adapter *padapter)
{
- struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
- struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
-
-#ifdef CONFIG_CONCURRENT_MODE
-
+ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
+ struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
- //if(check_buddy_mlmeinfo_state(padapter, _HW_STATE_NOLINK_))
- if(check_buddy_fwstate(padapter, _FW_LINKED) == _FALSE)
- {
- rtw_hal_set_hwreg(padapter, HW_VAR_CAM_INVALID_ALL, 0);
- }
- else
+#ifdef CONFIG_CONCURRENT_MODE
+ if(check_buddy_fwstate(padapter, _FW_LINKED) == _TRUE)
{
if(check_fwstate(pmlmepriv, WIFI_STATION_STATE))
{
struct sta_priv *pstapriv = &padapter->stapriv;
struct sta_info *psta;
- u8 cam_id;//cam_entry
psta = rtw_get_stainfo(pstapriv, pmlmeinfo->network.MacAddress);
if(psta) {
if(psta->state & WIFI_AP_STATE)
{} //clear cam when ap free per sta_info
else {
-
- cam_id = (u8)rtw_get_camid(psta->mac_id);
-
- //clear_cam_entry(padapter, cam_id);
- rtw_clearstakey_cmd(padapter, (u8*)psta, cam_id, _FALSE);
- }
+ rtw_clearstakey_cmd(padapter, psta, _FALSE);
+ }
}
}
else if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE)
{
- //clear cam when ap free per sta_info
- }
- }
-#else //CONFIG_CONCURRENT_MODE
+ /* clear default key */
+ int i, cam_id;
+ u8 null_addr[ETH_ALEN]= {0,0,0,0,0,0};
+
+ for (i=0;i<4;i++) {
+ cam_id = rtw_camid_search(padapter, null_addr, i);
+ if (cam_id >= 0) {
+ clear_cam_entry(padapter, cam_id);
+ rtw_camid_free(padapter, cam_id);
+ }
+ }
- rtw_hal_set_hwreg(padapter, HW_VAR_CAM_INVALID_ALL, 0);
+ /* clear default key related key search setting */
+ #ifdef DYNAMIC_CAMID_ALLOC
+ rtw_hal_set_hwreg(padapter, HW_VAR_SEC_DK_CFG, (u8*)_FALSE);
+ #endif
+ /* leave pairwise key when ap free per sta_info */
+ }
+ }
+ else
#endif //CONFIG_CONCURRENT_MODE
+ {
+ invalidate_cam_all(padapter);
+ /* clear default key related key search setting */
+ #ifdef DYNAMIC_CAMID_ALLOC
+ rtw_hal_set_hwreg(padapter, HW_VAR_SEC_DK_CFG, (u8*)_FALSE);
+ #endif
+ }
_rtw_memset((u8 *)(pmlmeinfo->FW_sta_info), 0, sizeof(pmlmeinfo->FW_sta_info));
u32 bcn_channel;
unsigned short ht_cap_info;
unsigned char ht_info_infos_0;
+ struct mlme_priv *pmlmepriv = &Adapter->mlmepriv;
if (is_client_associated_to_ap(Adapter) == _FALSE)
return _TRUE;
bssid = (WLAN_BSSID_EX *)rtw_zmalloc(sizeof(WLAN_BSSID_EX));
+ if ((pmlmepriv->timeBcnInfoChkStart != 0) && (rtw_get_passing_time_ms(pmlmepriv->timeBcnInfoChkStart) > DISCONNECT_BY_CHK_BCN_FAIL_OBSERV_PERIOD_IN_MS))
+ {
+ pmlmepriv->timeBcnInfoChkStart = 0;
+ pmlmepriv->NumOfBcnInfoChkFail = 0;
+ }
+
subtype = GetFrameSubType(pframe) >> 4;
if(subtype==WIFI_BEACON)
ht_cap_info, ht_info_infos_0);
DBG_871X("%s bcn link: ht_cap_info:%x ht_info_infos_0:%x\n", __func__,
cur_network->BcnInfo.ht_cap_info, cur_network->BcnInfo.ht_info_infos_0);
- DBG_871X("%s bw mode change, disconnect\n", __func__);
+ DBG_871X("%s bw mode change\n", __func__);
{
//bcn_info_update
cur_network->BcnInfo.ht_cap_info = ht_cap_info;
if (_rtw_memcmp(bssid->Ssid.Ssid, cur_network->network.Ssid.Ssid, 32) == _FALSE ||
bssid->Ssid.SsidLength != cur_network->network.Ssid.SsidLength) {
if (bssid->Ssid.Ssid[0] != '\0' && bssid->Ssid.SsidLength != 0) { /* not hidden ssid */
- DBG_871X("%s(), SSID is not match return FAIL\n", __func__);
+ DBG_871X("%s(), SSID is not match\n", __func__);
goto _mismatch;
}
}
("%s(): cur_network->network.Privacy is %d, bssid.Privacy is %d\n",
__func__, cur_network->network.Privacy,bssid->Privacy));
if (cur_network->network.Privacy != bssid->Privacy) {
- DBG_871X("%s(), privacy is not match return FAIL\n",__func__);
+ DBG_871X("%s(), privacy is not match\n",__func__);
goto _mismatch;
}
}
if (cur_network->BcnInfo.encryp_protocol != encryp_protocol) {
- DBG_871X("%s(): enctyp is not match ,return FAIL\n",__func__);
+ DBG_871X("%s(): enctyp is not match\n",__func__);
goto _mismatch;
}
RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,
("%s cur_network->group_cipher is %d: %d\n",__func__, cur_network->BcnInfo.group_cipher, group_cipher));
if (pairwise_cipher != cur_network->BcnInfo.pairwise_cipher || group_cipher != cur_network->BcnInfo.group_cipher) {
- DBG_871X("%s pairwise_cipher(%x:%x) or group_cipher(%x:%x) is not match ,return FAIL\n",__func__,
+ DBG_871X("%s pairwise_cipher(%x:%x) or group_cipher(%x:%x) is not match\n",__func__,
pairwise_cipher, cur_network->BcnInfo.pairwise_cipher,
group_cipher, cur_network->BcnInfo.group_cipher);
goto _mismatch;
}
if (is_8021x != cur_network->BcnInfo.is_8021x) {
- DBG_871X("%s authentication is not match ,return FAIL\n", __func__);
+ DBG_871X("%s authentication is not match\n", __func__);
goto _mismatch;
}
}
_mismatch:
rtw_mfree((u8 *)bssid, sizeof(WLAN_BSSID_EX));
- return _FAIL;
- _func_exit_;
+ if (pmlmepriv->NumOfBcnInfoChkFail == 0)
+ {
+ pmlmepriv->timeBcnInfoChkStart = rtw_get_current_time();
+ }
+
+ pmlmepriv->NumOfBcnInfoChkFail++;
+ DBG_871X("%s by "ADPT_FMT" - NumOfChkFail = %d (SeqNum of this Beacon frame = %d).\n", __func__, ADPT_ARG(Adapter), pmlmepriv->NumOfBcnInfoChkFail, GetSequence(pframe));
+
+ if ((pmlmepriv->timeBcnInfoChkStart != 0) && (rtw_get_passing_time_ms(pmlmepriv->timeBcnInfoChkStart) <= DISCONNECT_BY_CHK_BCN_FAIL_OBSERV_PERIOD_IN_MS)
+ && (pmlmepriv->NumOfBcnInfoChkFail >= DISCONNECT_BY_CHK_BCN_FAIL_THRESHOLD))
+ {
+ DBG_871X("%s by "ADPT_FMT" - NumOfChkFail = %d >= threshold : %d (in %d ms), return FAIL.\n", __func__, ADPT_ARG(Adapter), pmlmepriv->NumOfBcnInfoChkFail,
+ DISCONNECT_BY_CHK_BCN_FAIL_THRESHOLD, rtw_get_passing_time_ms(pmlmepriv->timeBcnInfoChkStart));
+ pmlmepriv->timeBcnInfoChkStart = 0;
+ pmlmepriv->NumOfBcnInfoChkFail = 0;
+ return _FAIL;
+ }
+
+ return _SUCCESS;
}
void update_beacon_info(_adapter *padapter, u8 *pframe, uint pkt_len, struct sta_info *psta)
rtw_hal_bcn_related_reg_setting(padapter);
}
-uint rtw_get_camid(uint macid)
-{
- uint camid;
-
- //camid 0, 1, 2, 3 is default entry for default key/group key
- //macid = 1 is for bc/mc stainfo, no mapping to camid
- //macid = 0 mapping to camid 4
- //for macid >=2, camid = macid+3;
-
- if(macid==0)
- camid = 4;
- else if(macid >=2)
- camid = macid + 3;
- else
- camid = 4;
-
- return camid;
-}
-
void rtw_alloc_macid(_adapter *padapter, struct sta_info *psta)
{
int i;
}
}
#endif //CONFIG_WOWLAN
+
+/*
+ * Description:
+ * rtw_check_invalid_mac_address:
+ * This is only used for checking mac address valid or not.
+ *
+ * Input:
+ * adapter: mac_address pointer.
+ *
+ * Output:
+ * _TRUE: The mac address is invalid.
+ * _FALSE: The mac address is valid.
+ *
+ * Auther: Isaac.Li
+ */
+u8 rtw_check_invalid_mac_address(u8 *mac_addr) {
+ u8 null_mac_addr[ETH_ALEN] = {0, 0, 0, 0, 0, 0};
+ u8 multi_mac_addr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
+ u8 res = _FALSE;
+
+ if (_rtw_memcmp(mac_addr, null_mac_addr, ETH_ALEN)) {
+ res = _TRUE;
+ goto func_exit;
+ }
+
+ if (_rtw_memcmp(mac_addr, multi_mac_addr, ETH_ALEN)) {
+ res = _TRUE;
+ goto func_exit;
+ }
+
+ if (mac_addr[0] & BIT0) {
+ res = _TRUE;
+ goto func_exit;
+ }
+
+ if (mac_addr[0] & BIT1) {
+ res = _TRUE;
+ goto func_exit;
+ }
+
+func_exit:
+ return res;
+}
+
}
}
-static void update_attrib_phy_info(struct pkt_attrib *pattrib, struct sta_info *psta)
+static void update_attrib_phy_info(_adapter *padapter, struct pkt_attrib *pattrib, struct sta_info *psta)
{
+ struct mlme_ext_priv *mlmeext = &padapter->mlmeextpriv;
+
/*if(psta->rtsen)
pattrib->vcs_mode = RTS_CTS;
else if(psta->cts2self)
pattrib->raid = psta->raid;
#ifdef CONFIG_80211N_HT
pattrib->ht_en = psta->htpriv.ht_option;
- pattrib->bwmode = psta->htpriv.bwmode;
+ if (mlmeext->cur_bwmode < psta->htpriv.bwmode)
+ pattrib->bwmode = mlmeext->cur_bwmode;
+ else
+ pattrib->bwmode = psta->htpriv.bwmode;
pattrib->ch_offset = psta->htpriv.ch_offset;
pattrib->sgi= psta->htpriv.sgi;
pattrib->ampdu_en = _FALSE;
if ((check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE) ||
(check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE)) {
_rtw_memcpy(pattrib->ra, pattrib->dst, ETH_ALEN);
- _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN);
+ _rtw_memcpy(pattrib->ta, myid(&padapter->eeprompriv), ETH_ALEN);
DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_adhoc);
}
else if (check_fwstate(pmlmepriv, WIFI_STATION_STATE)) {
_rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN);
- _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN);
+ _rtw_memcpy(pattrib->ta, myid(&padapter->eeprompriv), ETH_ALEN);
DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_sta);
}
else if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) {
RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("update_attrib: bswenc=_FALSE\n"));
}
-#ifdef CONFIG_CONCURRENT_MODE
+#if defined(CONFIG_CONCURRENT_MODE) && !defined(DYNAMIC_CAMID_ALLOC)
if((pattrib->encrypt && bmcast) || (pattrib->encrypt ==_WEP40_) || (pattrib->encrypt ==_WEP104_))
{
pattrib->bswenc = _TRUE;//force using sw enc.
rtw_set_tx_chksum_offload(pkt, pattrib);
- update_attrib_phy_info(pattrib, psta);
+ update_attrib_phy_info(padapter, pattrib, psta);
exit:
if (pattrib->subtype & WIFI_DATA_TYPE)
{
if ((check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE)) {
- //to_ds = 1, fr_ds = 0;
#ifdef CONFIG_TDLS
if((ptdlsinfo->setup_state == TDLS_LINKED_STATE)){
ptdls_sta = rtw_get_stainfo(pstapriv, pattrib->dst);
}else
#endif //CONFIG_TDLS
{
+ //to_ds = 1, fr_ds = 0;
//Data transfer to AP
SetToDs(fctrl);
_rtw_memcpy(pwlanhdr->addr1, get_bssid(pmlmepriv), ETH_ALEN);
- _rtw_memcpy(pwlanhdr->addr2, pattrib->src, ETH_ALEN);
+ _rtw_memcpy(pwlanhdr->addr2, pattrib->ta, ETH_ALEN);
_rtw_memcpy(pwlanhdr->addr3, pattrib->dst, ETH_ALEN);
}
else if ((check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE) ||
(check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE)) {
_rtw_memcpy(pwlanhdr->addr1, pattrib->dst, ETH_ALEN);
- _rtw_memcpy(pwlanhdr->addr2, pattrib->src, ETH_ALEN);
+ _rtw_memcpy(pwlanhdr->addr2, pattrib->ta, ETH_ALEN);
_rtw_memcpy(pwlanhdr->addr3, get_bssid(pmlmepriv), ETH_ALEN);
if(psta->qos_option)
}
#endif //CONFIG_TDLS
+#define RTW_HIQ_FILTER_ALLOW_ALL 0
+#define RTW_HIQ_FILTER_ALLOW_SPECIAL 1
+#define RTW_HIQ_FILTER_DENY_ALL 2
+
+inline bool xmitframe_hiq_filter(struct xmit_frame *xmitframe)
+{
+ bool allow = _FALSE;
+ _adapter *adapter = xmitframe->padapter;
+ struct registry_priv *registry = &adapter->registrypriv;
+
+if (adapter->interface_type != RTW_PCIE) {
+
+ if (registry->hiq_filter == RTW_HIQ_FILTER_ALLOW_SPECIAL) {
+
+ struct pkt_attrib *attrib = &xmitframe->attrib;
+
+ if (attrib->ether_type == 0x0806
+ || attrib->ether_type == 0x888e
+ #ifdef CONFIG_WAPI_SUPPORT
+ || attrib->ether_type == 0x88B4
+ #endif
+ || attrib->dhcp_pkt
+ ) {
+ if (0)
+ DBG_871X(FUNC_ADPT_FMT" ether_type:0x%04x%s\n", FUNC_ADPT_ARG(xmitframe->padapter)
+ , attrib->ether_type, attrib->dhcp_pkt?" DHCP":"");
+ allow = _TRUE;
+ }
+ }
+ else if (registry->hiq_filter == RTW_HIQ_FILTER_ALLOW_ALL) {
+ allow = _TRUE;
+ }
+ else if (registry->hiq_filter == RTW_HIQ_FILTER_DENY_ALL) {
+ }
+ else {
+ rtw_warn_on(1);
+ }
+}
+ return allow;
+}
+
#if defined(CONFIG_AP_MODE) || defined(CONFIG_TDLS)
sint xmitframe_enqueue_for_sleeping_sta(_adapter *padapter, struct xmit_frame *pxmitframe)
struct pkt_attrib *pattrib = &pxmitframe->attrib;
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
sint bmcst = IS_MCAST(pattrib->ra);
+ bool update_tim = _FALSE;
#ifdef CONFIG_TDLS
struct tdls_info *ptdlsinfo = &padapter->tdlsinfo;
//DBG_871X("directly xmit pspoll_triggered packet\n");
//pattrib->triggered=0;
-
- if(bmcst)
+ if (bmcst && xmitframe_hiq_filter(pxmitframe) == _TRUE)
pattrib->qsel = 0x11;//HIQ
-
return ret;
}
psta->sleepq_len++;
+ if (!(pstapriv->tim_bitmap & BIT(0)))
+ update_tim = _TRUE;
+
pstapriv->tim_bitmap |= BIT(0);//
pstapriv->sta_dz_bitmap |= BIT(0);
-
+
//DBG_871X("enqueue, sq_len=%d, tim=%x\n", psta->sleepq_len, pstapriv->tim_bitmap);
- update_beacon(padapter, _TIM_IE_, NULL, _FALSE);//tx bc/mc packets after upate bcn
-
+ if (update_tim == _TRUE) {
+ if (is_broadcast_mac_addr(pattrib->ra))
+ _update_beacon(padapter, _TIM_IE_, NULL, _TRUE, "buffer BC");
+ else
+ _update_beacon(padapter, _TIM_IE_, NULL, _TRUE, "buffer MC");
+ } else {
+ chk_bmc_sleepq_cmd(padapter);
+ }
+
//_exit_critical_bh(&psta->sleep_q.lock, &irqL);
ret = _TRUE;
if(((psta->has_legacy_ac) && (!wmmps_ac)) ||((!psta->has_legacy_ac)&&(wmmps_ac)))
{
+ if (!(pstapriv->tim_bitmap & BIT(psta->aid)))
+ update_tim = _TRUE;
+
pstapriv->tim_bitmap |= BIT(psta->aid);
//DBG_871X("enqueue, sq_len=%d, tim=%x\n", psta->sleepq_len, pstapriv->tim_bitmap);
- if(psta->sleepq_len==1)
+ if(update_tim == _TRUE)
{
//DBG_871X("sleepq_len==1, update BCNTIM\n");
//upate BCN for TIM IE
- update_beacon(padapter, _TIM_IE_, NULL, _FALSE);
+ _update_beacon(padapter, _TIM_IE_, NULL, _TRUE, "buffer UC");
}
}
pxmitframe = LIST_CONTAINOR(plist, struct xmit_frame, list);
plist = get_next(plist);
-
+
+ pattrib = &pxmitframe->attrib;
+
+ pattrib->triggered = 0;
+
ret = xmitframe_enqueue_for_sleeping_sta(padapter, pxmitframe);
if(_TRUE == ret)
{
- pattrib = &pxmitframe->attrib;
-
ptxservq = rtw_get_sta_pending(padapter, psta, pattrib->priority, (u8 *)(&ac_index));
ptxservq->qcnt--;
*/
rtw_hal_xmitframe_enqueue(padapter, pxmitframe);
-
}
-
+
+ if(psta->sleepq_len==0)
+ {
+#ifdef CONFIG_TDLS
+ if( psta->tdls_sta_state & TDLS_LINKED_STATE )
+ {
+ if(psta->state&WIFI_SLEEP_STATE)
+ psta->state ^= WIFI_SLEEP_STATE;
+
+ goto _exit;
+ }
+#endif //CONFIG_TDLS
+
+ if (pstapriv->tim_bitmap & BIT(psta->aid)) {
+ //DBG_871X("wakeup to xmit, qlen==0, update_BCNTIM, tim=%x\n", pstapriv->tim_bitmap);
+ //upate BCN for TIM IE
+ //update_BCNTIM(padapter);
+ update_mask = BIT(0);
+ }
+
+ pstapriv->tim_bitmap &= ~BIT(psta->aid);
+
+ if(psta->state&WIFI_SLEEP_STATE)
+ psta->state ^= WIFI_SLEEP_STATE;
+
+ if(psta->state & WIFI_STA_ALIVE_CHK_STATE)
+ {
+ psta->expire_to = pstapriv->expire_to;
+ psta->state ^= WIFI_STA_ALIVE_CHK_STATE;
+ }
+
+ pstapriv->sta_dz_bitmap &= ~BIT(psta->aid);
+ }
+
//for BC/MC Frames
if(!psta_bmc)
goto _exit;
if(psta_bmc->sleepq_len==0)
{
+ if (pstapriv->tim_bitmap & BIT(0)) {
+ //DBG_871X("wakeup to xmit, qlen==0, update_BCNTIM, tim=%x\n", pstapriv->tim_bitmap);
+ //upate BCN for TIM IE
+ //update_BCNTIM(padapter);
+ update_mask |= BIT(1);
+ }
+
pstapriv->tim_bitmap &= ~BIT(0);
pstapriv->sta_dz_bitmap &= ~BIT(0);
-
- //DBG_871X("wakeup to xmit, qlen==0, update_BCNTIM, tim=%x\n", pstapriv->tim_bitmap);
- //upate BCN for TIM IE
- //update_BCNTIM(padapter);
- update_mask |= BIT(1);
- }
-
- }
-
- if(psta->sleepq_len==0)
- {
-#ifdef CONFIG_TDLS
- if( psta->tdls_sta_state & TDLS_LINKED_STATE )
- {
- if(psta->state&WIFI_SLEEP_STATE)
- psta->state ^= WIFI_SLEEP_STATE;
-
- goto _exit;
- }
-#endif //CONFIG_TDLS
- pstapriv->tim_bitmap &= ~BIT(psta->aid);
-
- //DBG_871X("wakeup to xmit, qlen==0, update_BCNTIM, tim=%x\n", pstapriv->tim_bitmap);
- //upate BCN for TIM IE
- //update_BCNTIM(padapter);
- update_mask = BIT(0);
-
- if(psta->state&WIFI_SLEEP_STATE)
- psta->state ^= WIFI_SLEEP_STATE;
-
- if(psta->state & WIFI_STA_ALIVE_CHK_STATE)
- {
- psta->expire_to = pstapriv->expire_to;
- psta->state ^= WIFI_STA_ALIVE_CHK_STATE;
}
-
- pstapriv->sta_dz_bitmap &= ~BIT(psta->aid);
- }
+ }
_exit:
if(update_mask)
{
//update_BCNTIM(padapter);
- //printk("%s => call update_beacon\n",__FUNCTION__);
- update_beacon(padapter, _TIM_IE_, NULL, _FALSE);
- }
+ if ((update_mask & (BIT(0)|BIT(1))) == (BIT(0)|BIT(1)))
+ _update_beacon(padapter, _TIM_IE_, NULL, _TRUE, "clear UC&BMC");
+ else if ((update_mask & BIT(1)) == BIT(1))
+ _update_beacon(padapter, _TIM_IE_, NULL, _TRUE, "clear BMC");
+ else
+ _update_beacon(padapter, _TIM_IE_, NULL, _TRUE, "clear UC");
+ }
}
//DBG_871X("wakeup to xmit, qlen==0, update_BCNTIM, tim=%x\n", pstapriv->tim_bitmap);
//upate BCN for TIM IE
//update_BCNTIM(padapter);
- update_beacon(padapter, _TIM_IE_, NULL, _FALSE);
+ update_beacon(padapter, _TIM_IE_, NULL, _TRUE);
//update_mask = BIT(0);
}
#if (DM_ODM_SUPPORT_TYPE == ODM_MP)\r
// 2012/01/12 MH Use customeris signal strength from HalComRxdDesc.c/ \r
pPhyInfo->SignalStrength = (u1Byte)(SignalScaleMapping(pDM_Odm->Adapter, PWDB_ALL));//PWDB_ALL;\r
+#else\r
+#ifdef CONFIG_SKIP_SIGNAL_SCALE_MAPPING\r
+ pPhyInfo->SignalStrength = (u1Byte)PWDB_ALL;\r
#else\r
pPhyInfo->SignalStrength = (u1Byte)(odm_SignalScaleMapping(pDM_Odm, PWDB_ALL));//PWDB_ALL;\r
+#endif\r
#endif\r
}\r
else\r
#if (DM_ODM_SUPPORT_TYPE == ODM_MP)\r
// 2012/01/12 MH Use customeris signal strength from HalComRxdDesc.c/ \r
pPhyInfo->SignalStrength = (u1Byte)(SignalScaleMapping(pDM_Odm->Adapter, total_rssi/=rf_rx_num));//PWDB_ALL;\r
+#else\r
+#ifdef CONFIG_SKIP_SIGNAL_SCALE_MAPPING\r
+ total_rssi/=rf_rx_num;\r
+ pPhyInfo->SignalStrength = (u1Byte)total_rssi;\r
#else\r
pPhyInfo->SignalStrength = (u1Byte)(odm_SignalScaleMapping(pDM_Odm, total_rssi/=rf_rx_num));\r
+#endif\r
#endif\r
}\r
}\r
ODM_ConfigMACWithHeaderFile(\r
IN PDM_ODM_T pDM_Odm\r
);\r
+\r
+s4Byte\r
+odm_SignalScaleMapping( \r
+ IN OUT PDM_ODM_T pDM_Odm,\r
+ IN s4Byte CurrSig \r
+ );\r
+\r
#endif\r
\r
\r
0x908,0x00000000,\r
0x90c,0x81121111,\r
0xa00,0x00d047c8,\r
-0xa04,0x80ff000c,\r
+0xa04,0x80ff800c,\r
0xa08,0x8c838300,\r
0xa0c,0x2e68120f,\r
0xa10,0x9500bb78,\r
0xce4,0x00000000,\r
0xce8,0x37644302,\r
0xcec,0x2f97d40c,\r
-0xd00,0x00080740,\r
+0xd00,0x00000740,\r
0xd04,0x00020401,\r
0xd08,0x0000907f,\r
0xd0c,0x20010201,\r
0x908,0x00000000,\r
0x90c,0x81121111,\r
0xa00,0x00d047c8,\r
-0xa04,0x80ff000c,\r
+0xa04,0x80ff800c,\r
0xa08,0x8c838300,\r
0xa0c,0x2e68120f,\r
0xa10,0x9500bb78,\r
0xce4,0x00000000,\r
0xce8,0x37644302,\r
0xcec,0x2f97d40c,\r
-0xd00,0x00080740,\r
+0xd00,0x00000740,\r
0xd04,0x00020401,\r
0xd08,0x0000907f,\r
0xd0c,0x20010201,\r
0x908,0x00000000,\r
0x90c,0x81121111,\r
0xa00,0x00d047c8,\r
-0xa04,0x80ff000c,\r
+0xa04,0x80ff800c,\r
0xa08,0x8c838300,\r
0xa0c,0x2e68120f,\r
0xa10,0x9500bb78,\r
0xce4,0x00000000,\r
0xce8,0x37644302,\r
0xcec,0x2f97d40c,\r
-0xd00,0x00080740,\r
+0xd00,0x00000740,\r
0xd04,0x00020401,\r
0xd08,0x0000907f,\r
0xd0c,0x20010201,\r
0x908,0x00000000,\r
0x90c,0x81121111,\r
0xa00,0x00d047c8,\r
-0xa04,0x80ff000c,\r
+0xa04,0x80ff800c,\r
0xa08,0x8c838300,\r
0xa0c,0x2e68120f,\r
0xa10,0x9500bb78,\r
0xce4,0x00000000,\r
0xce8,0x37644302,\r
0xcec,0x2f97d40c,\r
-0xd00,0x00080740,\r
+0xd00,0x00000740,\r
0xd04,0x00020401,\r
0xd08,0x0000907f,\r
0xd0c,0x20010201,\r
#define _HAL_INIT_C_
+#ifdef CONFIG_RF_GAIN_OFFSET
+#ifdef CONFIG_RTL8723A
+#define RF_GAIN_OFFSET_ON BIT0
+#define REG_RF_BB_GAIN_OFFSET 0x7f
+#define RF_GAIN_OFFSET_MASK 0xfffff
+#else
+#define RF_GAIN_OFFSET_ON BIT4
+#define REG_RF_BB_GAIN_OFFSET 0x55
+#define RF_GAIN_OFFSET_MASK 0xfffff
+#endif //CONFIG_RTL8723A
+#endif //CONFIG_RF_GAIN_OFFSET
+
void dump_chip_info(HAL_VERSION ChipVersion)
{
int cnt = 0;
return ret;
}
+void SetHwReg(_adapter *adapter, u8 variable, u8 *val)
+{
+ HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
+ DM_ODM_T *odm = &(hal_data->odmpriv);
+
+_func_enter_;
+
+ switch (variable) {
+ case HW_VAR_SEC_CFG:
+ {
+ #if defined(CONFIG_CONCURRENT_MODE) && !defined(DYNAMIC_CAMID_ALLOC)
+ // enable tx enc and rx dec engine, and no key search for MC/BC
+ rtw_write8(adapter, REG_SECCFG, SCR_NoSKMC|SCR_RxDecEnable|SCR_TxEncEnable);
+ #elif defined(DYNAMIC_CAMID_ALLOC)
+ u16 reg_scr;
+
+ reg_scr = rtw_read16(adapter, REG_SECCFG);
+ rtw_write16(adapter, REG_SECCFG, reg_scr|SCR_CHK_KEYID|SCR_RxDecEnable|SCR_TxEncEnable);
+ #else
+ rtw_write8(adapter, REG_SECCFG, *((u8*)val));
+ #endif
+ }
+ break;
+ case HW_VAR_SEC_DK_CFG:
+ {
+ struct security_priv *sec = &adapter->securitypriv;
+ u8 reg_scr = rtw_read8(adapter, REG_SECCFG);
+
+ if (val) /* Enable default key related setting */
+ {
+ reg_scr |= SCR_TXBCUSEDK;
+ if (sec->dot11AuthAlgrthm != dot11AuthAlgrthm_8021X)
+ reg_scr |= (SCR_RxUseDK|SCR_TxUseDK);
+ }
+ else /* Disable default key related setting */
+ {
+ reg_scr &= ~(SCR_RXBCUSEDK|SCR_TXBCUSEDK|SCR_RxUseDK|SCR_TxUseDK);
+ }
+
+ rtw_write8(adapter, REG_SECCFG, reg_scr);
+ }
+ break;
+ default:
+ if (0)
+ DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" variable(%d) not defined!\n",
+ FUNC_ADPT_ARG(adapter), variable);
+ break;
+ }
+
+_func_exit_;
+}
+
+void GetHwReg(_adapter *adapter, u8 variable, u8 *val)
+{
+ HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
+ DM_ODM_T *odm = &(hal_data->odmpriv);
+
+_func_enter_;
+
+ switch (variable) {
+ default:
+ if (0)
+ DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" variable(%d) not defined!\n",
+ FUNC_ADPT_ARG(adapter), variable);
+ break;
+ }
+}
+
u8
SetHalDefVar(_adapter *adapter, HAL_DEF_VARIABLE variable, void *value)
{
case HAL_DEF_DBG_DM_FUNC:
*((u32*)value) = pHalData->odmpriv.SupportAbility;
break;
+ case HAL_DEF_MACID_SLEEP:
+ *(u8*)value = _FALSE; // support macid sleep
+ break;
default:
DBG_871X_LEVEL(_drv_always_, "%s: [WARNING] HAL_DEF_VARIABLE(%d) not defined!\n", __FUNCTION__, variable);
bResult = _FAIL;
return bResult;
}
+#ifdef CONFIG_RF_GAIN_OFFSET
+void rtw_bb_rf_gain_offset(_adapter *padapter)
+{
+ u8 value = padapter->eeprompriv.EEPROMRFGainOffset;
+ u8 tmp = 0x3e;
+ u32 res;
+
+ DBG_871X("+%s value: 0x%02x+\n", __func__, value);
+
+ if (value & RF_GAIN_OFFSET_ON) {
+ //DBG_871X("Offset RF Gain.\n");
+ //DBG_871X("Offset RF Gain. padapter->eeprompriv.EEPROMRFGainVal=0x%x\n",padapter->eeprompriv.EEPROMRFGainVal);
+ if(padapter->eeprompriv.EEPROMRFGainVal != 0xff){
+#ifdef CONFIG_RTL8723A
+ res = rtw_hal_read_rfreg(padapter, RF_PATH_A, 0xd, 0xffffffff);
+ //DBG_871X("Offset RF Gain. reg 0xd=0x%x\n",res);
+ res &= 0xfff87fff;
+
+ res |= (padapter->eeprompriv.EEPROMRFGainVal & 0x0f)<< 15;
+ //DBG_871X("Offset RF Gain. reg 0xd=0x%x\n",res);
+
+ rtw_hal_write_rfreg(padapter, RF_PATH_A, REG_RF_BB_GAIN_OFFSET, RF_GAIN_OFFSET_MASK, res);
+
+ res = rtw_hal_read_rfreg(padapter, RF_PATH_A, 0xe, 0xffffffff);
+ DBG_871X("Offset RF Gain. reg 0xe=0x%x\n",res);
+ res &= 0xfffffff0;
+
+ res |= (padapter->eeprompriv.EEPROMRFGainVal & 0x0f);
+ //DBG_871X("Offset RF Gain. reg 0xe=0x%x\n",res);
+
+ rtw_hal_write_rfreg(padapter, RF_PATH_A, REG_RF_BB_GAIN_OFFSET, RF_GAIN_OFFSET_MASK, res);
+#else
+ res = rtw_hal_read_rfreg(padapter, RF_PATH_A, REG_RF_BB_GAIN_OFFSET, 0xffffffff);
+ DBG_871X("REG_RF_BB_GAIN_OFFSET=%x \n",res);
+ res &= 0xfff87fff;
+ res |= (padapter->eeprompriv.EEPROMRFGainVal & 0x0f)<< 15;
+ DBG_871X("write REG_RF_BB_GAIN_OFFSET=%x \n",res);
+ rtw_hal_write_rfreg(padapter, RF_PATH_A, REG_RF_BB_GAIN_OFFSET, RF_GAIN_OFFSET_MASK, res);
+#endif
+ }
+ else
+ {
+ //DBG_871X("Offset RF Gain. padapter->eeprompriv.EEPROMRFGainVal=0x%x != 0xff, didn't run Kfree\n",padapter->eeprompriv.EEPROMRFGainVal);
+ }
+ } else {
+ //DBG_871X("Using the default RF gain.\n");
+ }
+
+}
+#endif //CONFIG_RF_GAIN_OFFSET
+
+#ifdef CONFIG_EFUSE_CONFIG_FILE
+int check_phy_efuse_tx_power_info_valid(PADAPTER padapter) {
+ EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(padapter);
+ u8* pContent = pEEPROM->efuse_eeprom_data;
+ int index = 0;
+ u16 tx_index_offset = 0x0000;
+
+ switch(padapter->chip_type) {
+ case RTL8723A:
+ tx_index_offset = EEPROM_CCK_TX_PWR_INX_8723A;
+ break;
+ default:
+ tx_index_offset = 0x0010;
+ break;
+ }
+ for (index = 0 ; index < 12 ; index++) {
+ if (pContent[tx_index_offset + index] == 0xFF) {
+ return _FALSE;
+ }
+ }
+ DBG_871X("phy efuse with valid tx power info\n");
+ return _TRUE;
+}
+
+int check_phy_efuse_macaddr_info_valid(PADAPTER padapter) {
+
+ u8 val = 0;
+ u16 addr_offset = 0x0000;
+
+ switch(padapter->chip_type) {
+ case RTL8723A:
+ if (padapter->interface_type == RTW_USB)
+ {
+ addr_offset = EEPROM_MAC_ADDR_8723AU;
+ DBG_871X("%s: interface is USB\n", __func__);
+ }
+ else if (padapter->interface_type == RTW_SDIO)
+ {
+ addr_offset = EEPROM_MAC_ADDR_8723AS;
+ DBG_871X("%s: interface is SDIO\n", __func__);
+ }
+ else if (padapter->interface_type == RTW_PCIE)
+ {
+ addr_offset = EEPROM_MAC_ADDR_8723AE;
+ DBG_871X("%s: interface is PCIE\n", __func__);
+ }
+ break;
+ }
+
+ if (addr_offset == 0x0000) {
+ DBG_871X("phy efuse MAC addr offset is 0!!\n");
+ return _FALSE;
+ } else {
+ rtw_efuse_map_read(padapter, addr_offset, 1, &val);
+ }
+
+ if (val == 0xFF) {
+ return _FALSE;
+ } else {
+ DBG_871X("phy efuse with valid MAC addr\n");
+ return _TRUE;
+ }
+}
+
+u32 Hal_readPGDataFromConfigFile(
+ PADAPTER padapter,
+ struct file *fp)
+{
+ u32 i;
+ mm_segment_t fs;
+ u8 temp[3];
+ loff_t pos = 0;
+ EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(padapter);
+ u8 *PROMContent = pEEPROM->efuse_eeprom_data;
+
+ temp[2] = 0; // add end of string '\0'
+
+ fs = get_fs();
+ set_fs(KERNEL_DS);
+
+ for (i = 0 ; i < HWSET_MAX_SIZE ; i++) {
+ vfs_read(fp, temp, 2, &pos);
+ PROMContent[i] = simple_strtoul(temp, NULL, 16);
+ if ((i % EFUSE_FILE_COLUMN_NUM) == (EFUSE_FILE_COLUMN_NUM - 1)) {
+ //Filter the lates space char.
+ vfs_read(fp, temp, 1, &pos);
+ if (strchr(temp, ' ') == NULL) {
+ pos--;
+ vfs_read(fp, temp, 2, &pos);
+ }
+ } else {
+ pos += 1; // Filter the space character
+ }
+ }
+
+ set_fs(fs);
+ pEEPROM->bloadfile_fail_flag = _FALSE;
+
+#ifdef CONFIG_DEBUG
+ DBG_871X("Efuse configure file:\n");
+ for (i=0; i<HWSET_MAX_SIZE; i++)
+ {
+ if (i % 16 == 0)
+ printk("\n");
+
+ printk("%02X ", PROMContent[i]);
+ }
+ printk("\n");
+#endif
+
+ return _SUCCESS;
+}
+
+void Hal_ReadMACAddrFromFile(
+ PADAPTER padapter,
+ struct file *fp)
+{
+ u32 i;
+ mm_segment_t fs;
+ u8 source_addr[18];
+ loff_t pos = 0;
+ u32 curtime = rtw_get_current_time();
+ EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(padapter);
+ u8 *head, *end;
+
+ _rtw_memset(source_addr, 0, 18);
+ _rtw_memset(pEEPROM->mac_addr, 0, ETH_ALEN);
+
+ fs = get_fs();
+ set_fs(KERNEL_DS);
+
+ DBG_871X("wifi mac address:\n");
+ vfs_read(fp, source_addr, 18, &pos);
+ source_addr[17] = ':';
+
+ head = end = source_addr;
+ for (i=0; i<ETH_ALEN; i++) {
+ while (end && (*end != ':') )
+ end++;
+
+ if (end && (*end == ':') )
+ *end = '\0';
+
+ pEEPROM->mac_addr[i] = simple_strtoul(head, NULL, 16 );
+
+ if (end) {
+ end++;
+ head = end;
+ }
+ }
+
+ set_fs(fs);
+ pEEPROM->bloadmac_fail_flag = _FALSE;
+
+ if (rtw_check_invalid_mac_address(pEEPROM->mac_addr) == _TRUE) {
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,33))
+ get_random_bytes(pEEPROM->mac_addr, ETH_ALEN);
+ pEEPROM->mac_addr[0] = 0x00;
+ pEEPROM->mac_addr[1] = 0xe0;
+ pEEPROM->mac_addr[2] = 0x4c;
+#else
+ pEEPROM->mac_addr[0] = 0x00;
+ pEEPROM->mac_addr[1] = 0xe0;
+ pEEPROM->mac_addr[2] = 0x4c;
+ pEEPROM->mac_addr[3] = (u8)(curtime & 0xff) ;
+ pEEPROM->mac_addr[4] = (u8)((curtime>>8) & 0xff) ;
+ pEEPROM->mac_addr[5] = (u8)((curtime>>16) & 0xff) ;
+#endif
+ DBG_871X("MAC Address from wifimac error is invalid, assign random MAC !!!\n");
+ }
+
+ DBG_871X("%s: Permanent Address = %02x-%02x-%02x-%02x-%02x-%02x\n",
+ __func__, pEEPROM->mac_addr[0], pEEPROM->mac_addr[1],
+ pEEPROM->mac_addr[2], pEEPROM->mac_addr[3],
+ pEEPROM->mac_addr[4], pEEPROM->mac_addr[5]);
+}
+
+void Hal_GetPhyEfuseMACAddr(PADAPTER padapter, u8* mac_addr) {
+ int i = 0;
+ u16 addr_offset = 0x0000;
+
+ switch(padapter->chip_type) {
+ case RTL8723A:
+ if (padapter->interface_type == RTW_USB)
+ {
+ addr_offset = EEPROM_MAC_ADDR_8723AU;
+ DBG_871X("%s: interface is USB\n", __func__);
+ }
+ else if (padapter->interface_type == RTW_SDIO)
+ {
+ addr_offset = EEPROM_MAC_ADDR_8723AS;
+ DBG_871X("%s: interface is SDIO\n", __func__);
+ }
+ else if (padapter->interface_type == RTW_PCIE)
+ {
+ addr_offset = EEPROM_MAC_ADDR_8723AE;
+ DBG_871X("%s: interface is PCIE\n", __func__);
+ }
+ break;
+ }
+
+ rtw_efuse_map_read(padapter, addr_offset, ETH_ALEN, mac_addr);
+
+ if (rtw_check_invalid_mac_address(mac_addr) == _TRUE) {
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,33))
+ get_random_bytes(mac_addr, ETH_ALEN);
+ mac_addr[0] = 0x00;
+ mac_addr[1] = 0xe0;
+ mac_addr[2] = 0x4c;
+#else
+ mac_addr[0] = 0x00;
+ mac_addr[1] = 0xe0;
+ mac_addr[2] = 0x4c;
+ mac_addr[3] = (u8)(curtime & 0xff) ;
+ mac_addr[4] = (u8)((curtime>>8) & 0xff) ;
+ mac_addr[5] = (u8)((curtime>>16) & 0xff) ;
+#endif
+ DBG_871X("MAC Address from phy efuse error, assign random MAC !!!\n");
+ }
+
+ DBG_871X("%s: Permanent Address = %02x-%02x-%02x-%02x-%02x-%02x\n",
+ __func__, mac_addr[0], mac_addr[1], mac_addr[2],
+ mac_addr[3], mac_addr[4], mac_addr[5]);
+}
+#endif //CONFIG_EFUSE_CONFIG_FILE
+
+
status = padapter->HalFunc.hal_init(padapter);
if(status == _SUCCESS){
- for (i = 0; i<dvobj->iface_nums; i++) {
- padapter = dvobj->padapters[i];
- padapter->hw_init_completed = _TRUE;
- }
+ for (i = 0; i<dvobj->iface_nums; i++)
+ dvobj->padapters[i]->hw_init_completed = _TRUE;
if (padapter->registrypriv.notch_filter == 1)
rtw_hal_notch_filter(padapter, 1);
rtw_hal_reset_security_engine(padapter);
- rtw_sec_restore_wep_key(padapter);
+
+ for (i = 0; i<dvobj->iface_nums; i++)
+ rtw_sec_restore_wep_key(dvobj->padapters[i]);
init_hw_mlme_ext(padapter);
+
+#ifdef CONFIG_RF_GAIN_OFFSET
+ rtw_bb_rf_gain_offset(padapter);
+#endif //CONFIG_RF_GAIN_OFFSET
}
else{
- for (i = 0; i<dvobj->iface_nums; i++) {
- padapter = dvobj->padapters[i];
- padapter->hw_init_completed = _FALSE;
- }
+ for (i = 0; i<dvobj->iface_nums; i++)
+ dvobj->padapters[i]->hw_init_completed = _FALSE;
DBG_871X("rtw_hal_init: hal__init fail\n");
}
return adapter->HalFunc.c2h_id_filter_ccx;
}
+s32 rtw_hal_macid_sleep(PADAPTER padapter, u8 macid)
+{
+ u8 support;
+
+ support = _FALSE;
+ rtw_hal_get_def_var(padapter, HAL_DEF_MACID_SLEEP, &support);
+ if (_FALSE == support)
+ return _FAIL;
+
+ if (macid >= 32) {
+ DBG_871X_LEVEL(_drv_err_, FUNC_ADPT_FMT": Invalid macid(%u)\n",
+ FUNC_ADPT_ARG(padapter), macid);
+ return _FAIL;
+ }
+
+ rtw_hal_set_hwreg(padapter, HW_VAR_MACID_SLEEP, &macid);
+
+ return _SUCCESS;
+}
+
+s32 rtw_hal_macid_wakeup(PADAPTER padapter, u8 macid)
+{
+ u8 support;
+
+ support = _FALSE;
+ rtw_hal_get_def_var(padapter, HAL_DEF_MACID_SLEEP, &support);
+ if (_FALSE == support)
+ return _FAIL;
+
+ if (macid >= 32) {
+ DBG_871X_LEVEL(_drv_err_, FUNC_ADPT_FMT": Invalid macid(%u)\n",
+ FUNC_ADPT_ARG(padapter), macid);
+ return _FAIL;
+ }
+
+ rtw_hal_set_hwreg(padapter, HW_VAR_MACID_WAKEUP, &macid);
+
+ return _SUCCESS;
+}
+
if (btdm_Is1AntPsTdmaStateChange(padapter))
{
// wide duration for WiFi
- BTDM_SetFw3a(padapter, 0xd3, 0x1a, 0x1a, 0x0, 0x50);
+ BTDM_SetFw3a(padapter, 0xd3, 0x1a, 0x1a, 0x0, 0x10);
btdm_1AntSetBTCoexTable(padapter, 6);
}
break;
if (btdm_Is1AntPsTdmaStateChange(padapter))
{
// normal duration for WiFi
- BTDM_SetFw3a(padapter, 0xd3, 0x12, 0x12, 0x0, 0x50);
+ BTDM_SetFw3a(padapter, 0xd3, 0x12, 0x12, 0x0, 0x10);
btdm_1AntSetBTCoexTable(padapter, 6);
}
break;
if (btdm_Is1AntPsTdmaStateChange(padapter))
{
// narrow duration for WiFi
- BTDM_SetFw3a(padapter, 0xd3, 0xa, 0xa, 0x0, 0x50); //narrow duration for WiFi
+ BTDM_SetFw3a(padapter, 0xd3, 0x10, 0x10, 0x0, 0x10); //narrow duration for WiFi
btdm_1AntSetBTCoexTable(padapter, 6);
}
break;
if (btdm_Is1AntPsTdmaStateChange(padapter))
{
// narrow duration for WiFi
- BTDM_SetFw3a(padapter, 0x53, 0x10, 0x03, 0x10, 0x50);
+ BTDM_SetFw3a(padapter, 0xd3, 0x10, 0x10, 0x0, 0x10);
btdm_1AntSetBTCoexTable(padapter, 6);
}
break;
case 37:
if (btdm_Is1AntPsTdmaStateChange(padapter))
{
- BTDM_SetFw3a(padapter, 0x53, 0x10, 0x03, 0x10, 0x10);
+ BTDM_SetFw3a(padapter, 0xd3, 0x20, 0x03, 0x10, 0x10);
btdm_1AntSetBTCoexTable(padapter, 6);
}
break;
//RTPRINT(FBT, BT_TRACE, ("[BTCoex], bPreIgnoreWlanAct = %d, bCurIgnoreWlanAct = %d!!\n",
// pBtdm8723->bPreIgnoreWlanAct, pBtdm8723->bCurIgnoreWlanAct));
+#if 0
if(pBtdm8723->bPreIgnoreWlanAct == pBtdm8723->bCurIgnoreWlanAct)
return;
+#endif
btdm_SetFwIgnoreWlanAct(padapter,bEnable);
pBtdm8723->bPreIgnoreWlanAct = pBtdm8723->bCurIgnoreWlanAct;
pHalData->bt_coexist.CurrentState = 0;
pHalData->bt_coexist.PreviousState = 0;
- pHalData->bt_coexist.halCoex8723.bBusyTrafficForCoex = _FALSE;
-
BTDM_8723AInit(padapter);
pHalData->bt_coexist.bInitlized = _TRUE;
}
{
// PMGNT_INFO pMgntInfo = &(GetDefaultAdapter(padapter)->MgntInfo);
struct mlme_priv *pmlmepriv = &(GetDefaultAdapter(padapter)->mlmepriv);
- PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
PBT30Info pBTInfo = GET_BT_INFO(padapter);
PBT_TRAFFIC pBtTraffic = &pBTInfo->BtTraffic;
#ifdef CONFIG_CONCURRENT_MODE
struct mlme_priv *pbuddy_mlmepriv;
- PHAL_DATA_TYPE pBuddyHalData;
if (padapter->pbuddy_adapter != NULL)
{
pbuddy_mlmepriv = &(padapter->pbuddy_adapter->mlmepriv);
- pBuddyHalData = GET_HAL_DATA(padapter->pbuddy_adapter);
#if 1
if ((btdm_BtWifiAntNum(padapter) == Ant_x1) && ((BT_IsBtDisabled(padapter) == _TRUE) || ((BT_IsBtDisabled(padapter) == _FALSE && (BT_GetBtState(padapter) <= BT_INFO_STATE_CONNECT_IDLE)))))
}
#endif
- if (pHalData->bt_coexist.halCoex8723.bBusyTrafficForCoex ||pBuddyHalData->bt_coexist.halCoex8723.bBusyTrafficForCoex ||
+ if (pmlmepriv->LinkDetectInfo.bBusyTrafficForCoex ||pbuddy_mlmepriv->LinkDetectInfo.bBusyTrafficForCoex ||
pBtTraffic->Bt30TrafficStatistics.bTxBusyTraffic ||
pBtTraffic->Bt30TrafficStatistics.bRxBusyTraffic)
return _TRUE;
}
#endif
- if (pHalData->bt_coexist.halCoex8723.bBusyTrafficForCoex ||
+ if (pmlmepriv->LinkDetectInfo.bBusyTrafficForCoex ||
pBtTraffic->Bt30TrafficStatistics.bTxBusyTraffic ||
pBtTraffic->Bt30TrafficStatistics.bRxBusyTraffic)
return _TRUE;
#endif\r
}\r
\r
+#ifdef CONFIG_SUPPORT_HW_WPS_PBC\r
static void dm_CheckPbcGPIO(_adapter *padapter)\r
{\r
u8 tmp1byte;\r
#endif\r
}\r
}\r
+#endif //#ifdef CONFIG_SUPPORT_HW_WPS_PBC\r
\r
#ifdef CONFIG_PCI_HCI\r
//\r
}\r
\r
skip_dm:\r
-\r
- // Check GPIO to determine current RF on/off and Pbc status.\r
- // Check Hardware Radio ON/OFF or not\r
-#ifdef CONFIG_PCI_HCI\r
- if(pHalData->bGpioHwWpsPbc)\r
-#endif\r
- {\r
- dm_CheckPbcGPIO(Adapter); // Add by hpfan 2008-03-11\r
- }\r
-\r
+#ifdef CONFIG_SUPPORT_HW_WPS_PBC\r
+ // Check GPIO to determine current Pbc status.\r
+ dm_CheckPbcGPIO(Adapter);\r
+#endif \r
+ return;\r
}\r
\r
void rtl8723a_init_dm_priv(IN PADAPTER Adapter)\r
DBG_871X("=====> _8051Reset8723A(): 8051 reset success .\n");
}
-extern u8 g_fwdl_chksum_fail;
static s32 polling_fwdl_chksum(_adapter *adapter, u32 min_cnt, u32 timeout_ms)
{
s32 ret = _FAIL;
goto exit;
}
- if (g_fwdl_chksum_fail) {
- DBG_871X("%s: fwdl test case: fwdl_chksum_fail\n", __FUNCTION__);
- g_fwdl_chksum_fail--;
+ if (rtw_fwdl_test_trigger_chksum_fail())
goto exit;
- }
ret = _SUCCESS;
return ret;
}
-extern u8 g_fwdl_wintint_rdy_fail;
static s32 _FWFreeToGo(_adapter *adapter, u32 min_cnt, u32 timeout_ms)
{
s32 ret = _FAIL;
goto exit;
}
- if (g_fwdl_wintint_rdy_fail) {
- DBG_871X("%s: fwdl test case: wintint_rdy_fail\n", __FUNCTION__);
- g_fwdl_wintint_rdy_fail--;
+ if (rtw_fwdl_test_trigger_wintint_rdy_fail())
goto exit;
- }
ret = _SUCCESS;
for (i=0; i<_size_byte; i++)
pbuf[i] = efuseTbl[_offset+i];
+#ifdef CONFIG_DEBUG
+if(1)
+{
+ DBG_871X("Efuse Realmap:\n");
+ for(i=0; i<_size_byte; i++)
+ {
+ if (i % 16 == 0)
+ printk("\n");
+ printk("%02X ", pbuf[i]);
+ }
+ printk("\n");
+}
+#endif
+
// Calculate Efuse utilization
EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, &total, bPseudoTest);
used = eFuse_Addr - 1;
break;
case HW_VAR_BASIC_RATE:
+ {
+ struct mlme_ext_info *mlmext_info = &padapter->mlmeextpriv.mlmext_info;
+ u16 input_b = 0, masked = 0, ioted = 0, BrateCfg = 0;
+ u16 rrsr_2g_force_mask = (RRSR_11M|RRSR_5_5M|RRSR_1M);
+ u16 rrsr_2g_allow_mask = (RRSR_24M|RRSR_12M|RRSR_6M|RRSR_11M|RRSR_5_5M|RRSR_2M|RRSR_1M);
+ u8 RateIndex = 0;
+
+ HalSetBrateCfg(padapter, val, &BrateCfg);
+ input_b = BrateCfg;
+
+ /* apply force and allow mask */
+ BrateCfg |= rrsr_2g_force_mask;
+ BrateCfg &= rrsr_2g_allow_mask;
+ masked = BrateCfg;
+
+ /* IOT consideration */
+ if (mlmext_info->assoc_AP_vendor == HT_IOT_PEER_CISCO) {
+ /* if peer is cisco and didn't use ofdm rate, we enable 6M ack */
+ if((BrateCfg & (RRSR_24M|RRSR_12M|RRSR_6M)) == 0)
+ BrateCfg |= RRSR_6M;
+ }
+ ioted = BrateCfg;
+
+ pHalData->BasicRateSet = BrateCfg;
+
+ DBG_8192C("HW_VAR_BASIC_RATE: %#x -> %#x -> %#x\n", input_b, masked, ioted);
+
+ // Set RRSR rate table.
+ rtw_write16(padapter, REG_RRSR, BrateCfg);
+ rtw_write8(padapter, REG_RRSR+2, rtw_read8(padapter, REG_RRSR+2)&0xf0);
+
+ // Set RTS initial rate
+ while (BrateCfg > 0x1)
{
- u16 BrateCfg = 0;
- u8 RateIndex = 0;
-
- // 2007.01.16, by Emily
- // Select RRSR (in Legacy-OFDM and CCK)
- // For 8190, we select only 24M, 12M, 6M, 11M, 5.5M, 2M, and 1M from the Basic rate.
- // We do not use other rates.
- HalSetBrateCfg(padapter, val, &BrateCfg);
-
- //2011.03.30 add by Luke Lee
- //CCK 2M ACK should be disabled for some BCM and Atheros AP IOT
- //because CCK 2M has poor TXEVM
- //CCK 5.5M & 11M ACK should be enabled for better performance
-
- pHalData->BasicRateSet = BrateCfg = (BrateCfg |0xd) & 0x15d;
- BrateCfg |= 0x01; // default enable 1M ACK rate
- DBG_8192C("HW_VAR_BASIC_RATE: BrateCfg(%#x)\n", BrateCfg);
-
- // Set RRSR rate table.
- rtw_write8(padapter, REG_RRSR, BrateCfg&0xff);
- rtw_write8(padapter, REG_RRSR+1, (BrateCfg>>8)&0xff);
- rtw_write8(padapter, REG_RRSR+2, rtw_read8(padapter, REG_RRSR+2)&0xf0);
-
- // Set RTS initial rate
- while (BrateCfg > 0x1)
- {
- BrateCfg = (BrateCfg >> 1);
- RateIndex++;
- }
- // Ziv - Check
- rtw_write8(padapter, REG_INIRTS_RATE_SEL, RateIndex);
+ BrateCfg = (BrateCfg >> 1);
+ RateIndex++;
}
+ // Ziv - Check
+ rtw_write8(padapter, REG_INIRTS_RATE_SEL, RateIndex);
+ }
break;
case HW_VAR_TXPAUSE:
}
break;
- case HW_VAR_SEC_CFG:
-#ifdef CONFIG_CONCURRENT_MODE
- rtw_write8(padapter, REG_SECCFG, 0x0c|BIT(5));// enable tx enc and rx dec engine, and no key search for MC/BC
-#else
- rtw_write8(padapter, REG_SECCFG, *val);
-#endif
- break;
-
case HW_VAR_DM_FLAG:
pHalData->odmpriv.SupportAbility = *((u32*)val);
break;
rtw_write8(padapter, REG_TDECTRL+2, rtw_read8(padapter, REG_TDECTRL+2) | BIT0);
break;
+ case HW_VAR_MACID_SLEEP:
+ {
+ u32 reg_macid_sleep;
+ u8 bit_shift;
+ u8 id = *(u8*)val;
+ u32 val32;
+
+ if (id < 32) {
+ reg_macid_sleep = REG_MACID_SLEEP;
+ bit_shift = id;
+ } else {
+ rtw_warn_on(1);
+ break;
+ }
+
+ val32 = rtw_read32(padapter, reg_macid_sleep);
+ DBG_8192C(FUNC_ADPT_FMT ": [HW_VAR_MACID_SLEEP] macid=%d, org reg_0x%03x=0x%08X\n",
+ FUNC_ADPT_ARG(padapter), id, reg_macid_sleep, val32);
+
+ if (val32 & BIT(bit_shift))
+ break;
+
+ val32 |= BIT(bit_shift);
+ rtw_write32(padapter, reg_macid_sleep, val32);
+ }
+ break;
+
+ case HW_VAR_MACID_WAKEUP:
+ {
+ u32 reg_macid_sleep;
+ u8 bit_shift;
+ u8 id = *(u8*)val;
+ u32 val32;
+
+ if (id < 32) {
+ reg_macid_sleep = REG_MACID_SLEEP;
+ bit_shift = id;
+ } else {
+ rtw_warn_on(1);
+ break;
+ }
+
+ val32 = rtw_read32(padapter, reg_macid_sleep);
+ DBG_8192C(FUNC_ADPT_FMT ": [HW_VAR_MACID_WAKEUP] macid=%d, org reg_0x%03x=0x%08X\n",
+ FUNC_ADPT_ARG(padapter), id, reg_macid_sleep, val32);
+
+ if (!(val32 & BIT(bit_shift)))
+ break;
+
+ val32 &= ~BIT(bit_shift);
+ rtw_write32(padapter, reg_macid_sleep, val32);
+ }
+ break;
+
default:
+ SetHwReg(padapter, variable, val);
break;
}
_func_exit_;
}
+struct qinfo_8723a {
+ u32 head:8;
+ u32 pkt_num:8;
+ u32 tail:8;
+ u32 empty:1;
+ u32 ac:2;
+ u32 macid:5;
+};
+
+struct bcn_qinfo_8723a {
+ u16 head:8;
+ u16 pkt_num:8;
+};
+
+void dump_qinfo_8723a(void *sel, struct qinfo_8723a *info, const char *tag)
+{
+ //if (info->pkt_num)
+ DBG_871X_SEL_NL(sel, "%shead:0x%02x, tail:0x%02x, pkt_num:%u, empty:%u, macid:%u, ac:%u\n"
+ , tag ? tag : "", info->head, info->tail, info->pkt_num, info->empty, info->macid, info->ac
+ );
+}
+
+void dump_bcn_qinfo_8723a(void *sel, struct bcn_qinfo_8723a *info, const char *tag)
+{
+ //if (info->pkt_num)
+ DBG_871X_SEL_NL(sel, "%shead:0x%02x, pkt_num:%u\n"
+ , tag ? tag : "", info->head, info->pkt_num
+ );
+}
+
+void dump_mac_qinfo_8723a(void *sel, _adapter *adapter)
+{
+ u32 q0_info;
+ u32 q1_info;
+ u32 q2_info;
+ u32 q3_info;
+ u32 q4_info;
+ u32 q5_info;
+ u32 q6_info;
+ u32 q7_info;
+ u32 mg_q_info;
+ u32 hi_q_info;
+ u16 bcn_q_info;
+
+ q0_info = rtw_read32(adapter, REG_Q0_INFO);
+ q1_info = rtw_read32(adapter, REG_Q1_INFO);
+ q2_info = rtw_read32(adapter, REG_Q2_INFO);
+ q3_info = rtw_read32(adapter, REG_Q3_INFO);
+ q4_info = rtw_read32(adapter, REG_Q4_INFO);
+ q5_info = rtw_read32(adapter, REG_Q5_INFO);
+ q6_info = rtw_read32(adapter, REG_Q6_INFO);
+ q7_info = rtw_read32(adapter, REG_Q7_INFO);
+ mg_q_info = rtw_read32(adapter, REG_MGQ_INFO);
+ hi_q_info = rtw_read32(adapter, REG_HGQ_INFO);
+ bcn_q_info = rtw_read16(adapter, REG_BCNQ_INFO);
+
+ dump_qinfo_8723a(sel, (struct qinfo_8723a *)&q0_info, "Q0 ");
+ dump_qinfo_8723a(sel, (struct qinfo_8723a *)&q1_info, "Q1 ");
+ dump_qinfo_8723a(sel, (struct qinfo_8723a *)&q2_info, "Q2 ");
+ dump_qinfo_8723a(sel, (struct qinfo_8723a *)&q3_info, "Q3 ");
+ dump_qinfo_8723a(sel, (struct qinfo_8723a *)&q4_info, "Q4 ");
+ dump_qinfo_8723a(sel, (struct qinfo_8723a *)&q5_info, "Q5 ");
+ dump_qinfo_8723a(sel, (struct qinfo_8723a *)&q6_info, "Q6 ");
+ dump_qinfo_8723a(sel, (struct qinfo_8723a *)&q7_info, "Q7 ");
+ dump_qinfo_8723a(sel, (struct qinfo_8723a *)&mg_q_info, "MG ");
+ dump_qinfo_8723a(sel, (struct qinfo_8723a *)&hi_q_info, "HI ");
+ dump_bcn_qinfo_8723a(sel, (struct bcn_qinfo_8723a *)&bcn_q_info, "BCN ");
+}
+
void GetHwReg8723A(PADAPTER padapter, u8 variable, u8 *val)
{
PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
*val = pHalData->bMacPwrCtrlOn;
break;
case HW_VAR_CHK_HI_QUEUE_EMPTY:
- *val = ((rtw_read32(padapter, REG_HGQ_INFORMATION)&0x0000ff00)==0) ? _TRUE:_FALSE;
+ *val = ((rtw_read32(padapter, REG_HGQ_INFO)&0x0000ff00)==0) ? _TRUE:_FALSE;
break;
case HW_VAR_C2HEVT_CLEAR:
*val = rtw_read8(padapter, REG_C2HEVT_CLEAR);
break;
case HW_VAR_C2HEVT_MSG_NORMAL:
*val = rtw_read8(padapter, REG_C2HEVT_MSG_NORMAL);
- break;
+ break;
+ case HW_VAR_DUMP_MAC_QUEUE_INFO:
+ dump_mac_qinfo_8723a(val, padapter);
+ break;
+ default:
+ GetHwReg(padapter, variable, val);
+ break;
+ }
+}
+
+u8
+GetHalDefVar8723A(
+ IN PADAPTER Adapter,
+ IN HAL_DEF_VARIABLE eVariable,
+ IN PVOID pValue
+ )
+{
+ HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
+ u8 bResult = _SUCCESS;
+
+ switch(eVariable) {
+
+ case HAL_DEF_MACID_SLEEP:
+ *(u8*)pValue = _TRUE; // support macid sleep
+ break;
+
+ default:
+ bResult = GetHalDefVar(Adapter, eVariable, pValue);
+ break;
}
+
+ return bResult;
}
#ifdef CONFIG_BT_COEXIST
\r
}\r
\r
+#define MGN_2M 0x04\r
+s8 tx_power_extra_bias(\r
+ IN u8 RFPath,\r
+ IN u8 Rate, \r
+ IN HT_CHANNEL_WIDTH BandWidth, \r
+ IN u8 Channel\r
+ )\r
+{\r
+ s8 bias = 0;\r
+\r
+ if (Rate == MGN_2M)\r
+ bias = -9;\r
+\r
+ return bias;\r
+}\r
\r
/*-----------------------------------------------------------------------------\r
* Function: PHY_RF6052SetCckTxPower\r
BOOLEAN TurboScanOff = _FALSE;\r
u8 idx1, idx2;\r
u8* ptr;\r
+ s8 bias_2m;\r
\r
// 2010/10/18 MH Accorsing to SD3 eechou's suggestion, we need to disable turbo scan for RU.\r
// Otherwise, external PA will be broken if power index > 0x20.\r
\r
for(idx1=RF_PATH_A; idx1<=RF_PATH_B; idx1++)\r
{\r
+ bias_2m = tx_power_extra_bias(idx1, MGN_2M, 0, 0);\r
ptr = (u8*)(&(TxAGC[idx1]));\r
for(idx2=0; idx2<4; idx2++)\r
{\r
+ if (idx2 == 1) /* 2M */\r
+ {\r
+ s16 value = *ptr + bias_2m;\r
+ if (value < 0)\r
+ value = 0;\r
+ else if (value > RF6052_MAX_TX_PWR)\r
+ value = RF6052_MAX_TX_PWR;\r
+\r
+ *ptr = (u8)value;\r
+ }\r
if(*ptr > RF6052_MAX_TX_PWR)\r
*ptr = RF6052_MAX_TX_PWR;\r
ptr++;\r
tmpval = TxAGC[RF_PATH_A]>>8;\r
PHY_SetBBReg(Adapter, rTxAGC_B_CCK11_A_CCK2_11, 0xffffff00, tmpval);\r
//RTPRINT(FPHY, PHY_TXPWR, ("CCK PWR 2~11M (rf-A) = 0x%x (reg 0x%x)\n", tmpval, rTxAGC_B_CCK11_A_CCK2_11));\r
+ if (0)\r
+ DBG_871X("CCK PWR 2~11M (rf-A) = 0x%x (H3Bytes of reg 0x%x)\n", tmpval, rTxAGC_B_CCK11_A_CCK2_11);\r
\r
// rf-B cck tx power\r
tmpval = TxAGC[RF_PATH_B]>>24;\r
//RTPRINT(FPHY, PHY_TXPWR, ("CCK PWR 11M (rf-B) = 0x%x (reg 0x%x)\n", tmpval, rTxAGC_B_CCK11_A_CCK2_11));\r
tmpval = TxAGC[RF_PATH_B]&0x00ffffff;\r
PHY_SetBBReg(Adapter, rTxAGC_B_CCK1_55_Mcs32, 0xffffff00, tmpval);\r
- //RTPRINT(FPHY, PHY_TXPWR, ("CCK PWR 1~5.5M (rf-B) = 0x%x (reg 0x%x)\n",\r
- // tmpval, rTxAGC_B_CCK1_55_Mcs32));\r
+ //RTPRINT(FPHY, PHY_TXPWR, ("CCK PWR 1~5.5M (rf-B) = 0x%x (reg 0x%x)\n", tmpval, rTxAGC_B_CCK1_55_Mcs32));\r
+ if (0)\r
+ DBG_871X("CCK PWR 1~5.5M (rf-B) = 0x%x (H3Bytes of reg 0x%x)\n", tmpval, rTxAGC_B_CCK1_55_Mcs32);\r
\r
} /* PHY_RF6052SetCckTxPower */\r
\r
#include <drv_types.h>
#include <rtl8723a_hal.h>
-static s32 translate2dbm(u8 signal_strength_idx)
-{
- s32 signal_power; // in dBm.
-
-
- // Translate to dBm (x=0.5y-95).
- signal_power = (s32)((signal_strength_idx + 1) >> 1);
- signal_power -= 95;
-
- return signal_power;
-}
#if 0
static u8 evm_db2percentage(s8 value)
{
if(padapter->recvpriv.is_signal_dbg) {
padapter->recvpriv.signal_strength= padapter->recvpriv.signal_strength_dbg;
- padapter->recvpriv.rssi=(s8)translate2dbm((u8)padapter->recvpriv.signal_strength_dbg);
+ padapter->recvpriv.rssi=(s8)translate_percentage_to_dbm(padapter->recvpriv.signal_strength_dbg);
} else {
padapter->recvpriv.signal_strength= tmp_val;
- padapter->recvpriv.rssi=(s8)translate2dbm((u8)tmp_val);
+ padapter->recvpriv.rssi=(s8)translate_percentage_to_dbm(tmp_val);
}
RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("UI RSSI = %d, ui_rssi.TotalVal = %d, ui_rssi.TotalNum = %d\n", tmp_val, padapter->recvpriv.signal_strength_data.total_val,padapter->recvpriv.signal_strength_data.total_num));
}
#ifdef CONFIG_EFUSE_CONFIG_FILE
-static u32 Hal_readPGDataFromConfigFile(
- PADAPTER padapter)
-{
- u32 i;
- struct file *fp;
- mm_segment_t fs;
- u8 temp[3];
- loff_t pos = 0;
- EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(padapter);
- u8 *PROMContent = pEEPROM->efuse_eeprom_data;
-
-
- temp[2] = 0; // add end of string '\0'
-
- fp = filp_open("/system/etc/wifi/wifi_efuse.map", O_RDONLY, 0);
- if (IS_ERR(fp)) {
- pEEPROM->bloadfile_fail_flag = _TRUE;
- DBG_871X("Error, Efuse configure file doesn't exist.\n");
- return _FAIL;
- }
-
- fs = get_fs();
- set_fs(KERNEL_DS);
-
- DBG_871X("Efuse configure file:\n");
- for (i=0; i<HWSET_MAX_SIZE_88E; i++) {
- vfs_read(fp, temp, 2, &pos);
- PROMContent[i] = simple_strtoul(temp, NULL, 16 );
- pos += 1; // Filter the space character
- DBG_871X("%02X \n", PROMContent[i]);
- }
- DBG_871X("\n");
- set_fs(fs);
-
- filp_close(fp, NULL);
- pEEPROM->bloadfile_fail_flag = _FALSE;
- return _SUCCESS;
-}
-
static void
Hal_ReadMACAddrFromFile_8723AS(
PADAPTER padapter
{
EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(padapter);
// HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
- u8 hwinfo[HWSET_MAX_SIZE];
+ u8* hwinfo = NULL;
+#ifdef CONFIG_EFUSE_CONFIG_FILE
+ struct file *fp = NULL;
+#endif
RT_TRACE(_module_hci_hal_init_c_, _drv_info_, ("====> readpadapterInfo_8723S()\n"));
+ if (sizeof(pEEPROM->efuse_eeprom_data) < HWSET_MAX_SIZE)
+ DBG_871X("[WARNING] size of efuse_eeprom_data is less than HWSET_MAX_SIZE!\n");
+
+ hwinfo = pEEPROM->efuse_eeprom_data;
+
//
// This part read and parse the eeprom/efuse content
//
Hal_InitPGData(padapter, hwinfo);
-#ifdef CONFIG_EFUSE_CONFIG_FILE
- Hal_readPGDataFromConfigFile(padapter, hwinfo);
-#endif
+ /* Check Tx power index info in phy efuse first to decide whether we need to read PG data from external config file or not */
+#ifdef CONFIG_EFUSE_CONFIG_FILE
+ if (check_phy_efuse_tx_power_info_valid(padapter) == _FALSE) {
+ fp = filp_open(EFUSE_MAP_PATH, O_RDONLY, 0);
+ if (fp == NULL || IS_ERR(fp)) {
+ DBG_871X("[WARNING] invalid phy efuse and no efuse file, use driver default!!\n");
+ } else {
+ Hal_readPGDataFromConfigFile(padapter, fp);
+ filp_close(fp, NULL);
+ }
+ }
+#endif //CONFIG_EFUSE_CONFIG_FILE
+
Hal_EfuseParseIDCode(padapter, hwinfo);
Hal_EfuseParsePIDVID_8723AS(padapter, hwinfo, pEEPROM->bautoload_fail_flag);
- Hal_EfuseParseMACAddr_8723AS(padapter, hwinfo, pEEPROM->bautoload_fail_flag);
+ /* Check macaddr info in phy efuse to decide whether we need to get macaddr from external file or not */
#ifdef CONFIG_EFUSE_CONFIG_FILE
- Hal_ReadMACAddrFromFile_8723AS(padapter);
-#endif
+ if (check_phy_efuse_macaddr_info_valid(padapter) == _TRUE) {
+ DBG_871X("using phy efuse mac\n");
+ Hal_GetPhyEfuseMACAddr(padapter, pEEPROM->mac_addr);
+ } else {
+ fp = filp_open(WIFIMAC_PATH, O_RDONLY, 0);
+ if (fp == NULL || IS_ERR(fp)) {
+ DBG_871X("wifimac does not exist!!\n");
+ Hal_GetPhyEfuseMACAddr(padapter, pEEPROM->mac_addr);
+ } else {
+ Hal_ReadMACAddrFromFile(padapter, fp);
+ filp_close(fp, NULL);
+ }
+ }
+#else //CONFIG_EFUSE_CONFIG_FILE
+ Hal_EfuseParseMACAddr_8723AS(padapter, hwinfo, pEEPROM->bautoload_fail_flag);
+#endif //CONFIG_EFUSE_CONFIG_FILE
+
Hal_EfuseParseTxPowerInfo_8723A(padapter, hwinfo, pEEPROM->bautoload_fail_flag);
Hal_EfuseParseBTCoexistInfo_8723A(padapter, hwinfo, pEEPROM->bautoload_fail_flag);
Hal_EfuseParseEEPROMVer(padapter, hwinfo, pEEPROM->bautoload_fail_flag);
*(( u32*)pValue) = MAX_AMPDU_FACTOR_64K;
break;
default:
- bResult = GetHalDefVar(Adapter, eVariable, pValue);
+ bResult = GetHalDefVar8723A(Adapter, eVariable, pValue);
break;
}
//init recv_buf
_rtw_init_queue(&precvpriv->free_recv_buf_queue);
-#ifdef CONFIG_USE_USB_BUFFER_ALLOC_RX
_rtw_init_queue(&precvpriv->recv_buf_pending_queue);
-#endif // CONFIG_USE_USB_BUFFER_ALLOC_RX
precvpriv->pallocated_recv_buf = rtw_zmalloc(NR_RECVBUFF *sizeof(struct recv_buf) + 4);
if(precvpriv->pallocated_recv_buf==NULL){
#ifdef CONFIG_EFUSE_CONFIG_FILE
-static u32 Hal_readPGDataFromConfigFile(
- PADAPTER padapter)
-{
- u32 i;
- struct file *fp;
- mm_segment_t fs;
- u8 temp[3];
- loff_t pos = 0;
- EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(padapter);
- u8 *PROMContent = pEEPROM->efuse_eeprom_data;
-
-
- temp[2] = 0; // add end of string '\0'
-
- fp = filp_open("/system/etc/wifi/wifi_efuse.map", O_RDWR, 0644);
- if (IS_ERR(fp)) {
- pEEPROM->bloadfile_fail_flag= _TRUE;
- DBG_871X("Error, Efuse configure file doesn't exist.\n");
- return _FAIL;
- }
-
- fs = get_fs();
- set_fs(KERNEL_DS);
-
- DBG_871X("Efuse configure file:\n");
- for (i=0; i<HWSET_MAX_SIZE_88E; i++) {
- vfs_read(fp, temp, 2, &pos);
- PROMContent[i] = simple_strtoul(temp, NULL, 16 );
- pos += 1; // Filter the space character
- DBG_871X("%02X \n", PROMContent[i]);
- }
- DBG_871X("\n");
- set_fs(fs);
-
- filp_close(fp, NULL);
-
- pEEPROM->bloadfile_fail_flag= _FALSE;
- return _SUCCESS;
-}
-
-
static void
Hal_ReadMACAddrFromFile_8723AU(
PADAPTER padapter
{
EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(padapter);
//PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
- u8 hwinfo[HWSET_MAX_SIZE];
-
+ u8* hwinfo = NULL;
#ifdef CONFIG_EFUSE_CONFIG_FILE
- Hal_readPGDataFromConfigFile(padapter);
-#else //CONFIG_EFUSE_CONFIG_FILE
+ struct file *fp = NULL;
+#endif
+
+ if (sizeof(pEEPROM->efuse_eeprom_data) < HWSET_MAX_SIZE)
+ DBG_871X("[WARNING] size of efuse_eeprom_data is less than HWSET_MAX_SIZE!\n");
+
+ hwinfo = pEEPROM->efuse_eeprom_data;
+
Hal_InitPGData(padapter, hwinfo);
-#endif //CONFIG_EFUSE_CONFIG_FILE
+
+ /* Check Tx power index info in phy efuse first to decide whether we need to read PG data from external config file or not */
+#ifdef CONFIG_EFUSE_CONFIG_FILE
+ if (check_phy_efuse_tx_power_info_valid(padapter) == _FALSE) {
+ fp = filp_open(EFUSE_MAP_PATH, O_RDONLY, 0);
+ if (fp == NULL || IS_ERR(fp)) {
+ DBG_871X("[WARNING] invalid phy efuse and no efuse file, use driver default!!\n");
+ } else {
+ Hal_readPGDataFromConfigFile(padapter, fp);
+ filp_close(fp, NULL);
+ }
+ }
+#endif //CONFIG_EFUSE_CONFIG_FILE
+
Hal_EfuseParseIDCode(padapter, hwinfo);
Hal_EfuseParsePIDVID_8723AU(padapter, hwinfo, pEEPROM->bautoload_fail_flag);
Hal_EfuseParseEEPROMVer(padapter, hwinfo, pEEPROM->bautoload_fail_flag);
+
+ /* Check macaddr info in phy efuse to decide whether we need to get macaddr from external file or not */
#ifdef CONFIG_EFUSE_CONFIG_FILE
- Hal_ReadMACAddrFromFile_8723AU(padapter);
+ if (check_phy_efuse_macaddr_info_valid(padapter) == _TRUE) {
+ DBG_871X("using phy efuse mac\n");
+ Hal_GetPhyEfuseMACAddr(padapter, pEEPROM->mac_addr);
+ } else {
+ fp = filp_open(WIFIMAC_PATH, O_RDONLY, 0);
+ if (fp == NULL || IS_ERR(fp)) {
+ DBG_871X("wifimac does not exist!!\n");
+ Hal_GetPhyEfuseMACAddr(padapter, pEEPROM->mac_addr);
+ } else {
+ Hal_ReadMACAddrFromFile(padapter, fp);
+ filp_close(fp, NULL);
+ }
+ }
#else //CONFIG_EFUSE_CONFIG_FILE
Hal_EfuseParseMACAddr_8723AU(padapter, hwinfo, pEEPROM->bautoload_fail_flag);
-#endif
+#endif //CONFIG_EFUSE_CONFIG_FILE
+
Hal_EfuseParseTxPowerInfo_8723A(padapter, hwinfo, pEEPROM->bautoload_fail_flag);
_ReadBoardType(padapter, hwinfo, pEEPROM->bautoload_fail_flag);
Hal_EfuseParseBTCoexistInfo_8723A(padapter, hwinfo, pEEPROM->bautoload_fail_flag);
//
Hal_InitChannelPlan(padapter);
-
+#ifdef CONFIG_RF_GAIN_OFFSET
+ Hal_ReadRFGainOffset(padapter, hwinfo, pEEPROM->bautoload_fail_flag);
+#endif //CONFIG_RF_GAIN_OFFSET
//hal_CustomizedBehavior_8723U(Adapter);
// Query setting of specified variable.
//
u8
-GetHalDefVar8192CUsb(
+GetHalDefVar8723AUsb(
IN PADAPTER Adapter,
IN HAL_DEF_VARIABLE eVariable,
IN PVOID pValue
*(( u32*)pValue) = MAX_AMPDU_FACTOR_64K;
break;
default:
- bResult = GetHalDefVar(Adapter, eVariable, pValue);
+ bResult = GetHalDefVar8723A(Adapter, eVariable, pValue);
break;
}
// Change default setting of specified variable.
//
u8
-SetHalDefVar8192CUsb(
+SetHalDefVar8723AUsb(
IN PADAPTER Adapter,
IN HAL_DEF_VARIABLE eVariable,
IN PVOID pValue
pHalFunc->SetHwRegHandler = &SetHwReg8723AU;
pHalFunc->GetHwRegHandler = &GetHwReg8723AU;
- pHalFunc->GetHalDefVarHandler = &GetHalDefVar8192CUsb;
- pHalFunc->SetHalDefVarHandler = &SetHalDefVar8192CUsb;
+ pHalFunc->GetHalDefVarHandler = &GetHalDefVar8723AUsb;
+ pHalFunc->SetHalDefVarHandler = &SetHalDefVar8723AUsb;
pHalFunc->UpdateRAMaskHandler = &UpdateHalRAMask8192CUsb;
_pkt *pskb;
_adapter *padapter = (_adapter*)priv;
struct recv_priv *precvpriv = &padapter->recvpriv;
+ struct recv_buf *precvbuf = NULL;
while (NULL != (pskb = skb_dequeue(&precvpriv->rx_skb_queue)))
{
#endif
}
-
+ while (NULL != (precvbuf = rtw_dequeue_recvbuf(&precvpriv->recv_buf_pending_queue)))
+ {
+ DBG_871X("dequeue_recvbuf %p\n", precvbuf);
+ precvbuf->pskb = NULL;
+ precvbuf->reuse = _FALSE;
+ rtw_read_port(padapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf);
+ }
}
if(precvbuf->pskb == NULL)
{
RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("init_recvbuf(): alloc_skb fail!\n"));
+ DBG_8192C("#### usb_read_port() alloc_skb fail! precvbuf=%p #####\n", precvbuf);
+ //enqueue precvbuf and wait for free skb
+ rtw_enqueue_recvbuf(precvbuf, &precvpriv->recv_buf_pending_queue);
return _FAIL;
}
/******************************************************************************
*
* Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.
- *
+ *
* This program is free software; you can redistribute it and/or modify it
* under the terms of version 2 of the GNU General Public License as
* published by the Free Software Foundation.
#define CONFIG_ODM_REFRESH_RAMASK
#define CONFIG_PHY_SETTING_WITH_ODM
+
/*
- * Public General Config
+ * Automatically generated C config: don't edit
*/
#define AUTOCONF_INCLUDED
#define CONFIG_USB_HCI
#define PLATFORM_LINUX
-#define CONFIG_EMBEDDED_FWIMG
+#define CONFIG_EMBEDDED_FWIMG
//#define CONFIG_FILE_FWIMG
/*
* Functions Config
*/
-
#define CONFIG_XMIT_ACK
#ifdef CONFIG_XMIT_ACK
#define CONFIG_ACTIVE_KEEP_ALIVE_CHECK
#endif
-#define CONFIG_80211N_HT
-#define CONFIG_RECV_REORDERING_CTRL
+#define CONFIG_80211N_HT
+#define CONFIG_RECV_REORDERING_CTRL
#define SUPPORT_HW_RFOFF_DETECTED
#ifdef CONFIG_IOCTL_CFG80211
#define RTW_USE_CFG80211_STA_EVENT /* Indecate new sta asoc through cfg80211_new_sta */
#define CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER
- //#define CONFIG_DEBUG_CFG80211
+ //#define CONFIG_DEBUG_CFG80211
#define CONFIG_SET_SCAN_DENY_TIMER
#endif
-#define CONFIG_AP_MODE
+#define CONFIG_AP_MODE
#ifdef CONFIG_AP_MODE
- #define CONFIG_NATIVEAP_MLME
+ #define CONFIG_NATIVEAP_MLME
#ifndef CONFIG_NATIVEAP_MLME
- #define CONFIG_HOSTAPD_MLME
- #endif
- //#define CONFIG_FIND_BEST_CHANNEL
- //#define CONFIG_NO_WIRELESS_HANDLERS
+ #define CONFIG_HOSTAPD_MLME
+ #endif
+ //#define CONFIG_FIND_BEST_CHANNEL
+ //#define CONFIG_NO_WIRELESS_HANDLERS
#endif
-#define CONFIG_P2P
+#define CONFIG_P2P
#ifdef CONFIG_P2P
//Added by Albert 20110812
//The CONFIG_WFD is for supporting the Wi-Fi display
#define CONFIG_WFD
-
+
#ifndef CONFIG_WIFI_TEST
#define CONFIG_P2P_REMOVE_GROUP_INFO
#endif
#endif
// Added by Kurt 20110511
-//#define CONFIG_TDLS
+//#define CONFIG_TDLS
#ifdef CONFIG_TDLS
// #ifndef CONFIG_WFD
// #define CONFIG_WFD
#define USB_INTERFERENCE_ISSUE // this should be checked in all usb interface
//#define CONFIG_ADAPTOR_INFO_CACHING_FILE // now just applied on 8192cu only, should make it general...
-#define CONFIG_RESUME_IN_WORKQUEUE
+//#define CONFIG_RESUME_IN_WORKQUEUE
//#define CONFIG_SET_SCAN_DENY_TIMER
#define CONFIG_LONG_DELAY_ISSUE
#define CONFIG_NEW_SIGNAL_STAT_PROCESS
-#define RTW_NOTCH_FILTER 0 /* 0:Disable, 1:Enable, */
+#define RTW_NOTCH_FILTER 0 /* 0:Disable, 1:Enable, */
#define CONFIG_DEAUTH_BEFORE_CONNECT
+//#define CONFIG_PATCH_JOIN_WRONG_CHANNEL
//#define CONFIG_ANTENNA_DIVERSITY
*/
#define DBG 0
-#define CONFIG_DEBUG /* DBG_871X, etc... */
+//#define CONFIG_DEBUG /* DBG_871X, etc... */
//#define CONFIG_DEBUG_RTL871X /* RT_TRACE, RT_PRINT_DATA, _func_enter_, _func_exit_ */
#define CONFIG_PROC_DEBUG
#define DBG_CONFIG_ERROR_DETECT
#define DBG_CONFIG_ERROR_RESET
-//#define DBG_IO
-//#define DBG_DELAY_OS
-//#define DBG_MEM_ALLOC
-//#define DBG_IOCTL
-
-//#define DBG_TX
//#define DBG_XMIT_BUF
-//#define DBG_TX_DROP_FRAME
-
-//#define DBG_RX_DROP_FRAME
-//#define DBG_RX_SEQ
-
-//#define DBG_SHOW_MCUFWDL_BEFORE_51_ENABLE
-//#define DBG_ROAMING_TEST
-
-//#define DBG_HAL_INIT_PROFILING
-
-//#define DBG_MEMORY_LEAK 1
-
-//TX use 1 urb
-//#define CONFIG_SINGLE_XMIT_BUF
-//RX use 1 urb
-//#define CONFIG_SINGLE_RECV_BUF
+//#define DBG_XMIT_BUF_EXT
#define CONFIG_USB_VENDOR_REQ_MUTEX
#endif
+#define DYNAMIC_CAMID_ALLOC
+
+#ifndef CONFIG_RTW_HIQ_FILTER
+ #define CONFIG_RTW_HIQ_FILTER 1
+#endif
//#include <rtl871x_byteorder.h>
#endif
u8 regulatory_tid;
u8 qos_opt_enable;
+
+ u8 hiq_filter;
};
#endif
+struct cam_ctl_t {
+ _lock lock;
+ u64 bitmap;
+};
+
+struct cam_entry_cache {
+ u16 ctrl;
+ u8 mac[ETH_ALEN];
+ u8 key[16];
+};
+
+#define KEY_FMT "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x"
+#define KEY_ARG(x) ((u8*)(x))[0],((u8*)(x))[1],((u8*)(x))[2],((u8*)(x))[3],((u8*)(x))[4],((u8*)(x))[5], \
+ ((u8*)(x))[6],((u8*)(x))[7],((u8*)(x))[8],((u8*)(x))[9],((u8*)(x))[10],((u8*)(x))[11], \
+ ((u8*)(x))[12],((u8*)(x))[13],((u8*)(x))[14],((u8*)(x))[15]
+
struct dvobj_priv
{
_adapter *if1; //PRIMARY_ADAPTER
_adapter *padapters[IFACE_ID_MAX];
u8 iface_nums; // total number of ifaces used runtime
+ struct cam_ctl_t cam_ctl;
+ struct cam_entry_cache cam_cache[32];
+
//For 92D, DMDP have 2 interface.
u8 InterfaceNumber;
u8 NumInterfaces;
void c2h_evt_clear(_adapter *adapter);
s32 c2h_evt_read(_adapter *adapter, u8 *buf);
+void SetHwReg(_adapter *adapter, u8 variable, u8 *val);
+void GetHwReg(_adapter *adapter, u8 variable, u8 *val);
+
u8 SetHalDefVar(_adapter *adapter, HAL_DEF_VARIABLE variable, void *value);
u8 GetHalDefVar(_adapter *adapter, HAL_DEF_VARIABLE variable, void *value);
+#ifdef CONFIG_RF_GAIN_OFFSET
+void rtw_bb_rf_gain_offset(_adapter *padapter);
+#endif //CONFIG_RF_GAIN_OFFSET
+
+#ifdef CONFIG_EFUSE_CONFIG_FILE
+#define EFUSE_FILE_COLUMN_NUM 16
+u32 Hal_readPGDataFromConfigFile(PADAPTER padapter, struct file *fp);
+void Hal_ReadMACAddrFromFile(PADAPTER padapter, struct file *fp);
+void Hal_GetPhyEfuseMACAddr(PADAPTER padapter, u8* mac_addr);
+int check_phy_efuse_tx_power_info_valid(PADAPTER padapter);
+int check_phy_efuse_macaddr_info_valid(PADAPTER padapter);
+#endif //CONFIG_EFUSE_CONFIG_FILE
+
+
#endif //__HAL_COMMON_H__
--- /dev/null
+/******************************************************************************\r
+ *\r
+ * Copyright(c) 2007 - 2013 Realtek Corporation. All rights reserved.\r
+ * \r
+ * This program is free software; you can redistribute it and/or modify it\r
+ * under the terms of version 2 of the GNU General Public License as\r
+ * published by the Free Software Foundation.\r
+ *\r
+ * This program is distributed in the hope that it will be useful, but WITHOUT\r
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\r
+ * more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License along with\r
+ * this program; if not, write to the Free Software Foundation, Inc.,\r
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\r
+ *\r
+ *\r
+ ******************************************************************************/\r
+#ifndef __HAL_COMMON_REG_H__\r
+#define __HAL_COMMON_REG_H__\r
+\r
+//-----------------------------------------------------\r
+//\r
+// 0x0400h ~ 0x047Fh Protocol Configuration\r
+//\r
+//-----------------------------------------------------\r
+\r
+/* 92C, 92D */\r
+#define REG_VOQ_INFO 0x0400\r
+#define REG_VIQ_INFO 0x0404\r
+#define REG_BEQ_INFO 0x0408\r
+#define REG_BKQ_INFO 0x040C\r
+\r
+/* 88E, 8723A, 8812A, 8821A, 92E, 8723B */\r
+#define REG_Q0_INFO 0x400\r
+#define REG_Q1_INFO 0x404\r
+#define REG_Q2_INFO 0x408\r
+#define REG_Q3_INFO 0x40C\r
+\r
+#define REG_MGQ_INFO 0x0410\r
+#define REG_HGQ_INFO 0x0414\r
+#define REG_BCNQ_INFO 0x0418\r
+\r
+/* 8723A, 8812A, 8821A, 92E, 8723B */\r
+#define REG_Q4_INFO 0x468\r
+#define REG_Q5_INFO 0x46C\r
+#define REG_Q6_INFO 0x470\r
+#define REG_Q7_INFO 0x474\r
+\r
+/* 8723A */\r
+#define REG_MACID_DROP 0x04D0\r
+\r
+/* 8723A, 8723B, 92E, 8812A, 8821A */\r
+#define REG_MACID_SLEEP 0x04D4\r
+\r
+// Security\r
+#define REG_CAMCMD 0x0670\r
+#define REG_CAMWRITE 0x0674\r
+#define REG_CAMREAD 0x0678\r
+#define REG_CAMDBG 0x067C\r
+#define REG_SECCFG 0x0680\r
+\r
+//----------------------------------------------------------------------------\r
+// CAM Config Setting (offset 0x680, 1 byte)\r
+//---------------------------------------------------------------------------- \r
+#define CAM_VALID BIT15\r
+#define CAM_NOTVALID 0x0000\r
+#define CAM_USEDK BIT5\r
+\r
+#define CAM_CONTENT_COUNT 8\r
+\r
+#define CAM_NONE 0x0\r
+#define CAM_WEP40 0x01\r
+#define CAM_TKIP 0x02\r
+#define CAM_AES 0x04\r
+#define CAM_WEP104 0x05\r
+#define CAM_SMS4 0x6\r
+\r
+#define TOTAL_CAM_ENTRY 32\r
+#define HALF_CAM_ENTRY 16 \r
+ \r
+#define CAM_CONFIG_USEDK _TRUE\r
+#define CAM_CONFIG_NO_USEDK _FALSE\r
+\r
+#define CAM_WRITE BIT16\r
+#define CAM_READ 0x00000000\r
+#define CAM_POLLINIG BIT31\r
+\r
+\r
+//2 SECCFG\r
+#define SCR_TxUseDK BIT(0) //Force Tx Use Default Key\r
+#define SCR_RxUseDK BIT(1) //Force Rx Use Default Key\r
+#define SCR_TxEncEnable BIT(2) //Enable Tx Encryption\r
+#define SCR_RxDecEnable BIT(3) //Enable Rx Decryption\r
+#define SCR_SKByA2 BIT(4) //Search kEY BY A2\r
+#define SCR_NoSKMC BIT(5) //No Key Search Multicast\r
+#define SCR_TXBCUSEDK BIT(6) // Force Tx Broadcast packets Use Default Key\r
+#define SCR_RXBCUSEDK BIT(7) // Force Rx Broadcast packets Use Default Key\r
+#define SCR_CHK_KEYID BIT(8)\r
+\r
+#endif //__HAL_COMMON_H__\r
+\r
HW_VAR_RESP_SIFS,
HW_VAR_ACK_PREAMBLE,
HW_VAR_SEC_CFG,
+ HW_VAR_SEC_DK_CFG,
HW_VAR_BCN_VALID,
HW_VAR_RF_TYPE,
HW_VAR_DM_FLAG,
HW_VAR_READ_LLT_TAB,
HW_VAR_C2HEVT_CLEAR,
HW_VAR_C2HEVT_MSG_NORMAL,
+ HW_VAR_DUMP_MAC_QUEUE_INFO,
+ HW_VAR_MACID_SLEEP,
+ HW_VAR_MACID_WAKEUP,
}HW_VARIABLES;
typedef enum _HAL_DEF_VARIABLE{
HW_DEF_FA_CNT_DUMP,
HW_DEF_ODM_DBG_FLAG,
HW_DEF_ODM_DBG_LEVEL,
+ HAL_DEF_MACID_SLEEP, // Support for MACID sleep
}HAL_DEF_VARIABLE;
typedef enum _HAL_ODM_VARIABLE{
s32 rtw_hal_c2h_handler(_adapter *adapter, struct c2h_evt_hdr *c2h_evt);
c2h_id_filter rtw_hal_c2h_id_filter_ccx(_adapter *adapter);
+s32 rtw_hal_macid_sleep(PADAPTER padapter, u8 macid);
+s32 rtw_hal_macid_wakeup(PADAPTER padapter, u8 macid);
+
#endif //__HAL_INTF_H__
void rtw_ips_dev_unload(_adapter *padapter);
-#ifdef CONFIG_RF_GAIN_OFFSET
-void rtw_bb_rf_gain_offset(_adapter *padapter);
-#endif //CONFIG_RF_GAIN_OFFSET
-
#ifdef CONFIG_IPS
int rtw_ips_pwr_up(_adapter *padapter);
void rtw_ips_pwr_down(_adapter *padapter);
#define __RTL8188E_SPEC_H__\r
\r
#include <drv_conf.h>\r
+#include "hal_com_reg.h"\r
\r
#ifndef BIT\r
#define BIT(x) (1 << (x))\r
// 0x0400h ~ 0x047Fh Protocol Configuration\r
//\r
//-----------------------------------------------------\r
-#define REG_VOQ_INFORMATION 0x0400\r
-#define REG_VIQ_INFORMATION 0x0404\r
-#define REG_BEQ_INFORMATION 0x0408\r
-#define REG_BKQ_INFORMATION 0x040C\r
-#define REG_MGQ_INFORMATION 0x0410\r
-#define REG_HGQ_INFORMATION 0x0414\r
-#define REG_BCNQ_INFORMATION 0x0418\r
#define REG_TXPKT_EMPTY 0x041A\r
\r
#define REG_CPU_MGQ_INFORMATION 0x041C\r
#define REG_RXERR_RPT 0x0664\r
#define REG_WMAC_TRXPTCL_CTL 0x0668\r
\r
-// Security\r
-#define REG_CAMCMD 0x0670\r
-#define REG_CAMWRITE 0x0674\r
-#define REG_CAMREAD 0x0678\r
-#define REG_CAMDBG 0x067C\r
-#define REG_SECCFG 0x0680\r
-\r
// Power\r
#define REG_WOW_CTRL 0x0690\r
#define REG_PS_RX_INFO 0x0692\r
#define BW_OPMODE_20MHZ BIT2\r
#define BW_OPMODE_5G BIT1\r
\r
-\r
-//----------------------------------------------------------------------------\r
-// 8192C CAM Config Setting (offset 0x250, 1 byte)\r
-//----------------------------------------------------------------------------\r
-#define CAM_VALID BIT15\r
-#define CAM_NOTVALID 0x0000\r
-#define CAM_USEDK BIT5\r
-\r
-#define CAM_CONTENT_COUNT 8\r
- \r
-#define CAM_NONE 0x0\r
-#define CAM_WEP40 0x01\r
-#define CAM_TKIP 0x02\r
-#define CAM_AES 0x04\r
-#define CAM_WEP104 0x05\r
-#define CAM_SMS4 0x6\r
- \r
-#define TOTAL_CAM_ENTRY 32\r
-#define HALF_CAM_ENTRY 16 \r
- \r
-#define CAM_CONFIG_USEDK _TRUE\r
-#define CAM_CONFIG_NO_USEDK _FALSE\r
- \r
-#define CAM_WRITE BIT16\r
-#define CAM_READ 0x00000000\r
-#define CAM_POLLINIG BIT31\r
-\r
-#define SCR_UseDK 0x01\r
-#define SCR_TxSecEnable 0x02\r
-#define SCR_RxSecEnable 0x04\r
-\r
//\r
// 10. Power Save Control Registers (Offset: 0x0260 - 0x02DF)\r
//\r
#define APP_MIC BIT(30)\r
#define APP_FCS BIT(31)\r
\r
-\r
-//2 SECCFG\r
-#define SCR_TxUseDK BIT(0) //Force Tx Use Default Key\r
-#define SCR_RxUseDK BIT(1) //Force Rx Use Default Key\r
-#define SCR_TxEncEnable BIT(2) //Enable Tx Encryption\r
-#define SCR_RxDecEnable BIT(3) //Enable Rx Decryption\r
-#define SCR_SKByA2 BIT(4) //Search kEY BY A2\r
-#define SCR_NoSKMC BIT(5) //No Key Search Multicast\r
-#define SCR_TXBCUSEDK BIT(6) // Force Tx Broadcast packets Use Default Key\r
-#define SCR_RXBCUSEDK BIT(7) // Force Rx Broadcast packets Use Default Key\r
-\r
-\r
//-----------------------------------------------------\r
//\r
// RTL8188E SDIO Configuration\r
#define __RTL8192C_SPEC_H__
#include <drv_conf.h>
+#include "hal_com_reg.h"
//============================================================
// 8192C Regsiter offset definition
// 0x0400h ~ 0x047Fh Protocol Configuration
//
//-----------------------------------------------------
-#define REG_VOQ_INFORMATION 0x0400
-#define REG_VIQ_INFORMATION 0x0404
-#define REG_BEQ_INFORMATION 0x0408
-#define REG_BKQ_INFORMATION 0x040C
-#define REG_MGQ_INFORMATION 0x0410
-#define REG_HGQ_INFORMATION 0x0414
-#define REG_BCNQ_INFORMATION 0x0418
-
-
#define REG_CPU_MGQ_INFORMATION 0x041C
#define REG_FWHW_TXQ_CTRL 0x0420
#define REG_HWSEQ_CTRL 0x0423
#define REG_WMAC_TRXPTCL_CTL 0x0668
-// Security
-#define REG_CAMCMD 0x0670
-#define REG_CAMWRITE 0x0674
-#define REG_CAMREAD 0x0678
-#define REG_CAMDBG 0x067C
-#define REG_SECCFG 0x0680
-
// Power
#define REG_WOW_CTRL 0x0690
#define REG_PSSTATUS 0x0691
#define BW_OPMODE_5G BIT1
#define BW_OPMODE_11J BIT0
-
-//----------------------------------------------------------------------------
-// 8192C CAM Config Setting (offset 0x250, 1 byte)
-//----------------------------------------------------------------------------
-#define CAM_VALID BIT15
-#define CAM_NOTVALID 0x0000
-#define CAM_USEDK BIT5
-
-#define CAM_CONTENT_COUNT 8
-
-#define CAM_NONE 0x0
-#define CAM_WEP40 0x01
-#define CAM_TKIP 0x02
-#define CAM_AES 0x04
-#define CAM_WEP104 0x05
-
-#define TOTAL_CAM_ENTRY 32
-#define HALF_CAM_ENTRY 16
-
-#define CAM_CONFIG_USEDK _TRUE
-#define CAM_CONFIG_NO_USEDK _FALSE
-
-#define CAM_WRITE BIT16
-#define CAM_READ 0x00000000
-#define CAM_POLLINIG BIT31
-
-#define SCR_UseDK 0x01
-#define SCR_TxSecEnable 0x02
-#define SCR_RxSecEnable 0x04
-
-
//
// 12. Host Interrupt Status Registers (Offset: 0x0300 - 0x030F)
//
#define RXERR_RPT_RST BIT(27)
#define _RXERR_RPT_SEL(type) ((type) << 28)
-
-//2 SECCFG
-#define SCR_TxUseDK BIT(0) //Force Tx Use Default Key
-#define SCR_RxUseDK BIT(1) //Force Rx Use Default Key
-#define SCR_TxEncEnable BIT(2) //Enable Tx Encryption
-#define SCR_RxDecEnable BIT(3) //Enable Rx Decryption
-#define SCR_SKByA2 BIT(4) //Search kEY BY A2
-#define SCR_NoSKMC BIT(5) //No Key Search Multicast
-
-
-
//-----------------------------------------------------
//
// 0xFE00h ~ 0xFE55h USB Configuration
#define __RTL8192D_SPEC_H__
#include <drv_conf.h>
+#include "hal_com_reg.h"
//============================================================
// 8192D Regsiter offset definition
// 0x0400h ~ 0x047Fh Protocol Configuration
//
//-----------------------------------------------------
-#define REG_VOQ_INFORMATION 0x0400
-#define REG_VIQ_INFORMATION 0x0404
-#define REG_BEQ_INFORMATION 0x0408
-#define REG_BKQ_INFORMATION 0x040C
-#define REG_MGQ_INFORMATION 0x0410
-#define REG_HGQ_INFORMATION 0x0414
-#define REG_BCNQ_INFORMATION 0x0418
-
-
#define REG_CPU_MGQ_INFORMATION 0x041C
#define REG_FWHW_TXQ_CTRL 0x0420
#define REG_HWSEQ_CTRL 0x0423
#define REG_RXERR_RPT 0x0664
#define REG_WMAC_TRXPTCL_CTL 0x0668
-
-// Security
-#define REG_CAMCMD 0x0670
-#define REG_CAMWRITE 0x0674
-#define REG_CAMREAD 0x0678
-#define REG_CAMDBG 0x067C
-#define REG_SECCFG 0x0680
-
// Power
#define REG_WOW_CTRL 0x0690
#define REG_PSSTATUS 0x0691
#define BW_OPMODE_5G BIT1
#define BW_OPMODE_11J BIT0
-
-//----------------------------------------------------------------------------
-// 8192C CAM Config Setting (offset 0x250, 1 byte)
-//----------------------------------------------------------------------------
-#define CAM_VALID BIT15
-#define CAM_NOTVALID 0x0000
-#define CAM_USEDK BIT5
-
-#define CAM_CONTENT_COUNT 8
-
-#define CAM_NONE 0x0
-#define CAM_WEP40 0x01
-#define CAM_TKIP 0x02
-#define CAM_AES 0x04
-#define CAM_WEP104 0x05
-#define CAM_SMS4 0x6
-
-
-#define TOTAL_CAM_ENTRY 32
-#define HALF_CAM_ENTRY 16
-
-#define CAM_CONFIG_USEDK _TRUE
-#define CAM_CONFIG_NO_USEDK _FALSE
-
-#define CAM_WRITE BIT16
-#define CAM_READ 0x00000000
-#define CAM_POLLINIG BIT31
-
-#define SCR_UseDK 0x01
-#define SCR_TxSecEnable 0x02
-#define SCR_RxSecEnable 0x04
-
-
//
// 12. Host Interrupt Status Registers (Offset: 0x0300 - 0x030F)
//
#define RXERR_RPT_RST BIT(27)
#define _RXERR_RPT_SEL(type) ((type) << 28)
-
-//2 SECCFG
-#define SCR_TxUseDK BIT(0) //Force Tx Use Default Key
-#define SCR_RxUseDK BIT(1) //Force Rx Use Default Key
-#define SCR_TxEncEnable BIT(2) //Enable Tx Encryption
-#define SCR_RxDecEnable BIT(3) //Enable Rx Decryption
-#define SCR_SKByA2 BIT(4) //Search kEY BY A2
-#define SCR_NoSKMC BIT(5) //No Key Search Multicast
-#define SCR_TXBCUSEDK BIT(6) // Force Tx Broadcast packets Use Default Key
-#define SCR_RXBCUSEDK BIT(7) // Force Rx Broadcast packets Use Default Key
-
-//vivi added for new cam search flow, 20091028
-#ifdef HW_EN_DE_CRYPTION_FOR_NEW_CAM_SEARCH_FLOW
-#define SCR_TxUseBroadcastDK BIT6 //Force Tx Use Broadcast Default Key
-#define SCR_RxUseBroadcastDK BIT7 //Force Rx Use Broadcast Default Key
-#endif
-
-
//-----------------------------------------------------
//
// 0xFE00h ~ 0xFE55h USB Configuration
u8 bC2hBtInfoReqSent;
u8 bForceFwBtInfo;
u8 bForceA2dpSink;
- u8 bBusyTrafficForCoex;
// u8 bForceLps;
// u8 bBtPwrSaveMode;
BTDM_8723A_2ANT btdm2Ant;
void rtl8723a_set_hal_ops(struct hal_ops *pHalFunc);\r
void SetHwReg8723A(PADAPTER padapter, u8 variable, u8 *val);\r
void GetHwReg8723A(PADAPTER padapter, u8 variable, u8 *val);\r
+u8 GetHalDefVar8723A(PADAPTER Adapter, HAL_DEF_VARIABLE eVariable, PVOID pValue);\r
#ifdef CONFIG_BT_COEXIST\r
void rtl8723a_SingleDualAntennaDetection(PADAPTER padapter);\r
#endif\r
//void update_BCNTIM(_adapter *padapter);\r
void rtw_add_bcn_ie(_adapter *padapter, WLAN_BSSID_EX *pnetwork, u8 index, u8 *data, u8 len);\r
void rtw_remove_bcn_ie(_adapter *padapter, WLAN_BSSID_EX *pnetwork, u8 index);\r
-void update_beacon(_adapter *padapter, u8 ie_id, u8 *oui, u8 tx);\r
+void _update_beacon(_adapter *padapter, u8 ie_id, u8 *oui, u8 tx, const char *tag);\r
+#define update_beacon(adapter, ie_id, oui, tx) _update_beacon((adapter), (ie_id), (oui), (tx), __func__)\r
void add_RATid(_adapter *padapter, struct sta_info *psta, u8 rssi_level);\r
void expire_timeout_chk(_adapter *padapter);\r
void update_sta_info_apmode(_adapter *padapter, struct sta_info *psta);\r
pcmd->rspsz = 0;\
} while(0)
+#define init_h2fwcmd_w_parm_no_parm_rsp(pcmd, code) \
+do {\
+ _rtw_init_listhead(&pcmd->list);\
+ pcmd->cmdcode = code;\
+ pcmd->parmbuf = NULL;\
+ pcmd->cmdsz = 0;\
+ pcmd->rsp = NULL;\
+ pcmd->rspsz = 0;\
+} while(0)
+
struct c2h_evt_hdr {
u8 id:4;
u8 plen:4;
struct set_stakey_parm {
u8 addr[ETH_ALEN];
u8 algorithm;
- u8 id;// currently for erasing cam entry if algorithm == _NO_PRIVACY_
+ u8 keyid;
u8 key[16];
};
extern u8 rtw_createbss_cmd(_adapter *padapter);
extern u8 rtw_createbss_cmd_ex(_adapter *padapter, unsigned char *pbss, unsigned int sz);
extern u8 rtw_setphy_cmd(_adapter *padapter, u8 modem, u8 ch);
-extern u8 rtw_setstakey_cmd(_adapter *padapter, u8 *psta, u8 unicast_key, bool enqueue);
-extern u8 rtw_clearstakey_cmd(_adapter *padapter, u8 *psta, u8 entry, u8 enqueue);
+
+struct sta_info;
+extern u8 rtw_setstakey_cmd(_adapter *padapter, struct sta_info *sta, u8 unicast_key, bool enqueue);
+extern u8 rtw_clearstakey_cmd(_adapter *padapter, struct sta_info *sta, u8 enqueue);
+
extern u8 rtw_joinbss_cmd(_adapter *padapter, struct wlan_network* pnetwork);
u8 rtw_disassoc_cmd(_adapter *padapter, u32 deauth_timeout_ms, bool enqueue);
extern u8 rtw_setopmode_cmd(_adapter *padapter, NDIS_802_11_NETWORK_INFRASTRUCTURE networktype, bool enqueue);
GEN_CMD_CODE(_SetChannelSwitch), /*61*/
GEN_CMD_CODE(_TDLS), /*62*/
+ GEN_CMD_CODE(_ChkBMCSleepq), /*63*/
MAX_H2CCMD
};
{GEN_CMD_CODE(_SetChannelSwitch), NULL},/*61*/
{GEN_CMD_CODE(_TDLS), NULL},/*62*/
+ {GEN_CMD_CODE(_ChkBMCSleepq), NULL}, /*63*/
};
#endif
void bb_reg_dump(void *sel, _adapter *adapter);
void rf_reg_dump(void *sel, _adapter *adapter);
+bool rtw_fwdl_test_trigger_chksum_fail(void);
+bool rtw_fwdl_test_trigger_wintint_rdy_fail(void);
+
+u32 rtw_get_wait_hiq_empty_ms(void);
+
#ifdef CONFIG_PROC_DEBUG
ssize_t proc_set_write_reg(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data);
int proc_get_read_reg(struct seq_file *m, void *v);
int proc_get_trx_info(struct seq_file *m, void *v);
ssize_t proc_set_fwdl_test_case(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data);
+ssize_t proc_set_wait_hiq_empty(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data);
#ifdef CONFIG_DBG_COUNTER
int proc_get_rx_logs(struct seq_file *m, void *v);
BOOLEAN bHigherBusyTraffic; // For interrupt migration purpose.
BOOLEAN bHigherBusyRxTraffic; // We may disable Tx interrupt according as Rx traffic.
BOOLEAN bHigherBusyTxTraffic; // We may disable Tx interrupt according as Tx traffic.
+#ifdef CONFIG_BT_COEXIST
+ BOOLEAN bBusyTrafficForCoex;
+#endif
}RT_LINK_DETECT_T, *PRT_LINK_DETECT_T;
struct profile_info {
struct ieee80211_channel remain_on_ch_channel;
enum nl80211_channel_type remain_on_ch_type;
u64 remain_on_ch_cookie;
+ bool not_indic_ro_ch_exp;
bool is_ro_ch;
};
#endif //CONFIG_IOCTL_CFG80211
#ifdef CONFIG_FTP_PROTECT
u8 ftp_lock_flag;
#endif //CONFIG_FTP_PROTECT
+
+ u8 NumOfBcnInfoChkFail;
+ u32 timeBcnInfoChkStart;
};
#ifdef CONFIG_AP_MODE
unsigned int decide_wait_for_beacon_timeout(unsigned int bcn_interval);
void read_cam(_adapter *padapter ,u8 entry);
-void write_cam(_adapter *padapter, u8 entry, u16 ctrl, u8 *mac, u8 *key);
-void clear_cam_entry(_adapter *padapter, u8 entry);
+
+/* modify HW only */
+void _write_cam(_adapter *padapter, u8 entry, u16 ctrl, u8 *mac, u8 *key);
+void _clear_cam_entry(_adapter *padapter, u8 entry);
+void write_cam_from_cache(_adapter *adapter, u8 id);
+
+/* modify both HW and cache */
+void write_cam(_adapter *padapter, u8 id, u16 ctrl, u8 *mac, u8 *key);
+void clear_cam_entry(_adapter *padapter, u8 id);
+
+/* modify cache only */
+void write_cam_cache(_adapter *adapter, u8 id, u16 ctrl, u8 *mac, u8 *key);
+void clear_cam_cache(_adapter *adapter, u8 id);
void invalidate_cam_all(_adapter *padapter);
void CAM_empty_entry(PADAPTER Adapter, u8 ucIndex);
void rtw_get_sec_iv(PADAPTER padapter, u8*pcur_dot11txpn, u8 *StaAddr);
#endif
+u8 rtw_check_invalid_mac_address (u8 *mac_addr);
+
//for sta/adhoc mode
void update_sta_info(_adapter *padapter, struct sta_info *psta);
unsigned int update_basic_rate(unsigned char *ptn, unsigned int ptn_sz);
unsigned int is_ap_in_wep(_adapter *padapter);
unsigned int should_forbid_n_rate(_adapter * padapter);
-extern uint rtw_get_camid(uint macid);
+s16 rtw_get_camid(_adapter *adapter, struct sta_info* sta, s16 kid);
+s16 rtw_camid_search(_adapter *adapter, u8 *addr, s16 kid);
+s16 rtw_camid_alloc(_adapter *adapter, struct sta_info *sta, u8 kid);
+void rtw_camid_free(_adapter *adapter, u8 cam_id);
+
extern void rtw_alloc_macid(_adapter *padapter, struct sta_info *psta);
extern void rtw_release_macid(_adapter *padapter, struct sta_info *psta);
extern u8 rtw_search_max_mac_id(_adapter *padapter);
void report_add_sta_event(_adapter *padapter, unsigned char* MacAddr, int cam_idx);
void beacon_timing_control(_adapter *padapter);
+u8 chk_bmc_sleepq_cmd(_adapter* padapter);
extern u8 set_tx_beacon_cmd(_adapter*padapter);
unsigned int setup_beacon_frame(_adapter *padapter, unsigned char *beacon_frame);
void update_mgnt_tx_rate(_adapter *padapter, u8 rate);
void issue_probereq(_adapter *padapter, NDIS_802_11_SSID *pssid, u8 *da);
s32 issue_probereq_ex(_adapter *padapter, NDIS_802_11_SSID *pssid, u8* da, int try_cnt, int wait_ms);
int issue_nulldata(_adapter *padapter, unsigned char *da, unsigned int power_mode, int try_cnt, int wait_ms);
+s32 issue_nulldata_in_interrupt(PADAPTER padapter, u8 *da);
int issue_qos_nulldata(_adapter *padapter, unsigned char *da, u16 tid, int try_cnt, int wait_ms);
int issue_deauth(_adapter *padapter, unsigned char *da, unsigned short reason);
int issue_deauth_ex(_adapter *padapter, u8 *da, unsigned short reason, int try_cnt, int wait_ms);
u8 mlme_evt_hdl(_adapter *padapter, unsigned char *pbuf);
u8 h2c_msg_hdl(_adapter *padapter, unsigned char *pbuf);
+u8 chk_bmc_sleepq_hdl(_adapter *padapter, unsigned char *pbuf);
u8 tx_beacon_hdl(_adapter *padapter, unsigned char *pbuf);
u8 set_ch_hdl(_adapter *padapter, u8 *pbuf);
u8 set_chplan_hdl(_adapter *padapter, unsigned char *pbuf);
GEN_MLME_EXT_HANDLER(sizeof(struct SetChannelSwitch_param), set_csa_hdl) /*61*/
GEN_MLME_EXT_HANDLER(sizeof(struct TDLSoption_param), tdls_hdl) /*62*/
+ GEN_MLME_EXT_HANDLER(0, chk_bmc_sleepq_hdl) /*63*/
};
#endif
struct ifqueue rx_indicate_queue;
#endif // CONFIG_RX_INDICATE_QUEUE
-#ifdef CONFIG_USE_USB_BUFFER_ALLOC_RX
- _queue recv_buf_pending_queue;
-#endif // CONFIG_USE_USB_BUFFER_ALLOC_RX
#endif //defined(PLATFORM_LINUX) || defined(PLATFORM_FREEBSD)
u8 *pallocated_recv_buf;
_queue free_recv_buf_queue;
u32 free_recv_buf_queue_cnt;
-#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
+#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) || defined(CONFIG_USB_HCI)
_queue recv_buf_pending_queue;
#endif
{
s32 SignalPower; // in dBm.
+#ifdef CONFIG_SKIP_SIGNAL_SCALE_MAPPING
+ // Translate to dBm (x=y-100)
+ SignalPower = SignalStrengthIndex - 100;
+#else
// Translate to dBm (x=0.5y-95).
SignalPower = (s32)((SignalStrengthIndex + 1) >> 1);
SignalPower -= 95;
+#endif
return SignalPower;
}
#endif //CONFIG_IEEE80211W
#define is_wep_enc(alg) (((alg) == _WEP40_) || ((alg) == _WEP104_))
+const char *security_type_str(u8 value);
+
#define _WPA_IE_ID_ 0xdd
#define _WPA2_IE_ID_ 0x30
//u8 szCapability[256]; // For WPA2-PSK using zero-config, by Annie, 2005-09-20.
u8 bWepDefaultKeyIdxSet;
+
+#define DBG_SW_SEC_CNT
+#ifdef DBG_SW_SEC_CNT
+ u64 wep_sw_enc_cnt_bc;
+ u64 wep_sw_enc_cnt_mc;
+ u64 wep_sw_enc_cnt_uc;
+ u64 wep_sw_dec_cnt_bc;
+ u64 wep_sw_dec_cnt_mc;
+ u64 wep_sw_dec_cnt_uc;
+
+ u64 tkip_sw_enc_cnt_bc;
+ u64 tkip_sw_enc_cnt_mc;
+ u64 tkip_sw_enc_cnt_uc;
+ u64 tkip_sw_dec_cnt_bc;
+ u64 tkip_sw_dec_cnt_mc;
+ u64 tkip_sw_dec_cnt_uc;
+
+ u64 aes_sw_enc_cnt_bc;
+ u64 aes_sw_enc_cnt_mc;
+ u64 aes_sw_enc_cnt_uc;
+ u64 aes_sw_dec_cnt_bc;
+ u64 aes_sw_dec_cnt_mc;
+ u64 aes_sw_dec_cnt_uc;
+#endif /* DBG_SW_SEC_CNT */
};
struct sha256_state {
-#define DRIVERVERSION "v4.1.10_10648.20140227_BTCOEX20131115_ver3.4"
+#define DRIVERVERSION "v4.1.11_12622.20141215_BTCOEX20140409_ver3.5"
s32 rtw_xmit(_adapter *padapter, _pkt **pkt);
-
+bool xmitframe_hiq_filter(struct xmit_frame *xmitframe);
#if defined(CONFIG_AP_MODE) || defined(CONFIG_TDLS)
sint xmitframe_enqueue_for_sleeping_sta(_adapter *padapter, struct xmit_frame *pxmitframe);
void stop_sta_xmit(_adapter *padapter, struct sta_info *psta);
dvobj->processing_dev_remove = _FALSE;
_rtw_spinlock_init(&dvobj->lock);
dvobj->macid[1] = _TRUE; //macid=1 for bc/mc stainfo
+ _rtw_spinlock_init(&dvobj->cam_ctl.lock);
//spi init
/* This is the only SPI value that we need to set here, the rest
* comes from the board-peripherals file */
_rtw_mutex_free(&dvobj->h2c_fwcmd_mutex);
_rtw_mutex_free(&dvobj->setch_mutex);
_rtw_mutex_free(&dvobj->setbw_mutex);
+ _rtw_spinlock_free(&dvobj->cam_ctl.lock);
rtw_mfree((u8*)dvobj, sizeof(*dvobj));
dvobj = NULL;
}
_rtw_mutex_free(&dvobj->h2c_fwcmd_mutex);
_rtw_mutex_free(&dvobj->setch_mutex);
_rtw_mutex_free(&dvobj->setbw_mutex);
+ _rtw_spinlock_free(&dvobj->cam_ctl.lock);
rtw_mfree((u8*)dvobj, sizeof(*dvobj));
}
}\r
}\r
\r
+static u64 rtw_get_systime_us(void)\r
+{\r
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,39))\r
+ struct timespec ts;\r
+ get_monotonic_boottime(&ts);\r
+ return ((u64)ts.tv_sec*1000000) + ts.tv_nsec / 1000;\r
+#else\r
+ struct timeval tv;\r
+ do_gettimeofday(&tv);\r
+ return ((u64)tv.tv_sec*1000000) + tv.tv_usec;\r
+#endif\r
+}\r
+\r
#define MAX_BSSINFO_LEN 1000\r
struct cfg80211_bss *rtw_cfg80211_inform_bss(_adapter *padapter, struct wlan_network *pnetwork)\r
{\r
u8 *notify_ie;\r
size_t notify_ielen;\r
s32 notify_signal;\r
- u8 buf[MAX_BSSINFO_LEN], *pbuf;\r
+ //u8 buf[MAX_BSSINFO_LEN];\r
+\r
+ u8 *pbuf;\r
+ size_t buf_size = MAX_BSSINFO_LEN;\r
size_t len,bssinf_len=0;\r
struct rtw_ieee80211_hdr *pwlanhdr;\r
unsigned short *fctrl;\r
struct wiphy *wiphy = wdev->wiphy;\r
struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);\r
\r
+ pbuf = rtw_zmalloc(buf_size);\r
+ if(pbuf == NULL){\r
+ DBG_871X("%s pbuf allocate failed !! \n",__FUNCTION__);\r
+ return bss;\r
+ }\r
\r
//DBG_8192C("%s\n", __func__);\r
\r
bssinf_len = pnetwork->network.IELength+sizeof (struct rtw_ieee80211_hdr_3addr);\r
- if(bssinf_len > MAX_BSSINFO_LEN){\r
- DBG_871X("%s IE Length too long > %d byte \n",__FUNCTION__,MAX_BSSINFO_LEN);\r
+ if(bssinf_len > buf_size){\r
+ DBG_871X("%s IE Length too long > %zu byte \n",__FUNCTION__,buf_size);\r
goto exit;\r
}\r
\r
\r
notify_channel = ieee80211_get_channel(wiphy, freq);\r
\r
- //rtw_get_timestampe_from_ie()\r
- notify_timestamp = jiffies_to_msecs(jiffies)*1000; /* uSec */\r
+ if (0)\r
+ notify_timestamp = le64_to_cpu(*(u64*)rtw_get_timestampe_from_ie(pnetwork->network.IEs));\r
+ else\r
+ notify_timestamp = rtw_get_systime_us();\r
\r
notify_interval = le16_to_cpu(*(u16*)rtw_get_beacon_interval_from_ie(pnetwork->network.IEs));\r
notify_capability = le16_to_cpu(*(u16*)rtw_get_capability_from_ie(pnetwork->network.IEs)); \r
\r
- \r
notify_ie = pnetwork->network.IEs+_FIXED_IE_LENGTH_;\r
notify_ielen = pnetwork->network.IELength-_FIXED_IE_LENGTH_;\r
\r
DBG_8192C("Capability: %X\n", notify_capability);\r
DBG_8192C("Beacon interval: %d\n", notify_interval);\r
DBG_8192C("Signal: %d\n", notify_signal);\r
- DBG_8192C("notify_timestamp: %#018llx\n", notify_timestamp);\r
+ DBG_8192C("notify_timestamp: %llu\n", notify_timestamp);\r
#endif\r
\r
- pbuf = buf;\r
+ //pbuf = buf;\r
\r
pwlanhdr = (struct rtw_ieee80211_hdr *)pbuf; \r
fctrl = &(pwlanhdr->frame_ctl);\r
_rtw_memcpy(pwlanhdr->addr3, pnetwork->network.MacAddress, ETH_ALEN);\r
\r
\r
- pbuf += sizeof(struct rtw_ieee80211_hdr_3addr); \r
+ //pbuf += sizeof(struct rtw_ieee80211_hdr_3addr);\r
len = sizeof (struct rtw_ieee80211_hdr_3addr);\r
+ _rtw_memcpy((pbuf+len), pnetwork->network.IEs, pnetwork->network.IELength);\r
+ *((u64*)(pbuf+len)) = cpu_to_le64(notify_timestamp);\r
\r
- _rtw_memcpy(pbuf, pnetwork->network.IEs, pnetwork->network.IELength);\r
len += pnetwork->network.IELength;\r
\r
//#ifdef CONFIG_P2P\r
// DBG_8192C("%s, got p2p_ie\n", __func__);\r
//}\r
//#endif\r
- \r
\r
#if 1 \r
- bss = cfg80211_inform_bss_frame(wiphy, notify_channel, (struct ieee80211_mgmt *)buf,\r
+ bss = cfg80211_inform_bss_frame(wiphy, notify_channel, (struct ieee80211_mgmt *)pbuf,\r
len, notify_signal, GFP_ATOMIC);\r
#else \r
\r
cfg80211_put_bss(bss);\r
#endif\r
\r
-exit: \r
+exit:\r
+\r
+ if(pbuf)\r
+ rtw_mfree(pbuf, buf_size);\r
+\r
return bss;\r
\r
}\r
pnetwork->Ssid.SsidLength,\r
WLAN_CAPABILITY_ESS, WLAN_CAPABILITY_ESS);\r
\r
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0)\r
+ cfg80211_put_bss(padapter->rtw_wdev->wiphy, bss);\r
+#else\r
+ cfg80211_put_bss(bss);\r
+#endif\r
+\r
return (bss!=NULL);\r
}\r
\r
//DEBUG_ERR((" param->u.crypt.key_len=%d\n",param->u.crypt.key_len));\r
DBG_871X(" ~~~~set sta key:unicastkey\n");\r
\r
- rtw_setstakey_cmd(padapter, (unsigned char *)psta, _TRUE, _TRUE);\r
+ rtw_setstakey_cmd(padapter, psta, _TRUE, _TRUE);\r
}\r
else//group key\r
{\r
DBG_871X(" ~~~~set sta key:groupkey\n");\r
\r
padapter->securitypriv.dot118021XGrpKeyid = param->u.crypt.idx;\r
-#ifdef CONFIG_CONCURRENT_MODE \r
- if (padapter->adapter_type == PRIMARY_ADAPTER)\r
- rtw_set_key(padapter,&padapter->securitypriv,param->u.crypt.idx, 1,_TRUE);\r
- else\r
- DBG_871X_LEVEL(_drv_always_, "second interface do not set cam.\n");\r
-#else\r
rtw_set_key(padapter,&padapter->securitypriv,param->u.crypt.idx, 1,_TRUE);\r
-#endif\r
}\r
#ifdef CONFIG_IEEE80211W\r
else if(strcmp(param->u.crypt.alg, "BIP") == 0)\r
\r
\r
#ifdef CONFIG_P2P\r
- if( pwdinfo->driver_interface == DRIVER_CFG80211 )\r
+ if(!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE) && !rtw_p2p_chk_state(pwdinfo, P2P_STATE_IDLE))\r
{\r
- if(!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE) && !rtw_p2p_chk_state(pwdinfo, P2P_STATE_IDLE))\r
- {\r
- rtw_p2p_set_state(pwdinfo, P2P_STATE_FIND_PHASE_SEARCH);\r
- rtw_free_network_queue(padapter, _TRUE);\r
+ rtw_p2p_set_state(pwdinfo, P2P_STATE_FIND_PHASE_SEARCH);\r
+ rtw_free_network_queue(padapter, _TRUE);\r
\r
- if(social_channel == 0)\r
- rtw_p2p_findphase_ex_set(pwdinfo, P2P_FINDPHASE_EX_NONE);\r
- else\r
- rtw_p2p_findphase_ex_set(pwdinfo, P2P_FINDPHASE_EX_SOCIAL_LAST);\r
- }\r
+ if(social_channel == 0)\r
+ rtw_p2p_findphase_ex_set(pwdinfo, P2P_FINDPHASE_EX_NONE);\r
+ else\r
+ rtw_p2p_findphase_ex_set(pwdinfo, P2P_FINDPHASE_EX_SOCIAL_LAST);\r
}\r
#endif //CONFIG_P2P\r
\r
{\r
u8 index,blInserted = _FALSE;\r
_adapter *padapter = wiphy_to_adapter(wiphy);\r
+ struct mlme_priv *mlme = &padapter->mlmepriv;\r
struct security_priv *psecuritypriv = &padapter->securitypriv;\r
u8 strZeroMacAddress[ ETH_ALEN ] = { 0x00 };\r
\r
- DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(netdev));\r
+ DBG_871X(FUNC_NDEV_FMT" "MAC_FMT" "KEY_FMT"\n", FUNC_NDEV_ARG(netdev)\r
+ , MAC_ARG(pmksa->bssid), KEY_ARG(pmksa->pmkid));\r
\r
if ( _rtw_memcmp( pmksa->bssid, strZeroMacAddress, ETH_ALEN ) == _TRUE )\r
{\r
return -EINVAL;\r
}\r
\r
+ if (check_fwstate(mlme, _FW_LINKED) == _FALSE) {\r
+ DBG_871X(FUNC_NDEV_FMT" not set pmksa cause not in linked state\n", FUNC_NDEV_ARG(netdev));\r
+ return -EINVAL;\r
+ }\r
+\r
blInserted = _FALSE;\r
\r
//overwrite PMKID\r
_adapter *padapter = wiphy_to_adapter(wiphy);\r
struct security_priv *psecuritypriv = &padapter->securitypriv;\r
\r
- DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(netdev));\r
+ DBG_871X(FUNC_NDEV_FMT" "MAC_FMT" "KEY_FMT"\n", FUNC_NDEV_ARG(netdev)\r
+ , MAC_ARG(pmksa->bssid), KEY_ARG(pmksa->pmkid));\r
\r
for(index=0 ; index<NUM_PMKID_CACHE; index++)\r
{\r
_rtw_memset( psecuritypriv->PMKIDList[index].PMKID, 0x00, WLAN_PMKID_LEN );\r
psecuritypriv->PMKIDList[index].bUsed = _FALSE;\r
bMatched = _TRUE;\r
+ DBG_871X(FUNC_NDEV_FMT" clear id:%hhu\n", FUNC_NDEV_ARG(netdev), index); \r
break;\r
} \r
}\r
\r
if(pcfg80211_wdinfo->is_ro_ch == _TRUE)\r
{\r
+ pcfg80211_wdinfo->not_indic_ro_ch_exp = _TRUE;\r
DBG_8192C("%s, cancel ro ch timer\n", __func__);\r
- \r
_cancel_timer_ex(&padapter->cfg80211_wdinfo.remain_on_ch_timer);\r
-\r
-#ifdef CONFIG_CONCURRENT_MODE\r
- ATOMIC_SET(&pwdev_priv->ro_ch_to, 1); \r
-#endif //CONFIG_CONCURRENT_MODE \r
-\r
+ #ifdef CONFIG_CONCURRENT_MODE\r
+ ATOMIC_SET(&pwdev_priv->ro_ch_to, 1);\r
+ #endif //CONFIG_CONCURRENT_MODE\r
p2p_protocol_wk_hdl(padapter, P2P_RO_CH_WK);\r
+ pcfg80211_wdinfo->not_indic_ro_ch_exp = _FALSE;\r
}\r
\r
pcfg80211_wdinfo->is_ro_ch = _TRUE;\r
DBG_871X(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(padapter));\r
\r
if (pcfg80211_wdinfo->is_ro_ch == _TRUE) {\r
+ pcfg80211_wdinfo->not_indic_ro_ch_exp = _TRUE;\r
DBG_8192C("%s, cancel ro ch timer\n", __func__);\r
_cancel_timer_ex(&padapter->cfg80211_wdinfo.remain_on_ch_timer);\r
#ifdef CONFIG_CONCURRENT_MODE\r
ATOMIC_SET(&pwdev_priv->ro_ch_to, 1);\r
#endif\r
p2p_protocol_wk_hdl(padapter, P2P_RO_CH_WK);\r
+ pcfg80211_wdinfo->not_indic_ro_ch_exp = _FALSE;\r
}\r
\r
#if 0\r
}
-
+#ifdef CONFIG_SUPPORT_HW_WPS_PBC
static void request_wps_pbc_event(_adapter *padapter)
{
u8 *buff, *p;
}
}
-
+#endif//#ifdef CONFIG_SUPPORT_HW_WPS_PBC
void indicate_wx_scan_complete_event(_adapter *padapter)
{
}
*/
-static char *translate_scan(_adapter *padapter,
+static int search_p2p_wfd_ie(_adapter *padapter,
struct iw_request_info* info, struct wlan_network *pnetwork,
char *start, char *stop)
{
- struct iw_event iwe;
- u16 cap;
- u32 ht_ielen = 0;
- char custom[MAX_CUSTOM_LEN];
- char *p;
- u16 max_rate=0, rate, ht_cap=_FALSE;
- u32 i = 0;
- char *current_val;
- long rssi;
- u8 bw_40MHz=0, short_GI=0;
- u16 mcs_rate=0;
- struct registry_priv *pregpriv = &padapter->registrypriv;
#ifdef CONFIG_P2P
struct wifidirect_info *pwdinfo = &padapter->wdinfo;
-#endif //CONFIG_P2P
-
-#ifdef CONFIG_P2P
#ifdef CONFIG_WFD
if ( SCAN_RESULT_ALL == pwdinfo->wfd_info->scan_result_type )
{
{
u32 p2pielen = 0;
- if (pnetwork->network.Reserved[0] == 2) { // Probe Request
- // Verifying the P2P IE
- if ( rtw_get_p2p_ie( pnetwork->network.IEs, pnetwork->network.IELength, NULL, &p2pielen) )
- {
- blnGotP2PIE = _TRUE;
- }
- } else { // Beacon or Probe Respones
- // Verifying the P2P IE
- if ( rtw_get_p2p_ie( &pnetwork->network.IEs[12], pnetwork->network.IELength - 12, NULL, &p2pielen) )
- {
- blnGotP2PIE = _TRUE;
- }
+ // Verifying the P2P IE
+ if (rtw_get_p2p_ie_from_scan_queue(&pnetwork->network.IEs[0], pnetwork->network.IELength, NULL, &p2pielen, pnetwork->network.Reserved[0]))
+ {
+ blnGotP2PIE = _TRUE;
}
}
if ( blnGotP2PIE == _FALSE )
{
- return start;
+ return _FALSE;
}
}
if ( blnGotWFD == _FALSE )
{
- return start;
+ return _FALSE;
}
}
#endif // CONFIG_WFD
#endif //CONFIG_P2P
+ return _TRUE;
+}
+static inline char *iwe_stream_mac_addr_proess(_adapter *padapter,
+ struct iw_request_info* info, struct wlan_network *pnetwork,
+ char *start, char *stop,struct iw_event *iwe)
+{
/* AP MAC address */
- iwe.cmd = SIOCGIWAP;
- iwe.u.ap_addr.sa_family = ARPHRD_ETHER;
+ iwe->cmd = SIOCGIWAP;
+ iwe->u.ap_addr.sa_family = ARPHRD_ETHER;
- _rtw_memcpy(iwe.u.ap_addr.sa_data, pnetwork->network.MacAddress, ETH_ALEN);
- start = iwe_stream_add_event(info, start, stop, &iwe, IW_EV_ADDR_LEN);
+ _rtw_memcpy(iwe->u.ap_addr.sa_data, pnetwork->network.MacAddress, ETH_ALEN);
+ start = iwe_stream_add_event(info, start, stop, iwe, IW_EV_ADDR_LEN);
+ return start;
+}
+static inline char * iwe_stream_essid_proess(_adapter *padapter,
+ struct iw_request_info* info, struct wlan_network *pnetwork,
+ char *start, char *stop,struct iw_event *iwe)
+{
/* Add the ESSID */
- iwe.cmd = SIOCGIWESSID;
- iwe.u.data.flags = 1;
- iwe.u.data.length = min((u16)pnetwork->network.Ssid.SsidLength, (u16)32);
- start = iwe_stream_add_point(info, start, stop, &iwe, pnetwork->network.Ssid.Ssid);
+ iwe->cmd = SIOCGIWESSID;
+ iwe->u.data.flags = 1;
+ iwe->u.data.length = min((u16)pnetwork->network.Ssid.SsidLength, (u16)32);
+ start = iwe_stream_add_point(info, start, stop, iwe, pnetwork->network.Ssid.Ssid);
+ return start;
+}
- //parsing HT_CAP_IE
- if (pnetwork->network.Reserved[0] == 2) // Probe Request
- {
- p = rtw_get_ie(&pnetwork->network.IEs[0], _HT_CAPABILITY_IE_, &ht_ielen, pnetwork->network.IELength);
+static inline char * iwe_stream_chan_process(_adapter *padapter,
+ struct iw_request_info* info, struct wlan_network *pnetwork,
+ char *start, char *stop,struct iw_event *iwe)
+{
+ if(pnetwork->network.Configuration.DSConfig<1 /*|| pnetwork->network.Configuration.DSConfig>14*/)
+ pnetwork->network.Configuration.DSConfig = 1;
+
+ /* Add frequency/channel */
+ iwe->cmd = SIOCGIWFREQ;
+ iwe->u.freq.m = rtw_ch2freq(pnetwork->network.Configuration.DSConfig) * 100000;
+ iwe->u.freq.e = 1;
+ iwe->u.freq.i = pnetwork->network.Configuration.DSConfig;
+ start = iwe_stream_add_event(info, start, stop, iwe, IW_EV_FREQ_LEN);
+ return start;
+}
+
+static inline char * iwe_stream_mode_process(_adapter *padapter,
+ struct iw_request_info* info, struct wlan_network *pnetwork,
+ char *start, char *stop,struct iw_event *iwe,u16 cap)
+{
+ /* Add mode */
+ if(cap & (WLAN_CAPABILITY_IBSS |WLAN_CAPABILITY_BSS)){
+ iwe->cmd = SIOCGIWMODE;
+ if (cap & WLAN_CAPABILITY_BSS)
+ iwe->u.mode = IW_MODE_MASTER;
+ else
+ iwe->u.mode = IW_MODE_ADHOC;
+
+ start = iwe_stream_add_event(info, start, stop, iwe, IW_EV_UINT_LEN);
}
+ return start;
+}
+
+static inline char * iwe_stream_encryption_process(_adapter *padapter,
+ struct iw_request_info* info, struct wlan_network *pnetwork,
+ char *start, char *stop,struct iw_event *iwe,u16 cap)
+{
+ /* Add encryption capability */
+ iwe->cmd = SIOCGIWENCODE;
+ if (cap & WLAN_CAPABILITY_PRIVACY)
+ iwe->u.data.flags = IW_ENCODE_ENABLED | IW_ENCODE_NOKEY;
else
- {
- p = rtw_get_ie(&pnetwork->network.IEs[12], _HT_CAPABILITY_IE_, &ht_ielen, pnetwork->network.IELength-12);
- }
+ iwe->u.data.flags = IW_ENCODE_DISABLED;
+ iwe->u.data.length = 0;
+ start = iwe_stream_add_point(info, start, stop, iwe, pnetwork->network.Ssid.Ssid);
+ return start;
+}
+
+static inline char * iwe_stream_protocol_process(_adapter *padapter,
+ struct iw_request_info* info, struct wlan_network *pnetwork,
+ char *start, char *stop,struct iw_event *iwe)
+{
+ u16 ht_cap=_FALSE,vht_cap = _FALSE;
+ u32 ht_ielen = 0, vht_ielen = 0;
+ char *p;
+ u8 ie_offset = (pnetwork->network.Reserved[0] == 2? 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;
- }
+ ht_cap = _TRUE;
+ #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;
+ #endif
/* Add the protocol name */
- iwe.cmd = SIOCGIWNAME;
- if ((rtw_is_cckratesonly_included((u8*)&pnetwork->network.SupportedRates)) == _TRUE)
+ iwe->cmd = SIOCGIWNAME;
+ if ((rtw_is_cckratesonly_included((u8*)&pnetwork->network.SupportedRates)) == _TRUE)
{
if(ht_cap == _TRUE)
- snprintf(iwe.u.name, IFNAMSIZ, "IEEE 802.11bn");
+ snprintf(iwe->u.name, IFNAMSIZ, "IEEE 802.11bn");
else
- snprintf(iwe.u.name, IFNAMSIZ, "IEEE 802.11b");
- }
- else if ((rtw_is_cckrates_included((u8*)&pnetwork->network.SupportedRates)) == _TRUE)
+ snprintf(iwe->u.name, IFNAMSIZ, "IEEE 802.11b");
+ }
+ else if ((rtw_is_cckrates_included((u8*)&pnetwork->network.SupportedRates)) == _TRUE)
{
if(ht_cap == _TRUE)
- snprintf(iwe.u.name, IFNAMSIZ, "IEEE 802.11bgn");
+ snprintf(iwe->u.name, IFNAMSIZ, "IEEE 802.11bgn");
else
- snprintf(iwe.u.name, IFNAMSIZ, "IEEE 802.11bg");
- }
+ snprintf(iwe->u.name, IFNAMSIZ, "IEEE 802.11bg");
+ }
else
{
if(pnetwork->network.Configuration.DSConfig > 14)
{
- if(ht_cap == _TRUE)
- snprintf(iwe.u.name, IFNAMSIZ, "IEEE 802.11an");
+ #ifdef CONFIG_80211AC_VHT
+ if(vht_cap == _TRUE){
+ snprintf(iwe->u.name, IFNAMSIZ, "IEEE 802.11AC");
+ }
else
- snprintf(iwe.u.name, IFNAMSIZ, "IEEE 802.11a");
+ #endif
+ {
+ if(ht_cap == _TRUE)
+ snprintf(iwe->u.name, IFNAMSIZ, "IEEE 802.11an");
+ else
+ snprintf(iwe->u.name, IFNAMSIZ, "IEEE 802.11a");
+ }
}
else
{
if(ht_cap == _TRUE)
- snprintf(iwe.u.name, IFNAMSIZ, "IEEE 802.11gn");
+ snprintf(iwe->u.name, IFNAMSIZ, "IEEE 802.11gn");
else
- snprintf(iwe.u.name, IFNAMSIZ, "IEEE 802.11g");
+ snprintf(iwe->u.name, IFNAMSIZ, "IEEE 802.11g");
}
- }
+ }
+ start = iwe_stream_add_event(info, start, stop, iwe, IW_EV_CHAR_LEN);
+ return start;
+}
- start = iwe_stream_add_event(info, start, stop, &iwe, IW_EV_CHAR_LEN);
+static inline char * iwe_stream_rate_process(_adapter *padapter,
+ struct iw_request_info* info, struct wlan_network *pnetwork,
+ char *start, char *stop,struct iw_event *iwe)
+{
+ u32 ht_ielen = 0, vht_ielen = 0;
+ char *p;
+ u16 max_rate=0, rate, ht_cap=_FALSE, vht_cap = _FALSE;
+ u32 i = 0;
+ u8 bw_40MHz=0, short_GI=0, bw_160MHz=0, vht_highest_rate = 0;
+ u16 mcs_rate=0, vht_data_rate=0;
+ char custom[MAX_CUSTOM_LEN]={0};
+ u8 ie_offset = (pnetwork->network.Reserved[0] == 2? 0:12);// Probe Request
- /* Add mode */
- if (pnetwork->network.Reserved[0] == 2) // 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)
{
- cap = 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;
}
- else
+
+#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)
{
- iwe.cmd = SIOCGIWMODE;
- _rtw_memcpy((u8 *)&cap, rtw_get_capability_from_ie(pnetwork->network.IEs), 2);
- cap = le16_to_cpu(cap);
- }
+ u8 mcs_map[2];
- if(cap & (WLAN_CAPABILITY_IBSS |WLAN_CAPABILITY_BSS)){
- if (cap & WLAN_CAPABILITY_BSS)
- iwe.u.mode = IW_MODE_MASTER;
+ 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
- iwe.u.mode = IW_MODE_ADHOC;
-
- start = iwe_stream_add_event(info, start, stop, &iwe, IW_EV_UINT_LEN);
- }
-
- if(pnetwork->network.Configuration.DSConfig<1 /*|| pnetwork->network.Configuration.DSConfig>14*/)
- pnetwork->network.Configuration.DSConfig = 1;
+ short_GI = GET_VHT_CAPABILITY_ELE_SHORT_GI80M(p+2);
- /* Add frequency/channel */
- iwe.cmd = SIOCGIWFREQ;
- iwe.u.freq.m = rtw_ch2freq(pnetwork->network.Configuration.DSConfig) * 100000;
- iwe.u.freq.e = 1;
- iwe.u.freq.i = pnetwork->network.Configuration.DSConfig;
- start = iwe_stream_add_event(info, start, stop, &iwe, IW_EV_FREQ_LEN);
+ _rtw_memcpy(mcs_map, GET_VHT_CAPABILITY_ELE_TX_MCS(p+2), 2);
- /* Add encryption capability */
- iwe.cmd = SIOCGIWENCODE;
- if (cap & WLAN_CAPABILITY_PRIVACY)
- iwe.u.data.flags = IW_ENCODE_ENABLED | IW_ENCODE_NOKEY;
- else
- iwe.u.data.flags = IW_ENCODE_DISABLED;
- iwe.u.data.length = 0;
- start = iwe_stream_add_point(info, start, stop, &iwe, pnetwork->network.Ssid.Ssid);
+ 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
/*Add basic and extended rates */
- max_rate = 0;
p = custom;
p += snprintf(p, MAX_CUSTOM_LEN - (p - custom), " Rates (Mb/s): ");
while(pnetwork->network.SupportedRates[i]!=0)
{
- rate = pnetwork->network.SupportedRates[i]&0x7F;
+ rate = pnetwork->network.SupportedRates[i]&0x7F;
if (rate > max_rate)
max_rate = rate;
p += snprintf(p, MAX_CUSTOM_LEN - (p - custom),
"%d%s ", rate >> 1, (rate & 1) ? ".5" : "");
i++;
}
-
+
+#ifdef CONFIG_80211AC_VHT
+ if(vht_cap == _TRUE) {
+ max_rate = vht_data_rate;
+ }
+ else
+#endif
if(ht_cap == _TRUE)
{
if(mcs_rate&0x8000)//MCS15
{
max_rate = (bw_40MHz) ? ((short_GI)?300:270):((short_GI)?144:130);
-
}
else if(mcs_rate&0x0080)//MCS7
{
max_rate = (bw_40MHz) ? ((short_GI)?150:135):((short_GI)?72:65);
}
- max_rate = max_rate*2;//Mbps/2;
+ max_rate = max_rate*2;//Mbps/2;
}
- iwe.cmd = SIOCGIWRATE;
- iwe.u.bitrate.fixed = iwe.u.bitrate.disabled = 0;
- iwe.u.bitrate.value = max_rate * 500000;
- start = iwe_stream_add_event(info, start, stop, &iwe, IW_EV_PARAM_LEN);
+ iwe->cmd = SIOCGIWRATE;
+ iwe->u.bitrate.fixed = iwe->u.bitrate.disabled = 0;
+ iwe->u.bitrate.value = max_rate * 500000;
+ start =iwe_stream_add_event(info, start, stop, iwe, IW_EV_PARAM_LEN);
+ return start ;
+}
- //parsing WPA/WPA2 IE
- if (pnetwork->network.Reserved[0] != 2) // Probe Request
- {
- u8 buf[MAX_WPA_IE_LEN*2];
- u8 wpa_ie[255],rsn_ie[255];
- u16 wpa_len=0,rsn_len=0;
- u8 *p;
- sint out_len=0;
- out_len=rtw_get_sec_ie(pnetwork->network.IEs ,pnetwork->network.IELength,rsn_ie,&rsn_len,wpa_ie,&wpa_len);
- RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("rtw_wx_get_scan: ssid=%s\n",pnetwork->network.Ssid.Ssid));
- RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("rtw_wx_get_scan: wpa_len=%d rsn_len=%d\n",wpa_len,rsn_len));
+static inline char * iwe_stream_wpa_wpa2_process(_adapter *padapter,
+ struct iw_request_info* info, struct wlan_network *pnetwork,
+ char *start, char *stop,struct iw_event *iwe)
+{
+ int buf_size = MAX_WPA_IE_LEN*2;
+ //u8 pbuf[buf_size]={0};
+ u8 *pbuf = rtw_zmalloc(buf_size);
+
+ u8 wpa_ie[255]={0},rsn_ie[255]={0};
+ u16 i, wpa_len=0,rsn_len=0;
+ u8 *p;
+ sint out_len=0;
- if (wpa_len > 0)
+ if(pbuf){
+ p=pbuf;
+
+ //parsing WPA/WPA2 IE
+ if (pnetwork->network.Reserved[0] != 2) // Probe Request
{
- p=buf;
- _rtw_memset(buf, 0, MAX_WPA_IE_LEN*2);
- p += sprintf(p, "wpa_ie=");
- for (i = 0; i < wpa_len; i++) {
- p += sprintf(p, "%02x", wpa_ie[i]);
- }
+ out_len=rtw_get_sec_ie(pnetwork->network.IEs ,pnetwork->network.IELength,rsn_ie,&rsn_len,wpa_ie,&wpa_len);
+ RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("rtw_wx_get_scan: ssid=%s\n",pnetwork->network.Ssid.Ssid));
+ RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("rtw_wx_get_scan: wpa_len=%d rsn_len=%d\n",wpa_len,rsn_len));
- if (wpa_len > 100) {
- printk("-----------------Len %d----------------\n", wpa_len);
+ if (wpa_len > 0){
+ _rtw_memset(pbuf, 0, buf_size);
+ p += sprintf(p, "wpa_ie=");
for (i = 0; i < wpa_len; i++) {
- printk("%02x ", wpa_ie[i]);
+ p += sprintf(p, "%02x", wpa_ie[i]);
}
- printk("\n");
- printk("-----------------Len %d----------------\n", wpa_len);
+
+ if (wpa_len > 100) {
+ printk("-----------------Len %d----------------\n", wpa_len);
+ for (i = 0; i < wpa_len; i++) {
+ printk("%02x ", wpa_ie[i]);
+ }
+ printk("\n");
+ printk("-----------------Len %d----------------\n", wpa_len);
+ }
+
+ _rtw_memset(iwe, 0, sizeof(*iwe));
+ iwe->cmd = IWEVCUSTOM;
+ iwe->u.data.length = strlen(pbuf);
+ start = iwe_stream_add_point(info, start, stop, iwe,pbuf);
+
+ _rtw_memset(iwe, 0, sizeof(*iwe));
+ iwe->cmd =IWEVGENIE;
+ iwe->u.data.length = wpa_len;
+ start = iwe_stream_add_point(info, start, stop, iwe, wpa_ie);
}
-
- _rtw_memset(&iwe, 0, sizeof(iwe));
- iwe.cmd = IWEVCUSTOM;
- iwe.u.data.length = strlen(buf);
- start = iwe_stream_add_point(info, start, stop, &iwe,buf);
-
- _rtw_memset(&iwe, 0, sizeof(iwe));
- iwe.cmd =IWEVGENIE;
- iwe.u.data.length = wpa_len;
- start = iwe_stream_add_point(info, start, stop, &iwe, wpa_ie);
- }
- if (rsn_len > 0)
- {
- p = buf;
- _rtw_memset(buf, 0, MAX_WPA_IE_LEN*2);
- p += sprintf(p, "rsn_ie=");
- for (i = 0; i < rsn_len; i++) {
- p += sprintf(p, "%02x", rsn_ie[i]);
+
+ if (rsn_len > 0){
+ _rtw_memset(pbuf, 0, buf_size);
+ p += sprintf(p, "rsn_ie=");
+ for (i = 0; i < rsn_len; i++) {
+ p += sprintf(p, "%02x", rsn_ie[i]);
+ }
+ _rtw_memset(iwe, 0, sizeof(*iwe));
+ iwe->cmd = IWEVCUSTOM;
+ iwe->u.data.length = strlen(pbuf);
+ start = iwe_stream_add_point(info, start, stop, iwe,pbuf);
+
+ _rtw_memset(iwe, 0, sizeof(*iwe));
+ iwe->cmd =IWEVGENIE;
+ iwe->u.data.length = rsn_len;
+ start = iwe_stream_add_point(info, start, stop, iwe, rsn_ie);
}
- _rtw_memset(&iwe, 0, sizeof(iwe));
- iwe.cmd = IWEVCUSTOM;
- iwe.u.data.length = strlen(buf);
- start = iwe_stream_add_point(info, start, stop, &iwe,buf);
-
- _rtw_memset(&iwe, 0, sizeof(iwe));
- iwe.cmd =IWEVGENIE;
- iwe.u.data.length = rsn_len;
- start = iwe_stream_add_point(info, start, stop, &iwe, rsn_ie);
}
+
+ rtw_mfree(pbuf, buf_size);
}
+ return start;
+}
- { //parsing WPS IE
- uint cnt = 0,total_ielen;
- u8 *wpsie_ptr=NULL;
- uint wps_ielen = 0;
+static inline char * iwe_stream_wps_process(_adapter *padapter,
+ struct iw_request_info* info, struct wlan_network *pnetwork,
+ char *start, char *stop,struct iw_event *iwe)
+{
+ //parsing WPS IE
+ uint cnt = 0,total_ielen;
+ u8 *wpsie_ptr=NULL;
+ uint wps_ielen = 0;
+ u8 ie_offset = (pnetwork->network.Reserved[0] == 2? 0:12);
- u8 *ie_ptr = pnetwork->network.IEs +_FIXED_IE_LENGTH_;
- total_ielen= pnetwork->network.IELength - _FIXED_IE_LENGTH_;
+ u8 *ie_ptr = pnetwork->network.IEs + ie_offset;
+ total_ielen= pnetwork->network.IELength - ie_offset;
- if (pnetwork->network.Reserved[0] == 2) // Probe Request
- {
- ie_ptr = pnetwork->network.IEs;
- total_ielen = pnetwork->network.IELength;
- }
- else // Beacon or Probe Respones
- {
- ie_ptr = pnetwork->network.IEs + _FIXED_IE_LENGTH_;
- total_ielen = pnetwork->network.IELength - _FIXED_IE_LENGTH_;
- }
+ if (pnetwork->network.Reserved[0] == 2) // Probe Request
+ {
+ ie_ptr = pnetwork->network.IEs;
+ total_ielen = pnetwork->network.IELength;
+ }
+ else // Beacon or Probe Respones
+ {
+ ie_ptr = pnetwork->network.IEs + _FIXED_IE_LENGTH_;
+ total_ielen = pnetwork->network.IELength - _FIXED_IE_LENGTH_;
+ }
- while(cnt < total_ielen)
+ while(cnt < total_ielen)
+ {
+ if(rtw_is_wps_ie(&ie_ptr[cnt], &wps_ielen) && (wps_ielen>2))
{
- if(rtw_is_wps_ie(&ie_ptr[cnt], &wps_ielen) && (wps_ielen>2))
- {
- wpsie_ptr = &ie_ptr[cnt];
- iwe.cmd =IWEVGENIE;
- iwe.u.data.length = (u16)wps_ielen;
- start = iwe_stream_add_point(info, start, stop, &iwe, wpsie_ptr);
- }
- cnt+=ie_ptr[cnt+1]+2; //goto next
+ wpsie_ptr = &ie_ptr[cnt];
+ iwe->cmd =IWEVGENIE;
+ iwe->u.data.length = (u16)wps_ielen;
+ start = iwe_stream_add_point(info, start, stop,iwe, wpsie_ptr);
}
+ cnt+=ie_ptr[cnt+1]+2; //goto next
}
+ return start;
+}
+static inline char * iwe_stream_wapi_process(_adapter *padapter,
+ struct iw_request_info* info, struct wlan_network *pnetwork,
+ char *start, char *stop,struct iw_event *iwe)
+{
#ifdef CONFIG_WAPI_SUPPORT
+ char *p;
+
if (pnetwork->network.Reserved[0] != 2) // Probe Request
{
sint out_len_wapi=0;
/* here use static for stack size */
- static u8 buf_wapi[MAX_WAPI_IE_LEN*2];
- static u8 wapi_ie[MAX_WAPI_IE_LEN];
+ static u8 buf_wapi[MAX_WAPI_IE_LEN*2]={0};
+ static u8 wapi_ie[MAX_WAPI_IE_LEN]={0};
u16 wapi_len=0;
u16 i;
- _rtw_memset(buf_wapi, 0, MAX_WAPI_IE_LEN);
- _rtw_memset(wapi_ie, 0, MAX_WAPI_IE_LEN);
-
out_len_wapi=rtw_get_wapi_ie(pnetwork->network.IEs ,pnetwork->network.IELength,wapi_ie,&wapi_len);
RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("rtw_wx_get_scan: ssid=%s\n",pnetwork->network.Ssid.Ssid));
RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("rtw_wx_get_scan: wapi_len=%d \n",wapi_len));
DBG_871X("rtw_wx_get_scan: %s ",pnetwork->network.Ssid.Ssid);
DBG_871X("rtw_wx_get_scan: ssid = %d ",wapi_len);
-
if (wapi_len > 0)
{
p=buf_wapi;
- _rtw_memset(buf_wapi, 0, MAX_WAPI_IE_LEN*2);
+ //_rtw_memset(buf_wapi, 0, MAX_WAPI_IE_LEN*2);
p += sprintf(p, "wapi_ie=");
for (i = 0; i < wapi_len; i++) {
p += sprintf(p, "%02x", wapi_ie[i]);
}
- _rtw_memset(&iwe, 0, sizeof(iwe));
- iwe.cmd = IWEVCUSTOM;
- iwe.u.data.length = strlen(buf_wapi);
- start = iwe_stream_add_point(info, start, stop, &iwe,buf_wapi);
+ _rtw_memset(iwe, 0, sizeof(*iwe));
+ iwe->cmd = IWEVCUSTOM;
+ iwe->u.data.length = strlen(buf_wapi);
+ start = iwe_stream_add_point(info, start, stop, iwe,buf_wapi);
- _rtw_memset(&iwe, 0, sizeof(iwe));
- iwe.cmd =IWEVGENIE;
- iwe.u.data.length = wapi_len;
- start = iwe_stream_add_point(info, start, stop, &iwe, wapi_ie);
+ _rtw_memset(iwe, 0, sizeof(*iwe));
+ iwe->cmd =IWEVGENIE;
+ iwe->u.data.length = wapi_len;
+ start = iwe_stream_add_point(info, start, stop, iwe, wapi_ie);
}
}
-#endif //CONFIG_WAPI_SUPPORT
+#endif//#ifdef CONFIG_WAPI_SUPPORT
+ return start;
+}
+static inline char * iwe_stream_rssi_process(_adapter *padapter,
+ struct iw_request_info* info, struct wlan_network *pnetwork,
+ char *start, char *stop,struct iw_event *iwe)
{
- struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
u8 ss, sq;
-
+ struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
+
/* Add quality statistics */
- iwe.cmd = IWEVQUAL;
- iwe.u.qual.updated = IW_QUAL_QUAL_UPDATED | IW_QUAL_LEVEL_UPDATED | IW_QUAL_NOISE_INVALID
+ iwe->cmd = IWEVQUAL;
+ iwe->u.qual.updated = IW_QUAL_QUAL_UPDATED | IW_QUAL_LEVEL_UPDATED
+ #if defined(CONFIG_SIGNAL_DISPLAY_DBM) && defined(CONFIG_BACKGROUND_NOISE_MONITOR)
+ | IW_QUAL_NOISE_UPDATED
+ #else
+ | IW_QUAL_NOISE_INVALID
+ #endif
#ifdef CONFIG_SIGNAL_DISPLAY_DBM
| IW_QUAL_DBM
#endif
;
if ( check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE &&
- is_same_network(&pmlmepriv->cur_network.network, &pnetwork->network, 0)) {
+ is_same_network(&pmlmepriv->cur_network.network, &pnetwork->network, 0)){
ss = padapter->recvpriv.signal_strength;
sq = padapter->recvpriv.signal_qual;
} else {
ss = pnetwork->network.PhyInfo.SignalStrength;
sq = pnetwork->network.PhyInfo.SignalQuality;
}
-
-
- #ifdef CONFIG_SIGNAL_DISPLAY_DBM
- iwe.u.qual.level = (u8) translate_percentage_to_dbm(ss);//dbm
+
+#ifdef CONFIG_SIGNAL_DISPLAY_DBM
+ iwe->u.qual.level = (u8) translate_percentage_to_dbm(ss);//dbm
+#else
+ #ifdef CONFIG_SKIP_SIGNAL_SCALE_MAPPING
+ {
+ /* 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)odm_SignalScaleMapping(&pHal->odmpriv, ss);
+ }
#else
- iwe.u.qual.level = (u8)ss;//%
+ iwe->u.qual.level = (u8)ss;//%
#ifdef CONFIG_BT_COEXIST
- BT_SignalCompensation(padapter, &iwe.u.qual.level, NULL);
+ BT_SignalCompensation(padapter, &iwe->u.qual.level, NULL);
#endif // CONFIG_BT_COEXIST
#endif
-
- iwe.u.qual.qual = (u8)sq; // signal quality
+#endif
+
+ iwe->u.qual.qual = (u8)sq; // signal quality
#ifdef CONFIG_PLATFORM_ROCKCHIPS
- iwe.u.qual.noise = -100; // noise level suggest by zhf@rockchips
- #else
- iwe.u.qual.noise = 0; // noise level
+ iwe->u.qual.noise = -100; // noise level suggest by zhf@rockchips
+ #else
+ #if defined(CONFIG_SIGNAL_DISPLAY_DBM) && defined(CONFIG_BACKGROUND_NOISE_MONITOR)
+ {
+ s16 tmp_noise=0;
+ rtw_hal_get_odm_var(padapter, HAL_ODM_NOISE_MONITOR,&(pnetwork->network.Configuration.DSConfig), &(tmp_noise));
+ iwe->u.qual.noise = tmp_noise;
+ }
+ #else
+ iwe->u.qual.noise = 0; // noise level
+ #endif
#endif //CONFIG_PLATFORM_ROCKCHIPS
-
+
//DBG_871X("iqual=%d, ilevel=%d, inoise=%d, iupdated=%d\n", iwe.u.qual.qual, iwe.u.qual.level , iwe.u.qual.noise, iwe.u.qual.updated);
- start = iwe_stream_add_event(info, start, stop, &iwe, IW_EV_QUAL_LEN);
+ start = iwe_stream_add_event(info, start, stop, iwe, IW_EV_QUAL_LEN);
+ return start;
}
+static inline char * iwe_stream_net_rsv_process(_adapter *padapter,
+ struct iw_request_info* info, struct wlan_network *pnetwork,
+ char *start, char *stop,struct iw_event *iwe)
+{
+ u8 buf[32] = {0};
+ u8 * p,*pos;
+ int len;
+ p = buf;
+ pos = pnetwork->network.Reserved;
+
+ p += sprintf(p, "fm=%02X%02X", pos[1], pos[0]);
+ _rtw_memset(iwe, 0, sizeof(*iwe));
+ iwe->cmd = IWEVCUSTOM;
+ iwe->u.data.length = strlen(buf);
+ start = iwe_stream_add_point(info, start, stop,iwe, buf);
+ return start;
+}
+
+static char *translate_scan(_adapter *padapter,
+ struct iw_request_info* info, struct wlan_network *pnetwork,
+ char *start, char *stop)
+{
+ struct iw_event iwe;
+ u16 cap = 0;
+ _rtw_memset(&iwe, 0, sizeof(iwe));
+
+ if(_FALSE == search_p2p_wfd_ie(padapter,info,pnetwork,start,stop))
+ return start;
+
+ start = iwe_stream_mac_addr_proess(padapter,info,pnetwork,start,stop,&iwe);
+ start = iwe_stream_essid_proess(padapter,info,pnetwork,start,stop,&iwe);
+ start = iwe_stream_protocol_process(padapter,info,pnetwork,start,stop,&iwe);
+ if (pnetwork->network.Reserved[0] == 2) // Probe Request
{
- u8 buf[MAX_WPA_IE_LEN];
- u8 * p,*pos;
- int len;
- p = buf;
- pos = pnetwork->network.Reserved;
- _rtw_memset(buf, 0, MAX_WPA_IE_LEN);
- p += sprintf(p, "fm=%02X%02X", pos[1], pos[0]);
- _rtw_memset(&iwe, 0, sizeof(iwe));
- iwe.cmd = IWEVCUSTOM;
- iwe.u.data.length = strlen(buf);
- start = iwe_stream_add_point(info, start, stop, &iwe, buf);
+ cap = 0;
}
-
- return start;
+ else
+ {
+ _rtw_memcpy((u8 *)&cap, rtw_get_capability_from_ie(pnetwork->network.IEs), 2);
+ cap = le16_to_cpu(cap);
+ }
+
+ start = iwe_stream_mode_process(padapter,info,pnetwork,start,stop,&iwe,cap);
+ start = iwe_stream_chan_process(padapter,info,pnetwork,start,stop,&iwe);
+ start = iwe_stream_encryption_process(padapter,info,pnetwork,start,stop,&iwe,cap);
+ start = iwe_stream_rate_process(padapter,info,pnetwork,start,stop,&iwe);
+ start = iwe_stream_wpa_wpa2_process(padapter,info,pnetwork,start,stop,&iwe);
+ start = iwe_stream_wps_process(padapter,info,pnetwork,start,stop,&iwe);
+ start = iwe_stream_wapi_process(padapter,info,pnetwork,start,stop,&iwe);
+ start = iwe_stream_rssi_process(padapter,info,pnetwork,start,stop,&iwe);
+ start = iwe_stream_net_rsv_process(padapter,info,pnetwork,start,stop,&iwe);
+
+ return start;
}
static int wpa_set_auth_algs(struct net_device *dev, u32 value)
//DEBUG_ERR((" param->u.crypt.key_len=%d\n",param->u.crypt.key_len));
DBG_871X(" ~~~~set sta key:unicastkey\n");
- rtw_setstakey_cmd(padapter, (unsigned char *)psta, _TRUE, _TRUE);
+ rtw_setstakey_cmd(padapter, psta, _TRUE, _TRUE);
}
else//group key
{
{
DBG_871X( "[%s] NOT Found in the Scanning Queue!\n", __FUNCTION__ );
#ifdef CONFIG_INTEL_WIDI
+ _cancel_timer_ex( &pwdinfo->restore_p2p_state_timer );
rtw_p2p_set_state(pwdinfo, P2P_STATE_FIND_PHASE_SEARCH);
rtw_p2p_findphase_ex_set(pwdinfo, P2P_FINDPHASE_EX_NONE);
rtw_free_network_queue(padapter, _TRUE);
pbuf = rtw_malloc(sizeof(l2_msg_t));
if(pbuf)
{
- copy_from_user(pbuf, wrqu->data.pointer, wrqu->data.length);
+ if ( copy_from_user(pbuf, wrqu->data.pointer, wrqu->data.length) )
+ ret = -EFAULT;
//_rtw_memcpy(pbuf, wrqu->data.pointer, wrqu->data.length);
if( wrqu->data.flags == 0 )
#ifdef CONFIG_SIGNAL_DISPLAY_DBM
tmp_level = translate_percentage_to_dbm(padapter->recvpriv.signal_strength);
#else
+ #ifdef CONFIG_SKIP_SIGNAL_SCALE_MAPPING
+ {
+ /* 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)odm_SignalScaleMapping(&pHal->odmpriv, padapter->recvpriv.signal_strength);
+ }
+ #else
tmp_level = padapter->recvpriv.signal_strength;
#ifdef CONFIG_BT_COEXIST
{
}
#endif // CONFIG_BT_COEXIST
#endif
+ #endif
tmp_qual = padapter->recvpriv.signal_qual;
tmp_noise =padapter->recvpriv.noise;
#include <rtw_br_ext.h>
#endif //CONFIG_BR_EXT
-#ifdef CONFIG_RF_GAIN_OFFSET
-#ifdef CONFIG_RTL8723A
-#define RF_GAIN_OFFSET_ON BIT0
-#define REG_RF_BB_GAIN_OFFSET 0x7f
-#define RF_GAIN_OFFSET_MASK 0xfffff
-#else
-#define RF_GAIN_OFFSET_ON BIT4
-#define REG_RF_BB_GAIN_OFFSET 0x55
-#define RF_GAIN_OFFSET_MASK 0xfffff
-#endif //CONFIG_RTL8723A
-#endif //CONFIG_RF_GAIN_OFFSET
-
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("Realtek Wireless Lan Driver");
MODULE_AUTHOR("Realtek Semiconductor Corp.");
module_param(rtw_notch_filter, uint, 0644);
MODULE_PARM_DESC(rtw_notch_filter, "0:Disable, 1:Enable, 2:Enable only for P2P");
+uint rtw_hiq_filter = CONFIG_RTW_HIQ_FILTER;
+module_param(rtw_hiq_filter, uint, 0644);
+MODULE_PARM_DESC(rtw_hiq_filter, "0:allow all, 1:allow special, 2:deny all");
+
static uint loadparam(PADAPTER padapter, _nic_hdl pnetdev);
int _netdev_open(struct net_device *pnetdev);
int netdev_open (struct net_device *pnetdev);
registry_par->force_igi = (u8)rtw_force_igi;
#endif
registry_par->regulatory_tid = (u8)rtw_regulatory_id;
-
+
+ registry_par->hiq_filter = (u8)rtw_hiq_filter;
_func_exit_;
DBG_871X("MAC Address = "MAC_FMT"\n", MAC_ARG(pnetdev->dev_addr));
-#ifdef CONFIG_RF_GAIN_OFFSET
- rtw_bb_rf_gain_offset(padapter);
-#endif //CONFIG_RF_GAIN_OFFSET
-
status=rtw_start_drv_threads(padapter);
if(status ==_FAIL)
{
goto netdev_open_error;
}
-#ifdef CONFIG_RF_GAIN_OFFSET
- rtw_bb_rf_gain_offset(padapter);
-#endif //CONFIG_RF_GAIN_OFFSET
-
if(padapter->intf_start)
{
padapter->intf_start(padapter);
}
-#ifdef CONFIG_RF_GAIN_OFFSET
-void rtw_bb_rf_gain_offset(_adapter *padapter)
-{
- u8 value = padapter->eeprompriv.EEPROMRFGainOffset;
- u8 tmp = 0x3e;
- u32 res;
-
- DBG_871X("+%s value: 0x%02x+\n", __func__, value);
-
- if (value & RF_GAIN_OFFSET_ON) {
- //DBG_871X("Offset RF Gain.\n");
- //DBG_871X("Offset RF Gain. padapter->eeprompriv.EEPROMRFGainVal=0x%x\n",padapter->eeprompriv.EEPROMRFGainVal);
- if(padapter->eeprompriv.EEPROMRFGainVal != 0xff){
-#ifdef CONFIG_RTL8723A
- res = rtw_hal_read_rfreg(padapter, RF_PATH_A, 0xd, 0xffffffff);
- //DBG_871X("Offset RF Gain. reg 0xd=0x%x\n",res);
- res &= 0xfff87fff;
-
- res |= (padapter->eeprompriv.EEPROMRFGainVal & 0x0f)<< 15;
- //DBG_871X("Offset RF Gain. reg 0xd=0x%x\n",res);
-
- rtw_hal_write_rfreg(padapter, RF_PATH_A, REG_RF_BB_GAIN_OFFSET, RF_GAIN_OFFSET_MASK, res);
-
- res = rtw_hal_read_rfreg(padapter, RF_PATH_A, 0xe, 0xffffffff);
- DBG_871X("Offset RF Gain. reg 0xe=0x%x\n",res);
- res &= 0xfffffff0;
-
- res |= (padapter->eeprompriv.EEPROMRFGainVal & 0x0f);
- //DBG_871X("Offset RF Gain. reg 0xe=0x%x\n",res);
-
- rtw_hal_write_rfreg(padapter, RF_PATH_A, REG_RF_BB_GAIN_OFFSET, RF_GAIN_OFFSET_MASK, res);
-#else
- res = rtw_hal_read_rfreg(padapter, RF_PATH_A, REG_RF_BB_GAIN_OFFSET, 0xffffffff);
- DBG_871X("REG_RF_BB_GAIN_OFFSET=%x \n",res);
- res &= 0xfff87fff;
- res |= (padapter->eeprompriv.EEPROMRFGainVal & 0x0f)<< 15;
- DBG_871X("write REG_RF_BB_GAIN_OFFSET=%x \n",res);
- rtw_hal_write_rfreg(padapter, RF_PATH_A, REG_RF_BB_GAIN_OFFSET, RF_GAIN_OFFSET_MASK, res);
-#endif
- }
- else
- {
- //DBG_871X("Offset RF Gain. padapter->eeprompriv.EEPROMRFGainVal=0x%x != 0xff, didn't run Kfree\n",padapter->eeprompriv.EEPROMRFGainVal);
- }
- } else {
- //DBG_871X("Using the default RF gain.\n");
- }
-
-}
-#endif //CONFIG_RF_GAIN_OFFSET
-
int pm_netdev_open(struct net_device *pnetdev,u8 bnormal)
{
int status;
dvobj->macid[1] = _TRUE; //macid=1 for bc/mc stainfo
dvobj->processing_dev_remove = _FALSE;
+
+ _rtw_spinlock_init(&dvobj->cam_ctl.lock);
+
if ( (err = pci_enable_device(pdev)) != 0) {
DBG_871X(KERN_ERR "%s : Cannot enable new PCI device\n", pci_name(pdev));
goto free_dvobj;
_rtw_mutex_free(&dvobj->h2c_fwcmd_mutex);
_rtw_mutex_free(&dvobj->setch_mutex);
_rtw_mutex_free(&dvobj->setbw_mutex);
+ _rtw_spinlock_free(&dvobj->cam_ctl.lock);
rtw_mfree((u8*)dvobj, sizeof(*dvobj));
dvobj = NULL;
}
_rtw_mutex_free(&dvobj->h2c_fwcmd_mutex);
_rtw_mutex_free(&dvobj->setch_mutex);
_rtw_mutex_free(&dvobj->setbw_mutex);
+ _rtw_spinlock_free(&dvobj->cam_ctl.lock);
rtw_mfree((u8*)dvobj, sizeof(*dvobj));
}
return 0;
}
+static int proc_get_mac_qinfo(struct seq_file *m, void *v)
+{
+ struct net_device *dev = m->private;
+ _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
+
+ rtw_hal_get_hwreg(adapter, HW_VAR_DUMP_MAC_QUEUE_INFO, (u8 *)m);
+
+ return 0;
+}
+
+static int proc_get_cam(struct seq_file *m, void *v)
+{
+ struct net_device *dev = m->private;
+ _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
+ u8 i;
+
+ return 0;
+}
+
+static ssize_t proc_set_cam(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
+{
+ struct net_device *dev = data;
+ _adapter *adapter;
+
+ char tmp[32];
+ char cmd[4];
+ u8 id;
+
+ adapter = (_adapter *)rtw_netdev_priv(dev);
+ if (!adapter)
+ return -EFAULT;
+
+ if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {
+
+ /* c <id>: clear specific cam entry */
+ /* wfc <id>: write specific cam entry from cam cache */
+
+ int num = sscanf(tmp, "%s %hhu", cmd, &id);
+
+ if (num < 2)
+ return count;
+
+ if (strcmp("c", cmd) == 0) {
+ _clear_cam_entry(adapter, id);
+ adapter->securitypriv.hw_decrypted = _FALSE; /* temporarily set this for TX path to use SW enc */
+ } else if (strcmp("wfc", cmd) == 0) {
+ write_cam_from_cache(adapter, id);
+ }
+ }
+
+ return count;
+}
+
+static int proc_get_cam_cache(struct seq_file *m, void *v)
+{
+ struct net_device *dev = m->private;
+ _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
+ struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
+ u8 i;
+
+ DBG_871X_SEL_NL(m, "cam bitmap:0x%016llx\n", dvobj->cam_ctl.bitmap);
+
+ DBG_871X_SEL_NL(m, "%-2s %-6s %-17s %-32s %-3s %-7s"
+ //" %-2s %-2s %-4s %-5s"
+ "\n"
+ , "id", "ctrl", "addr", "key", "kid", "type"
+ //, "MK", "GK", "MFB", "valid"
+ );
+
+ for (i=0;i<32;i++) {
+ if (dvobj->cam_cache[i].ctrl != 0)
+ DBG_871X_SEL_NL(m, "%2u 0x%04x "MAC_FMT" "KEY_FMT" %3u %-7s"
+ //" %2u %2u 0x%02x %5u"
+ "\n", i
+ , dvobj->cam_cache[i].ctrl
+ , MAC_ARG(dvobj->cam_cache[i].mac)
+ , KEY_ARG(dvobj->cam_cache[i].key)
+ , (dvobj->cam_cache[i].ctrl)&0x03
+ , security_type_str(((dvobj->cam_cache[i].ctrl)>>2)&0x07)
+ //, ((dvobj->cam_cache[i].ctrl)>>5)&0x01
+ //, ((dvobj->cam_cache[i].ctrl)>>6)&0x01
+ //, ((dvobj->cam_cache[i].ctrl)>>8)&0x7f
+ //, ((dvobj->cam_cache[i].ctrl)>>15)&0x01
+ );
+ }
+
+ return 0;
+}
+
/*
* rtw_adapter_proc:
* init/deinit when register/unregister net_device
{"ap_info", proc_get_ap_info, NULL},
{"adapter_state", proc_get_adapter_state, NULL},
{"trx_info", proc_get_trx_info, NULL},
+ {"mac_qinfo", proc_get_mac_qinfo, NULL},
+ {"cam", proc_get_cam, proc_set_cam},
+ {"cam_cache", proc_get_cam_cache, NULL},
#ifdef CONFIG_DBG_COUNTER
{"rx_logs", proc_get_rx_logs, NULL},
#endif
{"fwdl_test_case", proc_get_dummy, proc_set_fwdl_test_case},
+ {"wait_hiq_empty", proc_get_dummy, proc_set_wait_hiq_empty},
{"mac_reg_dump", proc_get_mac_reg_dump, NULL},
{"bb_reg_dump", proc_get_bb_reg_dump, NULL},
#else //!CONFIG_PROC_DEBUG
-struct proc_dir_entry *get_rtw_drv_proc(void) {return NULL;}
-int rtw_drv_proc_init(void) {return 0;}
-void rtw_drv_proc_deinit(void) {}
-struct proc_dir_entry *rtw_adapter_proc_init(struct net_device *dev){return NULL;}
-void rtw_adapter_proc_deinit(struct net_device *dev){}
-void rtw_adapter_proc_replace(struct net_device *dev){}
+#define get_rtw_drv_proc() NULL
+#define rtw_drv_proc_init() 0
+#define rtw_drv_proc_deinit() do {} while (0)
+#define rtw_adapter_proc_init(dev) NULL
+#define rtw_adapter_proc_deinit(dev) do {} while (0)
+#define rtw_adapter_proc_replace(dev) do {} while (0)
#endif //!CONFIG_PROC_DEBUG
_rtw_spinlock_init(&dvobj->lock);
dvobj->macid[1] = _TRUE; //macid=1 for bc/mc stainfo
+ _rtw_spinlock_init(&dvobj->cam_ctl.lock);
#ifdef CONFIG_WOWLAN
sdio_claim_host(func);
_rtw_mutex_free(&dvobj->h2c_fwcmd_mutex);
_rtw_mutex_free(&dvobj->setch_mutex);
_rtw_mutex_free(&dvobj->setbw_mutex);
+ _rtw_spinlock_free(&dvobj->cam_ctl.lock);
rtw_mfree((u8*)dvobj, sizeof(*dvobj));
dvobj = NULL;
}
_rtw_mutex_free(&dvobj->h2c_fwcmd_mutex);
_rtw_mutex_free(&dvobj->setch_mutex);
_rtw_mutex_free(&dvobj->setbw_mutex);
+ _rtw_spinlock_free(&dvobj->cam_ctl.lock);
rtw_mfree((u8*)dvobj, sizeof(*dvobj));
}
_rtw_mutex_init(&pdvobjpriv->setbw_mutex);
pdvobjpriv->processing_dev_remove = _FALSE;
- _rtw_spinlock_init(&pdvobjpriv->lock);
+ _rtw_spinlock_init(&pdvobjpriv->lock);
pdvobjpriv->macid[1] = _TRUE; //macid=1 for bc/mc stainfo
+ _rtw_spinlock_init(&pdvobjpriv->cam_ctl.lock);
pdvobjpriv->pusbintf = usb_intf ;
pusbd = pdvobjpriv->pusbdev = interface_to_usbdev(usb_intf);
_rtw_mutex_free(&pdvobjpriv->h2c_fwcmd_mutex);
_rtw_mutex_free(&pdvobjpriv->setch_mutex);
_rtw_mutex_free(&pdvobjpriv->setbw_mutex);
+ _rtw_spinlock_free(&pdvobjpriv->cam_ctl.lock);
rtw_mfree((u8*)pdvobjpriv, sizeof(*pdvobjpriv));
pdvobjpriv = NULL;
}
_rtw_mutex_free(&dvobj->h2c_fwcmd_mutex);
_rtw_mutex_free(&dvobj->setch_mutex);
_rtw_mutex_free(&dvobj->setbw_mutex);
+ _rtw_spinlock_free(&dvobj->cam_ctl.lock);
rtw_mfree((u8*)dvobj, sizeof(*dvobj));
}
extern int console_suspend_enabled;
#endif
-static int rtw_drv_entry(void)
+static int /*__init*/ rtw_drv_entry(void)
{
int ret = 0;
return ret;
}
-static void rtw_drv_halt(void)
+static void /*exit*/ rtw_drv_halt(void)
{
DBG_871X_LEVEL(_drv_always_, "module exit start\n");
pipe=usb_rcvbulkpipe(pusbd, pdvobj->RtInPipe[0]);\r
\r
} else if (addr == RECV_INT_IN_ADDR) { \r
- pipe=usb_rcvbulkpipe(pusbd, pdvobj->RtInPipe[1]);\r
+ pipe=usb_rcvintpipe(pusbd, pdvobj->RtInPipe[1]);\r
\r
} else if (addr < HW_QUEUE_ENTRY) {\r
ep_num = pdvobj->Queue2Pipe[addr];\r
case BK_QUEUE_INX:\r
pxmitpriv->bkq_cnt--; \r
break;\r
- case HIGH_QUEUE_INX:\r
-#ifdef CONFIG_AP_MODE \r
- rtw_chk_hi_queue_cmd(padapter);\r
-#endif\r
- break;\r
default: \r
break;\r
}\r
if ( !rtw_mc2u_disable
&& check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE
&& ( IP_MCAST_MAC(pkt->data)
- || ICMPV6_MCAST_MAC(pkt->data) )
+ || ICMPV6_MCAST_MAC(pkt->data)
+ #ifdef CONFIG_TX_BCAST2UNI
+ || is_broadcast_mac_addr(pkt->data)
+ #endif
+ )
&& (padapter->registrypriv.wifi_spec == 0)
)
{