Wifi->rtl8723au: update dirver to version 4.00(4.1.11_12622.20141215).
authorli bing <libing@rock-chips.com>
Thu, 29 Jan 2015 06:09:41 +0000 (14:09 +0800)
committerli bing <libing@rock-chips.com>
Thu, 29 Jan 2015 06:09:41 +0000 (14:09 +0800)
62 files changed:
drivers/net/wireless/rockchip_wlan/rtl8723au/Makefile
drivers/net/wireless/rockchip_wlan/rtl8723au/core/rtw_ap.c
drivers/net/wireless/rockchip_wlan/rtl8723au/core/rtw_cmd.c
drivers/net/wireless/rockchip_wlan/rtl8723au/core/rtw_debug.c
drivers/net/wireless/rockchip_wlan/rtl8723au/core/rtw_ieee80211.c
drivers/net/wireless/rockchip_wlan/rtl8723au/core/rtw_ioctl_set.c
drivers/net/wireless/rockchip_wlan/rtl8723au/core/rtw_mlme.c
drivers/net/wireless/rockchip_wlan/rtl8723au/core/rtw_mlme_ext.c
drivers/net/wireless/rockchip_wlan/rtl8723au/core/rtw_p2p.c
drivers/net/wireless/rockchip_wlan/rtl8723au/core/rtw_recv.c
drivers/net/wireless/rockchip_wlan/rtl8723au/core/rtw_security.c
drivers/net/wireless/rockchip_wlan/rtl8723au/core/rtw_sreset.c
drivers/net/wireless/rockchip_wlan/rtl8723au/core/rtw_tdls.c
drivers/net/wireless/rockchip_wlan/rtl8723au/core/rtw_wlan_util.c
drivers/net/wireless/rockchip_wlan/rtl8723au/core/rtw_xmit.c
drivers/net/wireless/rockchip_wlan/rtl8723au/hal/OUTSRC/odm_HWConfig.c
drivers/net/wireless/rockchip_wlan/rtl8723au/hal/OUTSRC/odm_HWConfig.h
drivers/net/wireless/rockchip_wlan/rtl8723au/hal/OUTSRC/rtl8723a/Hal8723SHWImg_CE.c
drivers/net/wireless/rockchip_wlan/rtl8723au/hal/OUTSRC/rtl8723a/Hal8723UHWImg_CE.c
drivers/net/wireless/rockchip_wlan/rtl8723au/hal/hal_com.c
drivers/net/wireless/rockchip_wlan/rtl8723au/hal/hal_intf.c
drivers/net/wireless/rockchip_wlan/rtl8723au/hal/rtl8723a/rtl8723a_bt-coexist.c
drivers/net/wireless/rockchip_wlan/rtl8723au/hal/rtl8723a/rtl8723a_dm.c
drivers/net/wireless/rockchip_wlan/rtl8723au/hal/rtl8723a/rtl8723a_hal_init.c
drivers/net/wireless/rockchip_wlan/rtl8723au/hal/rtl8723a/rtl8723a_rf6052.c
drivers/net/wireless/rockchip_wlan/rtl8723au/hal/rtl8723a/rtl8723a_rxdesc.c
drivers/net/wireless/rockchip_wlan/rtl8723au/hal/rtl8723a/sdio/sdio_halinit.c
drivers/net/wireless/rockchip_wlan/rtl8723au/hal/rtl8723a/usb/rtl8723au_recv.c
drivers/net/wireless/rockchip_wlan/rtl8723au/hal/rtl8723a/usb/usb_halinit.c
drivers/net/wireless/rockchip_wlan/rtl8723au/hal/rtl8723a/usb/usb_ops_linux.c
drivers/net/wireless/rockchip_wlan/rtl8723au/include/autoconf.h
drivers/net/wireless/rockchip_wlan/rtl8723au/include/drv_conf.h
drivers/net/wireless/rockchip_wlan/rtl8723au/include/drv_types.h
drivers/net/wireless/rockchip_wlan/rtl8723au/include/hal_com.h
drivers/net/wireless/rockchip_wlan/rtl8723au/include/hal_com_reg.h [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8723au/include/hal_intf.h
drivers/net/wireless/rockchip_wlan/rtl8723au/include/osdep_intf.h
drivers/net/wireless/rockchip_wlan/rtl8723au/include/rtl8188e_spec.h
drivers/net/wireless/rockchip_wlan/rtl8723au/include/rtl8192c_spec.h
drivers/net/wireless/rockchip_wlan/rtl8723au/include/rtl8192d_spec.h
drivers/net/wireless/rockchip_wlan/rtl8723au/include/rtl8723a_bt-coexist.h
drivers/net/wireless/rockchip_wlan/rtl8723au/include/rtl8723a_hal.h
drivers/net/wireless/rockchip_wlan/rtl8723au/include/rtw_ap.h
drivers/net/wireless/rockchip_wlan/rtl8723au/include/rtw_cmd.h
drivers/net/wireless/rockchip_wlan/rtl8723au/include/rtw_debug.h
drivers/net/wireless/rockchip_wlan/rtl8723au/include/rtw_mlme.h
drivers/net/wireless/rockchip_wlan/rtl8723au/include/rtw_mlme_ext.h
drivers/net/wireless/rockchip_wlan/rtl8723au/include/rtw_recv.h
drivers/net/wireless/rockchip_wlan/rtl8723au/include/rtw_security.h
drivers/net/wireless/rockchip_wlan/rtl8723au/include/rtw_version.h
drivers/net/wireless/rockchip_wlan/rtl8723au/include/rtw_xmit.h
drivers/net/wireless/rockchip_wlan/rtl8723au/os_dep/linux/gspi_intf.c
drivers/net/wireless/rockchip_wlan/rtl8723au/os_dep/linux/ioctl_cfg80211.c
drivers/net/wireless/rockchip_wlan/rtl8723au/os_dep/linux/ioctl_linux.c
drivers/net/wireless/rockchip_wlan/rtl8723au/os_dep/linux/os_intfs.c
drivers/net/wireless/rockchip_wlan/rtl8723au/os_dep/linux/pci_intf.c
drivers/net/wireless/rockchip_wlan/rtl8723au/os_dep/linux/rtw_proc.c
drivers/net/wireless/rockchip_wlan/rtl8723au/os_dep/linux/rtw_proc.h
drivers/net/wireless/rockchip_wlan/rtl8723au/os_dep/linux/sdio_intf.c
drivers/net/wireless/rockchip_wlan/rtl8723au/os_dep/linux/usb_intf.c
drivers/net/wireless/rockchip_wlan/rtl8723au/os_dep/linux/usb_ops_linux.c
drivers/net/wireless/rockchip_wlan/rtl8723au/os_dep/linux/xmit_linux.c

index a01e58145c0d93c2165a05eec1708285a9d1778d..680ad384f724239fa5a85a776be4ab71212c30bf 100755 (executable)
@@ -357,6 +357,8 @@ endif
 
 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)
@@ -371,6 +373,10 @@ ifeq ($(CONFIG_ODM_ADAPTIVITY), 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
@@ -631,7 +637,7 @@ 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)
@@ -736,14 +742,10 @@ KVER  := 3.3.0
 #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)
