update rtl8188eu wifi driver to v4.3.0.8_13522.20150213_beta
authorhwg <hwg@rock-chips.com>
Wed, 11 Mar 2015 06:00:13 +0000 (14:00 +0800)
committerhwg <hwg@rock-chips.com>
Wed, 11 Mar 2015 06:00:13 +0000 (14:00 +0800)
 solve android 5.0 ctsverify wifi direct test fail problem

37 files changed:
drivers/net/wireless/rockchip_wlan/rtl8188eu/Kconfig
drivers/net/wireless/rockchip_wlan/rtl8188eu/Makefile
drivers/net/wireless/rockchip_wlan/rtl8188eu/core/rtw_ap.c
drivers/net/wireless/rockchip_wlan/rtl8188eu/core/rtw_ieee80211.c
drivers/net/wireless/rockchip_wlan/rtl8188eu/core/rtw_mlme.c
drivers/net/wireless/rockchip_wlan/rtl8188eu/core/rtw_mlme_ext.c
drivers/net/wireless/rockchip_wlan/rtl8188eu/core/rtw_mp_ioctl.c
drivers/net/wireless/rockchip_wlan/rtl8188eu/core/rtw_odm.c
drivers/net/wireless/rockchip_wlan/rtl8188eu/core/rtw_p2p.c
drivers/net/wireless/rockchip_wlan/rtl8188eu/core/rtw_sta_mgt.c
drivers/net/wireless/rockchip_wlan/rtl8188eu/hal/OUTSRC/PhyDM_Adaptivity.c [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8188eu/hal/OUTSRC/PhyDM_Adaptivity.h [new file with mode: 0755]
drivers/net/wireless/rockchip_wlan/rtl8188eu/hal/OUTSRC/odm.c
drivers/net/wireless/rockchip_wlan/rtl8188eu/hal/OUTSRC/odm.h
drivers/net/wireless/rockchip_wlan/rtl8188eu/hal/OUTSRC/odm_HWConfig.c
drivers/net/wireless/rockchip_wlan/rtl8188eu/hal/OUTSRC/odm_RegDefine11AC.h
drivers/net/wireless/rockchip_wlan/rtl8188eu/hal/OUTSRC/odm_RegDefine11N.h
drivers/net/wireless/rockchip_wlan/rtl8188eu/hal/OUTSRC/odm_debug.h
drivers/net/wireless/rockchip_wlan/rtl8188eu/hal/rtl8188e/rtl8188e_dm.c
drivers/net/wireless/rockchip_wlan/rtl8188eu/hal/rtl8188e/rtl8188e_rxdesc.c
drivers/net/wireless/rockchip_wlan/rtl8188eu/hal/rtl8188e/usb/usb_ops_linux.c
drivers/net/wireless/rockchip_wlan/rtl8188eu/include/autoconf.h
drivers/net/wireless/rockchip_wlan/rtl8188eu/include/drv_conf.h
drivers/net/wireless/rockchip_wlan/rtl8188eu/include/drv_types.h
drivers/net/wireless/rockchip_wlan/rtl8188eu/include/ioctl_cfg80211.h
drivers/net/wireless/rockchip_wlan/rtl8188eu/include/osdep_service.h
drivers/net/wireless/rockchip_wlan/rtl8188eu/include/rtw_android.h
drivers/net/wireless/rockchip_wlan/rtl8188eu/include/rtw_mlme.h
drivers/net/wireless/rockchip_wlan/rtl8188eu/include/rtw_mlme_ext.h
drivers/net/wireless/rockchip_wlan/rtl8188eu/include/rtw_odm.h
drivers/net/wireless/rockchip_wlan/rtl8188eu/include/rtw_version.h
drivers/net/wireless/rockchip_wlan/rtl8188eu/os_dep/linux/ioctl_cfg80211.c
drivers/net/wireless/rockchip_wlan/rtl8188eu/os_dep/linux/ioctl_linux.c
drivers/net/wireless/rockchip_wlan/rtl8188eu/os_dep/linux/os_intfs.c
drivers/net/wireless/rockchip_wlan/rtl8188eu/os_dep/linux/rtw_android.c
drivers/net/wireless/rockchip_wlan/rtl8188eu/os_dep/linux/rtw_proc.c
drivers/net/wireless/rockchip_wlan/rtl8188eu/os_dep/linux/wifi_version.h

index c8148ed9fc438ac5a248cf1f11b0a5f773f84bee..013175c374b2f65c5f68c1fab9f2c5e144b623b9 100755 (executable)
@@ -1,9 +1,6 @@
 config RTL8188EU
-       tristate "Realtek 8188EU USB WiFi Support"
-    select WIRELESS_EXT
-    select WEXT_PRIV
-    select IEEE80211
-    default y
+       tristate "Realtek 8188E USB WiFi"
+       depends on USB
        ---help---
-         Help message of RTL8188EU & RTL8189ES
+         Help message of RTL8188EU
 
index 5551eea01f804fd85d7811ca3906f41431fec530..1ee2464ce3c673a2299c5fb61ab5f223392da579 100755 (executable)
@@ -53,7 +53,8 @@ CONFIG_TRAFFIC_PROTECT = y
 CONFIG_LOAD_PHY_PARA_FROM_FILE = y
 CONFIG_CALIBRATE_TX_POWER_BY_REGULATORY = n
 CONFIG_CALIBRATE_TX_POWER_TO_MAX = n
-CONFIG_ODM_ADAPTIVITY = n
+CONFIG_RTW_ADAPTIVITY_EN = disable
+CONFIG_RTW_ADAPTIVITY_MODE = normal
 ######################## Wake On Lan ##########################
 CONFIG_WOWLAN = n
 CONFIG_GPIO_WAKEUP = n
@@ -84,9 +85,9 @@ CONFIG_PLATFORM_TEGRA4_DALMORE = n
 CONFIG_PLATFORM_ARM_TCC8900 = n
 CONFIG_PLATFORM_ARM_TCC8920 = n
 CONFIG_PLATFORM_ARM_TCC8920_JB42 = n
-CONFIG_PLATFORM_ARM_RK2818 = y
+CONFIG_PLATFORM_ARM_RK2818 = n
 CONFIG_PLATFORM_ARM_RK3066 = n
-CONFIG_PLATFORM_ARM_RK3188 = n
+CONFIG_PLATFORM_ARM_RK3188 = y
 CONFIG_PLATFORM_ARM_URBETTER = n
 CONFIG_PLATFORM_ARM_TI_PANDA = n
 CONFIG_PLATFORM_MIPS_JZ4760 = n
@@ -100,6 +101,7 @@ CONFIG_PLATFORM_ARM_SUN6I = n
 CONFIG_PLATFORM_ARM_SUN7I = n
 CONFIG_PLATFORM_ARM_SUN8I = n
 CONFIG_PLATFORM_ACTIONS_ATM702X = n
+CONFIG_PLATFORM_ACTIONS_ATM705X = n
 CONFIG_PLATFORM_ACTIONS_ATV5201 = n
 CONFIG_PLATFORM_ARM_RTD299X = n
 CONFIG_PLATFORM_ARM_SPREADTRUM_6820 = n
@@ -165,7 +167,8 @@ _OUTSRC_FILES := hal/OUTSRC/odm_debug.o     \
                hal/OUTSRC/odm_interface.o\
                hal/OUTSRC/odm_HWConfig.o\
                hal/OUTSRC/odm.o\
-               hal/OUTSRC/HalPhyRf.o
+               hal/OUTSRC/HalPhyRf.o\
+               hal/OUTSRC/PhyDM_Adaptivity.o
 
 EXTRA_CFLAGS += -I$(src)/platform
 _PLATFORM_FILES := platform/platform_ops.o
@@ -711,8 +714,16 @@ ifeq ($(CONFIG_CALIBRATE_TX_POWER_TO_MAX), y)
 EXTRA_CFLAGS += -DCONFIG_CALIBRATE_TX_POWER_TO_MAX
 endif
 
-ifeq ($(CONFIG_ODM_ADAPTIVITY), y)
-EXTRA_CFLAGS += -DCONFIG_ODM_ADAPTIVITY
+ifeq ($(CONFIG_RTW_ADAPTIVITY_EN), disable)
+EXTRA_CFLAGS += -DCONFIG_RTW_ADAPTIVITY_EN=0
+else ifeq ($(CONFIG_RTW_ADAPTIVITY_EN), enable)
+EXTRA_CFLAGS += -DCONFIG_RTW_ADAPTIVITY_EN=1
+endif
+
+ifeq ($(CONFIG_RTW_ADAPTIVITY_MODE), normal)
+EXTRA_CFLAGS += -DCONFIG_RTW_ADAPTIVITY_MODE=0
+else ifeq ($(CONFIG_RTW_ADAPTIVITY_MODE), carrier_sense)
+EXTRA_CFLAGS += -DCONFIG_RTW_ADAPTIVITY_MODE=1
 endif
 
 ifeq ($(CONFIG_WOWLAN), y)
@@ -769,6 +780,27 @@ KSRC := $(KERNEL_BUILD_PATH)
 MODULE_NAME :=wlan
 endif
 
+ifeq ($(CONFIG_PLATFORM_ACTIONS_ATM705X), y)
+EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN
+# default setting for Android 4.1, 4.2, 4.3, 4.4
+EXTRA_CFLAGS += -DCONFIG_PLATFORM_ACTIONS_ATM705X
+EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE
+EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT
+EXTRA_CFLAGS += -DCONFIG_P2P_IPS
+
+# Enable this for Android 5.0
+EXTRA_CFLAGS += -DCONFIG_RADIO_WORK
+
+ifeq ($(CONFIG_SDIO_HCI), y)
+EXTRA_CFLAGS += -DCONFIG_PLATFORM_OPS
+_PLATFORM_FILES += platform/platform_arm_act_sdio.o
+endif
+
+ARCH := arm
+CROSS_COMPILE := /opt/arm-2011.09/bin/arm-none-linux-gnueabi-
+KSRC := /home/android_sdk/Action-semi/705a_android_L/android/kernel
+endif
+
 ifeq ($(CONFIG_PLATFORM_TI_AM3517), y)
 EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_ANDROID -DCONFIG_PLATFORM_SHUTTLE
 CROSS_COMPILE := arm-eabi-
@@ -1000,10 +1032,14 @@ MODULE_NAME := wlan
 endif
 
 ifeq ($(CONFIG_PLATFORM_ARM_RK3188), y)
-EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_ANDROID -DCONFIG_PLATFORM_ROCKCHIPS -DCONFIG_MINIMAL_MEMORY_USAGE
-EXTRA_CFLAGS += -DRTW_ENABLE_WIFI_CONTROL_FUNC
-EXTRA_CFLAGS += -DRTW_SUPPORT_PLATFORM_SHUTDOWN
-EXTRA_CFLAGS += -DRTW_USE_CFG80211_STA_EVENT
+EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_ANDROID -DCONFIG_MINIMAL_MEMORY_USAGE
+# default setting for Android 4.1, 4.2, 4.3, 4.4
+EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE
+EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT
+EXTRA_CFLAGS += -DCONFIG_P2P_IPS
+
+# Enable this for Android 5.0
+EXTRA_CFLAGS += -DCONFIG_RADIO_WORK
 ARCH := arm
 CROSS_COMPILE := /home/android_sdk/Rockchip/Rk3188/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin/arm-eabi-
 KSRC := /home/android_sdk/Rockchip/Rk3188/kernel
index 9e6e8aebba82c2a764b8bd7b80a17f9d196d0e44..ce46a12e63601c4e9673dd4a20750186c35d8301 100755 (executable)
@@ -71,9 +71,9 @@ void free_mlme_ap_info(_adapter *padapter)
 \r
        //free bc/mc sta_info\r
        psta = rtw_get_bcmc_stainfo(padapter);  \r
-       _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL);          \r
+       //_enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL);\r
        rtw_free_stainfo(padapter, psta);\r
-       _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL);\r
+       //_exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL);\r
        \r
 \r
        _rtw_spinlock_free(&pmlmepriv->bcn_update_lock);\r
@@ -405,9 +405,9 @@ void        expire_timeout_chk(_adapter *padapter)
                                \r
                                _exit_critical_bh(&pstapriv->auth_list_lock, &irqL);\r
                                \r
-                               _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL);  \r
+                               //_enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL);\r
                                rtw_free_stainfo(padapter, psta);\r
-                               _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL);   \r
+                               //_exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL);\r
                                \r
                                _enter_critical_bh(&pstapriv->auth_list_lock, &irqL);\r
                        }       \r
@@ -2912,9 +2912,9 @@ u8 ap_free_sta(_adapter *padapter, struct sta_info *psta, bool active, u16 reaso
 \r
        beacon_updated = bss_cap_update_on_sta_leave(padapter, psta);\r
 \r
-       _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL);                                  \r
+       //_enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL);\r
        rtw_free_stainfo(padapter, psta);\r
-       _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL);\r
+       //_exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL);\r
        \r
 \r
        return beacon_updated;\r
@@ -3244,9 +3244,9 @@ void stop_ap_mode(_adapter *padapter)
        rtw_free_all_stainfo(padapter);\r
        \r
        psta = rtw_get_bcmc_stainfo(padapter);\r
-       _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL);          \r
+       //_enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL);\r
        rtw_free_stainfo(padapter, psta);\r
-       _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL);\r
+       //_exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL);\r
        \r
        rtw_init_bcmc_stainfo(padapter);        \r
 \r
index 7316cdcac13e14e4dfadb329217fdabd4a657f25..08902f2ebf6d32e65d08e62bfb2228f2b105df8e 100755 (executable)
@@ -932,41 +932,45 @@ u8 *rtw_get_wps_ie_from_scan_queue(u8 *in_ie, uint in_len, u8 *wps_ie, uint *wps
 u8 *rtw_get_wps_ie(u8 *in_ie, uint in_len, u8 *wps_ie, uint *wps_ielen)
 {
        uint cnt;
-       u8 *wpsie_ptr=NULL;
-       u8 eid, wps_oui[4]={0x0,0x50,0xf2,0x04};
+       u8 *wpsie_ptr = NULL;
+       u8 eid, wps_oui[4] = {0x00, 0x50, 0xf2, 0x04};
 
-       if(wps_ielen)
+       if (wps_ielen)
                *wps_ielen = 0;
 
-       if(!in_ie || in_len<=0)
+       if (!in_ie) {
+               rtw_warn_on(1);
+               return wpsie_ptr;
+       }
+
+       if (in_len <= 0)
                return wpsie_ptr;
 
        cnt = 0;
 
-       while(cnt<in_len)
-       {
+       while (cnt + 1 + 4 < in_len) {
                eid = in_ie[cnt];
 
-               if((eid==_WPA_IE_ID_)&&(_rtw_memcmp(&in_ie[cnt+2], wps_oui, 4)==_TRUE))
-               {
-                       wpsie_ptr = &in_ie[cnt];
+               if (cnt + 1 + 4 >= MAX_IE_SZ) {
+                       rtw_warn_on(1);
+                       return NULL;
+               }
 
-                       if(wps_ie)
-                               _rtw_memcpy(wps_ie, &in_ie[cnt], in_ie[cnt+1]+2);
-                       
-                       if(wps_ielen)
-                               *wps_ielen = in_ie[cnt+1]+2;
-                       
-                       cnt+=in_ie[cnt+1]+2;
+               if (eid == WLAN_EID_VENDOR_SPECIFIC && _rtw_memcmp(&in_ie[cnt + 2], wps_oui, 4) == _TRUE) {
+                       wpsie_ptr = in_ie + cnt;
+
+                       if (wps_ie)
+                               _rtw_memcpy(wps_ie, &in_ie[cnt], in_ie[cnt + 1] + 2);
+
+                       if (wps_ielen)
+                               *wps_ielen = in_ie[cnt + 1] + 2;
 
                        break;
+               } else {
+                       cnt += in_ie[cnt + 1] + 2;
                }
-               else
-               {
-                       cnt+=in_ie[cnt+1]+2; //goto next        
-               }               
 
-       }       
+       }
 
        return wpsie_ptr;
 }
@@ -1572,47 +1576,48 @@ u8 *rtw_get_p2p_ie_from_scan_queue(u8 *in_ie, int in_len, u8 *p2p_ie, uint *p2p_
  */
 u8 *rtw_get_p2p_ie(u8 *in_ie, int in_len, u8 *p2p_ie, uint *p2p_ielen)
 {
-       uint cnt = 0;
-       u8 *p2p_ie_ptr;
-       u8 eid, p2p_oui[4]={0x50,0x6F,0x9A,0x09};
+       uint cnt;
+       u8 *p2p_ie_ptr = NULL;
+       u8 eid, p2p_oui[4] = {0x50, 0x6F, 0x9A, 0x09};
 
-       if ( p2p_ielen != NULL )
+       if (p2p_ielen)
                *p2p_ielen = 0;
 
-       while(cnt<in_len)
-       {
+       if (!in_ie || in_len < 0) {
+               rtw_warn_on(1);
+               return p2p_ie_ptr;
+       }
+
+       if (in_len <= 0)
+               return p2p_ie_ptr;
+
+       cnt = 0;
+
+       while (cnt + 1 + 4 < in_len) {
                eid = in_ie[cnt];
-               if ((in_len < 0) || (cnt > MAX_IE_SZ)) {
-                       rtw_dump_stack();
+
+               if (cnt + 1 + 4 >= MAX_IE_SZ) {
+                       rtw_warn_on(1);
                        return NULL;
-               }               
-               if( ( eid == _VENDOR_SPECIFIC_IE_ ) && ( _rtw_memcmp( &in_ie[cnt+2], p2p_oui, 4) == _TRUE ) )
-               {
+               }
+
+               if (eid == WLAN_EID_VENDOR_SPECIFIC && _rtw_memcmp(&in_ie[cnt + 2], p2p_oui, 4) == _TRUE) {
                        p2p_ie_ptr = in_ie + cnt;
-               
-                       if ( p2p_ie != NULL )
-                       {
-                               _rtw_memcpy( p2p_ie, &in_ie[ cnt ], in_ie[ cnt + 1 ] + 2 );
-                       }
 
-                       if ( p2p_ielen != NULL )
-                       {
-                               *p2p_ielen = in_ie[ cnt + 1 ] + 2;
-                       }
-                       
-                       return p2p_ie_ptr;
+                       if (p2p_ie)
+                               _rtw_memcpy(p2p_ie, &in_ie[cnt], in_ie[cnt + 1] + 2);
+
+                       if (p2p_ielen)
+                               *p2p_ielen = in_ie[cnt + 1] + 2;
 
                        break;
+               } else {
+                       cnt += in_ie[cnt + 1] + 2;
                }
-               else
-               {
-                       cnt += in_ie[ cnt + 1 ] +2; //goto next 
-               }               
-               
-       }       
 
-       return NULL;
+       }
 
+       return p2p_ie_ptr;
 }
 
 /**
index fde65664c36a8c344cf61338d0d59ea9334c27ee..17346eaa97da6e5c1bb401ad37022f75c6c6e539 100755 (executable)
@@ -1471,16 +1471,16 @@ _func_enter_;
                        rtw_tdls_cmd(adapter, myid(&(adapter->eeprompriv)), TDLS_RS_RCR);
                        rtw_reset_tdls_info(adapter);
                        rtw_free_all_stainfo(adapter);
-                       _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL);
+                       //_enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL);
                }
                else
 #endif //CONFIG_TDLS
                {
-                       _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL);
+                       //_enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL);
                        rtw_free_stainfo(adapter,  psta);
                }
 
-               _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL);
+               //_exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL);
                
        }
 
@@ -1491,9 +1491,9 @@ _func_enter_;
                rtw_free_all_stainfo(adapter);
 
                psta = rtw_get_bcmc_stainfo(adapter);
-               _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL);          
+               //_enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL);
                rtw_free_stainfo(adapter, psta);
-               _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL);           
+               //_exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL);
 
                rtw_init_bcmc_stainfo(adapter); 
        }
@@ -1721,17 +1721,17 @@ inline void rtw_indicate_scan_done( _adapter *padapter, bool aborted)
 #endif // CONFIG_IPS
 }
 
-void rtw_scan_abort(_adapter *adapter)
+u32 rtw_scan_abort_timeout(_adapter *adapter, u32 timeout_ms)
 {
-       u32 cnt=0;
        u32 start;
-       struct mlme_priv        *pmlmepriv = &(adapter->mlmepriv);
-       struct mlme_ext_priv    *pmlmeext = &(adapter->mlmeextpriv);
+       u32 pass_ms;
+       struct mlme_priv *pmlmepriv = &(adapter->mlmepriv);
+       struct mlme_ext_priv *pmlmeext = &(adapter->mlmeextpriv);
 
        start = rtw_get_current_time();
        pmlmeext->scan_abort = _TRUE;
        while (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY)
-               && rtw_get_passing_time_ms(start) <= 200) {
+               && rtw_get_passing_time_ms(start) <= timeout_ms) {
 
                if (adapter->bDriverStopped || adapter->bSurpriseRemoved)
                        break;
@@ -1751,6 +1751,23 @@ void rtw_scan_abort(_adapter *adapter)
                rtw_indicate_scan_done(adapter, _TRUE);
        }
        pmlmeext->scan_abort = _FALSE;
+       pass_ms = rtw_get_passing_time_ms(start);
+
+       return pass_ms;
+}
+
+void rtw_scan_abort_no_wait(_adapter *adapter)
+{
+       struct mlme_priv *pmlmepriv = &(adapter->mlmepriv);
+       struct mlme_ext_priv *pmlmeext = &(adapter->mlmeextpriv);
+
+       if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY))
+               pmlmeext->scan_abort = _TRUE;
+}
+
+void rtw_scan_abort(_adapter *adapter)
+{
+       rtw_scan_abort_timeout(adapter, 200);
 }
 
 static struct sta_info *rtw_joinbss_update_stainfo(_adapter *padapter, struct wlan_network *pnetwork)
@@ -2036,9 +2053,9 @@ _func_enter_;
 
                                        pcur_sta = rtw_get_stainfo(pstapriv, cur_network->network.MacAddress);
                                        if(pcur_sta){
-                                               _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL2);
+                                               //_enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL2);
                                                rtw_free_stainfo(adapter,  pcur_sta);
-                                               _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL2);
+                                               //_exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL2);
                                        }
 
                                        ptarget_wlan = rtw_find_network(&pmlmepriv->scanned_queue, pnetwork->network.MacAddress);
@@ -2502,9 +2519,9 @@ _func_enter_;
              check_fwstate(pmlmepriv,WIFI_ADHOC_STATE))
        {
                
-               _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL);
+               //_enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL);
                rtw_free_stainfo(adapter,  psta);
-               _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL);
+               //_exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL);
                
                if(adapter->stapriv.asoc_sta_count== 1) //a sta + bc/mc_stainfo (not Ibss_stainfo)
                { 
@@ -4495,3 +4512,19 @@ u8 rtw_get_buddy_bBusyTraffic(_adapter *padapter)
 }
 
 #endif //CONFIG_CONCURRENT_MODE
+
+static const char *miracast_mode_str[] = {
+       "DISABLED",
+       "SOURCE",
+       "SINK",
+       "INVALID",
+};
+
+const char *get_miracast_mode_str(int mode)
+{
+       if (mode < MIRACAST_DISABLED || mode >= MIRACAST_INVALID)
+               mode = MIRACAST_INVALID;
+
+       return miracast_mode_str[mode];
+}
+
index 3fcef9eabbf1cf41bb20830e9106070963db5acc..85c89c7296971e5f269e11c31199024cde893665 100755 (executable)
@@ -2574,8 +2574,6 @@ unsigned int OnDeAuth(_adapter *padapter, union recv_frame *precv_frame)
 
        reason = le16_to_cpu(*(unsigned short *)(pframe + WLAN_HDR_A3_LEN));
 
-       DBG_871X("%s Reason code(%d)\n", __FUNCTION__,reason);
-
        rtw_lock_rx_suspend_timeout(8000);
 
 #ifdef CONFIG_AP_MODE
@@ -2589,8 +2587,8 @@ unsigned int OnDeAuth(_adapter *padapter, union recv_frame *precv_frame)
                //rtw_free_stainfo(padapter, psta);
                //_exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL);         
 
-               DBG_871X_LEVEL(_drv_always_, "ap recv deauth reason code(%d) sta:%pM\n",
-                               reason, GetAddr2Ptr(pframe));
+               DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" reason=%u, ta=%pM\n"
+                       , FUNC_ADPT_ARG(padapter), reason, GetAddr2Ptr(pframe));
 
                psta = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe));  
                if(psta)
@@ -2635,12 +2633,12 @@ unsigned int OnDeAuth(_adapter *padapter, union recv_frame *precv_frame)
                        }
                }
 
-               DBG_871X_LEVEL(_drv_always_, "sta recv deauth reason code(%d) sta:%pM, ignore = %d\n",
-                               reason, GetAddr3Ptr(pframe), ignore_received_deauth);
-               
+               DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" reason=%u, ta=%pM, ignore=%d\n"
+                       , FUNC_ADPT_ARG(padapter), reason, GetAddr2Ptr(pframe), ignore_received_deauth);
+
                if ( 0 == ignore_received_deauth )
                {
-                       receive_disconnect(padapter, GetAddr3Ptr(pframe) ,reason);
+                       receive_disconnect(padapter, GetAddr2Ptr(pframe), reason);
                }
        }       
        pmlmepriv->LinkDetectInfo.bBusyTraffic = _FALSE;
@@ -2673,8 +2671,6 @@ unsigned int OnDisassoc(_adapter *padapter, union recv_frame *precv_frame)
 
        reason = le16_to_cpu(*(unsigned short *)(pframe + WLAN_HDR_A3_LEN));
 
-        DBG_871X("%s Reason code(%d)\n", __FUNCTION__,reason);
-
        rtw_lock_rx_suspend_timeout(8000);
        
 #ifdef CONFIG_AP_MODE
@@ -2688,8 +2684,8 @@ unsigned int OnDisassoc(_adapter *padapter, union recv_frame *precv_frame)
                //rtw_free_stainfo(padapter, psta);
                //_exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL);         
 
-               DBG_871X_LEVEL(_drv_always_, "ap recv disassoc reason code(%d) sta:%pM\n",
-                               reason, GetAddr2Ptr(pframe));
+               DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" reason=%u, ta=%pM\n"
+                       , FUNC_ADPT_ARG(padapter), reason, GetAddr2Ptr(pframe));
 
                psta = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe));  
                if(psta)
@@ -2714,10 +2710,10 @@ unsigned int OnDisassoc(_adapter *padapter, union recv_frame *precv_frame)
        else
 #endif
        {
-               DBG_871X_LEVEL(_drv_always_, "sta recv disassoc reason code(%d) sta:%pM\n",
-                               reason, GetAddr3Ptr(pframe));
-               
-               receive_disconnect(padapter, GetAddr3Ptr(pframe), reason);
+               DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" reason=%u, ta=%pM\n"
+                       , FUNC_ADPT_ARG(padapter), reason, GetAddr2Ptr(pframe));
+
+               receive_disconnect(padapter, GetAddr2Ptr(pframe), reason);
        }       
        pmlmepriv->LinkDetectInfo.bBusyTraffic = _FALSE;
        return _SUCCESS;
@@ -9431,18 +9427,25 @@ void site_survey(_adapter *padapter)
                //val8 |= 0x0f;
                //rtw_hal_set_hwreg(padapter, HW_VAR_TXPAUSE, (u8 *)(&val8));
 #if defined(CONFIG_STA_MODE_SCAN_UNDER_AP_MODE) || defined(CONFIG_ATMEL_RC_PATCH)
-               if((padapter->pbuddy_adapter->mlmeextpriv.mlmext_info.state&0x03) == WIFI_FW_AP_STATE)
-               {
-                       if( pmlmeinfo->scan_cnt == RTW_SCAN_NUM_OF_CH )
-                       {
-                               pmlmeinfo->scan_cnt = 0;
-                               survey_channel = pbuddy_mlmeext->cur_channel;
-                               stay_buddy_ch = 1;
-                       }
-                       else 
-                       {
-                               if( pmlmeinfo->scan_cnt == 0 )
+               if ((padapter->pbuddy_adapter->mlmeextpriv.mlmext_info.state&0x03) == WIFI_FW_AP_STATE) {
+                       if (pmlmeinfo->scan_cnt == RTW_SCAN_NUM_OF_CH) {
+                               if (pmlmeinfo->backop_cnt == 0)
+                                       stay_buddy_ch = 1;
+                               else if (pmlmeinfo->backop_cnt == RTW_STAY_AP_CH_MILLISECOND)
                                        stay_buddy_ch = 2;
+
+                               if (stay_buddy_ch == 2) {
+                                       pmlmeinfo->scan_cnt = 1;
+                                       pmlmeinfo->backop_cnt = 0;
+                               } else if (stay_buddy_ch == 1) {
+                                       pmlmeinfo->backop_cnt++;
+                                       survey_channel = pbuddy_mlmeext->cur_channel;
+                               } else {
+                                       pmlmeinfo->backop_cnt++;
+                                       set_survey_timer(pmlmeext, pmlmeext->chan_scan_time);
+                                       return; 
+                               }
+                       } else {
                                pmlmeinfo->scan_cnt++;
                        }
                }
@@ -9527,21 +9530,12 @@ void site_survey(_adapter *padapter)
                //      1,2-6-3,4-6-5,6-6-7,8-6-9,10-6-11,12-6-13,14
                //if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)==_TRUE)
 
-               if( stay_buddy_ch == 1 )
-                       set_survey_timer(pmlmeext, pmlmeext->chan_scan_time * RTW_STAY_AP_CH_MILLISECOND );
-               else {
-                       if( check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)
-                               set_survey_timer(pmlmeext, 20);
-                       else
-                               set_survey_timer(pmlmeext, 40);
-               }
-#elif defined(CONFIG_STA_MODE_SCAN_UNDER_AP_MODE)
-               if( stay_buddy_ch == 1 )
-                       set_survey_timer(pmlmeext, pmlmeext->chan_scan_time * RTW_STAY_AP_CH_MILLISECOND );
+               if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)
+                       set_survey_timer(pmlmeext, 20);
                else
-                       set_survey_timer(pmlmeext, pmlmeext->chan_scan_time);
+                       set_survey_timer(pmlmeext, 40);
 #else
-                       set_survey_timer(pmlmeext, pmlmeext->chan_scan_time);
+               set_survey_timer(pmlmeext, pmlmeext->chan_scan_time);
 #endif
        }
        else
@@ -9616,6 +9610,7 @@ void site_survey(_adapter *padapter)
 
 #if defined(CONFIG_STA_MODE_SCAN_UNDER_AP_MODE) || defined(CONFIG_ATMEL_RC_PATCH) 
                        pmlmeinfo->scan_cnt = 0;
+                       pmlmeinfo->backop_cnt = 0;
 #endif
 
 #ifdef CONFIG_ANTENNA_DIVERSITY
@@ -10208,7 +10203,6 @@ unsigned int receive_disconnect(_adapter *padapter, unsigned char *MacAddr, unsi
        struct mlme_ext_priv    *pmlmeext = &padapter->mlmeextpriv;
        struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);
 
-       //check A3
        if (!(_rtw_memcmp(MacAddr, get_my_bssid(&pmlmeinfo->network), ETH_ALEN)))
                return _SUCCESS;
 
@@ -11645,7 +11639,8 @@ void survey_timer_hdl(_adapter *padapter)
                if(pmlmeext->sitesurvey_res.state ==  SCAN_PROCESS)
                {
 #if defined(CONFIG_STA_MODE_SCAN_UNDER_AP_MODE) || defined(CONFIG_ATMEL_RC_PATCH) 
-                       if( padapter->mlmeextpriv.mlmext_info.scan_cnt != RTW_SCAN_NUM_OF_CH )
+                       if (padapter->mlmeextpriv.mlmext_info.scan_cnt != RTW_SCAN_NUM_OF_CH
+                               || padapter->mlmeextpriv.mlmext_info.backop_cnt == RTW_STAY_AP_CH_MILLISECOND)
 #endif
                                pmlmeext->sitesurvey_res.channel_idx++;
                }
@@ -12421,7 +12416,107 @@ u8 disconnect_hdl(_adapter *padapter, unsigned char *pbuf)
        return  H2C_SUCCESS;
 }
 
-int rtw_scan_ch_decision(_adapter *padapter, struct rtw_ieee80211_channel *out,
+u8 rtw_scan_sparse(_adapter *adapter, struct rtw_ieee80211_channel *ch, u8 ch_num)
+{
+/* interval larger than this is treated as backgroud scan */
+#ifndef RTW_SCAN_SPARSE_BG_INTERVAL_MS
+#define RTW_SCAN_SPARSE_BG_INTERVAL_MS 12000
+#endif
+
+#ifndef RTW_SCAN_SPARSE_CH_NUM_MIRACAST
+#define RTW_SCAN_SPARSE_CH_NUM_MIRACAST 1
+#endif
+#ifndef RTW_SCAN_SPARSE_CH_NUM_BG
+#define RTW_SCAN_SPARSE_CH_NUM_BG 4
+#endif
+
+#define SCAN_SPARSE_CH_NUM_INVALID 255
+
+       static u8 token = 255;
+       u32 interval;
+       bool busy_traffic = _FALSE;
+       bool miracast_enabled = _FALSE;
+       bool bg_scan = _FALSE;
+       u8 max_allow_ch = SCAN_SPARSE_CH_NUM_INVALID;
+       u8 scan_division_num;
+       u8 ret_num = ch_num;
+       struct registry_priv *regsty = dvobj_to_regsty(adapter_to_dvobj(adapter));
+       struct mlme_ext_priv *mlmeext = &adapter->mlmeextpriv;
+
+       if (regsty->wifi_spec)
+               goto exit;
+
+       /* assume ch_num > 6 is normal scan */
+       if (ch_num <= 6)
+               goto exit;
+
+       if (mlmeext->last_scan_time == 0)
+               mlmeext->last_scan_time = rtw_get_current_time();
+
+       interval = rtw_get_passing_time_ms(mlmeext->last_scan_time);
+
+       if (adapter->mlmepriv.LinkDetectInfo.bBusyTraffic == _TRUE
+               #ifdef CONFIG_CONCURRENT_MODE
+               || (adapter->pbuddy_adapter && adapter->pbuddy_adapter->mlmepriv.LinkDetectInfo.bBusyTraffic == _TRUE)
+               #endif
+       )
+                       busy_traffic = _TRUE;
+
+       #ifdef CONFIG_WFD
+       if (is_miracast_enabled(adapter->wfd_info.stack_wfd_mode)
+               #ifdef CONFIG_CONCURRENT_MODE
+               || (adapter->pbuddy_adapter && is_miracast_enabled(adapter->pbuddy_adapter->wfd_info.stack_wfd_mode))
+               #endif
+       )
+               miracast_enabled = _TRUE;
+       #endif
+
+       if (interval > RTW_SCAN_SPARSE_BG_INTERVAL_MS)
+               bg_scan = _TRUE;
+
+       /* max_allow_ch by conditions*/
+
+       #if RTW_SCAN_SPARSE_MIRACAST
+       if (miracast_enabled == _TRUE && busy_traffic == _TRUE)
+               max_allow_ch = rtw_min(max_allow_ch, RTW_SCAN_SPARSE_CH_NUM_MIRACAST);
+       #endif
+
+       #if RTW_SCAN_SPARSE_BG
+       if (bg_scan == _TRUE)
+               max_allow_ch = rtw_min(max_allow_ch, RTW_SCAN_SPARSE_CH_NUM_BG);
+       #endif
+
+
+       if (max_allow_ch != SCAN_SPARSE_CH_NUM_INVALID) {
+               int i;
+               int k = 0;
+
+               scan_division_num = (ch_num / max_allow_ch) + ((ch_num % max_allow_ch)?1:0);
+               token = (token + 1) % scan_division_num;
+               
+               if (0)
+                       DBG_871X("scan_division_num:%u, token:%u\n", scan_division_num, token);
+               
+               for (i = 0; i < ch_num; i++) {
+                       if (ch[i].hw_value && (i % scan_division_num) == token
+                       ) {
+                               if (i != k)
+                                       _rtw_memcpy(&ch[k], &ch[i], sizeof(struct rtw_ieee80211_channel));
+                               k++;
+                       }
+               }
+
+               _rtw_memset(&ch[k], 0, sizeof(struct rtw_ieee80211_channel));
+
+               ret_num = k;
+               mlmeext->last_scan_time = rtw_get_current_time();
+       }
+
+exit:
+       return ret_num;
+}
+
+static int rtw_scan_ch_decision(_adapter *padapter, struct rtw_ieee80211_channel *out,
        u32 out_num, struct rtw_ieee80211_channel *in, u32 in_num)
 {
        int i, j;
@@ -12486,49 +12581,8 @@ int rtw_scan_ch_decision(_adapter *padapter, struct rtw_ieee80211_channel *out,
                }
        }
 
-#ifdef CONFIG_SCAN_SPARSE //partial scan, ASUS RK3188 use the feature
-       /* assume j>6 is normal scan */
-       if ((j > 6) && (padapter->registrypriv.wifi_spec != 1))
-       {
-               static u8 token = 0;
-               u32 interval;
-
-               if (pmlmeext->last_scan_time == 0)
-                       pmlmeext->last_scan_time = rtw_get_current_time();
-
-               interval = rtw_get_passing_time_ms(pmlmeext->last_scan_time);
-               if ((interval > ALLOW_SCAN_INTERVAL)
-#if 0 // Miracast can't do AP scan
-                       || (padapter->mlmepriv.LinkDetectInfo.bBusyTraffic == _TRUE)
-#ifdef CONFIG_CONCURRENT_MODE
-                       || (padapter->pbuddy_adapter
-                               && (padapter->pbuddy_adapter->mlmepriv.LinkDetectInfo.bBusyTraffic == _TRUE))
-#endif // CONFIG_CONCURRENT_MODE
-#endif
-                       )
-               {
-                       // modify scan plan
-                       int k = 0;
-                       _rtw_memset(in, 0, sizeof(struct rtw_ieee80211_channel)*in_num);
-                       _rtw_memcpy(in, out, sizeof(struct rtw_ieee80211_channel)*j);
-                       _rtw_memset(out, 0, sizeof(struct rtw_ieee80211_channel)*j);
-
-                       for (i=0;i<j;i++) {
-                               if (in[i].hw_value && (i%SCAN_DIVISION_NUM) == token) {
-                                       _rtw_memcpy(&out[k], &in[i], sizeof(struct rtw_ieee80211_channel));
-                                       k++;
-                               }
-                               if(k>=out_num)
-                                       break;
-                       }
-
-                       j = k;
-                       token  = (token+1)%SCAN_DIVISION_NUM;
-               }
-
-               pmlmeext->last_scan_time = rtw_get_current_time();
-       }
-#endif //CONFIG_SCAN_SPARSE
+       /* scan_sparse */
+       j = rtw_scan_sparse(padapter, out, j);
 
        return j;
 }
index b2c5a28aeb1ca9b5a5dc56046536377d1a5c38c9..32b7c7387609f8e638eb107f46130e7016429d8d 100755 (executable)
@@ -1990,9 +1990,9 @@ NDIS_STATUS oid_rt_pro_dele_sta_info_hdl(struct oid_par_priv *poid_par_priv)
 
        psta = rtw_get_stainfo(&Adapter->stapriv, macaddr);
        if (psta != NULL) {
-               _enter_critical(&(Adapter->stapriv.sta_hash_lock), &irqL);
+               //_enter_critical(&(Adapter->stapriv.sta_hash_lock), &irqL);
                rtw_free_stainfo(Adapter, psta);
-               _exit_critical(&(Adapter->stapriv.sta_hash_lock), &irqL);
+               //_exit_critical(&(Adapter->stapriv.sta_hash_lock), &irqL);
        }
 
        return status;
index 75beea8a2178570fc09ad133aa8144e8fcfddc9f..0bfafd9d14024533907bd773a2992bcc319a6070 100755 (executable)
@@ -38,20 +38,20 @@ const char *odm_comp_str[] = {
        /* BIT13 */"ODM_COMP_RXHP",
        /* BIT14 */"ODM_COMP_MP",
        /* BIT15 */"ODM_COMP_DYNAMIC_ATC",
-       /* BIT16 */"ODM_COMP_EDCA_TURBO",
-       /* BIT17 */"ODM_COMP_EARLY_MODE",
-       /* BIT18 */NULL,
-       /* BIT19 */NULL,
-       /* BIT20 */NULL,
-       /* BIT21 */NULL,
-       /* BIT22 */NULL,
+       /* BIT16 */"ODM_COMP_ACS",
+       /* BIT17 */"PHYDM_COMP_ADAPTIVITY",
+       /* BIT18 */"PHYDM_COMP_RA_DBG",
+       /* BIT19 */"PHYDM_COMP_TXBF",
+       /* BIT20 */"ODM_COMP_EDCA_TURBO",
+       /* BIT21 */"ODM_COMP_EARLY_MODE",
+       /* BIT22 */"ODM_FW_DEBUG_TRACE",
        /* BIT23 */NULL,
        /* BIT24 */"ODM_COMP_TX_PWR_TRACK",
        /* BIT25 */"ODM_COMP_RX_GAIN_TRACK",
        /* BIT26 */"ODM_COMP_CALIBRATION",
        /* BIT27 */NULL,
        /* BIT28 */NULL,
-       /* BIT29 */NULL,
+       /* BIT29 */"BEAMFORMING_DEBUG",
        /* BIT30 */"ODM_COMP_COMMON",
        /* BIT31 */"ODM_COMP_INIT",
 };
@@ -74,13 +74,13 @@ const char *odm_ability_str[] = {
        /* BIT12 */"ODM_BB_RXHP",
        /* BIT13 */"ODM_BB_ADAPTIVITY",
        /* BIT14 */"ODM_BB_DYNAMIC_ATC",
-       /* BIT15 */NULL,
-       /* BIT16 */"ODM_MAC_EDCA_TURBO",
-       /* BIT17 */"ODM_MAC_EARLY_MODE",
+       /* BIT15 */"ODM_BB_NHM_CNT",
+       /* BIT16 */"ODM_BB_PRIMARY_CCA",
+       /* BIT17 */"ODM_BB_TXBF",
        /* BIT18 */NULL,
        /* BIT19 */NULL,
-       /* BIT20 */NULL,
-       /* BIT21 */NULL,
+       /* BIT20 */"ODM_MAC_EDCA_TURBO",
+       /* BIT21 */"ODM_MAC_EARLY_MODE",
        /* BIT22 */NULL,
        /* BIT23 */NULL,
        /* BIT24 */"ODM_RF_TX_PWR_TRACK",
@@ -106,15 +106,15 @@ void rtw_odm_dbg_comp_msg(void *sel, _adapter *adapter)
        HAL_DATA_TYPE *pHalData = GET_HAL_DATA(adapter);
        DM_ODM_T *odm = &pHalData->odmpriv;
        int cnt = 0;
-       u64 dbg_comp;
+       u64 dbg_comp = 0;
        int i;
 
        rtw_hal_get_def_var(adapter, HW_DEF_ODM_DBG_FLAG, &dbg_comp);
        DBG_871X_SEL_NL(sel, "odm.DebugComponents = 0x%016llx \n", dbg_comp);
        for (i=0;i<RTW_ODM_COMP_MAX;i++) {
                if (odm_comp_str[i])
-               DBG_871X_SEL_NL(sel, "%cBIT%-2d %s\n",
-                       (BIT0 << i) & dbg_comp ? '+' : ' ', i, odm_comp_str[i]);
+                       DBG_871X_SEL_NL(sel, "%cBIT%-2d %s\n",
+                               (BIT0 << i) & dbg_comp ? '+' : ' ', i, odm_comp_str[i]);
        }
 }
 
@@ -128,11 +128,11 @@ void rtw_odm_dbg_level_msg(void *sel, _adapter *adapter)
        HAL_DATA_TYPE *pHalData = GET_HAL_DATA(adapter);
        DM_ODM_T *odm = &pHalData->odmpriv;
        int cnt = 0;
-       u32 dbg_level;
+       u32 dbg_level = 0;
        int i;
 
        rtw_hal_get_def_var(adapter, HW_DEF_ODM_DBG_LEVEL, &dbg_level);
-       DBG_871X_SEL_NL(sel, "odm.DebugDebugLevel = %u\n", dbg_level);
+       DBG_871X_SEL_NL(sel, "odm.DebugLevel = %u\n", dbg_level);
        for (i=0;i<RTW_ODM_DBG_LEVEL_NUM;i++) {
                if (odm_dbg_level_str[i])
                        DBG_871X_SEL_NL(sel, "%u %s\n", i, odm_dbg_level_str[i]);
@@ -156,8 +156,8 @@ void rtw_odm_ability_msg(void *sel, _adapter *adapter)
        DBG_871X_SEL_NL(sel, "odm.SupportAbility = 0x%08x\n", ability);
        for (i=0;i<RTW_ODM_ABILITY_MAX;i++) {
                if (odm_ability_str[i])
-               DBG_871X_SEL_NL(sel, "%cBIT%-2d %s\n",
-                       (BIT0 << i) & ability ? '+' : ' ', i, odm_ability_str[i]);
+                       DBG_871X_SEL_NL(sel, "%cBIT%-2d %s\n",
+                               (BIT0 << i) & ability ? '+' : ' ', i, odm_ability_str[i]);
        }
 }
 
@@ -166,35 +166,129 @@ inline void rtw_odm_ability_set(_adapter *adapter, u32 ability)
        rtw_hal_set_hwreg(adapter, HW_VAR_DM_FLAG, (u8*)&ability);
 }
 
+void rtw_odm_adaptivity_ver_msg(void *sel, _adapter *adapter)
+{
+       DBG_871X_SEL_NL(sel, "ADAPTIVITY_VERSION "ADAPTIVITY_VERSION"\n");
+}
+
+#define RTW_ADAPTIVITY_EN_DISABLE 0
+#define RTW_ADAPTIVITY_EN_ENABLE 1
+
+void rtw_odm_adaptivity_en_msg(void *sel, _adapter *adapter)
+{
+       struct registry_priv *regsty = &adapter->registrypriv;
+       struct mlme_priv *mlme = &adapter->mlmepriv;
+       HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
+       DM_ODM_T *odm = &hal_data->odmpriv;
+
+       DBG_871X_SEL_NL(sel, "RTW_ADAPTIVITY_EN_");
+
+       if (regsty->adaptivity_en == RTW_ADAPTIVITY_EN_DISABLE) {
+               DBG_871X_SEL(sel, "DISABLE\n");
+       } else if (regsty->adaptivity_en == RTW_ADAPTIVITY_EN_ENABLE) {
+               DBG_871X_SEL(sel, "ENABLE\n");
+       } else {
+               DBG_871X_SEL(sel, "INVALID\n");
+       }
+}
+
+#define RTW_ADAPTIVITY_MODE_NORMAL 0
+#define RTW_ADAPTIVITY_MODE_CARRIER_SENSE 1
+
+void rtw_odm_adaptivity_mode_msg(void *sel, _adapter *adapter)
+{
+       struct registry_priv *regsty = &adapter->registrypriv;
+
+       DBG_871X_SEL_NL(sel, "RTW_ADAPTIVITY_MODE_");
+
+       if (regsty->adaptivity_mode == RTW_ADAPTIVITY_MODE_NORMAL) {
+               DBG_871X_SEL(sel, "NORMAL\n");
+       } else if (regsty->adaptivity_mode == RTW_ADAPTIVITY_MODE_CARRIER_SENSE) {
+               DBG_871X_SEL(sel, "CARRIER_SENSE\n");
+       } else {
+               DBG_871X_SEL(sel, "INVALID\n");
+       }
+}
+
+#define RTW_ADAPTIVITY_DML_DISABLE 0
+#define RTW_ADAPTIVITY_DML_ENABLE 1
+
+void rtw_odm_adaptivity_dml_msg(void *sel, _adapter *adapter)
+{
+       struct registry_priv *regsty = &adapter->registrypriv;
+
+       DBG_871X_SEL_NL(sel, "RTW_ADAPTIVITY_DML_");
+
+       if (regsty->adaptivity_dml == RTW_ADAPTIVITY_DML_DISABLE) {
+               DBG_871X_SEL(sel, "DISABLE\n");
+       } else if (regsty->adaptivity_dml == RTW_ADAPTIVITY_DML_ENABLE) {
+               DBG_871X_SEL(sel, "ENABLE\n");
+       } else {
+               DBG_871X_SEL(sel, "INVALID\n");
+       }
+}
+
+void rtw_odm_adaptivity_dc_backoff_msg(void *sel, _adapter *adapter)
+{
+       struct registry_priv *regsty = &adapter->registrypriv;
+
+       DBG_871X_SEL_NL(sel, "RTW_ADAPTIVITY_DC_BACKOFF:%u\n", regsty->adaptivity_dc_backoff);
+}
+
+bool rtw_odm_adaptivity_needed(_adapter *adapter)
+{
+       struct registry_priv *regsty = &adapter->registrypriv;
+       struct mlme_priv *mlme = &adapter->mlmepriv;
+       bool ret = _FALSE;
+
+       if (regsty->adaptivity_en == RTW_ADAPTIVITY_EN_ENABLE)
+               ret = _TRUE;
+
+       if (ret == _TRUE) {
+               rtw_odm_adaptivity_ver_msg(RTW_DBGDUMP, adapter);
+               rtw_odm_adaptivity_en_msg(RTW_DBGDUMP, adapter);
+               rtw_odm_adaptivity_mode_msg(RTW_DBGDUMP, adapter);
+               rtw_odm_adaptivity_dml_msg(RTW_DBGDUMP, adapter);
+               rtw_odm_adaptivity_dc_backoff_msg(RTW_DBGDUMP, adapter);
+       }
+
+       return ret;
+}
+
 void rtw_odm_adaptivity_parm_msg(void *sel, _adapter *adapter)
 {
        HAL_DATA_TYPE *pHalData = GET_HAL_DATA(adapter);
        DM_ODM_T *odm = &pHalData->odmpriv;
 
-       DBG_871X_SEL_NL(sel, "%10s %16s %8s %10s %11s %14s\n"
-               , "TH_L2H_ini", "TH_EDCCA_HL_diff", "IGI_Base", "ForceEDCCA", "AdapEn_RSSI", "IGI_LowerBound");
-       DBG_871X_SEL_NL(sel, "0x%-8x %-16d 0x%-6x %-10d %-11u %-14u\n"
+       rtw_odm_adaptivity_ver_msg(sel, adapter);
+       rtw_odm_adaptivity_en_msg(sel, adapter);
+       rtw_odm_adaptivity_mode_msg(sel, adapter);
+       rtw_odm_adaptivity_dml_msg(sel, adapter);
+       rtw_odm_adaptivity_dc_backoff_msg(sel, adapter);
+
+       DBG_871X_SEL_NL(sel, "%10s %16s\n"
+               , "TH_L2H_ini", "TH_EDCCA_HL_diff");
+       DBG_871X_SEL_NL(sel, "0x%-8x %-16d\n"
                , (u8)odm->TH_L2H_ini
                , odm->TH_EDCCA_HL_diff
-               , odm->IGI_Base
-               , odm->ForceEDCCA
-               , odm->AdapEn_RSSI
-               , odm->IGI_LowerBound
        );
+
+       DBG_871X_SEL_NL(sel, "%15s %9s\n", "AdapEnableState","Adap_Flag");
+       DBG_871X_SEL_NL(sel, "%-15x %-9x \n"
+               , odm->Adaptivity_enable
+               , odm->adaptivity_flag
+       );
+       
+       
 }
 
-void rtw_odm_adaptivity_parm_set(_adapter *adapter, s8 TH_L2H_ini, s8 TH_EDCCA_HL_diff,
-       s8 IGI_Base, bool ForceEDCCA, u8 AdapEn_RSSI, u8 IGI_LowerBound)
+void rtw_odm_adaptivity_parm_set(_adapter *adapter, s8 TH_L2H_ini, s8 TH_EDCCA_HL_diff)
 {
        HAL_DATA_TYPE *pHalData = GET_HAL_DATA(adapter);
        DM_ODM_T *odm = &pHalData->odmpriv;
 
        odm->TH_L2H_ini = TH_L2H_ini;
        odm->TH_EDCCA_HL_diff = TH_EDCCA_HL_diff;
-       odm->IGI_Base = IGI_Base;
-       odm->ForceEDCCA = ForceEDCCA;
-       odm->AdapEn_RSSI = AdapEn_RSSI;
-       odm->IGI_LowerBound = IGI_LowerBound;
 }
 
 void rtw_odm_get_perpkt_rssi(void *sel, _adapter *adapter)
index eaa3ea266e48ca1496526458493e8788ab09df4b..d729c84e183f7b2f19be165aedaf5449cf26d57d 100755 (executable)
@@ -3613,11 +3613,9 @@ _func_enter_;
        pcfg80211_wdinfo->is_ro_ch = _FALSE;
        pcfg80211_wdinfo->last_ro_ch_time = rtw_get_current_time();
 
-       if (pcfg80211_wdinfo->not_indic_ro_ch_exp == _TRUE)
-               return;
-
-       DBG_871X("cfg80211_remain_on_channel_expired, ch=%d, bw=%d, offset=%d\n", 
-               rtw_get_oper_ch(padapter), rtw_get_oper_bw(padapter), rtw_get_oper_choffset(padapter));
+       DBG_871X("cfg80211_remain_on_channel_expired cookie:0x%llx, ch=%d, bw=%d, offset=%d\n"
+               , pcfg80211_wdinfo->remain_on_ch_cookie
+               , rtw_get_oper_ch(padapter), rtw_get_oper_bw(padapter), rtw_get_oper_choffset(padapter));
 
        rtw_cfg80211_remain_on_channel_expired(padapter, 
                pcfg80211_wdinfo->remain_on_ch_cookie, 
index 2d266a2b24c5b78bb951a87569599dbb92fef16c..f25fa54212036486de0b010608aa757a4f732a6f 100755 (executable)
@@ -463,6 +463,11 @@ _func_enter_;
        if (psta == NULL)
                goto exit;
 
+       _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL0);
+       rtw_list_delete(&psta->hash_list);
+       RT_TRACE(_module_rtl871x_sta_mgt_c_,_drv_err_,("\n free number_%d stainfo  with hwaddr = 0x%.2x 0x%.2x 0x%.2x 0x%.2x 0x%.2x 0x%.2x  \n",pstapriv->asoc_sta_count , psta->hwaddr[0], psta->hwaddr[1], psta->hwaddr[2],psta->hwaddr[3],psta->hwaddr[4],psta->hwaddr[5]));
+       pstapriv->asoc_sta_count --;
+       _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL0);
 
        _enter_critical_bh(&psta->lock, &irqL0);
        psta->state &= ~_FW_LINKED;
@@ -526,11 +531,6 @@ _func_enter_;
 
        _exit_critical_bh(&pxmitpriv->lock, &irqL0);
        
-       rtw_list_delete(&psta->hash_list);
-       RT_TRACE(_module_rtl871x_sta_mgt_c_,_drv_err_,("\n free number_%d stainfo  with hwaddr = 0x%.2x 0x%.2x 0x%.2x 0x%.2x 0x%.2x 0x%.2x  \n",pstapriv->asoc_sta_count , psta->hwaddr[0], psta->hwaddr[1], psta->hwaddr[2],psta->hwaddr[3],psta->hwaddr[4],psta->hwaddr[5]));
-       pstapriv->asoc_sta_count --;
-       
-       
        // re-init sta_info; 20061114 // will be init in alloc_stainfo
        //_rtw_init_sta_xmit_priv(&psta->sta_xmitpriv);
        //_rtw_init_sta_recv_priv(&psta->sta_recvpriv);
@@ -637,7 +637,9 @@ _func_enter_;
         _rtw_spinlock_free(&psta->lock);
 
        //_enter_critical_bh(&(pfree_sta_queue->lock), &irqL0);
+       _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL0);
        rtw_list_insert_tail(&psta->list, get_list_head(pfree_sta_queue));