index c865a744bf18e6a87df831b033fdd2482ae4a2c5..a81ffbf82a71c8ca1c4f3d8cd58a9ce3700d3fbd 100755 (executable)
@@ -193,14 +193,6 @@ static void update_BCNTIM(_adapter *padapter)
                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
@@ -495,7 +487,7 @@ void        expire_timeout_chk(_adapter *padapter)
 \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
@@ -1354,7 +1346,7 @@ static void start_bss_network(_adapter *padapter, u8 *pbuf)
 \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
@@ -2074,7 +2066,7 @@ static void update_bcn_vendor_spec_ie(_adapter *padapter, u8*oui)
        \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
@@ -2152,6 +2144,8 @@ void update_beacon(_adapter *padapter, u8 ie_id, u8 *oui, u8 tx)
        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
@@ -2597,8 +2591,7 @@ u8 ap_free_sta(_adapter *padapter, struct sta_info *psta, bool active, u16 reaso
        //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
@@ -2835,7 +2828,7 @@ void rtw_ap_restore_network(_adapter *padapter)
                        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
index 5853d235eebb311b9a281b952a2cba9ce2ac5fb8..2679d42e91d9b31d83d3b42125abdd4d9af32ba7 100755 (executable)
@@ -1466,7 +1466,7 @@ _func_exit_;
        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;
@@ -1475,7 +1475,6 @@ u8 rtw_setstakey_cmd(_adapter *padapter, u8 *psta, u8 unicast_key, bool enqueue)
        
        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_;
@@ -1547,7 +1546,7 @@ _func_exit_;
        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;
@@ -1555,14 +1554,18 @@ u8 rtw_clearstakey_cmd(_adapter *padapter, u8 *psta, u8 entry, u8 enqueue)
        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
        {
@@ -1594,8 +1597,6 @@ _func_enter_;
                _rtw_memcpy(psetstakey_para->addr, sta->hwaddr, ETH_ALEN);
 
                psetstakey_para->algorithm = _NO_PRIVACY_;
-
-               psetstakey_para->id = entry;
        
                res = rtw_enqueue_cmd(pcmdpriv, ph2c);  
                
@@ -2322,7 +2323,7 @@ static void traffic_status_watchdog(_adapter *padapter)
        pmlmepriv->LinkDetectInfo.bHigherBusyRxTraffic = bHigherBusyRxTraffic;
        pmlmepriv->LinkDetectInfo.bHigherBusyTxTraffic = bHigherBusyTxTraffic;
 #ifdef CONFIG_BT_COEXIST
-       pHalData->bt_coexist.halCoex8723.bBusyTrafficForCoex = bBusyTrafficForCoex;
+       pmlmepriv->LinkDetectInfo.bBusyTrafficForCoex = bBusyTrafficForCoex;
 #endif
 }
 
@@ -2711,49 +2712,43 @@ _func_exit_;
 
 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)
index 00cff458e430344d7668f6188e97260da29c87d5..e20476dd3fe3eb3cb2af8bf8a61f5ce8e676b00d 100755 (executable)
@@ -131,6 +131,36 @@ void rf_reg_dump(void *sel, _adapter *adapter)
        }
 }
 
+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)
 {
@@ -253,11 +283,30 @@ int proc_get_sec_info(struct seq_file *m, void *v)
 {
        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;
 }
@@ -901,7 +950,7 @@ int proc_get_best_channel(struct seq_file *m, void *v)
                        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 ) {
@@ -1047,8 +1096,6 @@ ssize_t proc_set_sreset(struct file *file, const char __user *buffer, size_t cou
 }
 #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;
@@ -1059,7 +1106,23 @@ ssize_t proc_set_fwdl_test_case(struct file *file, const char __user *buffer, si
                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;
index 98c92eedaca0e2a3b2f7c68e6c0af5e5a01622e8..1f641cd33bfb6884a0820051e44889b3efe81188 100755 (executable)
@@ -1317,13 +1317,12 @@ extern char* rtw_initmac;
 #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 )
         {
@@ -1361,7 +1360,7 @@ void rtw_macaddr_cfg(u8 *mac_addr)
         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)
index d2d07d7ef386fedb2728222f7062661399bd0ac0..1cd87785f37a67d1359a482cc9d4353ef2aecad5 100755 (executable)
@@ -1265,11 +1265,11 @@ _func_enter_;
                        //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"));
                        }
                        
index 1872700eea3ca043ae05910787db02888c355dd1..76f6cba101bb5dc441e5e547858859d50ea24eb0 100755 (executable)
@@ -1622,6 +1622,8 @@ void rtw_indicate_disconnect( _adapter *padapter )
        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_;  
        
@@ -1629,7 +1631,22 @@ _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);
@@ -1760,6 +1777,7 @@ static struct sta_info *rtw_joinbss_update_stainfo(_adapter *padapter, struct wl
                        _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
@@ -2317,7 +2335,7 @@ _func_enter_;
        
 #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:
@@ -3469,25 +3487,71 @@ static int SecIsInPMKIDList(_adapter *Adapter, u8 *bssid)
 // 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;
@@ -3544,14 +3608,13 @@ _func_enter_;
        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_;
index 800982364b97a630487164ce95884886b01ac769..c75b90899567a3a97d558340660ea8474ec6945f 100755 (executable)
@@ -5594,8 +5594,7 @@ unsigned int on_action_public_p2p(union recv_frame *precv_frame)
                                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);
@@ -5845,8 +5844,7 @@ unsigned int on_action_public_p2p(union recv_frame *precv_frame)
                                        _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);
@@ -5931,8 +5929,7 @@ unsigned int on_action_public_p2p(union recv_frame *precv_frame)
                                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);
@@ -6094,10 +6091,7 @@ unsigned int OnAction_p2p(_adapter *padapter, union recv_frame *precv_frame)
        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;
@@ -7478,6 +7472,7 @@ void issue_assocreq(_adapter *padapter)
        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 };
@@ -7721,17 +7716,18 @@ void issue_assocreq(_adapter *padapter)
                                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;
 
@@ -8024,9 +8020,12 @@ exit:
        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;
@@ -8034,13 +8033,26 @@ int issue_nulldata(_adapter *padapter, unsigned char *da, unsigned int power_mod
        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++;
@@ -8074,6 +8086,31 @@ exit:
        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)
 {
@@ -10589,6 +10626,10 @@ void mlmeext_joinbss_event_callback(_adapter *padapter, int join_res)
                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;
@@ -10677,6 +10718,14 @@ void mlmeext_sta_del_event_callback(_adapter *padapter)
        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);
@@ -10909,7 +10958,7 @@ void linked_status_chk(_adapter *padapter)
                                        #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);
                                }
                        }
 
@@ -11167,7 +11216,7 @@ void link_timer_hdl(_adapter *padapter)
                        {
                                if (tx_cnt == pxmitpriv->tx_pkts)
                                {
-                                       issue_nulldata(padapter, NULL, 0, 0, 0);
+                                       issue_nulldata_in_interrupt(padapter, NULL);
                                }
 
                                tx_cnt = pxmitpriv->tx_pkts;
@@ -11613,6 +11662,15 @@ u8 disconnect_hdl(_adapter *padapter, unsigned char *pbuf)
                
        _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;
@@ -11833,33 +11891,48 @@ u8 setauth_hdl(_adapter *padapter, unsigned char *pbuf)
 
 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);