+       _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL0);
        //_exit_critical_bh(&(pfree_sta_queue->lock), &irqL0);
 
 exit:
@@ -657,6 +659,9 @@ void rtw_free_all_stainfo(_adapter *padapter)
        struct sta_info *psta = NULL;
        struct  sta_priv *pstapriv = &padapter->stapriv;
        struct sta_info* pbcmc_stainfo =rtw_get_bcmc_stainfo( padapter);
+       u8 free_sta_num = 0;
+       char free_sta_list[NUM_STA];
+       int stainfo_offset;
        
 _func_enter_;  
 
@@ -676,13 +681,25 @@ _func_enter_;
 
                        plist = get_next(plist);
 
-                       if(pbcmc_stainfo!=psta)                                 
-                               rtw_free_stainfo(padapter , psta);
-                       
+                       if(pbcmc_stainfo!=psta)
+                       {
+                               rtw_list_delete(&psta->hash_list);
+                               //rtw_free_stainfo(padapter , psta);
+                               stainfo_offset = rtw_stainfo_offset(pstapriv, psta);
+                               if (stainfo_offset_valid(stainfo_offset)) {
+                                       free_sta_list[free_sta_num++] = stainfo_offset;
+                               }
+                       }
                }
        }
        
        _exit_critical_bh(&pstapriv->sta_hash_lock, &irqL);
+
+       for (index = 0; index < free_sta_num; free_sta_num++) 
+       {
+               psta = rtw_get_stainfo_by_offset(pstapriv, free_sta_list[index]);
+               rtw_free_stainfo(padapter , psta);
+       }
        
 exit:  
        
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8188eu/hal/OUTSRC/PhyDM_Adaptivity.c b/drivers/net/wireless/rockchip_wlan/rtl8188eu/hal/OUTSRC/PhyDM_Adaptivity.c
new file mode 100755 (executable)
index 0000000..3395559
--- /dev/null
@@ -0,0 +1,874 @@
+/******************************************************************************\r
+ *\r
+ * Copyright(c) 2007 - 2011 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
+\r
+//============================================================\r
+// include files\r
+//============================================================\r
+//#include "Mp_Precomp.h"\r
+#include "odm_precomp.h"\r
+\r
+#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+#if WPP_SOFTWARE_TRACE\r
+#include "PhyDM_Adaptivity.tmh"\r
+#endif\r
+#endif\r
+\r
+\r
+VOID\r
+Phydm_CheckAdaptivity(\r
+       IN              PVOID                   pDM_VOID\r
+)\r
+{\r
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       PADAPTIVITY_STATISTICS  Adaptivity = (PADAPTIVITY_STATISTICS)PhyDM_Get_Structure(pDM_Odm, PHYDM_ADAPTIVITY);\r
+       \r
+       if (pDM_Odm->SupportAbility & ODM_BB_ADAPTIVITY) {\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+               if (pDM_Odm->APTotalNum > Adaptivity->APNumTH) {\r
+                       pDM_Odm->Adaptivity_enable = FALSE;\r
+                       pDM_Odm->adaptivity_flag = FALSE;\r
+                       Phydm_SetEDCCAThreshold(pDM_Odm, 0x7f, 0x7f);\r
+                       ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("AP total num > %d!!, disable adaptivity\n", Adaptivity->APNumTH));\r
+               } else\r
+#endif\r
+               {\r
+                       if (Adaptivity->DynamicLinkAdaptivity == TRUE) {\r
+                               if (pDM_Odm->bLinked && Adaptivity->bCheck == FALSE) {\r
+                                       Phydm_NHMCounterStatistics(pDM_Odm);\r
+                                       Phydm_CheckEnvironment(pDM_Odm);\r
+                               } else if (!pDM_Odm->bLinked)\r
+                                       Adaptivity->bCheck = FALSE;\r
+                       } else {\r
+                               pDM_Odm->Adaptivity_enable = TRUE;\r
+\r
+                               if (pDM_Odm->SupportICType & (ODM_RTL8814A|ODM_RTL8195A))\r
+                                       pDM_Odm->adaptivity_flag = FALSE;\r
+                               else\r
+                                       pDM_Odm->adaptivity_flag = TRUE;\r
+                       }\r
+               }\r
+       } else {\r
+               pDM_Odm->Adaptivity_enable = FALSE;\r
+               pDM_Odm->adaptivity_flag = FALSE;\r
+       }\r
+\r
+       \r
+\r
+}\r
+\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+BOOLEAN\r
+Phydm_CheckChannelPlan(\r
+       IN              PVOID                   pDM_VOID\r
+)\r
+{\r
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       PADAPTER                pAdapter        = pDM_Odm->Adapter;\r
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(pAdapter);\r
+       PMGNT_INFO              pMgntInfo = &(pAdapter->MgntInfo);\r
+       \r
+       if (pMgntInfo->RegEnableAdaptivity == 2) {\r
+               if (pDM_Odm->Carrier_Sense_enable == FALSE) {           /*check domain Code for Adaptivity or CarrierSense*/\r
+                       if ((*pDM_Odm->pBandType == ODM_BAND_5G) &&\r
+                           !(pDM_Odm->odm_Regulation5G == REGULATION_ETSI || pDM_Odm->odm_Regulation5G == REGULATION_WW)) {\r
+                               ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("Adaptivity skip 5G domain code : %d\n", pDM_Odm->odm_Regulation5G));\r
+                               return TRUE;\r
+                       } else if ((*pDM_Odm->pBandType == ODM_BAND_2_4G) &&\r
+                                  !(pDM_Odm->odm_Regulation2_4G == REGULATION_ETSI || pDM_Odm->odm_Regulation2_4G == REGULATION_WW)) {\r
+                               ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("Adaptivity skip 2.4G domain code : %d\n", pDM_Odm->odm_Regulation2_4G));\r
+                               return TRUE;\r
+\r
+                       } else if ((*pDM_Odm->pBandType != ODM_BAND_2_4G) && (*pDM_Odm->pBandType != ODM_BAND_5G)) {\r
+                               ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("Adaptivity neither 2G nor 5G band, return\n"));\r
+                               return TRUE;\r
+                       }\r
+               } else {\r
+                       if ((*pDM_Odm->pBandType == ODM_BAND_5G) &&\r
+                           !(pDM_Odm->odm_Regulation5G == REGULATION_MKK || pDM_Odm->odm_Regulation5G == REGULATION_WW)) {\r
+                               ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("CarrierSense skip 5G domain code : %d\n", pDM_Odm->odm_Regulation5G));\r
+                               return TRUE;\r
+                       }\r
+\r
+                       else if ((*pDM_Odm->pBandType == ODM_BAND_2_4G) &&\r
+                                  !(pDM_Odm->odm_Regulation2_4G == REGULATION_MKK  || pDM_Odm->odm_Regulation2_4G == REGULATION_WW)) {\r
+                               ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("CarrierSense skip 2.4G domain code : %d\n", pDM_Odm->odm_Regulation2_4G));\r
+                               return TRUE;\r
+\r
+                       } else if ((*pDM_Odm->pBandType != ODM_BAND_2_4G) && (*pDM_Odm->pBandType != ODM_BAND_5G)) {\r
+                               ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("CarrierSense neither 2G nor 5G band, return\n"));\r
+                               return TRUE;\r
+                       }\r
+               }\r
+       }\r
+\r
+       return FALSE;\r
+\r
+}\r
+#endif\r
+\r
+VOID\r
+Phydm_NHMCounterStatisticsInit(\r
+       IN              PVOID                   pDM_VOID\r
+)\r
+{\r
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+\r
+       if (pDM_Odm->SupportICType & ODM_IC_11N_SERIES) {\r
+               /*PHY parameters initialize for n series*/\r
+               ODM_Write2Byte(pDM_Odm, ODM_REG_NHM_TIMER_11N + 2, 0xC350);                     /*0x894[31:16]=0x0xC350 Time duration for NHM unit: us, 0xc350=200ms*/\r
+               ODM_Write2Byte(pDM_Odm, ODM_REG_NHM_TH9_TH10_11N + 2, 0xffff);          /*0x890[31:16]=0xffff           th_9, th_10*/\r
+               ODM_Write4Byte(pDM_Odm, ODM_REG_NHM_TH3_TO_TH0_11N, 0xffffff50);                /*0x898=0xffffff52                      th_3, th_2, th_1, th_0*/\r
+               ODM_Write4Byte(pDM_Odm, ODM_REG_NHM_TH7_TO_TH4_11N, 0xffffffff);                /*0x89c=0xffffffff                      th_7, th_6, th_5, th_4*/\r
+               ODM_SetBBReg(pDM_Odm, ODM_REG_FPGA0_IQK_11N, bMaskByte0, 0xff);         /*0xe28[7:0]=0xff                       th_8*/\r
+               ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH9_TH10_11N, BIT10 | BIT9 | BIT8, 0x1);      /*0x890[10:8]=1                 ignoreCCA ignore PHYTXON enable CCX*/\r
+               ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTC_11N, BIT7, 0x1);                     /*0xc0c[7]=1                            max power among all RX ants*/\r
+       }\r
+#if (RTL8195A_SUPPORT == 0)\r
+       else if (pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) {\r
+               /*PHY parameters initialize for ac series*/\r
+               ODM_Write2Byte(pDM_Odm, ODM_REG_NHM_TIMER_11AC + 2, 0xC350);                    /*0x990[31:16]=0xC350   Time duration for NHM unit: us, 0xc350=200ms*/\r
+               ODM_Write2Byte(pDM_Odm, ODM_REG_NHM_TH9_TH10_11AC + 2, 0xffff);         /*0x994[31:16]=0xffff           th_9, th_10*/\r
+               ODM_Write4Byte(pDM_Odm, ODM_REG_NHM_TH3_TO_TH0_11AC, 0xffffff50);       /*0x998=0xffffff52                      th_3, th_2, th_1, th_0*/\r
+               ODM_Write4Byte(pDM_Odm, ODM_REG_NHM_TH7_TO_TH4_11AC, 0xffffffff);       /*0x99c=0xffffffff                      th_7, th_6, th_5, th_4*/\r
+               ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH8_11AC, bMaskByte0, 0xff);          /*0x9a0[7:0]=0xff                       th_8*/\r
+               ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH9_TH10_11AC, BIT8 | BIT9 | BIT10, 0x1); /*0x994[10:8]=1                     ignoreCCA ignore PHYTXON        enable CCX*/\r
+               ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_9E8_11AC, BIT0, 0x1);                         /*0x9e8[7]=1                            max power among all RX ants*/\r
+\r
+       }\r
+#endif\r
+}\r
+\r
+VOID\r
+Phydm_NHMCounterStatistics(\r
+       IN              PVOID                   pDM_VOID\r
+)\r
+{\r
+       PDM_ODM_T       pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+\r
+       if (!(pDM_Odm->SupportAbility & ODM_BB_NHM_CNT))\r
+               return;\r
+\r
+       /*Get NHM report*/\r
+       Phydm_GetNHMCounterStatistics(pDM_Odm);\r
+\r
+       /*Reset NHM counter*/\r
+       Phydm_NHMCounterStatisticsReset(pDM_Odm);\r
+}\r
+\r
+VOID\r
+Phydm_GetNHMCounterStatistics(\r
+       IN              PVOID                   pDM_VOID\r
+)\r
+{\r
+       PDM_ODM_T       pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       u4Byte          value32 = 0;\r
+#if (RTL8195A_SUPPORT == 0)\r
+       if (pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)\r
+               value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_NHM_CNT_11AC, bMaskDWord);\r
+       else if (pDM_Odm->SupportICType & ODM_IC_11N_SERIES)\r
+#endif\r
+               value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_NHM_CNT_11N, bMaskDWord);\r
+\r
+       pDM_Odm->NHM_cnt_0 = (u1Byte)(value32 & bMaskByte0);\r
+       pDM_Odm->NHM_cnt_1 = (u1Byte)((value32 & bMaskByte1) >> 8);\r
+\r
+}\r
+\r
+VOID\r
+Phydm_NHMCounterStatisticsReset(\r
+       IN              PVOID                   pDM_VOID\r
+)\r
+{\r
+       PDM_ODM_T       pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+\r
+       if (pDM_Odm->SupportICType & ODM_IC_11N_SERIES) {\r
+               ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH9_TH10_11N, BIT1, 0);\r
+               ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH9_TH10_11N, BIT1, 1);\r
+       }\r
+#if (RTL8195A_SUPPORT == 0)\r
+       else if (pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) {\r
+               ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH9_TH10_11AC, BIT1, 0);\r
+               ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH9_TH10_11AC, BIT1, 1);\r
+       }\r
+\r
+#endif\r
+\r
+}\r
+\r
+VOID\r
+Phydm_SetEDCCAThreshold(\r
+       IN      PVOID   pDM_VOID,\r
+       IN      s1Byte  H2L,\r
+       IN      s1Byte  L2H\r
+)\r
+{\r
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+\r
+       if (pDM_Odm->SupportICType & ODM_IC_11N_SERIES) {\r
+               ODM_SetBBReg(pDM_Odm, rOFDM0_ECCAThreshold, bMaskByte0, (u1Byte)L2H);\r
+               ODM_SetBBReg(pDM_Odm, rOFDM0_ECCAThreshold, bMaskByte2, (u1Byte)H2L);\r
+       }\r
+#if (RTL8195A_SUPPORT == 0)\r
+       else if (pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) {\r
+               ODM_SetBBReg(pDM_Odm, rFPGA0_XB_LSSIReadBack, bMaskByte0, (u1Byte)L2H);\r
+               ODM_SetBBReg(pDM_Odm, rFPGA0_XB_LSSIReadBack, bMaskByte1, (u1Byte)H2L);\r
+       }\r
+#endif\r
+\r
+}\r
+\r
+VOID\r
+Phydm_SetTRxMux(\r
+       IN      PVOID                           pDM_VOID,\r
+       IN      PhyDM_Trx_MUX_Type      txMode,\r
+       IN      PhyDM_Trx_MUX_Type      rxMode\r
+)\r
+{\r
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+\r
+       if (pDM_Odm->SupportICType & ODM_IC_11N_SERIES) {\r
+               ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_RPT_FORMAT_11N, BIT3 | BIT2 | BIT1, txMode);                  /*set TXmod to standby mode to remove outside noise affect*/\r
+               ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_RPT_FORMAT_11N, BIT22 | BIT21 | BIT20, rxMode);               /*set RXmod to standby mode to remove outside noise affect*/\r
+               if (pDM_Odm->RFType > ODM_1T1R) {\r
+                       ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_RPT_FORMAT_11N_B, BIT3 | BIT2 | BIT1, txMode);                /*set TXmod to standby mode to remove outside noise affect*/\r
+                       ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_RPT_FORMAT_11N_B, BIT22 | BIT21 | BIT20, rxMode);     /*set RXmod to standby mode to remove outside noise affect*/\r
+               }\r
+       }\r
+#if (RTL8195A_SUPPORT == 0)\r
+       else if (pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) {\r
+               ODM_SetBBReg(pDM_Odm, ODM_REG_TRMUX_11AC, BIT11 | BIT10 | BIT9 | BIT8, txMode);                         /*set TXmod to standby mode to remove outside noise affect*/\r
+               ODM_SetBBReg(pDM_Odm, ODM_REG_TRMUX_11AC, BIT7 | BIT6 | BIT5 | BIT4, rxMode);                           /*set RXmod to standby mode to remove outside noise affect*/\r
+               if (pDM_Odm->RFType > ODM_1T1R) {\r
+                       ODM_SetBBReg(pDM_Odm, ODM_REG_TRMUX_11AC_B, BIT11 | BIT10 | BIT9 | BIT8, txMode);               /*set TXmod to standby mode to remove outside noise affect*/\r
+                       ODM_SetBBReg(pDM_Odm, ODM_REG_TRMUX_11AC_B, BIT7 | BIT6 | BIT5 | BIT4, rxMode);                 /*set RXmod to standby mode to remove outside noise affect*/\r
+               }\r
+       }\r
+#endif\r
+\r
+}\r
+\r
+VOID\r
+Phydm_MACEDCCAState(\r
+       IN      PVOID                                   pDM_VOID,\r
+       IN      PhyDM_MACEDCCA_Type             State\r
+)\r
+{\r
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       if (State == PhyDM_IGNORE_EDCCA) {\r
+               ODM_SetMACReg(pDM_Odm, REG_TX_PTCL_CTRL, BIT15, 1);     /*ignore EDCCA  reg520[15]=1*/\r
+               ODM_SetMACReg(pDM_Odm, REG_RD_CTRL, BIT11, 0);                  /*reg524[11]=0*/\r
+       } else {        /*don't set MAC ignore EDCCA signal*/\r
+               ODM_SetMACReg(pDM_Odm, REG_TX_PTCL_CTRL, BIT15, 0);     /*don't ignore EDCCA     reg520[15]=0\14*/\r
+               ODM_SetMACReg(pDM_Odm, REG_RD_CTRL, BIT11, 1);                  /*reg524[11]=1  */\r
+       }\r
+       ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("EDCCA enable State = %d\n", State));\r
+\r
+}\r
+\r
+BOOLEAN\r
+Phydm_CalNHMcnt(\r
+       IN              PVOID           pDM_VOID\r
+)\r
+{\r
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       u2Byte                  Base = 0;\r
+\r
+       Base = pDM_Odm->NHM_cnt_0 + pDM_Odm->NHM_cnt_1;\r
+\r
+       if (Base != 0) {\r
+               pDM_Odm->NHM_cnt_0 = ((pDM_Odm->NHM_cnt_0) << 8) / Base;\r
+               pDM_Odm->NHM_cnt_1 = ((pDM_Odm->NHM_cnt_1) << 8) / Base;\r
+       }\r
+       if ((pDM_Odm->NHM_cnt_0 - pDM_Odm->NHM_cnt_1) >= 100)\r
+               return TRUE;                    /*clean environment*/\r
+       else\r
+               return FALSE;           /*noisy environment*/\r
+\r
+}\r
+\r
+\r
+VOID\r
+Phydm_CheckEnvironment(\r
+       IN      PVOID   pDM_VOID\r
+)\r
+{\r
+       PDM_ODM_T       pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       PADAPTIVITY_STATISTICS  Adaptivity = (PADAPTIVITY_STATISTICS)PhyDM_Get_Structure(pDM_Odm, PHYDM_ADAPTIVITY);\r
+       BOOLEAN         isCleanEnvironment = FALSE;\r
+\r
+       if (Adaptivity->bFirstLink == TRUE) {\r
+               if (pDM_Odm->SupportICType & (ODM_RTL8814A|ODM_RTL8195A))\r
+                       pDM_Odm->adaptivity_flag = FALSE;\r
+               else\r
+                       pDM_Odm->adaptivity_flag = TRUE;\r
+\r
+               Adaptivity->bFirstLink = FALSE;\r
+               return;\r
+       } else {\r
+               if (Adaptivity->NHMWait < 3) {          /*Start enter NHM after 4 NHMWait*/\r
+                       Adaptivity->NHMWait++;\r
+                       Phydm_NHMCounterStatistics(pDM_Odm);\r
+                       return;\r
+               } else {\r
+                       Phydm_NHMCounterStatistics(pDM_Odm);\r
+                       isCleanEnvironment = Phydm_CalNHMcnt(pDM_Odm);\r
+                       if (isCleanEnvironment == TRUE) {\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+                               pDM_Odm->TH_L2H_ini = pDM_Odm->TH_L2H_ini_backup;                       /*mode 1*/\r
+                               pDM_Odm->TH_EDCCA_HL_diff = Adaptivity->TH_EDCCA_HL_diff_backup;\r
+#endif\r
+                               pDM_Odm->Adaptivity_enable = TRUE;\r
+\r
+                               if (pDM_Odm->SupportICType & (ODM_RTL8814A|ODM_RTL8195A))\r
+                                       pDM_Odm->adaptivity_flag = FALSE;\r
+                               else\r
+                                       pDM_Odm->adaptivity_flag = TRUE;\r
+                       } else {\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\r
+                               Phydm_SetEDCCAThreshold(pDM_Odm, 0x7f, 0x7f);\r
+#else\r
+                               pDM_Odm->TH_L2H_ini = Adaptivity->TH_L2H_ini_mode2;                     /*for AP mode 2*/\r
+                               pDM_Odm->TH_EDCCA_HL_diff = Adaptivity->TH_EDCCA_HL_diff_mode2;\r
+#endif\r
+                               pDM_Odm->adaptivity_flag = FALSE;\r
+                               pDM_Odm->Adaptivity_enable = FALSE;\r
+                       }\r
+                       Adaptivity->NHMWait = 0;\r
+                       Adaptivity->bFirstLink = TRUE;\r
+                       Adaptivity->bCheck = TRUE;\r
+               }\r
+\r
+       }\r
+\r
+\r
+}\r
+\r
+VOID\r
+Phydm_SearchPwdBLowerBound(\r
+       IN              PVOID           pDM_VOID\r
+)\r
+{\r
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       PADAPTIVITY_STATISTICS  Adaptivity = (PADAPTIVITY_STATISTICS)PhyDM_Get_Structure(pDM_Odm, PHYDM_ADAPTIVITY);\r
+       u4Byte                  value32 = 0;\r
+       u1Byte                  cnt, IGI_Pause = 0x7f, IGI_Resume = 0x20, IGI = 0x50;           /*IGI = 0x50 for cal EDCCA lower bound*/\r
+       u1Byte                  txEdcca1 = 0, txEdcca0 = 0;\r
+       BOOLEAN                 bAdjust = TRUE;\r
+       s1Byte                  TH_L2H_dmc, TH_H2L_dmc, IGI_target = 0x32;\r
+       s1Byte                  Diff;\r
+\r
+       Phydm_SetTRxMux(pDM_Odm, PhyDM_STANDBY_MODE, PhyDM_STANDBY_MODE);\r
+       ODM_Write_DIG(pDM_Odm, IGI_Pause);\r
+\r
+       Diff = IGI_target - (s1Byte)IGI;\r
+       TH_L2H_dmc = pDM_Odm->TH_L2H_ini + Diff;\r
+       if (TH_L2H_dmc > 10)\r
+               TH_L2H_dmc = 10;\r
+       TH_H2L_dmc = TH_L2H_dmc - pDM_Odm->TH_EDCCA_HL_diff;\r
+\r
+       Phydm_SetEDCCAThreshold(pDM_Odm, TH_H2L_dmc, TH_L2H_dmc);\r
+       ODM_delay_ms(5);\r
+\r
+       while (bAdjust) {\r
+               for (cnt = 0; cnt < 250; cnt++) {\r
+                       if (pDM_Odm->SupportICType & ODM_IC_11N_SERIES)\r
+                               value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_RPT_11N, bMaskDWord);\r
+#if (RTL8195A_SUPPORT == 0)\r
+                       else if (pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)\r
+                               value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_RPT_11AC, bMaskDWord);\r
+#endif\r
+                       if (value32 & BIT30 && (pDM_Odm->SupportICType & (ODM_RTL8723A | ODM_RTL8723B | ODM_RTL8188E)))\r
+                               txEdcca1 = txEdcca1 + 1;\r
+                       else if (value32 & BIT29)\r
+                               txEdcca1 = txEdcca1 + 1;\r
+                       else\r
+                               txEdcca0 = txEdcca0 + 1;\r
+               }\r
+\r
+               if (txEdcca1 > 1) {\r
+                       IGI = IGI - 1;\r
+                       TH_L2H_dmc = TH_L2H_dmc + 1;\r
+                       if (TH_L2H_dmc > 10)\r
+                               TH_L2H_dmc = 10;\r
+                       TH_H2L_dmc = TH_L2H_dmc - pDM_Odm->TH_EDCCA_HL_diff;\r
+\r
+                       Phydm_SetEDCCAThreshold(pDM_Odm, TH_H2L_dmc, TH_L2H_dmc);\r
+                       if (TH_L2H_dmc == 10) {\r
+                               bAdjust = FALSE;\r
+                               Adaptivity->H2L_lb = TH_H2L_dmc;\r
+                               Adaptivity->L2H_lb = TH_L2H_dmc;\r
+                               pDM_Odm->Adaptivity_IGI_upper = IGI;\r
+                       }\r
+\r
+                       txEdcca1 = 0;\r
+                       txEdcca0 = 0;\r
+\r
+               } else {\r
+                       bAdjust = FALSE;\r
+                       Adaptivity->H2L_lb = TH_H2L_dmc;\r
+                       Adaptivity->L2H_lb = TH_L2H_dmc;\r
+                       pDM_Odm->Adaptivity_IGI_upper = IGI;\r
+                       txEdcca1 = 0;\r
+                       txEdcca0 = 0;\r
+               }\r
+       }\r
+\r
+       pDM_Odm->Adaptivity_IGI_upper = pDM_Odm->Adaptivity_IGI_upper - pDM_Odm->DCbackoff;\r
+       Adaptivity->H2L_lb = Adaptivity->H2L_lb + pDM_Odm->DCbackoff;\r
+       Adaptivity->L2H_lb = Adaptivity->L2H_lb + pDM_Odm->DCbackoff;\r
+\r
+       Phydm_SetTRxMux(pDM_Odm, PhyDM_TX_MODE, PhyDM_RX_MODE);\r
+       ODM_Write_DIG(pDM_Odm, IGI_Resume);\r
+       Phydm_SetEDCCAThreshold(pDM_Odm, 0x7f, 0x7f);                           /*resume to no link state*/\r
+}\r
+\r
+VOID\r
+Phydm_AdaptivityInit(\r
+       IN      PVOID           pDM_VOID\r
+)\r
+{\r
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       PADAPTIVITY_STATISTICS  Adaptivity = (PADAPTIVITY_STATISTICS)PhyDM_Get_Structure(pDM_Odm, PHYDM_ADAPTIVITY);\r
+#if(DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+       PADAPTER                pAdapter        = pDM_Odm->Adapter;\r
+       PMGNT_INFO              pMgntInfo = &(pAdapter->MgntInfo);\r
+       pDM_Odm->Carrier_Sense_enable = (BOOLEAN)pMgntInfo->RegEnableCarrierSense;\r
+       pDM_Odm->DCbackoff = (u1Byte)pMgntInfo->RegDCbackoff;\r
+       Adaptivity->DynamicLinkAdaptivity = (BOOLEAN)pMgntInfo->RegDmLinkAdaptivity;\r
+       Adaptivity->APNumTH = (u1Byte)pMgntInfo->RegAPNumTH;\r
+#elif(DM_ODM_SUPPORT_TYPE == ODM_CE)\r
+       pDM_Odm->Carrier_Sense_enable = (pDM_Odm->Adapter->registrypriv.adaptivity_mode != 0) ? TRUE : FALSE;\r
+       pDM_Odm->DCbackoff = pDM_Odm->Adapter->registrypriv.adaptivity_dc_backoff;\r
+       Adaptivity->DynamicLinkAdaptivity = (pDM_Odm->Adapter->registrypriv.adaptivity_dml != 0) ? TRUE : FALSE;\r
+#endif\r
+\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN))\r
+\r
+       if (pDM_Odm->Carrier_Sense_enable == FALSE) {\r
+#if(DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+               if (pMgntInfo->RegL2HForAdaptivity != 0)\r
+                       pDM_Odm->TH_L2H_ini = pMgntInfo->RegL2HForAdaptivity;\r
+               else\r
+#endif\r
+               {\r
+                       pDM_Odm->TH_L2H_ini = 0xf5;\r
+               }\r
+       } else {\r
+#if(DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+               if (pMgntInfo->RegL2HForAdaptivity != 0)\r
+                       pDM_Odm->TH_L2H_ini = pMgntInfo->RegL2HForAdaptivity;\r
+               else\r
+#endif\r
+                       pDM_Odm->TH_L2H_ini = 0xa;\r
+       }\r
+\r
+#if(DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+       if (pMgntInfo->RegHLDiffForAdaptivity != 0)\r
+               pDM_Odm->TH_EDCCA_HL_diff = pMgntInfo->RegHLDiffForAdaptivity;\r
+       else\r
+#endif\r
+               pDM_Odm->TH_EDCCA_HL_diff = 7;\r
+\r
+       ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("TH_L2H_ini = 0x%x, TH_EDCCA_HL_diff = 0x%x\n", pDM_Odm->TH_L2H_ini, pDM_Odm->TH_EDCCA_HL_diff));\r
+\r
+#elif (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+       prtl8192cd_priv priv = pDM_Odm->priv;\r
+\r
+       if (pDM_Odm->Carrier_Sense_enable) {\r
+               pDM_Odm->TH_L2H_ini = 0xa;\r
+               pDM_Odm->TH_EDCCA_HL_diff = 7;\r
+       } else {\r
+               pDM_Odm->TH_L2H_ini = pDM_Odm->TH_L2H_ini_backup;       /*set by mib*/\r
+               pDM_Odm->TH_EDCCA_HL_diff = 7;\r
+       }\r
+\r
+       Adaptivity->TH_L2H_ini_mode2 = 20;\r
+       Adaptivity->TH_EDCCA_HL_diff_mode2 = 8;\r
+       Adaptivity->TH_EDCCA_HL_diff_backup = pDM_Odm->TH_EDCCA_HL_diff;\r
+       if (priv->pshare->rf_ft_var.adaptivity_enable == 2)\r
+               Adaptivity->DynamicLinkAdaptivity = TRUE;\r
+       else\r
+               Adaptivity->DynamicLinkAdaptivity = FALSE;\r
+\r
+#endif\r
+\r
+       pDM_Odm->Adaptivity_IGI_upper = 0;\r
+       pDM_Odm->Adaptivity_enable = FALSE;     /*use this flag to decide enable or disable*/\r
+       \r
+       Adaptivity->IGI_Base = 0x32;\r
+       Adaptivity->IGI_target = 0x1c;\r
+       Adaptivity->H2L_lb = 0;\r
+       Adaptivity->L2H_lb = 0;\r
+       Adaptivity->NHMWait = 0;\r
+       Adaptivity->bCheck = FALSE;\r
+       Adaptivity->bFirstLink = TRUE;\r
+\r
+       Phydm_MACEDCCAState(pDM_Odm, PhyDM_DONT_IGNORE_EDCCA);\r
+\r
+       /*Search pwdB lower bound*/\r
+       if (pDM_Odm->SupportICType & ODM_IC_11N_SERIES)\r
+               ODM_SetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11N, bMaskDWord, 0x208);\r
+#if (RTL8195A_SUPPORT == 0)\r
+       else if (pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)\r
+               ODM_SetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC, bMaskDWord, 0x209);\r
+#endif\r
+\r
+#if (RTL8195A_SUPPORT == 1)\r
+       if (pDM_Odm->SupportICType & ODM_RTL8195A) {\r
+               ODM_SetBBReg(pDM_Odm, ODM_REG_EDCCA_DOWN_OPT_11N, BIT12 | BIT11 | BIT10, 0x7);          /*interfernce need > 2^x us, and then EDCCA will be 1*/\r
+               ODM_SetBBReg(pDM_Odm, DOM_REG_EDCCA_DCNF_11N, BIT21 | BIT20, 0x1);              /*0:rx_dfir, 1: dcnf_out, 2 :rx_iq, 3: rx_nbi_nf_out*/\r
+       }\r
+#else\r
+       if (pDM_Odm->SupportICType & ODM_RTL8814A) {            /*8814a no need to find pwdB lower bound, maybe*/\r
+               ODM_SetBBReg(pDM_Odm, ODM_REG_EDCCA_DOWN_OPT, BIT30 | BIT29 | BIT28, 0x7);              /*interfernce need > 2^x us, and then EDCCA will be 1*/\r
+               ODM_SetBBReg(pDM_Odm, ODM_REG_EDCCA_POWER_CAL, BIT5, 1);                                                /*0:mean, 1:max pwdB*/\r
+               ODM_SetBBReg(pDM_Odm, ODM_REG_ACBB_EDCCA_ENHANCE, BIT29 | BIT28, 0x1);          /*0:rx_dfir, 1: dcnf_out, 2 :rx_iq, 3: rx_nbi_nf_out*/\r
+       } else\r
+               Phydm_SearchPwdBLowerBound(pDM_Odm);\r
+#endif\r
+\r
+}\r
+\r
+\r
+VOID\r
+Phydm_Adaptivity(\r
+       IN              PVOID                   pDM_VOID,\r
+       IN              u1Byte                  IGI\r
+)\r
+{\r
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       s1Byte                  TH_L2H_dmc, TH_H2L_dmc;\r
+       s1Byte                  Diff, IGI_target;\r
+       PADAPTIVITY_STATISTICS  Adaptivity = (PADAPTIVITY_STATISTICS)PhyDM_Get_Structure(pDM_Odm, PHYDM_ADAPTIVITY);\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+       PADAPTER                pAdapter        = pDM_Odm->Adapter;\r
+       BOOLEAN                 bFwCurrentInPSMode = FALSE;\r
+       PMGNT_INFO              pMgntInfo = &(pAdapter->MgntInfo);\r
+\r
+       pAdapter->HalFunc.GetHwRegHandler(pAdapter, HW_VAR_FW_PSMODE_STATUS, (pu1Byte)(&bFwCurrentInPSMode));\r
+\r
+       /*Disable EDCCA mode while under LPS mode, added by Roger, 2012.09.14.*/\r
+       if (bFwCurrentInPSMode)\r
+               return;\r
+#endif\r
+\r
+       if (!(pDM_Odm->SupportAbility & ODM_BB_ADAPTIVITY)) {\r
+               ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("Go to odm_DynamicEDCCA()\n"));\r
+               /*Add by Neil Chen to enable edcca to MP Platform */\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+               /*Adjust EDCCA.*/\r
+               if (pDM_Odm->SupportICType & ODM_IC_11N_SERIES)\r
+                       Phydm_DynamicEDCCA(pDM_Odm);\r
+#endif\r
+               return;\r
+       }\r
+       \r
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+       if (Phydm_CheckChannelPlan(pDM_Odm))\r
+               return;\r
+       if (pDM_Odm->APTotalNum > Adaptivity->APNumTH)\r
+               return;\r
+#endif\r
+\r
+       ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("odm_Adaptivity() =====>\n"));\r
+       ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("IGI_Base=0x%x, TH_L2H_ini = %d, TH_EDCCA_HL_diff = %d\n",\r
+                        Adaptivity->IGI_Base, pDM_Odm->TH_L2H_ini, pDM_Odm->TH_EDCCA_HL_diff));\r
+#if (RTL8195A_SUPPORT == 0)\r
+       if (pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) {\r
+               /*fix AC series when enable EDCCA hang issue*/\r
+               ODM_SetBBReg(pDM_Odm, 0x800, BIT10, 1); /*ADC_mask disable*/\r
+               ODM_SetBBReg(pDM_Odm, 0x800, BIT10, 0); /*ADC_mask enable*/\r
+       }\r
+#endif\r
+       if (*pDM_Odm->pBandWidth == ODM_BW20M)          /*CHANNEL_WIDTH_20*/\r
+               IGI_target = Adaptivity->IGI_Base;\r
+       else if (*pDM_Odm->pBandWidth == ODM_BW40M)\r
+               IGI_target = Adaptivity->IGI_Base + 2;\r
+#if (RTL8195A_SUPPORT == 0)\r
+       else if (*pDM_Odm->pBandWidth == ODM_BW80M)\r
+               IGI_target = Adaptivity->IGI_Base + 2;\r
+#endif\r
+       else\r
+               IGI_target = Adaptivity->IGI_Base;\r
+       Adaptivity->IGI_target = (u1Byte) IGI_target;\r
+\r
+       if (*pDM_Odm->pChannel >= 149) {                        /*Band4 -> for AP : mode2*/\r
+#if (DM_ODM_SUPPORT_TYPE & ODM_AP)\r
+       s1Byte  L2H_nolink_Band4 = 0x7f, H2L_nolink_Band4 = 0x7f;\r
+               if (pDM_Odm->bLinked) {\r
+                       if (pDM_Odm->SupportICType & ODM_RTL8814A) {\r
+                               L2H_nolink_Band4 = (s1Byte)Adaptivity->TH_L2H_ini_mode2 + IGI_target;\r
+                               H2L_nolink_Band4 = L2H_nolink_Band4 - Adaptivity->TH_EDCCA_HL_diff_mode2;\r
+                       } else {\r
+                               Diff = IGI_target - (s1Byte)IGI;\r
+                               L2H_nolink_Band4 = Adaptivity->TH_L2H_ini_mode2 + Diff;\r
+                               if (L2H_nolink_Band4 > 10)\r
+                                       L2H_nolink_Band4 = 10;\r
+                               H2L_nolink_Band4 = L2H_nolink_Band4 - Adaptivity->TH_EDCCA_HL_diff_mode2;\r
+                       }\r
+               } else {\r
+                       L2H_nolink_Band4 = 0x7f;\r
+                       H2L_nolink_Band4 = 0x7f;\r
+               }\r
+               Phydm_SetEDCCAThreshold(pDM_Odm, H2L_nolink_Band4, L2H_nolink_Band4);\r
+               return;\r
+#endif\r
+       }\r
+\r
+       ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("BandWidth=%s, IGI_target=0x%x, DynamicLinkAdaptivity = %d\n",\r
+                        (*pDM_Odm->pBandWidth == ODM_BW80M) ? "80M" : ((*pDM_Odm->pBandWidth == ODM_BW40M) ? "40M" : "20M"), IGI_target, Adaptivity->DynamicLinkAdaptivity));\r
+       ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("RSSI_min = %d, AdapIGIUpper= 0x%x, adaptivity_flag = %d, Adaptivity_enable = %d\n",\r
+                        pDM_Odm->RSSI_Min, pDM_Odm->Adaptivity_IGI_upper, pDM_Odm->adaptivity_flag, pDM_Odm->Adaptivity_enable));\r
+\r
+       if ((Adaptivity->DynamicLinkAdaptivity == TRUE) && (!pDM_Odm->bLinked) && (pDM_Odm->Adaptivity_enable == FALSE)) {\r
+               Phydm_SetEDCCAThreshold(pDM_Odm, 0x7f, 0x7f);\r
+               ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("In DynamicLink mode(noisy) and No link, Turn off EDCCA!!\n"));\r
+               return;\r
+       }\r
+#if (!(DM_ODM_SUPPORT_TYPE & ODM_AP))\r
+       else if ((Adaptivity->DynamicLinkAdaptivity == TRUE) && (pDM_Odm->Adaptivity_enable == FALSE)) {\r
+               Phydm_SetEDCCAThreshold(pDM_Odm, 0x7f, 0x7f);\r
+               ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("In DynamicLink mode(noisy) disable EDCCA, return!!\n"));\r
+               return;\r
+       }\r
+#endif\r
+\r
+       if (pDM_Odm->SupportICType & (ODM_RTL8814A|ODM_RTL8195A)) {\r
+               TH_L2H_dmc = (s1Byte)pDM_Odm->TH_L2H_ini + IGI_target;\r
+               TH_H2L_dmc = TH_L2H_dmc - pDM_Odm->TH_EDCCA_HL_diff;\r
+       }\r
+#if (RTL8195A_SUPPORT == 0)\r
+       else    {\r
+               Diff = IGI_target - (s1Byte)IGI;\r
+               TH_L2H_dmc = pDM_Odm->TH_L2H_ini + Diff;\r
+               if (TH_L2H_dmc > 10)\r
+                       TH_L2H_dmc = 10;\r
+\r
+               TH_H2L_dmc = TH_L2H_dmc - pDM_Odm->TH_EDCCA_HL_diff;\r
+\r
+               /*replace lower bound to prevent EDCCA always equal 1*/\r
+               if (TH_H2L_dmc < Adaptivity->H2L_lb)\r
+                       TH_H2L_dmc = Adaptivity->H2L_lb;\r
+               if (TH_L2H_dmc < Adaptivity->L2H_lb)\r
+                       TH_L2H_dmc = Adaptivity->L2H_lb;\r
+       }\r
+#endif\r
+       ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("IGI=0x%x, TH_L2H_dmc = %d, TH_H2L_dmc = %d\n", IGI, TH_L2H_dmc, TH_H2L_dmc));\r
+       ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("Adaptivity_IGI_upper=0x%x, H2L_lb = 0x%x, L2H_lb = 0x%x\n", pDM_Odm->Adaptivity_IGI_upper, Adaptivity->H2L_lb, Adaptivity->L2H_lb));\r
+\r
+       Phydm_SetEDCCAThreshold(pDM_Odm, TH_H2L_dmc, TH_L2H_dmc);\r
+       return;\r
+}\r
+\r
+\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+\r
+VOID\r
+Phydm_AdaptivityBSOD(\r
+       IN              PVOID           pDM_VOID\r
+)\r
+{\r
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       PADAPTER                pAdapter = pDM_Odm->Adapter;\r
+       PMGNT_INFO              pMgntInfo = &(pAdapter->MgntInfo);\r
+       u1Byte                  count = 0;\r
+       u4Byte                  u4Value;\r
+\r
+       /*\r
+       1. turn off RF (TRX Mux in standby mode)\r
+       2. H2C mac id drop\r
+       3. ignore EDCCA\r
+       4. wait for clear FIFO\r
+       5. don't ignore EDCCA\r
+       6. turn on RF (TRX Mux in TRx mdoe)\r
+       7. H2C mac id resume\r
+       */\r
+\r
+       RT_TRACE(COMP_MLME, DBG_WARNING, ("MAC id drop packet!!!!!\n"));\r
+\r
+       pAdapter->dropPktByMacIdCnt++;\r
+       pMgntInfo->bDropPktInProgress = TRUE;\r
+\r
+       pAdapter->HalFunc.GetHwRegHandler(pAdapter, HW_VAR_MAX_Q_PAGE_NUM, (pu1Byte)(&u4Value));\r
+       RT_TRACE(COMP_INIT, DBG_LOUD, ("Queue Reserved Page Number = 0x%08x\n", u4Value));\r
+       pAdapter->HalFunc.GetHwRegHandler(pAdapter, HW_VAR_AVBL_Q_PAGE_NUM, (pu1Byte)(&u4Value));\r
+       RT_TRACE(COMP_INIT, DBG_LOUD, ("Available Queue Page Number = 0x%08x\n", u4Value));\r
+\r
+#if 1\r
+\r
+       /*Standby mode*/\r
+       Phydm_SetTRxMux(pDM_Odm, PhyDM_STANDBY_MODE, PhyDM_STANDBY_MODE);\r
+       ODM_Write_DIG(pDM_Odm, 0x20);\r
+\r
+       /*H2C mac id drop*/\r
+       MacIdIndicateDisconnect(pAdapter);\r
+\r
+       /*Ignore EDCCA*/\r
+       Phydm_MACEDCCAState(pDM_Odm, PhyDM_IGNORE_EDCCA);\r
+\r
+       delay_ms(50);\r
+       count = 5;\r
+\r
+#else\r
+\r
+       do {\r
+\r
+               u8Byte          diffTime, curTime, oldestTime;\r
+               u1Byte          queueIdx\r
+\r
+               //3 Standby mode\r
+               Phydm_SetTRxMux(pDM_Odm, PhyDM_STANDBY_MODE, PhyDM_STANDBY_MODE);\r
+               ODM_Write_DIG(pDM_Odm, 0x20);\r
+\r
+               //3 H2C mac id drop\r
+               MacIdIndicateDisconnect(pAdapter);\r
+\r
+               //3 Ignore EDCCA\r
+               Phydm_MACEDCCAState(pDM_Odm, PhyDM_IGNORE_EDCCA);\r
+\r
+               count++;\r
+               delay_ms(10);\r
+\r
+               // Check latest packet\r
+               curTime = PlatformGetCurrentTime();\r
+               oldestTime = 0xFFFFFFFFFFFFFFFF;\r
+\r
+               for (queueIdx = 0; queueIdx < MAX_TX_QUEUE; queueIdx++) {\r
+                       if (!IS_DATA_QUEUE(queueIdx))\r
+                               continue;\r
+\r
+                       if (!pAdapter->bTcbBusyQEmpty[queueIdx]) {\r
+                               RT_TRACE(COMP_MLME, DBG_WARNING, ("oldestTime = %llu\n", oldestTime));\r
+                               RT_TRACE(COMP_MLME, DBG_WARNING, ("Q[%d] = %llu\n", queueIdx, pAdapter->firstTcbSysTime[queueIdx]));\r
+                               if (pAdapter->firstTcbSysTime[queueIdx] < oldestTime)\r
+                                       oldestTime = pAdapter->firstTcbSysTime[queueIdx];\r
+                       }\r
+               }\r
+\r
+               diffTime = curTime - oldestTime;\r
+\r
+               RT_TRACE(COMP_MLME, DBG_WARNING, ("diff s = %llu\n", (diffTime / 1000000)));\r
+\r
+       } while (((diffTime / 1000000) >= 4) && (oldestTime != 0xFFFFFFFFFFFFFFFF));\r
+#endif\r
+\r
+       /*Resume EDCCA*/\r
+       Phydm_MACEDCCAState(pDM_Odm, PhyDM_DONT_IGNORE_EDCCA);\r
+\r
+       /*Turn on TRx mode*/\r
+       Phydm_SetTRxMux(pDM_Odm, PhyDM_TX_MODE, PhyDM_RX_MODE);\r
+       ODM_Write_DIG(pDM_Odm, 0x20);\r
+\r
+       /*Resume H2C macid*/\r
+       MacIdRecoverMediaStatus(pAdapter);\r
+\r
+       pAdapter->HalFunc.GetHwRegHandler(pAdapter, HW_VAR_AVBL_Q_PAGE_NUM, (pu1Byte)(&u4Value));\r
+       RT_TRACE(COMP_INIT, DBG_LOUD, ("Available Queue Page Number = 0x%08x\n", u4Value));\r
+\r
+       pMgntInfo->bDropPktInProgress = FALSE;\r
+       RT_TRACE(COMP_MLME, DBG_WARNING, ("End of MAC id drop packet, spent %dms\n", count * 10));\r
+\r
+}\r
+\r
+VOID\r
+Phydm_EnableEDCCA(\r
+       IN              PVOID                                   pDM_VOID\r
+)\r
+{\r
+\r
+       /*This should be moved out of OUTSRC*/\r
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       PADAPTER                pAdapter        = pDM_Odm->Adapter;\r
+       /*Enable EDCCA. The value is suggested by SD3 Wilson.*/\r
+\r
+       /*Revised for ASUS 11b/g performance issues, suggested by BB Neil, 2012.04.13.*/\r
+       if ((pDM_Odm->SupportICType == ODM_RTL8723A) && (IS_WIRELESS_MODE_G(pAdapter))) {\r
+               ODM_Write1Byte(pDM_Odm, rOFDM0_ECCAThreshold, 0x00);\r
+               ODM_Write1Byte(pDM_Odm, rOFDM0_ECCAThreshold + 2, 0xFD);\r
+       } else {\r
+               ODM_Write1Byte(pDM_Odm, rOFDM0_ECCAThreshold, 0x03);\r
+               ODM_Write1Byte(pDM_Odm, rOFDM0_ECCAThreshold + 2, 0x00);\r
+       }\r
+}\r
+\r
+VOID\r
+Phydm_DisableEDCCA(\r
+       IN              PVOID                                   pDM_VOID\r
+)\r
+{\r
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       ODM_Write1Byte(pDM_Odm, rOFDM0_ECCAThreshold, 0x7f);\r
+       ODM_Write1Byte(pDM_Odm, rOFDM0_ECCAThreshold + 2, 0x7f);\r
+}\r
+\r
+VOID\r
+Phydm_DynamicEDCCA(\r
+       IN              PVOID                                   pDM_VOID\r
+)\r
+{\r
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       PADAPTER                pAdapter        = pDM_Odm->Adapter;\r
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(pAdapter);\r
+       u1Byte                  RegC50, RegC58;\r
+\r
+#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+       BOOLEAN                 bFwCurrentInPSMode = FALSE;\r
+\r
+       pAdapter->HalFunc.GetHwRegHandler(pAdapter, HW_VAR_FW_PSMODE_STATUS, (pu1Byte)(&bFwCurrentInPSMode));\r
+\r
+       /*Disable EDCCA mode while under LPS mode, added by Roger, 2012.09.14.*/\r
+       if (bFwCurrentInPSMode)\r
+               return;\r
+#endif\r
+\r
+       /*2013/11/14 Ken According to BB team Jame's suggestion, we need to disable soft AP mode EDCCA.*/\r
+       /*2014/01/08 MH For Miracst AP mode test. We need to disable EDCCA. Otherwise, we may stop*/\r
+       /*to send beacon in noisy environment or platform.*/\r
+\r
+       if (ACTING_AS_AP(pAdapter) || ACTING_AS_AP(GetFirstAPAdapter(pAdapter))) {\r
+               ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("At least One Port as AP disable EDCCA\n"));\r
+               Phydm_DisableEDCCA(pDM_Odm);\r
+               if (pHalData->bPreEdccaEnable)\r
+                       Phydm_DisableEDCCA(pDM_Odm);\r
+               pHalData->bPreEdccaEnable = FALSE;\r
+               return;\r
+       }\r
+\r
+       RegC50 = (u1Byte)ODM_GetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, bMaskByte0);\r
+       RegC58 = (u1Byte)ODM_GetBBReg(pDM_Odm, rOFDM0_XBAGCCore1, bMaskByte0);\r
+\r
+\r
+       if ((RegC50 > 0x28 && RegC58 > 0x28) ||\r
+           ((pDM_Odm->SupportICType == ODM_RTL8723A && IS_WIRELESS_MODE_G(pAdapter) && RegC50 > 0x26)) ||\r
+           (pDM_Odm->SupportICType == ODM_RTL8188E && RegC50 > 0x28)) {\r
+               if (!pHalData->bPreEdccaEnable) {\r
+                       Phydm_EnableEDCCA(pDM_Odm);\r
+                       pHalData->bPreEdccaEnable = TRUE;\r
+               }\r
+\r
+       } else if ((RegC50 < 0x25 && RegC58 < 0x25) || (pDM_Odm->SupportICType == ODM_RTL8188E && RegC50 < 0x25)) {\r
+               if (pHalData->bPreEdccaEnable) {\r
+                       Phydm_DisableEDCCA(pDM_Odm);\r
+                       pHalData->bPreEdccaEnable = FALSE;\r
+               }\r
+       }\r
+}\r
+\r
+#endif\r
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8188eu/hal/OUTSRC/PhyDM_Adaptivity.h b/drivers/net/wireless/rockchip_wlan/rtl8188eu/hal/OUTSRC/PhyDM_Adaptivity.h
new file mode 100755 (executable)
index 0000000..136c5dc
--- /dev/null
@@ -0,0 +1,157 @@
+/******************************************************************************\r
+ *\r
+ * Copyright(c) 2007 - 2011 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
\r
+#ifndef        __PHYDMADAPTIVITY_H__\r
+#define    __PHYDMADAPTIVITY_H__\r
+\r
+#define ADAPTIVITY_VERSION     "8.5"\r
+\r
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN))\r
+typedef enum _tag_PhyDM_REGULATION_Type {\r
+       REGULATION_FCC = 0,\r
+       REGULATION_MKK = 1,\r
+       REGULATION_ETSI = 2,\r
+       REGULATION_WW = 3,      \r
+       \r
+       MAX_REGULATION_NUM = 4\r
+} PhyDM_REGULATION_TYPE;\r
+#endif\r
+\r
+\r
+typedef enum tag_PhyDM_TRx_MUX_Type\r
+{\r
+       PhyDM_SHUTDOWN                  = 0,\r
+       PhyDM_STANDBY_MODE              = 1,\r
+       PhyDM_TX_MODE                   = 2,\r
+       PhyDM_RX_MODE                   = 3\r
+}PhyDM_Trx_MUX_Type;\r
+\r
+typedef enum tag_PhyDM_MACEDCCA_Type\r
+{\r
+       PhyDM_IGNORE_EDCCA                      = 0,\r
+       PhyDM_DONT_IGNORE_EDCCA = 1\r
+}PhyDM_MACEDCCA_Type;\r
+\r
+typedef struct _ADAPTIVITY_STATISTICS {\r
+       s1Byte                  TH_L2H_ini_mode2;\r
+       s1Byte                  TH_EDCCA_HL_diff_mode2;\r
+       s1Byte                  TH_EDCCA_HL_diff_backup;\r
+       s1Byte                  IGI_Base;\r
+       u1Byte                  IGI_target;\r
+       u1Byte                  NHMWait;\r
+       s1Byte                  H2L_lb;\r
+       s1Byte                  L2H_lb;\r
+       BOOLEAN                 bFirstLink;\r
+       BOOLEAN                 bCheck;\r
+       BOOLEAN                 DynamicLinkAdaptivity;\r
+       u1Byte                  APNumTH;\r
+} ADAPTIVITY_STATISTICS, *PADAPTIVITY_STATISTICS;\r
+\r
+VOID\r
+Phydm_CheckAdaptivity(\r
+       IN              PVOID                   pDM_VOID\r
+       );\r
+\r
+VOID\r
+Phydm_CheckEnvironment(\r
+       IN              PVOID                                   pDM_VOID\r
+       );\r
+\r
+VOID\r
+Phydm_NHMCounterStatisticsInit(\r
+       IN              PVOID                                   pDM_VOID\r
+       );\r
+\r
+VOID\r
+Phydm_NHMCounterStatistics(\r
+       IN              PVOID                                   pDM_VOID\r
+       );\r
+\r
+VOID\r
+Phydm_NHMCounterStatisticsReset(\r
+       IN              PVOID                   pDM_VOID\r
+);\r
+\r
+VOID\r
+Phydm_GetNHMCounterStatistics(\r
+       IN              PVOID                   pDM_VOID\r
+);\r
+\r
+VOID\r
+Phydm_MACEDCCAState(\r
+       IN      PVOID                                   pDM_VOID,\r
+       IN      PhyDM_MACEDCCA_Type             State\r
+);\r
+\r
+VOID\r
+Phydm_SetEDCCAThreshold(\r
+       IN              PVOID           pDM_VOID,\r
+       IN              s1Byte          H2L,\r
+       IN              s1Byte          L2H\r
+);\r
+\r
+VOID\r
+Phydm_SetTRxMux(\r
+       IN              PVOID                   pDM_VOID,\r
+       IN              PhyDM_Trx_MUX_Type                      txMode,\r
+       IN              PhyDM_Trx_MUX_Type                      rxMode\r
+);     \r
+\r
+BOOLEAN\r
+Phydm_CalNHMcnt(\r
+       IN              PVOID           pDM_VOID\r
+);\r
+\r
+VOID\r
+Phydm_SearchPwdBLowerBound(\r
+       IN              PVOID                                   pDM_VOID\r
+);\r
+\r
+VOID \r
+Phydm_AdaptivityInit(\r
+       IN              PVOID                                   pDM_VOID\r
+       );\r
+\r
+VOID\r
+Phydm_Adaptivity(\r
+       IN              PVOID                                   pDM_VOID,\r
+       IN              u1Byte                                  IGI\r
+       );\r
+\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+VOID\r
+Phydm_DisableEDCCA(\r
+       IN              PVOID                                   pDM_VOID\r
+);\r
+\r
+VOID\r
+Phydm_DynamicEDCCA(\r
+       IN              PVOID                                   pDM_VOID\r
+);\r
+\r
+VOID\r
+Phydm_AdaptivityBSOD(\r
+       IN              PVOID                                   pDM_VOID\r
+);\r
+\r
+#endif\r
+\r
+\r
+#endif\r
index fd6474e8aa210275c1bafe30d24858afd2f46fcd..dc0964bc8f6d487cd61e4d37284af597895159d6 100755 (executable)
@@ -465,16 +465,6 @@ odm_CCKPacketDetectionThresh(
        IN              PDM_ODM_T               pDM_Odm
        );
 
-VOID
-odm_AdaptivityInit(
-       IN              PDM_ODM_T               pDM_Odm
-);
-
-VOID
-odm_Adaptivity(
-       IN              PDM_ODM_T               pDM_Odm,
-       IN              u1Byte                  IGI
-);
 //END---------------DIG---------------------------//
 
 //START-------BB POWER SAVE-----------------------//
@@ -923,7 +913,7 @@ ODM_DMInit(
        odm_CommonInfoSelfInit(pDM_Odm);
        odm_CmnInfoInit_Debug(pDM_Odm);
        odm_DIGInit(pDM_Odm);   
-       odm_AdaptivityInit(pDM_Odm);
+       Phydm_AdaptivityInit(pDM_Odm);
        odm_RateAdaptiveMaskInit(pDM_Odm);
        odm_RSSIMonitorInit(pDM_Odm);
        
@@ -1046,17 +1036,25 @@ ODM_DMWatchdog(
                        ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("----Step1: odm_DIG is in LPS mode\n"));                              
                        ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("---Step2: 8723AS is in LPS mode\n"));
                        odm_DIGbyRSSI_LPS(pDM_Odm);
+                       {
+                               pDIG_T  pDM_DigTable = &pDM_Odm->DM_DigTable;
+                               Phydm_Adaptivity(pDM_Odm, pDM_DigTable->CurIGValue);
+                       }
+
        }               
        else                            
 //#endif
 #endif
+
+       Phydm_CheckAdaptivity(pDM_Odm);
+
        {
                odm_DIG(pDM_Odm);
        }
 
        {
                pDIG_T  pDM_DigTable = &pDM_Odm->DM_DigTable;
-               odm_Adaptivity(pDM_Odm, pDM_DigTable->CurIGValue);
+               Phydm_Adaptivity(pDM_Odm, pDM_DigTable->CurIGValue);
        }
        odm_CCKPacketDetectionThresh(pDM_Odm);
 
@@ -2027,36 +2025,6 @@ int getIGIForDiff(int value_IGI)
        }
 }
 
-
-VOID
-odm_AdaptivityInit(
-IN PDM_ODM_T pDM_Odm
-)
-{
-       if(pDM_Odm->SupportICType == ODM_RTL8723B)
-       {
-               pDM_Odm->TH_L2H_ini = 0xf8; // -8
-       }
-       if((pDM_Odm->SupportICType == ODM_RTL8192E)&&(pDM_Odm->SupportInterface == ODM_ITRF_PCIE))
-       {
-               pDM_Odm->TH_L2H_ini = 0xf0; // -16
-       }
-       else
-       {
-               pDM_Odm->TH_L2H_ini = 0xf9; // -7
-       }
-       
-       pDM_Odm->TH_EDCCA_HL_diff = 7;
-       pDM_Odm->IGI_Base = 0x32;
-       pDM_Odm->IGI_target = 0x1c;
-       pDM_Odm->ForceEDCCA = 0;
-       pDM_Odm->AdapEn_RSSI = 20;
-
-       //Reg524[11]=0 is easily to transmit packets during adaptivity test
-
-       //ODM_SetBBReg(pDM_Odm, 0x524, BIT11, 1);// stop counting if EDCCA is asserted
-}
-
 // Add by Neil Chen to enable edcca to MP Platform 
 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
 
@@ -2149,119 +2117,6 @@ odm_DynamicEDCCA(
 
 #endif    // end MP platform support
 
-VOID
-odm_Adaptivity(
-       IN              PDM_ODM_T               pDM_Odm,
-       IN              u1Byte                  IGI
-)
-{
-       s1Byte TH_L2H_dmc, TH_H2L_dmc;
-       s1Byte Diff, IGI_target;
-       BOOLEAN EDCCA_State = 0;
-
-#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
-       PADAPTER                pAdapter        = pDM_Odm->Adapter;
-       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(pAdapter);
-       BOOLEAN         bFwCurrentInPSMode=FALSE;       
-       PMGNT_INFO                              pMgntInfo = &(pAdapter->MgntInfo);
-               
-       pAdapter->HalFunc.GetHwRegHandler(pAdapter, HW_VAR_FW_PSMODE_STATUS, (pu1Byte)(&bFwCurrentInPSMode));   
-
-       // Disable EDCCA mode while under LPS mode, added by Roger, 2012.09.14.
-       if(bFwCurrentInPSMode)
-               return;
-#endif
-
-       if(!(pDM_Odm->SupportAbility & ODM_BB_ADAPTIVITY))
-       {
-               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("Go to odm_DynamicEDCCA() \n"));
-               // Add by Neil Chen to enable edcca to MP Platform 
-#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
-               // Adjust EDCCA.
-               if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
-                       odm_DynamicEDCCA(pDM_Odm);
-#endif
-               return;
-       }
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_Adaptivity() =====> \n"));
-
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("ForceEDCCA=%d, IGI_Base=0x%x, TH_L2H_ini = %d, TH_EDCCA_HL_diff = %d, AdapEn_RSSI = %d\n", 
-               pDM_Odm->ForceEDCCA, pDM_Odm->IGI_Base, pDM_Odm->TH_L2H_ini, pDM_Odm->TH_EDCCA_HL_diff, pDM_Odm->AdapEn_RSSI));
-
-       if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)
-               ODM_SetBBReg(pDM_Odm, 0x800, BIT10, 0); //ADC_mask enable
-       
-       if((!pDM_Odm->bLinked)||(*pDM_Odm->pChannel > 149)) // Band4 doesn't need adaptivity
-       {
-               if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
-               {
-                       ODM_SetBBReg(pDM_Odm,rOFDM0_ECCAThreshold, bMaskByte0, 0x7f);
-                       ODM_SetBBReg(pDM_Odm,rOFDM0_ECCAThreshold, bMaskByte2, 0x7f);
-               }
-               else
-                       ODM_SetBBReg(pDM_Odm, rFPGA0_XB_LSSIReadBack, 0xFFFF, (0x7f<<8) | 0x7f);
-               return;
-       }
-
-#if (DM_ODM_SUPPORT_TYPE==ODM_WIN)     
-               if(pMgntInfo->IOTPeer == HT_IOT_PEER_BROADCOM)
-                       ODM_Write1Byte(pDM_Odm, REG_TRX_SIFS_OFDM, 0x0a); 
-               else
-                       ODM_Write1Byte(pDM_Odm, REG_TRX_SIFS_OFDM, 0x0e);
-#endif
-       if(!pDM_Odm->ForceEDCCA)
-       {
-               if(pDM_Odm->RSSI_Min > pDM_Odm->AdapEn_RSSI)
-                       EDCCA_State = 1;
-               else if(pDM_Odm->RSSI_Min < (pDM_Odm->AdapEn_RSSI - 5))
-                       EDCCA_State = 0;
-       }
-       else
-               EDCCA_State = 1;
-       //if((pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) && (*pDM_Odm->pBandType == BAND_ON_5G))
-               //IGI_target = pDM_Odm->IGI_Base;
-       //else
-       {
-
-               if(*pDM_Odm->pBandWidth == ODM_BW20M) //CHANNEL_WIDTH_20
-                       IGI_target = pDM_Odm->IGI_Base;
-               else if(*pDM_Odm->pBandWidth == ODM_BW40M)
-                       IGI_target = pDM_Odm->IGI_Base + 2;
-               else if(*pDM_Odm->pBandWidth == ODM_BW80M)
-                       IGI_target = pDM_Odm->IGI_Base + 6;
-               else
-                       IGI_target = pDM_Odm->IGI_Base;
-       }
-
-       pDM_Odm->IGI_target = (u1Byte) IGI_target;
-
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("BandWidth=%s, IGI_target=0x%x, EDCCA_State=%d\n",
-               (*pDM_Odm->pBandWidth==ODM_BW80M)?"80M":((*pDM_Odm->pBandWidth==ODM_BW40M)?"40M":"20M"), IGI_target, EDCCA_State));
-
-       if(EDCCA_State == 1)
-       {
-               Diff = IGI_target -(s1Byte)IGI;
-               TH_L2H_dmc = pDM_Odm->TH_L2H_ini + Diff;
-               if(TH_L2H_dmc > 10)     TH_L2H_dmc = 10;
-               TH_H2L_dmc = TH_L2H_dmc - pDM_Odm->TH_EDCCA_HL_diff;
-       }
-       else
-       {
-               TH_L2H_dmc = 0x7f;
-               TH_H2L_dmc = 0x7f;
-       }
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("IGI=0x%x, TH_L2H_dmc = %d, TH_H2L_dmc = %d\n", 
-               IGI, TH_L2H_dmc, TH_H2L_dmc));
-
-       if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
-       {
-               ODM_SetBBReg(pDM_Odm,rOFDM0_ECCAThreshold, bMaskByte0, (u1Byte)TH_L2H_dmc);
-               ODM_SetBBReg(pDM_Odm,rOFDM0_ECCAThreshold, bMaskByte2, (u1Byte)TH_H2L_dmc);
-       }
-       else
-               ODM_SetBBReg(pDM_Odm, rFPGA0_XB_LSSIReadBack, 0xFFFF, ((u1Byte)TH_H2L_dmc<<8) | (u1Byte)TH_L2H_dmc);
-}
-
 VOID
 ODM_DynamicATCSwitch_init(
        IN              PDM_ODM_T               pDM_Odm
@@ -2518,41 +2373,71 @@ ODM_Write_DIG(
        ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("ODM_REG(IGI_A,pDM_Odm)=0x%x, ODM_BIT(IGI,pDM_Odm)=0x%x \n",
                ODM_REG(IGI_A,pDM_Odm),ODM_BIT(IGI,pDM_Odm)));
 
-       if(pDM_DigTable->CurIGValue != CurrentIGI)//if(pDM_DigTable->PreIGValue != CurrentIGI)
+       //1 Check initial gain by upper bound           
+       //if(!pDM_DigTable->bPSDInProgress)
        {
-               if(pDM_Odm->SupportPlatform & (ODM_CE|ODM_WIN))
+               if(CurrentIGI > pDM_DigTable->rx_gain_range_max)
+               {
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_TRACE, ("CurrentIGI(0x%02x) is larger than upper bound !!\n",CurrentIGI));
+                       CurrentIGI = pDM_DigTable->rx_gain_range_max;
+               }
+               if(pDM_Odm->SupportAbility & ODM_BB_ADAPTIVITY && pDM_Odm->adaptivity_flag == TRUE)
+               {
+                       if(CurrentIGI > pDM_Odm->Adaptivity_IGI_upper)
+                               CurrentIGI = pDM_Odm->Adaptivity_IGI_upper;
+       
+                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_write_DIG(): Adaptivity case: Force upper bound to 0x%x !!!!!!\n", CurrentIGI));
+               }
+       }
+
+       if(pDM_DigTable->CurIGValue != CurrentIGI)
+       {
+               //1 Set IGI value
+               if(pDM_Odm->SupportPlatform & (ODM_WIN|ODM_CE))
                { 
-                               ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
-                       if(pDM_Odm->RFType != ODM_1T1R)
+                       ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
+
+                       if(pDM_Odm->RFType > ODM_1T1R)
                                ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_B,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
+
+                       if((pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) && (pDM_Odm->RFType > ODM_2T2R))
+                       {
+                               ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_C,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
+                               ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_D,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
                        }
+               }
                else if(pDM_Odm->SupportPlatform & (ODM_AP|ODM_ADSL))
                {
                        switch(*(pDM_Odm->pOnePathCCA))
                        {
-                       case ODM_CCA_2R:
-                       ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
-                                       if(pDM_Odm->RFType != ODM_1T1R)
-                                       ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_B,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
-                               break;
-                       case ODM_CCA_1R_A:
-                               ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
+                               case ODM_CCA_2R:
+                                       ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
+
+                                       if(pDM_Odm->RFType > ODM_1T1R)
+                                               ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_B,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
+                                       
+                                       if((pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) && (pDM_Odm->RFType > ODM_2T2R))
+                                       {
+                                               ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_C,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
+                                               ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_D,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
+                                       }
+                                       break;
+                               case ODM_CCA_1R_A:
+                                       ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
                                        if(pDM_Odm->RFType != ODM_1T1R)
-                                       ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_B,pDM_Odm), ODM_BIT(IGI,pDM_Odm), getIGIForDiff(CurrentIGI));
-                               break;
-                       case ODM_CCA_1R_B:
-                               ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm), getIGIForDiff(CurrentIGI));
+                                               ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_B,pDM_Odm), ODM_BIT(IGI,pDM_Odm), getIGIForDiff(CurrentIGI));
+                                       break;
+                               case ODM_CCA_1R_B:
+                                       ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm), getIGIForDiff(CurrentIGI));
                                        if(pDM_Odm->RFType != ODM_1T1R)
-                                       ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_B,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
+                                               ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_B,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
                                        break;
-                               }
+                       }
                }
-               
-               ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("CurrentIGI(0x%02x). \n",CurrentIGI));
-               //pDM_DigTable->PreIGValue = pDM_DigTable->CurIGValue;
                pDM_DigTable->CurIGValue = CurrentIGI;
-       }       
-       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("ODM_Write_DIG():CurrentIGI=0x%x \n",CurrentIGI));
+       }
+
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("CurrentIGI(0x%02x). \n",CurrentIGI));
        
 }
 
@@ -2710,7 +2595,6 @@ odm_DIG(
        BOOLEAN                                         FirstConnect, FirstDisConnect;
        u1Byte                                          dm_dig_max, dm_dig_min, offset;
        u1Byte                                          CurrentIGI = pDM_DigTable->CurIGValue;
-       u1Byte                                          Adap_IGI_Upper = pDM_Odm->IGI_target + 30 + (u1Byte) pDM_Odm->TH_L2H_ini -(u1Byte) pDM_Odm->TH_EDCCA_HL_diff;
 
 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
 // This should be moved out of OUTSRC
@@ -2722,10 +2606,6 @@ odm_DIG(
                return;
        }
 #endif
-/*
-       if (pDM_Odm->SupportICType==ODM_RTL8723B)
-               return;
-*/
 
        if(pDM_Odm->bBtHsOperation)
        {
@@ -2793,7 +2673,9 @@ odm_DIG(
                        return;
                }
        }