@@ -11870,96 +11943,38 @@ u8 set_stakey_hdl(_adapter *padapter, u8 *pbuf)
        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)
@@ -12002,6 +12017,31 @@ 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;
@@ -12011,15 +12051,15 @@ u8 set_tx_beacon_cmd(_adapter* padapter)
        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));
@@ -12028,21 +12068,20 @@ _func_enter_;
        }
 
        _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;
@@ -12121,87 +12160,87 @@ u8 h2c_msg_hdl(_adapter *padapter, unsigned char *pbuf)
        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
index f786bbe0cd7f339924cd148bb6176c1314efd018..dcb7dc75e6cc84dfc0958c54207d32244b7314f1 100755 (executable)
@@ -3432,6 +3432,8 @@ _func_exit_;
 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;
@@ -3472,9 +3474,12 @@ _func_enter_;
                                        }
 
                                        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 );
                                }
@@ -3494,8 +3499,12 @@ _func_enter_;
                                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);
                                }
@@ -3588,6 +3597,9 @@ _func_enter_;
 
        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, 
@@ -5273,6 +5285,11 @@ int rtw_p2p_enable(_adapter *padapter, enum P2P_ROLE role)
                        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);
index a6c6a2e13cc321f50345176f5face4e84a188091..ed32eb40e49c19a8fe4eaa1baf90e30e936615c4 100755 (executable)
@@ -1682,12 +1682,12 @@ sint validate_recv_ctrl_frame(_adapter *padapter, union recv_frame *precv_frame)
 
                                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); 
@@ -1707,7 +1707,7 @@ sint validate_recv_ctrl_frame(_adapter *padapter, union recv_frame *precv_frame)
 
                                        //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);
@@ -1727,7 +1727,7 @@ sint validate_recv_ctrl_frame(_adapter *padapter, union recv_frame *precv_frame)
                                                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
                                        {
@@ -1739,7 +1739,7 @@ sint validate_recv_ctrl_frame(_adapter *padapter, union recv_frame *precv_frame)
 
                                        //upate BCN for TIM IE
                                        //update_BCNTIM(padapter);
-                                       update_beacon(padapter, _TIM_IE_, NULL, _FALSE);
+                                       update_beacon(padapter, _TIM_IE_, NULL, _TRUE);
                                }
                                
                        }                               
index 66df244eeaf7653631a2dbb7a321ac54f926b26b..a5d2a28ad165afddea3645fdd96d3d1f461e6fbd 100755 (executable)
 #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===== 
 
@@ -233,7 +312,8 @@ _func_enter_;
                        }
                        
                }               
-                                               
+
+               WEP_SW_ENC_CNT_INC(psecuritypriv, pattrib->ra);
        }
        
 _func_exit_;                                           
@@ -281,8 +361,9 @@ _func_enter_;
                {
                        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_;           
@@ -754,7 +835,7 @@ _func_enter_;
                                }
                        }
 
-
+                       TKIP_SW_ENC_CNT_INC(psecuritypriv,pattrib->ra);
                }
                else{
                        RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("rtw_tkip_encrypt: stainfo==NULL!!!\n"));
@@ -844,7 +925,6 @@ _func_enter_;
                        }
                        else
                        {
-                               RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("rtw_tkip_decrypt: stainfo!=NULL!!!\n"));
                                prwskey=&stainfo->dot118021x_UncstKey.skey[0];
                                prwskeylen=16;
                        }
@@ -874,8 +954,8 @@ _func_enter_;
                                                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"));
@@ -1681,7 +1761,7 @@ _func_enter_;
                                }
                        }
 
-
+                       AES_SW_ENC_CNT_INC(psecuritypriv, pattrib->ra);
                }
                else{
                        RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("rtw_aes_encrypt: stainfo==NULL!!!\n"));
@@ -2004,7 +2084,6 @@ _func_enter_;
                                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)
@@ -2080,10 +2159,10 @@ _func_enter_;
 
                        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;
                }
                                                
@@ -3127,9 +3206,9 @@ void rtw_sec_restore_wep_key(_adapter *adapter)
                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);
                        }
                }
        }
index bc34827b492be86f47aa08a191d9ea1bf5687ec2..25812b83e267500622ca515ef901f0ae6765df8f 100755 (executable)
@@ -161,7 +161,7 @@ void sreset_restore_security_station(_adapter *padapter)
                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
index f7ca24aab82665208e43ac08ae347e95c7adea68..c2a8279fbe35744c1cad07b46b70efd0734b038d 100755 (executable)
@@ -294,7 +294,7 @@ void rtw_tdls_set_key(_adapter *adapter, struct rx_pkt_attrib *prx_pkt_attrib, s
        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
index 0e7153d38a3e5e50312ad9add4b64000a822cb83..5488ef05b1bfb1b8b0fe74e0d99544139c97a577 100755 (executable)
@@ -59,6 +59,9 @@ extern unsigned char RSN_TKIP_CIPHER[4];
 #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
@@ -662,9 +665,34 @@ void CAM_empty_entry(
        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)
@@ -700,80 +728,310 @@ void read_cam(_adapter *padapter ,u8 entry)
        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)
@@ -797,49 +1055,58 @@ 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));
        
@@ -1437,6 +1704,7 @@ int rtw_check_bcn_info(ADAPTER *Adapter, u8 *pframe, u32 packet_len)
        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;
@@ -1456,6 +1724,12 @@ int rtw_check_bcn_info(ADAPTER *Adapter, u8 *pframe, u32 packet_len)
 
        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)
@@ -1490,7 +1764,7 @@ int rtw_check_bcn_info(ADAPTER *Adapter, u8 *pframe, u32 packet_len)
                                                        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;
@@ -1543,7 +1817,7 @@ int rtw_check_bcn_info(ADAPTER *Adapter, u8 *pframe, u32 packet_len)
        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;
                }
        }
@@ -1560,7 +1834,7 @@ int rtw_check_bcn_info(ADAPTER *Adapter, u8 *pframe, u32 packet_len)
                        ("%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;
        }
 
@@ -1576,7 +1850,7 @@ int rtw_check_bcn_info(ADAPTER *Adapter, u8 *pframe, u32 packet_len)
        }
 
        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;
        }
 
@@ -1603,14 +1877,14 @@ int rtw_check_bcn_info(ADAPTER *Adapter, u8 *pframe, u32 packet_len)
                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;
                }
        }
@@ -1620,9 +1894,26 @@ int rtw_check_bcn_info(ADAPTER *Adapter, u8 *pframe, u32 packet_len)
 
 _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)
@@ -2440,25 +2731,6 @@ void beacon_timing_control(_adapter *padapter)
        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;
@@ -2772,3 +3044,47 @@ void rtw_set_sec_iv(PADAPTER padapter)
                }
 }
 #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;
+}
+
index ee5e9fe7789797db2ef447eaf27cd7a226f425d3..6b5c31e04226686244e21a27bf228413fcba832f 100755 (executable)
@@ -603,8 +603,10 @@ static void update_attrib_vcs_info(_adapter *padapter, struct xmit_frame *pxmitf
        }
 }
 