-               
+
+       //1 Update status
+#if (RTL8192D_SUPPORT==1) 
        if(pDM_Odm->SupportICType == ODM_RTL8192D)
        {
                if(*(pDM_Odm->pMacPhyMode) == ODM_DMSP)
@@ -2801,13 +2683,13 @@ odm_DIG(
                        if(*(pDM_Odm->pbMasterOfDMSP))
                        {
                                DIG_Dynamic_MIN = pDM_DigTable->DIG_Dynamic_MIN_0;
-                               FirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == FALSE);  
+                               FirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == FALSE);
                                FirstDisConnect = (!pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == TRUE);
                        }
                        else
                        {
                                DIG_Dynamic_MIN = pDM_DigTable->DIG_Dynamic_MIN_1;
-                               FirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_1 == FALSE);  
+                               FirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_1 == FALSE);
                                FirstDisConnect = (!pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_1 == TRUE);
                        }
                }
@@ -2828,6 +2710,7 @@ odm_DIG(
                }
        }
        else
+#endif
        {       
                DIG_Dynamic_MIN = pDM_DigTable->DIG_Dynamic_MIN_0;
                FirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == FALSE);
@@ -2835,11 +2718,12 @@ odm_DIG(
        }
        
        //1 Boundary Decision
-       if(pDM_Odm->SupportICType & (ODM_RTL8192C) &&(pDM_Odm->BoardType & (ODM_BOARD_EXT_LNA | ODM_BOARD_EXT_PA)))
+#if (RTL8192C_SUPPORT==1) 
+       if((pDM_Odm->SupportICType & ODM_RTL8192C) && (pDM_Odm->BoardType & (ODM_BOARD_EXT_LNA | ODM_BOARD_EXT_PA)))
        {
+               //2 High power case
                if(pDM_Odm->SupportPlatform & (ODM_AP|ODM_ADSL))
                {
-
                        dm_dig_max = DM_DIG_MAX_AP_HP;
                        dm_dig_min = DM_DIG_MIN_AP_HP;
                }
@@ -2851,6 +2735,7 @@ odm_DIG(
                DIG_MaxOfMin = DM_DIG_MAX_AP_HP;
        }
        else
+#endif
        {
                if(pDM_Odm->SupportPlatform & (ODM_AP|ODM_ADSL))
                {
@@ -3185,49 +3070,21 @@ odm_DIG(
                }
        }
        ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): DIG End Adjust IGI\n"));
-       //1 Check initial gain by upper/lower bound
 
-       if(CurrentIGI > pDM_DigTable->rx_gain_range_max)
-               CurrentIGI = pDM_DigTable->rx_gain_range_max;
+       //1 Check initial gain by upper/lower bound
        if(CurrentIGI < pDM_DigTable->rx_gain_range_min)
                CurrentIGI = pDM_DigTable->rx_gain_range_min;
-
-       if(pDM_Odm->SupportAbility & ODM_BB_ADAPTIVITY)
-       {
-               if(CurrentIGI > Adap_IGI_Upper)
-                       CurrentIGI = Adap_IGI_Upper;
-
-               if(pDM_Odm->IGI_LowerBound != 0)
-               {
-                       if(CurrentIGI < pDM_Odm->IGI_LowerBound)
-                               CurrentIGI = pDM_Odm->IGI_LowerBound;
-               }
-               ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): pDM_Odm->IGI_LowerBound = %d\n", pDM_Odm->IGI_LowerBound));
-       }
        
+       if(CurrentIGI > pDM_DigTable->rx_gain_range_max)
+               CurrentIGI = pDM_DigTable->rx_gain_range_max;
+
        ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): rx_gain_range_max=0x%x, rx_gain_range_min=0x%x\n", 
                pDM_DigTable->rx_gain_range_max, pDM_DigTable->rx_gain_range_min));
-       ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): TotalFA=%d\n", pFalseAlmCnt->Cnt_all));
-       ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): CurIGValue=0x%x\n", CurrentIGI));
 
-       //2 High power RSSI threshold
-#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)    
-{
-       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(pDM_Odm->Adapter);
-       //PMGNT_INFO                    pMgntInfo       = &(pAdapter->MgntInfo);        
-       // for LC issue to dymanic modify DIG lower bound----------LC Mocca Issue
-       u8Byte                  curTxOkCnt=0, curRxOkCnt=0;
-       static u8Byte           lastTxOkCnt=0, lastRxOkCnt=0;
+       ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): CurIGValue=0x%x, TotalFA=%d\n\n", CurrentIGI, pFalseAlmCnt->Cnt_all));   
 
-       //u8Byte                        OKCntAll=0;
-       //static u8Byte         TXByteCnt_A=0, TXByteCnt_B=0, RXByteCnt_A=0, RXByteCnt_B=0;
-       //u8Byte                        CurByteCnt=0, PreByteCnt=0;
-       
-       curTxOkCnt = pAdapter->TxStats.NumTxBytesUnicast - lastTxOkCnt;
-       curRxOkCnt =pAdapter->RxStats.NumRxBytesUnicast - lastRxOkCnt;
-       lastTxOkCnt = pAdapter->TxStats.NumTxBytesUnicast;
-       lastRxOkCnt = pAdapter->RxStats.NumRxBytesUnicast;
-       //----------------------------------------------------------end for LC Mocca issue
+       //1 High power RSSI threshold
+#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
        if((pDM_Odm->SupportICType == ODM_RTL8723A)&& (pHalData->UndecoratedSmoothedPWDB > DM_DIG_HIGH_PWR_THRESHOLD))
        {
                // High power IGI lower bound
@@ -3239,60 +3096,27 @@ odm_DIG(
                        CurrentIGI=DM_DIG_HIGH_PWR_IGI_LOWER_BOUND;
                }
        }
-       if((pDM_Odm->SupportICType & ODM_RTL8723A) && 
-                       IS_WIRELESS_MODE_G(pAdapter))
-               {
-                       if(pHalData->UndecoratedSmoothedPWDB > 0x28)
-                       {
-                               if(CurrentIGI < DM_DIG_Gmode_HIGH_PWR_IGI_LOWER_BOUND)
-                               {
-                                       //pDM_DigTable->CurIGValue = DM_DIG_Gmode_HIGH_PWR_IGI_LOWER_BOUND;
-                                       CurrentIGI = DM_DIG_Gmode_HIGH_PWR_IGI_LOWER_BOUND;
-                               }       
-                       } 
-               }       
-#if 0
-       if((pDM_Odm->SupportICType & ODM_RTL8723A)&&(pMgntInfo->CustomerID = RT_CID_LENOVO_CHINA))
+       if((pDM_Odm->SupportICType & ODM_RTL8723A) && IS_WIRELESS_MODE_G(pAdapter))
        {
-               OKCntAll = (curTxOkCnt+curRxOkCnt);
-               ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): CurIGValue(%#x)\n", CurrentIGI));
-               ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): UndecoratedSmoothedPWDB(%#x)\n", pHalData->UndecoratedSmoothedPWDB));
-               ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): OKCntAll(%#x)\n", OKCntAll));
-               //8723AS_VAU
-               if(pDM_Odm->SupportInterface==ODM_ITRF_USB)
+               if(pHalData->UndecoratedSmoothedPWDB > 0x28)
                {
-                       if(pHalData->UndecoratedSmoothedPWDB < 12)
+                       if(CurrentIGI < DM_DIG_Gmode_HIGH_PWR_IGI_LOWER_BOUND)
                        {
-                               if(CurrentIGI > DM_DIG_MIN_NIC)
-                               {
-                                       if(OKCntAll >= 1500000)                  // >=6Mbps
-                                               CurrentIGI=0x1B;
-                                       else if(OKCntAll >= 1000000)     //4Mbps
-                                               CurrentIGI=0x1A;
-                                       else if(OKCntAll >= 500000)              //2Mbps
-                                               CurrentIGI=0x19;
-                                       else if(OKCntAll >= 250000)             //1Mbps
-                                               CurrentIGI=0x18;
-                                       else
-                                       {
-                                               CurrentIGI=0x17;                //SCAN mode
-                                       }
-                               }
-                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("Modify---->CurIGValue(%#x)\n", CurrentIGI));        
-                       }
-               }
-       }       
-#endif 
-}
+                               //pDM_DigTable->CurIGValue = DM_DIG_Gmode_HIGH_PWR_IGI_LOWER_BOUND;
+                               CurrentIGI = DM_DIG_Gmode_HIGH_PWR_IGI_LOWER_BOUND;
+                       }       
+               } 
+       }
 #endif