-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) 
@@ -622,7 +624,10 @@ static void update_attrib_phy_info(struct pkt_attrib *pattrib, struct sta_info *
        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;
@@ -728,12 +733,12 @@ static s32 update_attrib(_adapter *padapter, _pkt *pkt, struct pkt_attrib *pattr
        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)) {
@@ -970,7 +975,7 @@ static s32 update_attrib(_adapter *padapter, _pkt *pkt, struct pkt_attrib *pattr
                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.
@@ -984,7 +989,7 @@ static s32 update_attrib(_adapter *padapter, _pkt *pkt, struct pkt_attrib *pattr
 
        rtw_set_tx_chksum_offload(pkt, pattrib);
 
-       update_attrib_phy_info(pattrib, psta);
+       update_attrib_phy_info(padapter, pattrib, psta);
 
 exit:
 
@@ -1235,7 +1240,6 @@ _func_enter_;
        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);
@@ -1256,10 +1260,11 @@ _func_enter_;
                        }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);
                        } 
 
@@ -1280,7 +1285,7 @@ _func_enter_;
                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)                    
@@ -3588,6 +3593,47 @@ sint xmitframe_enqueue_for_tdls_sleeping_sta(_adapter *padapter, struct xmit_fra
 }
 #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)
@@ -3599,6 +3645,7 @@ sint xmitframe_enqueue_for_sleeping_sta(_adapter *padapter, struct xmit_frame *p
        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;
 
@@ -3645,10 +3692,8 @@ sint xmitframe_enqueue_for_sleeping_sta(_adapter *padapter, struct xmit_frame *p
                //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;
        }
@@ -3670,13 +3715,23 @@ sint xmitframe_enqueue_for_sleeping_sta(_adapter *padapter, struct xmit_frame *p
                        
                        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;                    
@@ -3734,15 +3789,18 @@ sint xmitframe_enqueue_for_sleeping_sta(_adapter *padapter, struct xmit_frame *p
 
                        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");
                                }
                        }
 
@@ -3784,13 +3842,15 @@ static void dequeue_xmitframes_to_sleeping_queue(_adapter *padapter, struct sta_
                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--;
@@ -3949,9 +4009,41 @@ void wakeup_sta_to_xmit(_adapter *padapter, struct sta_info *psta)
 */
                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;
@@ -3992,46 +4084,17 @@ void wakeup_sta_to_xmit(_adapter *padapter, struct sta_info *psta)
        
                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:
 
@@ -4041,9 +4104,13 @@ _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");
+       }
        
 }
 
@@ -4134,7 +4201,7 @@ void xmit_delivery_enabled_frames(_adapter *padapter, struct sta_info *psta)
                        //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);
                }
        