-               
+
+       //1 Update status
 #if (RTL8192D_SUPPORT==1) 
        if(pDM_Odm->SupportICType == ODM_RTL8192D)
        {
                //sherry  delete DualMacSmartConncurrent 20110517
                if(*(pDM_Odm->pMacPhyMode) == ODM_DMSP)
                {
-                       ODM_Write_DIG_DMSP(pDM_Odm, (u1Byte)CurrentIGI);//ODM_Write_DIG_DMSP(pDM_Odm, pDM_DigTable->CurIGValue);
+                       ODM_Write_DIG_DMSP(pDM_Odm, CurrentIGI);//ODM_Write_DIG_DMSP(pDM_Odm, pDM_DigTable->CurIGValue);
                        if(*(pDM_Odm->pbMasterOfDMSP))
                        {
                                pDM_DigTable->bMediaConnect_0 = pDM_Odm->bLinked;
@@ -3322,39 +3146,31 @@ odm_DIG(
        else
 #endif
        {
+#if ((DM_ODM_SUPPORT_TYPE & ODM_WIN) || ((DM_ODM_SUPPORT_TYPE & ODM_CE) && (ODM_CONFIG_BT_COEXIST == 1)))
                if(pDM_Odm->bBtHsOperation)
                {
                        if(pDM_Odm->bLinked)
                        {
                                if(pDM_DigTable->BT30_CurIGI > (CurrentIGI))
-                               {
                                        ODM_Write_DIG(pDM_Odm, CurrentIGI);
-                                       
-                               }       
                                else
-                               {
                                        ODM_Write_DIG(pDM_Odm, pDM_DigTable->BT30_CurIGI);
-                               }
+                                       
                                pDM_DigTable->bMediaConnect_0 = pDM_Odm->bLinked;
                                pDM_DigTable->DIG_Dynamic_MIN_0 = DIG_Dynamic_MIN;
                        }
                        else
                        {
                                if(pDM_Odm->bLinkInProcess)
-                               {
                                        ODM_Write_DIG(pDM_Odm, 0x1c);
-                               }
                                else if(pDM_Odm->bBtConnectProcess)
-                               {
                                        ODM_Write_DIG(pDM_Odm, 0x28);
-                               }
                                else
-                               {
                                        ODM_Write_DIG(pDM_Odm, pDM_DigTable->BT30_CurIGI);//ODM_Write_DIG(pDM_Odm, pDM_DigTable->CurIGValue);   
-                               }
                        }
-               }       
+               }
                else            // BT is not using
+#endif
                {
                        ODM_Write_DIG(pDM_Odm, CurrentIGI);//ODM_Write_DIG(pDM_Odm, pDM_DigTable->CurIGValue);
                        pDM_DigTable->bMediaConnect_0 = pDM_Odm->bLinked;
@@ -3363,7 +3179,6 @@ odm_DIG(
        }
 }
 
-
 BOOLEAN 
 odm_DigAbort(
        IN              PDM_ODM_T               pDM_Odm
@@ -14192,3 +14007,51 @@ void odm_dtc(PDM_ODM_T pDM_Odm)
 
 #endif /* #if (DM_ODM_SUPPORT_TYPE == ODM_CE) */
 
+PVOID
+PhyDM_Get_Structure(
+       IN              PDM_ODM_T               pDM_Odm,
+       IN              u1Byte                  Structure_Type
+)
+
+{
+       PVOID   pStruct = NULL;
+#if RTL8195A_SUPPORT
+       switch (Structure_Type){
+               case    PHYDM_FALSEALMCNT:
+                       pStruct = &FalseAlmCnt;
+               break;
+               
+               case    PHYDM_CFOTRACK:
+                       pStruct = &DM_CfoTrack;
+               break;
+
+               case    PHYDM_ADAPTIVITY:
+                       pStruct = &(pDM_Odm->Adaptivity);
+               break;
+               
+               default:
+               break;
+       }
+
+#else
+       switch (Structure_Type){
+               case    PHYDM_FALSEALMCNT:
+                       pStruct = &(pDM_Odm->FalseAlmCnt);
+               break;
+               
+               //case  PHYDM_CFOTRACK:
+               //      pStruct = &(pDM_Odm->DM_CfoTrack);
+               //break;
+
+               case    PHYDM_ADAPTIVITY:
+                       pStruct = &(pDM_Odm->Adaptivity);
+               break;
+               
+               default:
+               break;
+       }
+
+#endif
+       return  pStruct;
+}
+
index d5983d21a19d702538cf7b39553f04c2355751d8..7b9664f0e95b37aa58e017cbdc64a8fa509d819d 100755 (executable)
@@ -22,6 +22,8 @@
 #ifndef        __HALDMOUTSRC_H__\r
 #define __HALDMOUTSRC_H__\r
 \r
+#include "PhyDM_Adaptivity.h"\r
+\r
 //============================================================\r
 // Definition \r
 //============================================================\r
@@ -748,12 +750,15 @@ typedef enum _ODM_Support_Ability_Definition
        ODM_BB_RXHP                                     = BIT12,\r
        ODM_BB_ADAPTIVITY                               = BIT13,\r
        ODM_BB_DYNAMIC_ATC                      = BIT14,\r
+       ODM_BB_NHM_CNT                          = BIT15,\r
+       ODM_BB_PRIMARY_CCA                      = BIT16,\r
+       ODM_BB_TXBF                             = BIT17,\r
        \r
        //\r
-       // MAC DM section BIT 16-23\r
+       // MAC DM section BIT 20-23\r
        //\r
-       ODM_MAC_EDCA_TURBO                      = BIT16,\r
-       ODM_MAC_EARLY_MODE                      = BIT17,\r
+       ODM_MAC_EDCA_TURBO                      = BIT20,\r
+       ODM_MAC_EARLY_MODE                      = BIT21,\r
        \r
        //\r
        // RF ODM section BIT 24-31\r
@@ -776,21 +781,26 @@ typedef enum tag_ODM_Support_Interface_Definition
 // ODM_CMNINFO_IC_TYPE\r
 typedef enum tag_ODM_Support_IC_Type_Definition\r
 {\r
-       ODM_RTL8192S    =       BIT0,\r
-       ODM_RTL8192C    =       BIT1,\r
-       ODM_RTL8192D    =       BIT2,\r
-       ODM_RTL8723A    =       BIT3,\r
-       ODM_RTL8188E    =       BIT4,\r
+       ODM_RTL8192S    =       BIT0,\r
+       ODM_RTL8192C    =       BIT1,\r
+       ODM_RTL8192D    =       BIT2,\r
+       ODM_RTL8723A    =       BIT3,\r
+       ODM_RTL8188E    =       BIT4,\r
        ODM_RTL8812     =       BIT5,\r
        ODM_RTL8821     =       BIT6,\r
-       ODM_RTL8192E    =       BIT7,   \r
+       ODM_RTL8192E    =       BIT7,   \r
        ODM_RTL8723B    =       BIT8,\r
-       ODM_RTL8813A    =       BIT9,   \r
-       ODM_RTL8881A    =       BIT10\r
+       ODM_RTL8814A    =       BIT9,   \r
+       ODM_RTL8881A    =       BIT10,\r
+       ODM_RTL8821B    =       BIT11,\r
+       ODM_RTL8822B    =       BIT12,\r
+       ODM_RTL8703B    =       BIT13,\r
+       ODM_RTL8195A    =       BIT14,\r
+       ODM_RTL8188F    =       BIT15\r
 }ODM_IC_TYPE_E;\r
 \r
 #define ODM_IC_11N_SERIES              (ODM_RTL8192S|ODM_RTL8192C|ODM_RTL8192D|ODM_RTL8723A|ODM_RTL8188E|ODM_RTL8192E|ODM_RTL8723B)\r
-#define ODM_IC_11AC_SERIES             (ODM_RTL8812|ODM_RTL8821|ODM_RTL8813A|ODM_RTL8881A)\r
+#define ODM_IC_11AC_SERIES             (ODM_RTL8812|ODM_RTL8821|ODM_RTL8814A|ODM_RTL8881A)\r
 \r
 #if (DM_ODM_SUPPORT_TYPE == ODM_AP)\r
 #ifdef RTK_AC_SUPPORT\r
@@ -802,6 +812,14 @@ typedef enum tag_ODM_Support_IC_Type_Definition
 #define ODM_IC_11AC_SERIES_SUPPORT             1\r
 #endif\r
 \r
+#if (DM_ODM_SUPPORT_TYPE == ODM_CE)\r
+#ifdef CONFIG_BT_COEXIST\r
+#define ODM_CONFIG_BT_COEXIST                          1\r
+#else\r
+#define ODM_CONFIG_BT_COEXIST                          0\r
+#endif\r
+#endif\r
+\r
 //ODM_CMNINFO_CUT_VER\r
 typedef enum tag_ODM_Cut_Version_Definition\r
 {\r
@@ -1464,15 +1482,22 @@ typedef  struct DM_Out_Source_Dynamic_Mechanism_Structure
        BOOLEAN                 IsBbSwingOffsetPositiveA;\r
        u4Byte                  BbSwingOffsetB;\r
        BOOLEAN                 IsBbSwingOffsetPositiveB;\r
+\r
+       //For Adaptivtiy\r
+       u2Byte                  NHM_cnt_0;\r
+       u2Byte                  NHM_cnt_1;\r
        s1Byte                  TH_L2H_ini;\r
        s1Byte                  TH_EDCCA_HL_diff;\r
-       s1Byte                  IGI_Base;\r
-       u1Byte                  IGI_target;\r
-       BOOLEAN                 ForceEDCCA;\r
-       u1Byte                  AdapEn_RSSI;\r
-       s1Byte                  Force_TH_H;\r
-       s1Byte                  Force_TH_L;\r
-       u1Byte                  IGI_LowerBound;\r
+       s1Byte                  TH_L2H_ini_backup;\r
+       BOOLEAN                 Carrier_Sense_enable;\r
+       u1Byte                  Adaptivity_IGI_upper;\r
+       BOOLEAN                 adaptivity_flag;\r
+       u1Byte                  DCbackoff;\r
+       BOOLEAN                 Adaptivity_enable;\r
+       u1Byte                  APTotalNum;\r
+       ADAPTIVITY_STATISTICS   Adaptivity;\r
+       //For Adaptivtiy\r
+       \r
        u1Byte                  antdiv_rssi;\r
        u1Byte                  AntType;\r
        u1Byte                  pre_AntType;\r
@@ -2366,5 +2391,19 @@ ODM_DynamicARFBSelect(
 void odm_dtc(PDM_ODM_T pDM_Odm);\r
 #endif /* #if (DM_ODM_SUPPORT_TYPE == ODM_CE) */\r
 \r
+typedef enum _PHYDM_STRUCTURE_TYPE{\r
+       PHYDM_FALSEALMCNT,\r
+       PHYDM_CFOTRACK,\r
+       PHYDM_ADAPTIVITY,\r
+       PHYDM_ROMINFO,\r
+       \r
+}PHYDM_STRUCTURE_TYPE;\r
+\r
+PVOID\r
+PhyDM_Get_Structure(\r
+       IN              PDM_ODM_T               pDM_Odm,\r
+       IN              u1Byte                  Structure_Type\r
+);\r
+\r
 #endif\r
 \r
index a5955ad059d7383b733827cc80e307cae2fb9c17..bbe652377427c163689d62b8ec1d601a1ab67476 100755 (executable)
@@ -1490,7 +1490,7 @@ odm_Process_RSSIForDM(
        PSTA_INFO_T             pEntry;\r
 \r
 \r
-       if(pPktinfo->StationID == 0xFF)\r
+       if (pPktinfo->StationID >= ODM_ASSOCIATE_ENTRY_NUM)\r
                return;\r
 \r
        //\r
@@ -1905,7 +1905,7 @@ ODM_ConfigRFWithHeaderFile(
 #endif\r
 \r
 #if (RTL8813A_SUPPORT == 1)\r
-       if (pDM_Odm->SupportICType == ODM_RTL8813A)\r
+       if (pDM_Odm->SupportICType == ODM_RTL8814A)\r
        {\r
                /*\r
                if(ConfigType == CONFIG_RF_TXPWR_LMT) {\r
@@ -2137,7 +2137,7 @@ ODM_ConfigBBWithHeaderFile(
        }\r
 #endif\r
 #if (RTL8813A_SUPPORT == 1)\r
-    if(pDM_Odm->SupportICType == ODM_RTL8813A)\r
+    if(pDM_Odm->SupportICType == ODM_RTL8814A)\r
        {\r
 \r
                if(ConfigType == CONFIG_BB_PHY_REG)\r
index 1193653a52726a4473afc0991e2d25c2a92f1ee7..ad680c88457e1f1eb292f2054ebd38c2264b4433 100755 (executable)
 //PAGE 8\r
 #define        ODM_REG_CCK_RPT_FORMAT_11AC     0x804\r
 #define        ODM_REG_BB_RX_PATH_11AC                 0x808\r
+#define        ODM_REG_BB_TX_PATH_11AC                 0x80c\r
+#define        ODM_REG_BB_ATC_11AC                             0x860\r
+#define        ODM_REG_EDCCA_POWER_CAL         0x8dc\r
+#define        ODM_REG_DBG_RPT_11AC                    0x8fc\r
 //PAGE 9\r
+#define        ODM_REG_EDCCA_DOWN_OPT                  0x900\r
+#define        ODM_REG_ACBB_EDCCA_ENHANCE              0x944\r
 #define        ODM_REG_OFDM_FA_RST_11AC                0x9A4\r
+#define        ODM_REG_NHM_TIMER_11AC                  0x990\r
+#define        ODM_REG_NHM_TH9_TH10_11AC               0x994\r
+#define        ODM_REG_NHM_TH3_TO_TH0_11AC     0x998\r
+#define        ODM_REG_NHM_TH7_TO_TH4_11AC     0x99c\r
+#define        ODM_REG_NHM_TH8_11AC                    0x9a0\r
+#define        ODM_REG_NHM_9E8_11AC                    0x9e8\r
 //PAGE A\r
 #define        ODM_REG_CCK_CCA_11AC                    0xA0A\r
 #define        ODM_REG_CCK_FA_RST_11AC                 0xA2C\r
 #define        ODM_REG_CCK_FA_11AC                             0xA5C\r
+//PAGE B\r
+#define        ODM_REG_RST_RPT_11AC                            0xB58\r
 //PAGE C\r
+#define        ODM_REG_TRMUX_11AC                              0xC08\r
 #define        ODM_REG_IGI_A_11AC                              0xC50\r
 //PAGE E\r
 #define        ODM_REG_IGI_B_11AC                              0xE50\r
+#define        ODM_REG_TRMUX_11AC_B                    0xE08\r
 //PAGE F\r
+#define        ODM_REG_CCK_CCA_CNT_11AC                0xF08\r
 #define        ODM_REG_OFDM_FA_11AC                    0xF48\r
-\r
+#define        ODM_REG_RPT_11AC                                        0xfa0\r
+#define        ODM_REG_NHM_CNT_11AC                    0xfa8\r
+//PAGE 18\r
+#define        ODM_REG_IGI_C_11AC                              0x1850\r
+//PAGE 1A\r
+#define        ODM_REG_IGI_D_11AC                              0x1A50\r
 \r
 //2 MAC REG LIST\r
 #define        ODM_REG_RESP_TX_11AC                            0x6D8\r
@@ -52,6 +74,8 @@
 #define        ODM_BIT_IGI_11AC                                        0xFFFFFFFF\r
 #define        ODM_BIT_CCK_RPT_FORMAT_11AC             BIT16\r
 #define        ODM_BIT_BB_RX_PATH_11AC                 0xF\r
+#define        ODM_BIT_BB_TX_PATH_11AC                 0xF\r
+#define        ODM_BIT_BB_ATC_11AC                             BIT14\r
 \r
 #endif\r
 \r
index b6236092fb5a4d8bd200abb370faedb2f979da29..7ed8879c344986b685f335ee763b4895c117dc37 100755 (executable)
@@ -46,6 +46,7 @@
 #define        ODM_REG_TX_ANT_CTRL_11N                 0x80C\r
 #define        ODM_REG_BB_PWR_SAV5_11N                 0x818\r
 #define        ODM_REG_CCK_RPT_FORMAT_11N              0x824\r
+#define        ODM_REG_CCK_RPT_FORMAT_11N_B    0x82C\r
 #define        ODM_REG_RX_DEFUALT_A_11N                0x858\r
 #define        ODM_REG_RX_DEFUALT_B_11N                0x85A\r
 #define        ODM_REG_BB_PWR_SAV3_11N                 0x85C\r
 #define        ODM_REG_ANTSEL_PATH_11N                 0x878\r
 #define        ODM_REG_BB_3WIRE_11N                    0x88C\r
 #define        ODM_REG_SC_CNT_11N                              0x8C4\r
-#define        ODM_REG_PSD_DATA_11N                    0x8B4\r
+#define        ODM_REG_PSD_DATA_11N                            0x8B4\r
+#define        ODM_REG_PSD_DATA_11N                            0x8B4\r
+#define        ODM_REG_NHM_TIMER_11N                   0x894\r
+#define        ODM_REG_NHM_TH9_TH10_11N                0x890\r
+#define        ODM_REG_NHM_TH3_TO_TH0_11N              0x898\r
+#define        ODM_REG_NHM_TH7_TO_TH4_11N              0x89c\r
+#define        ODM_REG_NHM_CNT_11N                             0x8d8\r
 //PAGE 9\r
+#define        ODM_REG_DBG_RPT_11N                             0x908\r
+#define        ODM_REG_BB_TX_PATH_11N                  0x90c\r
 #define        ODM_REG_ANT_MAPPING1_11N                0x914\r
 #define        ODM_REG_ANT_MAPPING2_11N                0x918\r
+#define        ODM_REG_EDCCA_DOWN_OPT_11N      0x948\r
+\r
 //PAGE A\r
 #define        ODM_REG_CCK_ANTDIV_PARA1_11N    0xA00\r
 #define        ODM_REG_CCK_CCA_11N                             0xA0A\r
 #define        ODM_REG_OFDM_FA_TYPE1_11N               0xCF0\r
 //PAGE D\r
 #define        ODM_REG_OFDM_FA_RSTD_11N                0xD00\r
+#define        ODM_REG_BB_ATC_11N                              0xD2C\r
 #define        ODM_REG_OFDM_FA_TYPE2_11N               0xDA0\r
 #define        ODM_REG_OFDM_FA_TYPE3_11N               0xDA4\r
 #define        ODM_REG_OFDM_FA_TYPE4_11N               0xDA8\r
+#define        ODM_REG_RPT_11N                                 0xDF4\r
 //PAGE E\r
 #define        ODM_REG_TXAGC_A_6_18_11N                0xE00\r
 #define        ODM_REG_TXAGC_A_24_54_11N               0xE04\r
 #define        ODM_REG_TXAGC_A_MCS4_7_11N              0xE14\r
 #define        ODM_REG_TXAGC_A_MCS8_11_11N     0xE18\r
 #define        ODM_REG_TXAGC_A_MCS12_15_11N    0xE1C\r
+#define        DOM_REG_EDCCA_DCNF_11N                  0xE24\r
 #define        ODM_REG_FPGA0_IQK_11N                   0xE28\r
 #define        ODM_REG_TXIQK_TONE_A_11N                0xE30\r
 #define        ODM_REG_RXIQK_TONE_A_11N                0xE34\r
 #define        ODM_REG_STANDBY_11N                             0xEDC\r
 #define        ODM_REG_SLEEP_11N                               0xEE0\r
 #define        ODM_REG_PMPD_ANAEN_11N                  0xEEC\r
-\r
-\r
-\r
-\r
-\r
-\r
+#define        ODM_REG_IGI_C_11N                                       0xF84\r
+#define        ODM_REG_IGI_D_11N                                       0xF88\r
 \r
 //2 MAC REG LIST\r
 #define        ODM_REG_BB_RST_11N                              0x02\r
 #define        ODM_BIT_IGI_11N                                 0x0000007F\r
 #define        ODM_BIT_CCK_RPT_FORMAT_11N              BIT9\r
 #define        ODM_BIT_BB_RX_PATH_11N                  0xF\r
+#define        ODM_BIT_BB_TX_PATH_11N                  0xF\r
+#define        ODM_BIT_BB_ATC_11N                              BIT11\r
+\r
 \r
 #endif\r
 \r
index 0a32f85ef34d35bddaae8d1079727a247b163ac4..73c0d6fb30f793ed09a167d38cfbafbc438582af 100755 (executable)
 //\r
 //-----------------------------------------------------------------------------\r
 //BB Functions\r
-#define ODM_COMP_DIG                           BIT0    \r
-#define ODM_COMP_RA_MASK                       BIT1    \r
+#define ODM_COMP_DIG                                   BIT0    \r
+#define ODM_COMP_RA_MASK                               BIT1    \r
 #define ODM_COMP_DYNAMIC_TXPWR         BIT2\r
 #define ODM_COMP_FA_CNT                                BIT3\r
 #define ODM_COMP_RSSI_MONITOR          BIT4\r
 #define ODM_COMP_CCK_PD                                BIT5\r
-#define ODM_COMP_ANT_DIV                       BIT6\r
+#define ODM_COMP_ANT_DIV                               BIT6\r
 #define ODM_COMP_PWR_SAVE                      BIT7\r
 #define ODM_COMP_PWR_TRAIN                     BIT8\r
 #define ODM_COMP_RATE_ADAPTIVE         BIT9\r
-#define ODM_COMP_PATH_DIV                      BIT10\r
-#define ODM_COMP_PSD                           BIT11\r
+#define ODM_COMP_PATH_DIV                              BIT10\r
+#define ODM_COMP_PSD                                   BIT11\r
 #define ODM_COMP_DYNAMIC_PRICCA                BIT12\r
-#define ODM_COMP_RXHP                          BIT13                   \r
+#define ODM_COMP_RXHP                                  BIT13\r
 #define ODM_COMP_MP                                    BIT14\r
-#define ODM_COMP_DYNAMIC_ATC                   BIT15\r
+#define ODM_COMP_DYNAMIC_ATC           BIT15\r
+#define ODM_COMP_ACS                                   BIT16\r
+#define PHYDM_COMP_ADAPTIVITY                  BIT17\r
+#define PHYDM_COMP_RA_DBG                              BIT18\r
+#define PHYDM_COMP_TXBF                                BIT19\r
 //MAC Functions\r
-#define ODM_COMP_EDCA_TURBO                    BIT16\r
-#define ODM_COMP_EARLY_MODE                    BIT17\r
+#define ODM_COMP_EDCA_TURBO                    BIT20\r
+#define ODM_COMP_EARLY_MODE                    BIT21\r
+#define ODM_FW_DEBUG_TRACE                     BIT22\r
 //RF Functions\r
 #define ODM_COMP_TX_PWR_TRACK          BIT24\r
 #define ODM_COMP_RX_GAIN_TRACK         BIT25\r
-#define ODM_COMP_CALIBRATION           BIT26\r
+#define ODM_COMP_CALIBRATION                   BIT26\r
 //Common Functions\r
+#define        BEAMFORMING_DEBUG                       BIT29\r
 #define ODM_COMP_COMMON                                BIT30\r
-#define ODM_COMP_INIT                          BIT31\r
+#define ODM_COMP_INIT                                  BIT31\r
 \r
 /*------------------------Export Marco Definition---------------------------*/\r
 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
index dc966775a17f1b601435454b75030c9be68b01f9..3f57dfe56b540ff0f8743df369d36160aa3205e7 100755 (executable)
@@ -347,11 +347,11 @@ static void Update_ODM_ComInfo_88E(PADAPTER       Adapter)
                | ODM_BB_PWR_SAVE               \r
                | ODM_RF_CALIBRATION\r
                | ODM_RF_TX_PWR_TRACK\r
-#ifdef CONFIG_ODM_ADAPTIVITY\r
-               | ODM_BB_ADAPTIVITY\r
-#endif\r
                ;\r
 \r
+       if (rtw_odm_adaptivity_needed(Adapter) == _TRUE)\r
+               pdmpriv->InitODMFlag |= ODM_BB_ADAPTIVITY;\r
+\r
        if (!Adapter->registrypriv.qos_opt_enable) {\r
                pdmpriv->InitODMFlag |= ODM_MAC_EDCA_TURBO;\r
        }\r
index 0039b76730f1798805fc9218f5b51fa018d5f518..db0f41d741d78926a543411d2749976a36a1bbb0 100755 (executable)
@@ -276,7 +276,7 @@ void update_recvframe_phyinfo_88e(
        ODM_PACKET_INFO_T       pkt_info;
        u8 *sa = NULL;
        struct sta_priv *pstapriv;
-       struct sta_info *psta;
+       struct sta_info *psta = NULL;
        //_irqL         irqL;
        
        pkt_info.bPacketMatchBSSID =_FALSE;
@@ -315,15 +315,23 @@ void update_recvframe_phyinfo_88e(
        }       
 */     
        sa = get_ta(wlanhdr);   
-       
-       pstapriv = &padapter->stapriv;
+
        pkt_info.StationID = 0xFF;
-       psta = rtw_get_stainfo(pstapriv, sa);
-       if (psta)
-       {
-               pkt_info.StationID = psta->mac_id;              
-               //DBG_8192C("%s ==> StationID(%d)\n",__FUNCTION__,pkt_info.StationID);
-       }                       
+
+       if (_rtw_memcmp(myid(&padapter->eeprompriv), sa, ETH_ALEN) == _TRUE) {
+               static u32 start_time = 0;
+
+               if ((start_time == 0) || (rtw_get_passing_time_ms(start_time) > 5000)) {
+                       DBG_871X_LEVEL(_drv_always_, "Warning!!! %s: Confilc mac addr!!\n", __func__);
+                       start_time = rtw_get_current_time();
+               }
+       } else {
+               pstapriv = &padapter->stapriv;
+               psta = rtw_get_stainfo(pstapriv, sa);
+               if (psta)
+                       pkt_info.StationID = psta->mac_id;
+       }
+
        pkt_info.DataRate = pattrib->data_rate; 
        //rtl8188e_query_rx_phy_status(precvframe, pphy_status);
 
index 51d33c05804191b1e85d95de684ef6cc71452f35..bdc468bce1e43b1d55128404227a82824973b320 100755 (executable)
@@ -950,31 +950,19 @@ void rtl8188eu_recv_tasklet(void *priv)
                        rtw_skb_free(pskb);
                        break;
                }
-       
-               recvbuf2recvframe(padapter, pskb);
-
-#ifdef CONFIG_PREALLOC_RECV_SKB
 
+               recvbuf2recvframe(padapter, pskb);
                skb_reset_tail_pointer(pskb);
-
                pskb->len = 0;
                
                skb_queue_tail(&precvpriv->free_recv_skb_queue, pskb);
-               
-#else
-               rtw_skb_free(pskb);
-#endif
-                               
-       }
 
-       while (NULL != (precvbuf = rtw_dequeue_recvbuf(&precvpriv->recv_buf_pending_queue)))
-       {
-               DBG_871X("dequeue_recvbuf %p\n", precvbuf);
-               precvbuf->pskb = NULL;
-               precvbuf->reuse = _FALSE;
-               rtw_read_port(padapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf);
+               if (NULL != (precvbuf = rtw_dequeue_recvbuf(&precvpriv->recv_buf_pending_queue))) {
+                       precvbuf->pskb = NULL;
+                       precvbuf->reuse = _FALSE;
+                       rtw_read_port(padapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf);
+               }
        }
-       
 }
 
 
@@ -1133,12 +1121,14 @@ _func_enter_;
        //re-assign for linux based on skb
        if((precvbuf->reuse == _FALSE) || (precvbuf->pskb == NULL))
        {
+               #ifndef CONFIG_FIX_NR_BULKIN_BUFFER
                precvbuf->pskb = rtw_skb_alloc(MAX_RECVBUF_SZ + RECVBUFF_ALIGN_SZ);
+               #endif
 
                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);
+                       if (0)
+                               DBG_871X("usb_read_port() enqueue precvbuf=%p \n", precvbuf);
                        //enqueue precvbuf and wait for free skb
                        rtw_enqueue_recvbuf(precvbuf, &precvpriv->recv_buf_pending_queue);
                        return _FAIL;
index cd868dff3c9b1dd8710462fe7f1f05d8193e5a92..384fe534913ac7a7d4919452ffe3f2880edae0ab 100755 (executable)
@@ -36,7 +36,7 @@
 
 #define PLATFORM_LINUX 
 
-#define CONFIG_IOCTL_CFG80211 
+//#define CONFIG_IOCTL_CFG80211 
 //#define CONFIG_IEEE80211W
 
 #if defined(CONFIG_PLATFORM_ACTIONS_ATM702X)
@@ -46,7 +46,7 @@
 #endif
 
 #ifdef CONFIG_IOCTL_CFG80211
-       #define RTW_USE_CFG80211_STA_EVENT /* Indecate new sta asoc through cfg80211_new_sta */
+       //#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_DRV_ISSUE_PROV_REQ // IOT FOR S2
        #endif
 
 
-       #define CONFIG_CONCURRENT_MODE 
+       //#define CONFIG_CONCURRENT_MODE 
        #ifdef CONFIG_CONCURRENT_MODE
                //#define CONFIG_HWPORT_SWAP                            //Port0->Sec , Port1 -> Pri
                #define CONFIG_RUNTIME_PORT_SWITCH
        //#define CONFIG_DBG_P2P
 
        #define CONFIG_P2P_PS
-       #define CONFIG_P2P_IPS
+       //#define CONFIG_P2P_IPS
        #define CONFIG_P2P_OP_CHK_SOCIAL_CH
        #define CONFIG_CFG80211_ONECHANNEL_UNDER_CONCURRENT  //replace CONFIG_P2P_CHK_INVITE_CH_LIST flag
        #define CONFIG_P2P_INVITE_IOT
        #define CONFIG_USB_RX_AGGREGATION       
 #endif
 
-#define CONFIG_PREALLOC_RECV_SKB       
 //#define CONFIG_REDUCE_USB_TX_INT             // Trade-off: Improve performance, but may cause TX URBs blocked by USB Host/Bus driver on few platforms.
 //#define CONFIG_EASY_REPLACEMENT      
 
 //#define CONFIG_USE_USB_BUFFER_ALLOC_TX       // Trade-off: For TX path, improve stability on some platforms, but may cause performance degrade on other platforms.
 //#define CONFIG_USE_USB_BUFFER_ALLOC_RX       // For RX path
 #ifdef CONFIG_USE_USB_BUFFER_ALLOC_RX
-#undef CONFIG_PREALLOC_RECV_SKB
+
+#else
+       #define CONFIG_PREALLOC_RECV_SKB
+       #ifdef CONFIG_PREALLOC_RECV_SKB
+               //#define CONFIG_FIX_NR_BULKIN_BUFFER /* only use PREALLOC_RECV_SKB buffer, don't alloc skb at runtime */
+       #endif
 #endif
 
 /* 
 #define RTL8192E_SUPPORT                               0
 
 #define RTL8813A_SUPPORT                               0
+#define RTL8195A_SUPPORT                               0
+
 
 //#if (RTL8188E_SUPPORT==1)
 #define RATE_ADAPTIVE_SUPPORT                  1
index 5b0c3ca1fab7ad738d946aee3f60a4c954e5e191..a8f219d2fbecd13980611bd1f737e374b248cd05 100755 (executable)
 
 #define DYNAMIC_CAMID_ALLOC
 
+#define RTW_SCAN_SPARSE_MIRACAST 1
+#define RTW_SCAN_SPARSE_BG 0
+
 #ifndef CONFIG_RTW_HIQ_FILTER
        #define CONFIG_RTW_HIQ_FILTER 1
 #endif
 
+#ifndef CONFIG_RTW_ADAPTIVITY_EN
+       #define CONFIG_RTW_ADAPTIVITY_EN 0
+#endif
+
+#ifndef CONFIG_RTW_ADAPTIVITY_MODE
+       #define CONFIG_RTW_ADAPTIVITY_MODE 0
+#endif
+
+#ifndef CONFIG_RTW_ADAPTIVITY_DML
+       #define CONFIG_RTW_ADAPTIVITY_DML 0
+#endif
+
+#ifndef CONFIG_RTW_ADAPTIVITY_DC_BACKOFF
+       #define CONFIG_RTW_ADAPTIVITY_DC_BACKOFF 2
+#endif
+
 //#include <rtl871x_byteorder.h>
 
 #endif // __DRV_CONF_H__
index b2294c39fdb571e1ce23e97f59b42112dc1c246b..7573a97fb3dc62c962bb9d15d0c78c2ff6b84a7e 100755 (executable)
@@ -322,6 +322,12 @@ struct registry_priv
        u8 qos_opt_enable;
 
        u8 hiq_filter;
+
+       u8 adaptivity_en;
+       u8 adaptivity_mode;
+       u8 adaptivity_dml;
+       u8 adaptivity_dc_backoff;
+
 };
 
 
@@ -595,6 +601,7 @@ struct dvobj_priv
 
 #define dvobj_to_pwrctl(dvobj) (&(dvobj->pwrctl_priv))
 #define pwrctl_to_dvobj(pwrctl) container_of(pwrctl, struct dvobj_priv, pwrctl_priv)
+#define dvobj_to_regsty(dvobj) (&(dvobj->if1->registrypriv))
 
 #ifdef PLATFORM_LINUX
 static struct device *dvobj_to_dev(struct dvobj_priv *dvobj)
index d21341d65385696c429a22c87587c8c7a13d6f9f..e8e93313308478e801add3e9a0ff7fa8d6d142cc 100755 (executable)
@@ -98,6 +98,7 @@ struct rtw_wdev_priv
 \r
        u8 bandroid_scan;\r
        bool block;\r
+       bool block_scan;\r
        bool power_mgmt;\r
 \r
 #ifdef CONFIG_CONCURRENT_MODE\r
index 76026b9723efe401901e04f56ae397e950796def..b262938ee10f5aa12cea575e12d93a4f8e351291 100755 (executable)
@@ -474,6 +474,8 @@ __inline static u32 bitshift(u32 bitmask)
        return i;
 }
 
+#define rtw_min(a, b) ((a>b)?b:a)
+
 #ifndef MAC_FMT
 #define MAC_FMT "%02x:%02x:%02x:%02x:%02x:%02x"
 #endif
index 5f3892ca555aab3992711b8fbb2b449c24ea3bb5..9cae3eb2f210474c09f4b1f2a525ca1821061547 100755 (executable)
@@ -45,6 +45,9 @@ enum ANDROID_WIFI_CMD {
        ANDROID_WIFI_CMD_P2P_GET_NOA,   
        ANDROID_WIFI_CMD_P2P_SET_PS,    
        ANDROID_WIFI_CMD_SET_AP_WPS_P2P_IE,
+
+       ANDROID_WIFI_CMD_MIRACAST,
+       
 #ifdef CONFIG_PNO_SUPPORT
        ANDROID_WIFI_CMD_PNOSSIDCLR_SET,
        ANDROID_WIFI_CMD_PNOSETUP_SET,
@@ -54,6 +57,7 @@ enum ANDROID_WIFI_CMD {
 
        ANDROID_WIFI_CMD_MACADDR,
 
+       ANDROID_WIFI_CMD_BLOCK_SCAN,
        ANDROID_WIFI_CMD_BLOCK,
 
        ANDROID_WIFI_CMD_WFD_ENABLE,
index 4e0642a2778d6a5e73e7a5e009915b36083aa69c..79eeb00fdf2de03a916866b98c6d032ef765b715 100755 (executable)
@@ -191,6 +191,16 @@ struct tx_invite_resp_info{
        u8                                      token;  //      Used to record the dialog token of p2p invitation request frame.
 };
 
+#define MIRACAST_DISABLED 0
+#define MIRACAST_SOURCE 1
+#define MIRACAST_SINK 2
+#define MIRACAST_INVALID 3
+
+#define is_miracast_enabled(mode) \
+       (mode == MIRACAST_SOURCE || mode == MIRACAST_SINK)
+
+const char *get_miracast_mode_str(int mode);
+
 #ifdef CONFIG_WFD
 
 struct wifi_display_info{
@@ -212,7 +222,7 @@ struct wifi_display_info{
                                                                                                        //      0 -> WFD Source Device
                                                                                                        //      1 -> WFD Primary Sink Device
        enum    SCAN_RESULT_TYPE        scan_result_type;       //      Used when P2P is enable. This parameter will impact the scan result.
-
+       u8 stack_wfd_mode;
 };
 #endif //CONFIG_WFD
 
@@ -257,8 +267,8 @@ struct cfg80211_wifidirect_info{
        u8                                              restore_channel;
        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;
+       ATOMIC_T ro_ch_cookie_gen;
+       u64 remain_on_ch_cookie;
        bool is_ro_ch;
        u32 last_ro_ch_time; /* this will be updated at the beginning and end of ro_ch */
 };
@@ -796,6 +806,9 @@ extern void rtw_free_assoc_resources(_adapter* adapter, int lock_scanned_queue);
 extern void rtw_indicate_disconnect(_adapter* adapter);
 extern void rtw_indicate_connect(_adapter* adapter);
 void rtw_indicate_scan_done( _adapter *padapter, bool aborted);
+
+u32 rtw_scan_abort_timeout(_adapter *adapter, u32 timeout_ms);
+void rtw_scan_abort_no_wait(_adapter *adapter);
 void rtw_scan_abort(_adapter *adapter);
 
 extern int rtw_restruct_sec_ie(_adapter *adapter,u8 *in_ie,u8 *out_ie,uint in_len);
index 82d20cf3c2a89d101ebd7f3e7a475a9b87c7e702..3bb9c5287e1d1ef39f4fc5d107b3259af33d6ed4 100755 (executable)
@@ -478,6 +478,7 @@ struct mlme_ext_info
 
 #if defined(CONFIG_STA_MODE_SCAN_UNDER_AP_MODE) || defined(CONFIG_ATMEL_RC_PATCH)
        u8 scan_cnt;
+       u8 backop_cnt;
 #endif //CONFIG_STA_MODE_SCAN_UNDER_AP_MODE
 };
 
index 50edd0124aee8e2f7b307adca3ea714d3b2c4483..95f6ac11fae9954eef7f791267d59a49278cf857 100755 (executable)
@@ -34,9 +34,9 @@ void rtw_odm_dbg_level_set(_adapter *adapter, u32 level);
 void rtw_odm_ability_msg(void *sel, _adapter *adapter);
 void rtw_odm_ability_set(_adapter *adapter, u32 ability);
 
+bool rtw_odm_adaptivity_needed(_adapter *adapter);
 void rtw_odm_adaptivity_parm_msg(void *sel,_adapter *adapter);
-void rtw_odm_adaptivity_parm_set(_adapter *adapter, s8 TH_L2H_ini, s8 TH_EDCCA_HL_diff,
-       s8 IGI_Base, bool ForceEDCCA, u8 AdapEn_RSSI, u8 IGI_LowerBound);
+void rtw_odm_adaptivity_parm_set(_adapter *adapter, s8 TH_L2H_ini, s8 TH_EDCCA_HL_diff);
 void rtw_odm_get_perpkt_rssi(void *sel, _adapter *adapter);
 #endif // __RTW_ODM_H__
 
index 2d5046f64e45b119fcbee3ae42df18e49bbb72d5..a0e3beb5b83fe59fa13a09506edc56abc2ced5bd 100755 (executable)
@@ -1 +1 @@
-#define DRIVERVERSION  "v4.3.0.7_12758.20141114"
+#define DRIVERVERSION  "v4.3.0.8_13522.20150213_beta"
index 1a01894444c90cb0d5d465c83b5eed5dca6d72fe..37029ddfa09341c15ed63487870c5c8476afdb83 100755 (executable)
@@ -26,6 +26,7 @@
 #include <rtw_wifi_regd.h>\r
 \r
 #define RTW_MAX_MGMT_TX_CNT (8)\r
+#define RTW_MAX_MGMT_TX_MS_GAS (500)\r
 \r
 #define RTW_SCAN_IE_LEN_MAX      2304\r
 #define RTW_MAX_REMAIN_ON_CHANNEL_DURATION 5000 //ms\r
@@ -2139,6 +2140,7 @@ static int cfg80211_rtw_scan(struct wiphy *wiphy
        struct cfg80211_ssid *ssids = request->ssids;\r
        int social_channel = 0, j = 0;\r
        bool need_indicate_scan_done = _FALSE;\r
+       bool ps_denied = _FALSE;\r
 \r
        _adapter *padapter;\r
        struct rtw_wdev_priv *pwdev_priv;\r
@@ -2197,6 +2199,12 @@ if (padapter->registrypriv.mp_mode == 1)
        pwdev_priv->scan_request = request;\r
        _exit_critical_bh(&pwdev_priv->scan_req_lock, &irqL);\r
 \r
+       if (adapter_wdev_data(padapter)->block_scan == _TRUE) {\r
+               DBG_871X(FUNC_ADPT_FMT" wdev_priv.block_scan is set\n", FUNC_ADPT_ARG(padapter));\r
+               need_indicate_scan_done = _TRUE;\r
+               goto check_need_indicate_scan_done;\r
+       }\r
+\r
        if (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE)\r
        {\r
 #ifdef CONFIG_DEBUG_CFG80211\r
@@ -2218,6 +2226,7 @@ if (padapter->registrypriv.mp_mode == 1)
        }\r
 \r
        rtw_ps_deny(padapter, PS_DENY_SCAN);\r
+       ps_denied = _TRUE;\r
        if(_FAIL == rtw_pwr_wakeup(padapter)) {\r
                need_indicate_scan_done = _TRUE;\r
                goto check_need_indicate_scan_done;\r
@@ -2411,7 +2420,8 @@ check_need_indicate_scan_done:
        }\r
 \r
 cancel_ps_deny:\r
-       rtw_ps_deny_cancel(padapter, PS_DENY_SCAN);\r
+       if (ps_denied == _TRUE)\r
+               rtw_ps_deny_cancel(padapter, PS_DENY_SCAN);\r
 \r
 exit:\r
        return ret;\r
@@ -4204,7 +4214,10 @@ static int       cfg80211_rtw_del_station(struct wiphy *wiphy, struct net_device *ndev
                                pstapriv->asoc_list_cnt--;\r
 \r
                                //_exit_critical_bh(&pstapriv->asoc_list_lock, &irqL);\r
-                               updated = ap_free_sta(padapter, psta, _TRUE, WLAN_REASON_DEAUTH_LEAVING);\r
+                               if (check_fwstate(pmlmepriv, (WIFI_AP_STATE)) == _TRUE)\r
+                                       updated = ap_free_sta(padapter, psta, _TRUE, WLAN_REASON_PREV_AUTH_NOT_VALID);\r
+                               else\r
+                                       updated = ap_free_sta(padapter, psta, _TRUE, WLAN_REASON_DEAUTH_LEAVING);\r
                                //_enter_critical_bh(&pstapriv->asoc_list_lock, &irqL);\r
 \r
                                psta = NULL;\r
@@ -4386,11 +4399,14 @@ void rtw_cfg80211_rx_action(_adapter *adapter, u8 *frame, uint frame_len, const
 \r
        rtw_action_frame_parse(frame, frame_len, &category, &action);\r
 \r
-       DBG_8192C("RTW_Rx:cur_ch=%d\n", channel);\r
-       if (msg)\r
-               DBG_871X("RTW_Rx:%s\n", msg);\r
-       else\r
-               DBG_871X("RTW_Rx:category(%u), action(%u)\n", category, action);\r
+       if (action == ACT_PUBLIC_GAS_INITIAL_REQ) {\r
+               rtw_set_scan_deny(adapter, 200);\r
+               rtw_scan_abort_no_wait(adapter);\r
+               #ifdef CONFIG_CONCURRENT_MODE\r
+               if (rtw_buddy_adapter_up(adapter))\r
+                       rtw_scan_abort_no_wait(adapter->pbuddy_adapter);\r
+               #endif\r
+       }\r
 \r
        if (channel <= RTW_CH_MAX_2G_CHANNEL)\r
                freq = rtw_ieee80211_channel_to_frequency(channel, IEEE80211_BAND_2GHZ);\r
@@ -4403,6 +4419,11 @@ void rtw_cfg80211_rx_action(_adapter *adapter, u8 *frame, uint frame_len, const
        cfg80211_rx_action(adapter->pnetdev, freq, frame, frame_len, GFP_ATOMIC);\r
 #endif\r
 \r
+       DBG_8192C("RTW_Rx:cur_ch=%d\n", channel);\r
+       if (msg)\r
+               DBG_871X("RTW_Rx:%s\n", msg);\r
+       else\r
+               DBG_871X("RTW_Rx:category(%u), action(%u)\n", category, action);\r
 }\r
 \r
 #ifdef CONFIG_P2P\r
@@ -4655,6 +4676,11 @@ static s32 cfg80211_rtw_remain_on_channel(struct wiphy *wiphy,
        struct wifidirect_info *pwdinfo;\r
        struct cfg80211_wifidirect_info *pcfg80211_wdinfo;\r
 \r
+#ifndef CONFIG_RADIO_WORK\r
+       #define RTW_ROCH_DURATION_ENLARGE\r
+       #define RTW_ROCH_BACK_OP\r
+#endif\r
+\r
        if (ndev == NULL) {\r
                return  -EINVAL;\r
        }\r
@@ -4665,18 +4691,18 @@ static s32 cfg80211_rtw_remain_on_channel(struct wiphy *wiphy,
        pwdinfo = &padapter->wdinfo;\r
        pcfg80211_wdinfo = &padapter->cfg80211_wdinfo;\r
 \r
-       DBG_871X(FUNC_ADPT_FMT" ch:%u duration:%d\n", FUNC_ADPT_ARG(padapter), remain_ch, duration);\r
+       *cookie = ATOMIC_INC_RETURN(&pcfg80211_wdinfo->ro_ch_cookie_gen);\r
+\r
+       DBG_871X(FUNC_ADPT_FMT" ch:%u duration:%d, cookie:0x%llx\n", FUNC_ADPT_ARG(padapter), remain_ch, duration, *cookie);\r
 \r
        if(pcfg80211_wdinfo->is_ro_ch == _TRUE)\r
        {\r
-               pcfg80211_wdinfo->not_indic_ro_ch_exp = _TRUE;\r
                DBG_8192C("%s, cancel ro ch timer\n", __func__);\r
                _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 //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
@@ -4729,12 +4755,13 @@ static s32 cfg80211_rtw_remain_on_channel(struct wiphy *wiphy,
 \r
 \r
        rtw_p2p_set_state(pwdinfo, P2P_STATE_LISTEN);\r
-       \r
-       \r
-       if(duration < 400)\r
-               duration = duration*3;//extend from exper.\r
 \r
+       #ifdef RTW_ROCH_DURATION_ENLARGE\r
+       if (duration < 400)\r
+               duration = duration * 3; /* extend from exper */\r
+       #endif\r
 \r
+#ifdef RTW_ROCH_BACK_OP\r
 #ifdef CONFIG_CONCURRENT_MODE\r
        if(check_buddy_fwstate(padapter, _FW_LINKED) &&\r
                (duration<pwdinfo->ext_listen_interval)) \r
@@ -4742,6 +4769,7 @@ static s32 cfg80211_rtw_remain_on_channel(struct wiphy *wiphy,
                duration = duration +   pwdinfo->ext_listen_interval;\r
        }\r
 #endif\r
+#endif /* RTW_ROCH_BACK_OP */\r
 \r
        pcfg80211_wdinfo->restore_channel = rtw_get_oper_ch(padapter);\r
 \r
@@ -4763,9 +4791,11 @@ static s32 cfg80211_rtw_remain_on_channel(struct wiphy *wiphy,
                                        }\r
 \r
                                        ATOMIC_SET(&pwdev_priv->switch_ch_to, 0);\r
-                       \r
+\r
+                                       #ifdef RTW_ROCH_BACK_OP\r
                                        DBG_8192C("%s, set switch ch timer, duration=%d\n", __func__, duration-pwdinfo->ext_listen_interval);\r
-                                       _set_timer(&pwdinfo->ap_p2p_switch_timer, duration-pwdinfo->ext_listen_interval);       \r
+                                       _set_timer(&pwdinfo->ap_p2p_switch_timer, duration-pwdinfo->ext_listen_interval);\r
+                                       #endif\r
                                }                       \r
                        }\r
                \r
@@ -4856,17 +4886,15 @@ static s32 cfg80211_rtw_cancel_remain_on_channel(struct wiphy *wiphy,
        pwdinfo = &padapter->wdinfo;\r
        pcfg80211_wdinfo = &padapter->cfg80211_wdinfo;\r
 \r
-       DBG_871X(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(padapter));\r
+       DBG_871X(FUNC_ADPT_FMT" cookie:0x%llx\n", FUNC_ADPT_ARG(padapter), cookie);\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
@@ -5177,10 +5205,27 @@ dump:
                goto cancel_ps_deny;\r
        }\r
 \r
-       do {\r
+       while (1) {\r
+               u32 sleep_ms = 0;\r
+               u32 retry_guarantee_ms = 0;\r
+\r
                dump_cnt++;\r
                tx_ret = _cfg80211_rtw_mgmt_tx(padapter, tx_ch, buf, len);\r
-       } while (dump_cnt < dump_limit && tx_ret != _SUCCESS);\r
+\r
+               switch (action) {\r
+               case ACT_PUBLIC_GAS_INITIAL_REQ:\r
+               case ACT_PUBLIC_GAS_INITIAL_RSP:\r
+                       sleep_ms = 50;\r
+                       retry_guarantee_ms = RTW_MAX_MGMT_TX_MS_GAS;\r
+               }\r
+\r
+               if (tx_ret == _SUCCESS\r
+                       || (dump_cnt >= dump_limit && rtw_get_passing_time_ms(start) >= retry_guarantee_ms))\r
+                               break;\r
+\r
+               if (sleep_ms > 0)\r
+                       rtw_msleep_os(sleep_ms);\r
+       }\r
 \r
        if (tx_ret != _SUCCESS || dump_cnt > 1) {\r
                DBG_871X(FUNC_ADPT_FMT" %s (%d/%d) in %d ms\n", FUNC_ADPT_ARG(padapter),\r
@@ -5819,14 +5864,14 @@ void rtw_cfg80211_init_wiphy(_adapter *padapter)
 \r
        DBG_8192C("%s:rf_type=%d\n", __func__, rf_type);\r
 \r
-       /* if (padapter->registrypriv.wireless_mode & WIRELESS_11G) */\r
+       if (padapter->registrypriv.wireless_mode & WIRELESS_11G)\r
        {\r
                bands = wiphy->bands[IEEE80211_BAND_2GHZ];\r
                if(bands)\r
                        rtw_cfg80211_init_ht_capab(&bands->ht_cap, IEEE80211_BAND_2GHZ, rf_type);\r
        }\r
 \r
-       /* if (padapter->registrypriv.wireless_mode & WIRELESS_11A) */\r
+       if (padapter->registrypriv.wireless_mode & WIRELESS_11A)\r
        {\r
                bands = wiphy->bands[IEEE80211_BAND_5GHZ];\r
                if(bands)\r
@@ -5881,7 +5926,9 @@ static void rtw_cfg80211_preinit_wiphy(_adapter *padapter, struct wiphy *wiphy)
                                                                | BIT(NL80211_IFTYPE_ADHOC)\r
 #ifdef CONFIG_AP_MODE\r
                                                                | BIT(NL80211_IFTYPE_AP)\r
+                                                               #ifndef CONFIG_RADIO_WORK\r
                                                                | BIT(NL80211_IFTYPE_MONITOR)\r
+                                                               #endif\r
 #endif\r
 #if defined(CONFIG_P2P) && ((LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE))\r
                                                                | BIT(NL80211_IFTYPE_P2P_CLIENT)\r
@@ -5896,7 +5943,9 @@ static void rtw_cfg80211_preinit_wiphy(_adapter *padapter, struct wiphy *wiphy)
 #endif         \r
 \r
 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,0,0))\r
+       #ifndef CONFIG_RADIO_WORK\r
        wiphy->software_iftypes |= BIT(NL80211_IFTYPE_MONITOR);\r
+       #endif\r
 #endif\r
 \r
        /*\r
@@ -5909,8 +5958,10 @@ static void rtw_cfg80211_preinit_wiphy(_adapter *padapter, struct wiphy *wiphy)
 \r
        /* if (padapter->registrypriv.wireless_mode & WIRELESS_11G) */\r
                wiphy->bands[IEEE80211_BAND_2GHZ] = rtw_spt_band_alloc(IEEE80211_BAND_2GHZ);\r
+#ifdef CONFIG_IEEE80211_BAND_5GHZ\r
        /* if (padapter->registrypriv.wireless_mode & WIRELESS_11A) */\r
                wiphy->bands[IEEE80211_BAND_5GHZ] = rtw_spt_band_alloc(IEEE80211_BAND_5GHZ);\r
+#endif\r
        \r
 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38) && LINUX_VERSION_CODE < KERNEL_VERSION(3,0,0))\r
        wiphy->flags |= WIPHY_FLAG_SUPPORTS_SEPARATE_DEFAULT_KEYS;\r
index d9507337e815e9327c6b1252c8ea898c745babfb..bb005df69465ccb0b3c3dbf23a80a4657920d69a 100755 (executable)
@@ -8053,9 +8053,9 @@ static int rtw_add_sta(struct net_device *dev, struct ieee_param *param)
        if(psta)
        {
                DBG_871X("rtw_add_sta(), free has been added psta=%p\n", psta);
-               _enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL);          
+               //_enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL);
                rtw_free_stainfo(padapter,  psta);              
-               _exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL);
+               //_exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL);
 
                psta = NULL;
        }       
index c5d387919fcae6a8c092619d0eb4534e4b45c4b3..fd7d6a9ae0e9ae4a5194f393080dce6600f9aeb8 100755 (executable)
@@ -320,6 +320,22 @@ 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");
 
+uint rtw_adaptivity_en = CONFIG_RTW_ADAPTIVITY_EN;
+module_param(rtw_adaptivity_en, uint, 0644);
+MODULE_PARM_DESC(rtw_adaptivity_en, "0:disable, 1:enable");
+
+uint rtw_adaptivity_mode = CONFIG_RTW_ADAPTIVITY_MODE;
+module_param(rtw_adaptivity_mode, uint, 0644);
+MODULE_PARM_DESC(rtw_adaptivity_mode, "0:normal, 1:carrier sense");
+
+uint rtw_adaptivity_dml = CONFIG_RTW_ADAPTIVITY_DML;
+module_param(rtw_adaptivity_dml, uint, 0644);
+MODULE_PARM_DESC(rtw_adaptivity_dml, "0:disable, 1:enable");
+
+uint rtw_adaptivity_dc_backoff = CONFIG_RTW_ADAPTIVITY_DC_BACKOFF;
+module_param(rtw_adaptivity_dc_backoff, uint, 0644);
+MODULE_PARM_DESC(rtw_adaptivity_dc_backoff, "DC backoff for Adaptivity");
+
 #if defined(CONFIG_CALIBRATE_TX_POWER_BY_REGULATORY) //eFuse: Regulatory selection=1
 int rtw_tx_pwr_lmt_enable = 1;
 int rtw_tx_pwr_by_rate = 1;
@@ -533,6 +549,12 @@ _func_enter_;
        registry_par->qos_opt_enable = (u8)rtw_qos_opt_enable;
 
        registry_par->hiq_filter = (u8)rtw_hiq_filter;
+
+       registry_par->adaptivity_en = (u8)rtw_adaptivity_en;
+       registry_par->adaptivity_mode = (u8)rtw_adaptivity_mode;
+       registry_par->adaptivity_dml = (u8)rtw_adaptivity_dml;
+       registry_par->adaptivity_dc_backoff = (u8)rtw_adaptivity_dc_backoff;
+
 _func_exit_;
 
        return status;
index 59ce0dc418e83f6af1399ad7ce7557cb6bb5e1bf..62ad6da683e7e18453b6b2772fa5aeef0a84ef34 100755 (executable)
@@ -64,6 +64,9 @@ const char *android_wifi_cmd_str[ANDROID_WIFI_CMD_MAX] = {
        "P2P_GET_NOA",
        "P2P_SET_PS",
        "SET_AP_WPS_P2P_IE",
+
+       "MIRACAST",
+
 #ifdef CONFIG_PNO_SUPPORT
        "PNOSSIDCLR",
        "PNOSETUP",
@@ -73,6 +76,7 @@ const char *android_wifi_cmd_str[ANDROID_WIFI_CMD_MAX] = {
 
        "MACADDR",
 
+       "BLOCK_SCAN",
        "BLOCK",
        "WFD-ENABLE",
        "WFD-DISABLE",
@@ -346,6 +350,18 @@ int rtw_android_get_p2p_dev_addr(struct net_device *net, char *command, int tota
        return bytes_written;
 }
 
+int rtw_android_set_block_scan(struct net_device *net, char *command, int total_len)
+{
+       _adapter *adapter = (_adapter *)rtw_netdev_priv(net);
+       char *block_value = command + strlen(android_wifi_cmd_str[ANDROID_WIFI_CMD_BLOCK_SCAN]) + 1;
+
+       #ifdef CONFIG_IOCTL_CFG80211
+       adapter_wdev_data(adapter)->block_scan = (*block_value == '0')?_FALSE:_TRUE;
+       #endif
+
+       return 0;
+}
+
 int rtw_android_set_block(struct net_device *net, char *command, int total_len)
 {
        _adapter *adapter = (_adapter *)rtw_netdev_priv(net);
@@ -381,6 +397,28 @@ int rtw_android_getband(struct net_device *net, char *command, int total_len)
        return bytes_written;
 }
 
+#ifdef CONFIG_WFD
+int rtw_android_set_miracast_mode(struct net_device *net, char *command, int total_len)
+{
+       _adapter *adapter = (_adapter *)rtw_netdev_priv(net);
+       struct wifi_display_info *wfd_info = &adapter->wfd_info;
+       char *arg = command + strlen(android_wifi_cmd_str[ANDROID_WIFI_CMD_MIRACAST]) + 1;
+       u8 mode;
+       int num;
+       int ret = _FAIL;
+
+       num = sscanf(arg, "%hhu", &mode);
+
+       if (num >= 1) {
+               wfd_info->stack_wfd_mode = mode;
+               DBG_871X("Miracast mode: %s(%u)\n", get_miracast_mode_str(wfd_info->stack_wfd_mode), wfd_info->stack_wfd_mode);
+               ret = _SUCCESS;
+       }
+
+       return (ret == _SUCCESS)?0:-1;
+}
+#endif /* CONFIG_WFD */
+
 int get_int_from_command( char* pcmd )
 {
        int i = 0;
@@ -545,7 +583,11 @@ int rtw_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd)
        case ANDROID_WIFI_CMD_MACADDR:
                bytes_written = rtw_android_get_macaddr(net, command, priv_cmd.total_len);
                break;
-               
+
+       case ANDROID_WIFI_CMD_BLOCK_SCAN:
+               bytes_written = rtw_android_set_block_scan(net, command, priv_cmd.total_len);
+               break;
+
        case ANDROID_WIFI_CMD_BLOCK:
                bytes_written = rtw_android_set_block(net, command, priv_cmd.total_len);
                break;
@@ -595,7 +637,7 @@ int rtw_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd)
        case ANDROID_WIFI_CMD_GETBAND:
                bytes_written = rtw_android_getband(net, command, priv_cmd.total_len);
                break;
-               
+
        case ANDROID_WIFI_CMD_COUNTRY:
                bytes_written = rtw_android_set_country(net, command, priv_cmd.total_len);
                break;
@@ -639,6 +681,11 @@ int rtw_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd)
 #endif //CONFIG_IOCTL_CFG80211
 
 #ifdef CONFIG_WFD
+
+       case ANDROID_WIFI_CMD_MIRACAST:
+               bytes_written = rtw_android_set_miracast_mode(net, command, priv_cmd.total_len);
+               break;
+
        case ANDROID_WIFI_CMD_WFD_ENABLE:
        {
                //      Commented by Albert 2012/07/24
index dd0947613929bf91bf9bf95a4bc9f1f1caa9d126..37435041d1ae82f1d5e8598166452d6071bf45ce 100755 (executable)
@@ -648,23 +648,18 @@ ssize_t proc_set_odm_adaptivity(struct file *file, const char __user *buffer, si
        char tmp[32];
        u32 TH_L2H_ini;
        s8 TH_EDCCA_HL_diff;
-       u32 IGI_Base;
-       int ForceEDCCA;
-       u8 AdapEn_RSSI;
-       u8 IGI_LowerBound;
 
        if (count < 1)
                return -EFAULT;
 
        if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {
 
-               int num = sscanf(tmp, "%x %hhd %x %d %hhu %hhu",
-                       &TH_L2H_ini, &TH_EDCCA_HL_diff, &IGI_Base, &ForceEDCCA, &AdapEn_RSSI, &IGI_LowerBound);
+               int num = sscanf(tmp, "%x %hhd",        &TH_L2H_ini, &TH_EDCCA_HL_diff);
 
-               if (num != 6)
+               if (num != 2)
                        return count;
 
-               rtw_odm_adaptivity_parm_set(padapter, (s8)TH_L2H_ini, TH_EDCCA_HL_diff, (s8)IGI_Base, (bool)ForceEDCCA, AdapEn_RSSI, IGI_LowerBound);
+               rtw_odm_adaptivity_parm_set(padapter, (s8)TH_L2H_ini, TH_EDCCA_HL_diff);
        }
        
        return count;
index 0cc47c18d6b38fd5c72df60ae4343e31556b5ec3..0de8f110bd9c3dffc77167684d623fb43e4e236f 100755 (executable)
@@ -7,7 +7,7 @@
 /*
  * Broadcom BCM4319 driver version.
  */
-#define RTL8192_DRV_VERSION "3.80.WFD"
+#define RTL8192_DRV_VERSION "3.80.WFD.beta"
 
 #endif /* WIFI_VERSION_H */