index a11a8154448f022279b5fa0eab7ecdba8fff77b7..8c84a03d157f1b48f65afea3101be17663d22a0b 100755 (executable)
@@ -710,8 +710,12 @@ odm_RxPhyStatus92CSeries_Parsing(
 #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
@@ -721,8 +725,13 @@ odm_RxPhyStatus92CSeries_Parsing(
 #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
index 9b53a8aa33614982ee7f036aa33d14584d4bc056..2799a27e9c561c931405dbe4d4ab27aba139db7b 100755 (executable)
@@ -188,6 +188,13 @@ HAL_STATUS
 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
index e4e646eed982e05f0f45eb6c4cce177fad2272e6..7b634355ae6addffb5d68e71066dc2d0a26918ad 100755 (executable)
@@ -5267,7 +5267,7 @@ const u32 Rtl8723SPHY_REG_1TArray[Rtl8723SPHY_REG_1TArrayLength] = {
 0x908,0x00000000,\r
 0x90c,0x81121111,\r
 0xa00,0x00d047c8,\r
-0xa04,0x80ff000c,\r
+0xa04,0x80ff800c,\r
 0xa08,0x8c838300,\r
 0xa0c,0x2e68120f,\r
 0xa10,0x9500bb78,\r
@@ -5341,7 +5341,7 @@ const u32 Rtl8723SPHY_REG_1TArray[Rtl8723SPHY_REG_1TArrayLength] = {
 0xce4,0x00000000,\r
 0xce8,0x37644302,\r
 0xcec,0x2f97d40c,\r
-0xd00,0x00080740,\r
+0xd00,0x00000740,\r
 0xd04,0x00020401,\r
 0xd08,0x0000907f,\r
 0xd0c,0x20010201,\r
index a6f106df8b3f8f8b98baf201655b88b201c380c6..c0fe819e8f74dc1be08cc175c078ebddbb3d61ff 100755 (executable)
@@ -5369,7 +5369,7 @@ u32 Rtl8723UPHY_REG_1TArray[Rtl8723UPHY_REG_1TArrayLength] = {
 0x908,0x00000000,\r
 0x90c,0x81121111,\r
 0xa00,0x00d047c8,\r
-0xa04,0x80ff000c,\r
+0xa04,0x80ff800c,\r
 0xa08,0x8c838300,\r
 0xa0c,0x2e68120f,\r
 0xa10,0x9500bb78,\r
@@ -5443,7 +5443,7 @@ u32 Rtl8723UPHY_REG_1TArray[Rtl8723UPHY_REG_1TArrayLength] = {
 0xce4,0x00000000,\r
 0xce8,0x37644302,\r
 0xcec,0x2f97d40c,\r
-0xd00,0x00080740,\r
+0xd00,0x00000740,\r
 0xd04,0x00020401,\r
 0xd08,0x0000907f,\r
 0xd0c,0x20010201,\r
@@ -5568,7 +5568,7 @@ u32 Rtl8723UPHY_REG_1T_mCardArray[Rtl8723UPHY_REG_1T_mCardArrayLength] = {
 0x908,0x00000000,\r
 0x90c,0x81121111,\r
 0xa00,0x00d047c8,\r
-0xa04,0x80ff000c,\r
+0xa04,0x80ff800c,\r
 0xa08,0x8c838300,\r
 0xa0c,0x2e68120f,\r
 0xa10,0x9500bb78,\r
@@ -5642,7 +5642,7 @@ u32 Rtl8723UPHY_REG_1T_mCardArray[Rtl8723UPHY_REG_1T_mCardArrayLength] = {
 0xce4,0x00000000,\r
 0xce8,0x37644302,\r
 0xcec,0x2f97d40c,\r
-0xd00,0x00080740,\r
+0xd00,0x00000740,\r
 0xd04,0x00020401,\r
 0xd08,0x0000907f,\r
 0xd0c,0x20010201,\r
@@ -5757,7 +5757,7 @@ u32 Rtl8723UPHY_REG_1T_SDIOArray[Rtl8723UPHY_REG_1T_SDIOArrayLength] = {
 0x908,0x00000000,\r
 0x90c,0x81121111,\r
 0xa00,0x00d047c8,\r
-0xa04,0x80ff000c,\r
+0xa04,0x80ff800c,\r
 0xa08,0x8c838300,\r
 0xa0c,0x2e68120f,\r
 0xa10,0x9500bb78,\r
@@ -5831,7 +5831,7 @@ u32 Rtl8723UPHY_REG_1T_SDIOArray[Rtl8723UPHY_REG_1T_SDIOArrayLength] = {
 0xce4,0x00000000,\r
 0xce8,0x37644302,\r
 0xcec,0x2f97d40c,\r
-0xd00,0x00080740,\r
+0xd00,0x00000740,\r
 0xd04,0x00020401,\r
 0xd08,0x0000907f,\r
 0xd0c,0x20010201,\r
index 9f413a09cfbfa936f4cdf5041d76f7abf1323c54..d18b011f5d099dbcef01b357f07e78622d59b714 100755 (executable)
 
 #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;
@@ -396,6 +408,74 @@ exit:
        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)
 {
@@ -442,6 +522,9 @@ GetHalDefVar(_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;
@@ -451,3 +534,281 @@ GetHalDefVar(_adapter *adapter, HAL_DEF_VARIABLE variable, void *value)
        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
+
+
index a37c9ccb3f57865966585489d06064ff92f8f12d..a16d5a2bf3a5ea9cc91ee83b27c39036c5d8ee18 100755 (executable)
@@ -142,24 +142,26 @@ uint       rtw_hal_init(_adapter *padapter)
        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");
        }
 
@@ -597,3 +599,43 @@ c2h_id_filter rtw_hal_c2h_id_filter_ccx(_adapter *adapter)
        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;
+}
+
index b6c6a3a6bb7515222beb42c9d48f9c590bdd3d6c..fbe18866fec2bba426009665463b39dd7a78018c 100755 (executable)
@@ -8238,7 +8238,7 @@ btdm_1AntPsTdma(
                                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;
@@ -8246,7 +8246,7 @@ btdm_1AntPsTdma(
                                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;
@@ -8278,7 +8278,7 @@ btdm_1AntPsTdma(
                                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;
@@ -8293,7 +8293,7 @@ btdm_1AntPsTdma(
                                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;
@@ -8385,7 +8385,7 @@ btdm_1AntPsTdma(
                        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;
@@ -10480,8 +10480,10 @@ void btdm_2AntIgnoreWlanAct(PADAPTER   padapter,u8     bEnable)
        //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;
@@ -17880,8 +17882,6 @@ void btdm_InitBtCoexistDM(PADAPTER padapter)
        pHalData->bt_coexist.CurrentState = 0;
        pHalData->bt_coexist.PreviousState = 0;
 
-       pHalData->bt_coexist.halCoex8723.bBusyTrafficForCoex = _FALSE;
-
        BTDM_8723AInit(padapter);
        pHalData->bt_coexist.bInitlized = _TRUE;
 }
@@ -19467,18 +19467,15 @@ u8 BTDM_IsWifiBusy(PADAPTER padapter)
 {
 //     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)))))
@@ -19489,7 +19486,7 @@ u8 BTDM_IsWifiBusy(PADAPTER padapter)
                }
 #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;
@@ -19498,7 +19495,7 @@ u8 BTDM_IsWifiBusy(PADAPTER padapter)
        }
 #endif
 
-       if (pHalData->bt_coexist.halCoex8723.bBusyTrafficForCoex ||
+       if (pmlmepriv->LinkDetectInfo.bBusyTrafficForCoex ||
                pBtTraffic->Bt30TrafficStatistics.bTxBusyTraffic ||
                pBtTraffic->Bt30TrafficStatistics.bRxBusyTraffic)
                return _TRUE;
index fd0c45e5d4fccfd0f603f50fcabfbd029564463e..b8117870663af77b302df59ccb71ca52354ca3fb 100755 (executable)
@@ -89,6 +89,7 @@ dm_CheckStatistics(
 #endif\r
 }\r
 \r
+#ifdef CONFIG_SUPPORT_HW_WPS_PBC\r
 static void dm_CheckPbcGPIO(_adapter *padapter)\r
 {\r
        u8      tmp1byte;\r
@@ -156,6 +157,7 @@ static void dm_CheckPbcGPIO(_adapter *padapter)
 #endif\r
        }\r
 }\r
+#endif //#ifdef CONFIG_SUPPORT_HW_WPS_PBC\r
 \r
 #ifdef CONFIG_PCI_HCI\r
 //\r
@@ -559,16 +561,11 @@ _record_initrate:
        }\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
index f5d3716cd1409c0d71403c1f4bafaf613a317092..dad346a8773452ca5ac40fbe7a91df24f0a6de58 100755 (executable)
@@ -249,7 +249,6 @@ void _8051Reset8723A(PADAPTER padapter)
        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;
@@ -270,11 +269,8 @@ static s32 polling_fwdl_chksum(_adapter *adapter, u32 min_cnt, u32 timeout_ms)
                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;
 
@@ -285,7 +281,6 @@ exit:
        return ret;
 }
 
-extern u8 g_fwdl_wintint_rdy_fail;
 static s32 _FWFreeToGo(_adapter *adapter, u32 min_cnt, u32 timeout_ms)
 {
        s32 ret = _FAIL;
@@ -313,11 +308,8 @@ static s32 _FWFreeToGo(_adapter *adapter, u32 min_cnt, u32 timeout_ms)
                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;
 
@@ -1386,6 +1378,20 @@ hal_ReadEFuse_WiFi(
        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;
@@ -4904,39 +4910,46 @@ _func_enter_;
                        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:
@@ -5122,14 +5135,6 @@ _func_enter_;
                        }
                        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;
@@ -5510,13 +5515,137 @@ _func_enter_;
                        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);
@@ -5616,15 +5745,45 @@ void GetHwReg8723A(PADAPTER padapter, u8 variable, u8 *val)
                        *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
index b6449371f5a7b26affa647588c81797f95657986..eede4b5a32baf937c85850025eff021d0b6284ed 100755 (executable)
@@ -184,6 +184,21 @@ rtl8192c_PHY_RF6052SetBandwidth(
 \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
@@ -216,6 +231,7 @@ rtl8192c_PHY_RF6052SetCckTxPower(
        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
@@ -290,9 +306,20 @@ rtl8192c_PHY_RF6052SetCckTxPower(
 \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
@@ -306,6 +333,8 @@ rtl8192c_PHY_RF6052SetCckTxPower(
        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
@@ -313,8 +342,9 @@ rtl8192c_PHY_RF6052SetCckTxPower(
        //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
index f030eb8212917630cd512784e5605e4fbbc89285..8c7d8de2343bf53960c71dd73d117f040181b017 100755 (executable)
 #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)
 {
@@ -547,10 +536,10 @@ static void process_rssi(_adapter *padapter,union recv_frame *prframe)
                
                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));
index 61a6c1b0a3ae94e2d57d808b84556bd73a36a62d..aa18608e61acd4618a38462f26930a0f4e0ff730 100755 (executable)
@@ -1827,45 +1827,6 @@ Hal_CustomizeByCustomerID_8723AS(
 }
 
 #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
@@ -1945,25 +1906,58 @@ readAdapterInfo(
 {
        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);
@@ -2157,7 +2151,7 @@ GetHalDefVar8723ASDIO(
                        *(( u32*)pValue) = MAX_AMPDU_FACTOR_64K;
                        break;
                default:
-                       bResult = GetHalDefVar(Adapter, eVariable, pValue);
+                       bResult = GetHalDefVar8723A(Adapter, eVariable, pValue);
                        break;
        }
 
index 330c41c8f0441bbb72178d934c05743f8d33bf66..00e450c30d8acb42dc233f35ba575ae85bfb0718 100755 (executable)
@@ -91,9 +91,7 @@ int   rtl8192cu_init_recv_priv(_adapter *padapter)
        //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){
index 626a54039a594428ed18880ce9cc0a749b2a59ac..6efc078b20a5950e6ce77297920682eaa9908462 100755 (executable)
@@ -3276,47 +3276,6 @@ Hal_EfuseParseMACAddr_8723AU(
 
 
 #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
@@ -3398,21 +3357,54 @@ readAdapterInfo(
 {
        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);
@@ -3433,7 +3425,9 @@ readAdapterInfo(
        //
        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);
 
@@ -3683,7 +3677,7 @@ _func_exit_;
 //             Query setting of specified variable.
 //
 u8
-GetHalDefVar8192CUsb(
+GetHalDefVar8723AUsb(
        IN      PADAPTER                                Adapter,
        IN      HAL_DEF_VARIABLE                eVariable,
        IN      PVOID                                   pValue
@@ -3723,7 +3717,7 @@ GetHalDefVar8192CUsb(
                        *(( u32*)pValue) = MAX_AMPDU_FACTOR_64K;
                        break;
                default:
-                       bResult = GetHalDefVar(Adapter, eVariable, pValue);
+                       bResult = GetHalDefVar8723A(Adapter, eVariable, pValue);
                        break;
        }
 
@@ -3738,7 +3732,7 @@ GetHalDefVar8192CUsb(
 //             Change default setting of specified variable.
 //
 u8
-SetHalDefVar8192CUsb(
+SetHalDefVar8723AUsb(
        IN      PADAPTER                                Adapter,
        IN      HAL_DEF_VARIABLE                eVariable,
        IN      PVOID                                   pValue
@@ -4033,8 +4027,8 @@ _func_enter_;
 
        pHalFunc->SetHwRegHandler = &SetHwReg8723AU;
        pHalFunc->GetHwRegHandler = &GetHwReg8723AU;
-       pHalFunc->GetHalDefVarHandler = &GetHalDefVar8192CUsb;
-       pHalFunc->SetHalDefVarHandler = &SetHalDefVar8192CUsb;
+       pHalFunc->GetHalDefVarHandler = &GetHalDefVar8723AUsb;
+       pHalFunc->SetHalDefVarHandler = &SetHalDefVar8723AUsb;
 
        pHalFunc->UpdateRAMaskHandler = &UpdateHalRAMask8192CUsb;
 
index eb6a5bfaf33e8e2e6fb9ef16b0a2a8a89da842ad..f34ae9097c87fc8bb4ef4c85b925a53a8dac1ecc 100755 (executable)
@@ -1394,6 +1394,7 @@ void rtl8192cu_recv_tasklet(void *priv)
        _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)))
        {
@@ -1419,7 +1420,13 @@ void rtl8192cu_recv_tasklet(void *priv)
 #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);
+       }       
 }
 
 
@@ -1585,6 +1592,9 @@ _func_enter_;
                        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;
                        }       
 
index 0ac76f61716a3a5da8c1154aa78ce2ba0f093fbd..67e006595aa6c24883a50a2df1e3347389f0072f 100755 (executable)
@@ -1,7 +1,7 @@
 /******************************************************************************
  *
  * 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.
@@ -20,8 +20,9 @@
 #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
@@ -87,7 +87,7 @@
 #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
 
index 0443b65e1c5c5802faa4ad7fcc219e2f9b21b994..47a07e9e1a9e60e9eae24c42aa426e59adfad018 100755 (executable)
        #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>
 
index 420dd0ea7872d1a6d2748a8483df5ad1009bc19e..cb21a12d32dbe44a2cd0572f31367a604470bfdd 100755 (executable)
@@ -226,6 +226,8 @@ struct registry_priv
 #endif
        u8 regulatory_tid;
        u8 qos_opt_enable;
+
+       u8 hiq_filter;
 };
 
 
@@ -386,6 +388,22 @@ struct int_logs {
 
 #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
@@ -411,6 +429,9 @@ struct dvobj_priv
        _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;
index e1542783ae28b82368b3d60d33df9058e20e2e86..52f72f639b93ae2b437e4795c6e4436430628bb4 100755 (executable)
@@ -178,8 +178,25 @@ void hal_init_macaddr(_adapter *adapter);
 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__
 
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8723au/include/hal_com_reg.h b/drivers/net/wireless/rockchip_wlan/rtl8723au/include/hal_com_reg.h
new file mode 100755 (executable)
index 0000000..7b5c5e0
--- /dev/null
@@ -0,0 +1,103 @@
+/******************************************************************************\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
index 67eb6b99ec4e9eb7438afa2c28881c4cfdbd1780..d38037b1216c872e31d0a48c7e3accc818838ff4 100755 (executable)
@@ -70,6 +70,7 @@ typedef enum _HW_VARIABLES{
        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,
@@ -128,6 +129,9 @@ typedef enum _HW_VARIABLES{
        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{
@@ -148,6 +152,7 @@ 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{
@@ -487,5 +492,8 @@ void rtw_hal_reset_security_engine(_adapter * adapter);
 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__
 
index 5f2c814b39ec08932067a670cea74a855a0fde49..44b514a4a70e0447b33e3d257a56a8092f2d739b 100755 (executable)
@@ -127,10 +127,6 @@ extern int rtw_ioctl(struct ifnet * ifp, u_long cmd, caddr_t data);
 
 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);
index 0421da9007002f8ffb4dac9b73c1e71886e36745..093e7a7daa268c38607804448d72487604b6ef46 100755 (executable)
@@ -20,6 +20,7 @@
 #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
@@ -658,37 +645,6 @@ Default: 00b.
 #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
@@ -1317,18 +1273,6 @@ Current IOREG MAP
 #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
index ce88b0224452cadff54f1f7aed01785b664506c1..54f7ca229159f0c8b6e722ccb961774ff39700ee 100755 (executable)
@@ -21,6 +21,7 @@
 #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
@@ -537,37 +522,6 @@ Default: 00b.
 #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)
 //
@@ -1696,17 +1650,6 @@ Current IOREG MAP
 #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
index 74e11d5af653d76c13d0d56333047042a0d4890a..1ebb126ec0e3b1c13d4ec557a5c933e6a09b572e 100755 (executable)
@@ -22,6 +22,7 @@
 #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
@@ -553,39 +537,6 @@ Default: 00b.
 #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)
 //
@@ -1687,24 +1638,6 @@ Current IOREG MAP
 #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
index 128eaff2387ed5babc0903062afdc9562166af63..78d64b8d81b9e6bac21e1c66830508fbe47c84be 100755 (executable)
@@ -1466,7 +1466,6 @@ typedef struct _BT_COEXIST_8723A
        u8                                      bC2hBtInfoReqSent;
        u8                                      bForceFwBtInfo;
        u8                                      bForceA2dpSink;
-       u8                                      bBusyTrafficForCoex;
 //     u8                                      bForceLps;
 //     u8                                      bBtPwrSaveMode;
        BTDM_8723A_2ANT                 btdm2Ant;
index 2111999b82f4f8021215440f288cb82579fd1977..eab5aafa5fd8ec81bb4e35a51f7104ef2a9b05ae 100755 (executable)
@@ -818,6 +818,7 @@ void Hal_InitChannelPlan(PADAPTER padapter);
 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
index a93e1e8da886244b3ac5dff0df8bcf296ee5dbc2..0aa871d73661cc82607e922de308b5d985d5e522 100755 (executable)
@@ -37,7 +37,8 @@ void free_mlme_ap_info(_adapter *padapter);
 //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
index 97a468c04b272c26d1ec8dc0152461b00bd67dc7..cbf5222f4c5e087d112f3d61da1099dc0190c859 100755 (executable)
@@ -130,6 +130,16 @@ do {\
        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;
@@ -351,7 +361,7 @@ when shared key ==> algorithm/keyid
 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];
 };
 
@@ -945,8 +955,11 @@ u8 rtw_sitesurvey_cmd(_adapter  *padapter, NDIS_802_11_SSID *ssid, int ssid_num,
 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);
@@ -1089,6 +1102,7 @@ enum rtw_h2c_cmd
 
        GEN_CMD_CODE(_SetChannelSwitch), /*61*/
        GEN_CMD_CODE(_TDLS), /*62*/
+       GEN_CMD_CODE(_ChkBMCSleepq), /*63*/
        
        MAX_H2CCMD
 };
@@ -1171,6 +1185,7 @@ struct _cmd_callback      rtw_cmd_callback[] =
        
        {GEN_CMD_CODE(_SetChannelSwitch), NULL},/*61*/
        {GEN_CMD_CODE(_TDLS), NULL},/*62*/
+       {GEN_CMD_CODE(_ChkBMCSleepq), NULL}, /*63*/
 };
 #endif
 
index bb9685ecb8185f8dc2dd2ae7da9ca9c8d9330de3..e3d78548bb0dde277340b6fbc0e15a709c25fc29 100755 (executable)
@@ -335,6 +335,11 @@ void mac_reg_dump(void *sel, _adapter *adapter);
 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);
@@ -351,6 +356,7 @@ int proc_get_adapter_state(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);
index 33c6f4229306ae1a1a2dab2031380c0d4c63123e..fba8bbc5056765065651591d662e2b4198e3a05f 100755 (executable)
@@ -171,6 +171,9 @@ typedef struct _RT_LINK_DETECT_T{
        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 {
@@ -261,6 +264,7 @@ struct cfg80211_wifidirect_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
@@ -601,6 +605,9 @@ struct mlme_priv {
 #ifdef CONFIG_FTP_PROTECT
        u8      ftp_lock_flag;
 #endif //CONFIG_FTP_PROTECT
+
+       u8      NumOfBcnInfoChkFail;
+       u32     timeBcnInfoChkStart;
 };
 
 #ifdef CONFIG_AP_MODE
index c94e03372904da8b55dd85f709dd8406a55223ef..63fd7142977c4ea2861822cae7211017c2530c0d 100755 (executable)
@@ -599,8 +599,19 @@ void SetBWMode(_adapter *padapter, unsigned short bwmode, unsigned char channel_
 
 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);
@@ -655,6 +666,8 @@ void rtw_get_current_ip_address(PADAPTER padapter, u8 *pcurrentip);
 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);
@@ -671,7 +684,11 @@ unsigned int is_ap_in_tkip(_adapter *padapter);
 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);
@@ -683,6 +700,7 @@ void report_del_sta_event(_adapter *padapter, unsigned char* MacAddr, unsigned s
 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);
@@ -708,6 +726,7 @@ void issue_auth(_adapter *padapter, struct sta_info *psta, unsigned short status
 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);
@@ -844,6 +863,7 @@ u8 add_ba_hdl(_adapter *padapter, unsigned char *pbuf);
 
 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);
@@ -925,6 +945,7 @@ struct cmd_hdl wlancmds[] =
 
        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
index 97ffea34a0632e1ffa50d74fc896cb0a9b2bb387..337d355a2f1248cc2c67a833a86f424fc481e386 100755 (executable)
@@ -324,9 +324,6 @@ struct recv_priv
        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;
@@ -334,7 +331,7 @@ struct recv_priv
        _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
 
@@ -740,9 +737,14 @@ __inline static s32 translate_percentage_to_dbm(u32 SignalStrengthIndex)
 {
        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;
 }
index 730857c2b97e30c2f555e3e585685a6af34e6cb8..6243222fd63a4f31e12c8bed76507c6237349317 100755 (executable)
@@ -39,6 +39,8 @@
 #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
 
@@ -205,6 +207,30 @@ struct security_priv
        //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 {
index 3331da403a06c10f8309e0df9c8f06b0b21b052c..d8ebbe51bbe1572e99a213ad1d6f53e1f0a99b58 100755 (executable)
@@ -1 +1 @@
-#define DRIVERVERSION  "v4.1.10_10648.20140227_BTCOEX20131115_ver3.4"
+#define DRIVERVERSION  "v4.1.11_12622.20141215_BTCOEX20140409_ver3.5"
index 0da14ddd621c1da4ef1a48efd2a73bb578c971e4..5c817939ecf0907238b131bc0102076a2e8444bb 100755 (executable)
@@ -744,7 +744,7 @@ void rtw_free_hwxmits(_adapter *padapter);
 
 
 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);
index eb1a13f01b73cf3e066afb31c362af57acaea13c..948b29dc469a24c2039176164155dd7550b85189 100755 (executable)
@@ -195,6 +195,7 @@ _func_enter_;
        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 */
@@ -236,6 +237,7 @@ 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;
        }
@@ -260,6 +262,7 @@ _func_enter_;
                _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));
        }
 
index 60e61dfc633c72e2461c41dc612b8907f007fd35..6299edc6dabd3ddfd1989e759472816777a7e86d 100755 (executable)
@@ -357,6 +357,19 @@ static int rtw_ieee80211_channel_to_frequency(int chan, int band)
        }\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
@@ -371,7 +384,10 @@ struct cfg80211_bss *rtw_cfg80211_inform_bss(_adapter *padapter, struct wlan_net
        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
@@ -381,12 +397,17 @@ struct cfg80211_bss *rtw_cfg80211_inform_bss(_adapter *padapter, struct wlan_net
        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
@@ -472,13 +493,14 @@ struct cfg80211_bss *rtw_cfg80211_inform_bss(_adapter *padapter, struct wlan_net
        \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
@@ -496,10 +518,10 @@ struct cfg80211_bss *rtw_cfg80211_inform_bss(_adapter *padapter, struct wlan_net
        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
@@ -520,10 +542,11 @@ struct cfg80211_bss *rtw_cfg80211_inform_bss(_adapter *padapter, struct wlan_net
        _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
@@ -532,10 +555,9 @@ struct cfg80211_bss *rtw_cfg80211_inform_bss(_adapter *padapter, struct wlan_net
        //      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
@@ -587,7 +609,11 @@ struct cfg80211_bss *rtw_cfg80211_inform_bss(_adapter *padapter, struct wlan_net
        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
@@ -619,6 +645,12 @@ int rtw_cfg80211_check_bss(_adapter *padapter)
                        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
@@ -1393,7 +1425,7 @@ _func_enter_;
                                        //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
@@ -1407,14 +1439,7 @@ _func_enter_;
                                                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
@@ -2356,18 +2381,15 @@ if (padapter->registrypriv.mp_mode == 1)
 \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
@@ -3324,16 +3346,23 @@ static int cfg80211_rtw_set_pmksa(struct wiphy *wiphy,
 {\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
@@ -3379,7 +3408,8 @@ static int cfg80211_rtw_del_pmksa(struct wiphy *wiphy,
        _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
@@ -3389,6 +3419,7 @@ static int cfg80211_rtw_del_pmksa(struct wiphy *wiphy,
                        _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
@@ -4628,15 +4659,14 @@ static s32 cfg80211_rtw_remain_on_channel(struct wiphy *wiphy,
 \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
@@ -4781,12 +4811,14 @@ static s32 cfg80211_rtw_cancel_remain_on_channel(struct wiphy *wiphy,
        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
index b0d1bacaf16abeb9296b667ed0e16fce7a40584e..331f6ebe800b214ded9e539b574b38f1794e87bf 100755 (executable)
@@ -188,7 +188,7 @@ static void indicate_wx_custom_event(_adapter *padapter, char *msg)
 
 }
 
-
+#ifdef CONFIG_SUPPORT_HW_WPS_PBC
 static void request_wps_pbc_event(_adapter *padapter)
 {
        u8 *buff, *p;
@@ -223,7 +223,7 @@ static void request_wps_pbc_event(_adapter *padapter)
        }
 
 }
-
+#endif//#ifdef CONFIG_SUPPORT_HW_WPS_PBC
 
 void indicate_wx_scan_complete_event(_adapter *padapter)
 {      
@@ -309,27 +309,12 @@ uint      rtw_is_cckratesonly_included(u8 *rate)
 }
 */
 
-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 )
        {
@@ -352,24 +337,16 @@ static char *translate_scan(_adapter *padapter,
                        {
                                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;
                        }
                        
                }
@@ -413,141 +390,223 @@ static char *translate_scan(_adapter *padapter,
                
                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
                {
@@ -559,119 +618,143 @@ static char *translate_scan(_adapter *padapter,
                        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));
@@ -679,88 +762,151 @@ static char *translate_scan(_adapter *padapter,
                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)
@@ -987,7 +1133,7 @@ _func_enter_;
                                        //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
                                {                                       
@@ -6271,6 +6417,7 @@ static int rtw_p2p_prov_disc(struct net_device *dev,
        {
                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);                
@@ -12622,7 +12769,8 @@ static int rtw_widi_set_probe_request(struct net_device *dev,
        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 )
@@ -13711,6 +13859,15 @@ static struct iw_statistics *rtw_get_wireless_stats(struct net_device *dev)
                #ifdef CONFIG_SIGNAL_DISPLAY_DBM
                tmp_level = translate_percentage_to_dbm(padapter->recvpriv.signal_strength); 
                #else
+               #ifdef CONFIG_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
                {
@@ -13720,6 +13877,7 @@ static struct iw_statistics *rtw_get_wireless_stats(struct net_device *dev)
                }
                #endif // CONFIG_BT_COEXIST
                #endif
+               #endif
                
                tmp_qual = padapter->recvpriv.signal_qual;
                tmp_noise =padapter->recvpriv.noise;            
index 594eeb6a2d14aaadfdecefc83cba2ae407cead2c..1b7cbb27b6f4a1a2609ed933b802f61a089b7ab3 100755 (executable)
 #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.");
@@ -308,6 +296,10 @@ uint rtw_notch_filter = RTW_NOTCH_FILTER;
 module_param(rtw_notch_filter, uint, 0644);
 MODULE_PARM_DESC(rtw_notch_filter, "0:Disable, 1:Enable, 2:Enable only for P2P");
 
+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);
@@ -442,7 +434,8 @@ _func_enter_;
        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_;
 
@@ -1727,10 +1720,6 @@ int _netdev_open(struct net_device *pnetdev)
                
                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)
                {                       
@@ -1837,10 +1826,6 @@ int  ips_netdrv_open(_adapter *padapter)
                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);
@@ -1911,57 +1896,6 @@ void rtw_ips_dev_unload(_adapter *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;
index ed675f4191b4304d7917f611e5232f93fac01bcc..c87868d7375053ebd54a84651004a6ce8c79d0cc 100755 (executable)
@@ -1161,6 +1161,9 @@ _func_enter_;
        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;
@@ -1328,6 +1331,7 @@ 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;
        }
@@ -1359,6 +1363,7 @@ _func_enter_;
                _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));
        }
index a26e5d55977243f8d5481a6a49e3b85cd6c6d094..b8b485971ad5ef7cbfecf22b12777be60eb776a3 100755 (executable)
@@ -250,6 +250,95 @@ static int proc_get_rf_reg_dump(struct seq_file *m, void *v)
        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
@@ -266,6 +355,9 @@ const struct rtw_proc_hdl adapter_proc_hdls [] = {
        {"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},
@@ -274,6 +366,7 @@ const struct rtw_proc_hdl adapter_proc_hdls [] = {
 #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},
index d45a28e2bb46f3e53831b7dd55898251ced3d0b4..9aee7bf56f68240c664064bc015297c854aa8057 100755 (executable)
@@ -40,12 +40,12 @@ void rtw_adapter_proc_replace(struct net_device *dev);
 
 #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
 
index 334b5b898af4c7e3b7c5c34cb6644ff90c7c3dbf..38701c81356682c76e15415c1dd63c21d33abd3c 100755 (executable)
@@ -349,6 +349,7 @@ _func_enter_;
         _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);
@@ -375,6 +376,7 @@ 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;
        }
@@ -396,6 +398,7 @@ _func_enter_;
                _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));
        }
 
index bae55ac6290bed03903fa57ae99e22899bd753e4..282262b22e38fbc8bb94ae879f8adf4b4e768acd 100755 (executable)
@@ -556,8 +556,9 @@ _func_enter_;
        _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);
@@ -698,6 +699,7 @@ free_dvobj:
                _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;
        }
@@ -730,6 +732,7 @@ _func_enter_;
                _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));
        }
        
@@ -2048,7 +2051,7 @@ _func_exit_;
 extern int console_suspend_enabled;
 #endif
 
-static int rtw_drv_entry(void)
+static int /*__init*/ rtw_drv_entry(void)
 {
        int ret = 0;
 
@@ -2122,7 +2125,7 @@ exit:
        return ret;
 }
 
-static void rtw_drv_halt(void)
+static void /*exit*/ rtw_drv_halt(void)
 {
        DBG_871X_LEVEL(_drv_always_, "module exit start\n");
 
index e9229e61333726b75b9c282dd1f48fb249477194..655c3e853c08b35cd3ec43ed29116ee0c79bbce6 100755 (executable)
@@ -167,7 +167,7 @@ unsigned int ffaddr2pipehdl(struct dvobj_priv *pdvobj, u32 addr)
                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
@@ -330,11 +330,6 @@ _func_enter_;
                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
index 9baccc3f08e1558d061407680e969074d668d4c3..ffc4c6ef75f124748a55e77f366f0a12e2a3f789 100755 (executable)
@@ -422,7 +422,11 @@ _func_enter_;
        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)
                 )
        {