net: wireless: rockchip_wlan: add rtl8723bs support
[firefly-linux-kernel-4.4.55.git] / drivers / net / wireless / rockchip_wlan / rtl8723bs / os_dep / linux / ioctl_linux.c
old mode 100755 (executable)
new mode 100644 (file)
index 1c6c50b..22bb5c2
 #define _IOCTL_LINUX_C_
 
 #include <drv_types.h>
-
-//#ifdef CONFIG_MP_INCLUDED
+#include <rtw_mp.h>
 #include <rtw_mp_ioctl.h>
-#include "../../hal/OUTSRC/phydm_precomp.h"
-//#endif
-
-#if defined(CONFIG_RTL8723A)
-#include "rtl8723a_hal.h"
-#include <rtw_bt_mp.h>
-#endif
-
-#if defined(CONFIG_RTL8723B)
-#include <rtw_bt_mp.h>
-#endif
+#include "../../hal/phydm/phydm_precomp.h"
 
 #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27))
 #define  iwe_stream_add_event(a, b, c, d, e)  iwe_stream_add_event(b, c, d, e)
@@ -333,10 +322,8 @@ static int search_p2p_wfd_ie(_adapter *padapter,
                                u32     p2pielen = 0;
 
                                //      Verifying the P2P IE
-                               if (rtw_get_p2p_ie_from_scan_queue(&pnetwork->network.IEs[0], pnetwork->network.IELength, NULL, &p2pielen, pnetwork->network.Reserved[0])) 
-                               {
+                               if (rtw_bss_ex_get_p2p_ie(&pnetwork->network, NULL, &p2pielen))
                                        blnGotP2PIE = _TRUE;
-                               }
                        }
 
                        if ( blnGotP2PIE == _FALSE )
@@ -351,16 +338,16 @@ static int search_p2p_wfd_ie(_adapter *padapter,
        if ( SCAN_RESULT_WFD_TYPE == pwdinfo->wfd_info->scan_result_type )
        {
                u32     blnGotWFD = _FALSE;
-               u8      wfd_ie[ 128 ] = { 0x00 };
-               uint    wfd_ielen = 0;
-               
-               if ( rtw_get_wfd_ie_from_scan_queue( &pnetwork->network.IEs[0], pnetwork->network.IELength,  wfd_ie, &wfd_ielen, pnetwork->network.Reserved[0]) )
-               {
-                       u8      wfd_devinfo[ 6 ] = { 0x00 };
-                       uint    wfd_devlen = 6;
-                       
-                       if ( rtw_get_wfd_attr_content( wfd_ie, wfd_ielen, WFD_ATTR_DEVICE_INFO, wfd_devinfo, &wfd_devlen) )
-                       {
+               u8 *wfd_ie;
+               uint wfd_ielen = 0;
+
+               wfd_ie = rtw_bss_ex_get_wfd_ie(&pnetwork->network, NULL, &wfd_ielen);
+               if (wfd_ie) {
+                       u8 *wfd_devinfo;
+                       uint wfd_devlen;
+
+                       wfd_devinfo = rtw_get_wfd_attr_content(wfd_ie, wfd_ielen, WFD_ATTR_DEVICE_INFO, NULL, &wfd_devlen);
+                       if (wfd_devinfo) {
                                if ( pwdinfo->wfd_info->wfd_device_type == WFD_DEVINFO_PSINK )
                                {
                                        //      the first two bits will indicate the WFD device type
@@ -813,18 +800,18 @@ static inline char *  iwe_stream_rssi_process(_adapter *padapter,
        
        
        #ifdef CONFIG_SIGNAL_DISPLAY_DBM
-       iwe->u.qual.level = (u8) translate_percentage_to_dbm(ss);//dbm
+       iwe->u.qual.level = (u8) translate_percentage_to_dbm(ss); /* dbm */
+       #else
+       #ifdef CONFIG_SIGNAL_SCALE_MAPPING
+       iwe->u.qual.level = (u8)ss; /* % */
        #else
-       #ifdef CONFIG_SKIP_SIGNAL_SCALE_MAPPING
        {
                /* Do signal scale mapping when using percentage as the unit of signal strength, since the scale mapping is skipped in odm */
                
                HAL_DATA_TYPE *pHal = GET_HAL_DATA(padapter);
                
                iwe->u.qual.level = (u8)odm_SignalScaleMapping(&pHal->odmpriv, ss);
-       }
-       #else
-       iwe->u.qual.level = (u8)ss;//%
+       }       
        #endif
        #endif
        
@@ -1263,9 +1250,11 @@ static char *translate_scan(_adapter *padapter,
        
        
        #ifdef CONFIG_SIGNAL_DISPLAY_DBM
-       iwe.u.qual.level = (u8) translate_percentage_to_dbm(ss);//dbm
+       iwe.u.qual.level = (u8) translate_percentage_to_dbm(ss); /* dbm */
+       #else
+       #ifdef CONFIG_SIGNAL_SCALE_MAPPING
+       iwe.u.qual.level = (u8)ss; /* % */
        #else
-       #ifdef CONFIG_SKIP_SIGNAL_SCALE_MAPPING
        {
                /* Do signal scale mapping when using percentage as the unit of signal strength, since the scale mapping is skipped in odm */
                
@@ -1273,8 +1262,6 @@ static char *translate_scan(_adapter *padapter,
                
                iwe.u.qual.level = (u8)odm_SignalScaleMapping(&pHal->odmpriv, ss);
        }
-       #else
-       iwe.u.qual.level = (u8)ss;//%
        #endif
        #endif
        
@@ -1376,7 +1363,6 @@ static int wpa_set_encryption(struct net_device *dev, struct ieee_param *param,
 {
        int ret = 0;
        u32 wep_key_idx, wep_key_len,wep_total_len;
-       NDIS_802_11_WEP  *pwep = NULL;  
        _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
        struct mlme_priv        *pmlmepriv = &padapter->mlmepriv;               
        struct security_priv *psecuritypriv = &padapter->securitypriv;
@@ -1426,77 +1412,38 @@ _func_enter_;
                RT_TRACE(_module_rtl871x_ioctl_os_c,_drv_err_,("wpa_set_encryption, crypt.alg = WEP\n"));
                DBG_871X("wpa_set_encryption, crypt.alg = WEP\n");
 
-               padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption1Enabled;
-               padapter->securitypriv.dot11PrivacyAlgrthm=_WEP40_;
-               padapter->securitypriv.dot118021XGrpPrivacy=_WEP40_;
-
                wep_key_idx = param->u.crypt.idx;
                wep_key_len = param->u.crypt.key_len;
 
-               RT_TRACE(_module_rtl871x_ioctl_os_c,_drv_info_,("(1)wep_key_idx=%d\n", wep_key_idx));
-               DBG_871X("(1)wep_key_idx=%d\n", wep_key_idx);
-
-               if (wep_key_idx > WEP_KEYS)
-                       return -EINVAL;
-
-               RT_TRACE(_module_rtl871x_ioctl_os_c,_drv_info_,("(2)wep_key_idx=%d\n", wep_key_idx));
-
-               if (wep_key_len > 0) 
+               if ((wep_key_idx > WEP_KEYS) || (wep_key_len <= 0))
                {
-                       wep_key_len = wep_key_len <= 5 ? 5 : 13;
-                       wep_total_len = wep_key_len + FIELD_OFFSET(NDIS_802_11_WEP, KeyMaterial);
-                       pwep =(NDIS_802_11_WEP   *) rtw_malloc(wep_total_len);
-                       if(pwep == NULL){
-                               RT_TRACE(_module_rtl871x_ioctl_os_c,_drv_err_,(" wpa_set_encryption: pwep allocate fail !!!\n"));
-                               goto exit;
-                       }
-
-                       _rtw_memset(pwep, 0, wep_total_len);
-
-                       pwep->KeyLength = wep_key_len;
-                       pwep->Length = wep_total_len;
-
-                       if(wep_key_len==13)
-                       {
-                               padapter->securitypriv.dot11PrivacyAlgrthm=_WEP104_;
-                               padapter->securitypriv.dot118021XGrpPrivacy=_WEP104_;
-                       }
-               }
-               else {          
                        ret = -EINVAL;
                        goto exit;
                }
 
-               pwep->KeyIndex = wep_key_idx;
-               pwep->KeyIndex |= 0x80000000;
+               if (psecuritypriv->bWepDefaultKeyIdxSet == 0) {
+                       /* wep default key has not been set, so use this key index as default key.*/
 
-               _rtw_memcpy(pwep->KeyMaterial,  param->u.crypt.key, pwep->KeyLength);
+                       wep_key_len = wep_key_len <= 5 ? 5 : 13;
 
-               if(param->u.crypt.set_tx)
-               {
-                       DBG_871X("wep, set_tx=1\n");
+                       psecuritypriv->ndisencryptstatus = Ndis802_11Encryption1Enabled;
+                       psecuritypriv->dot11PrivacyAlgrthm = _WEP40_;
+                       psecuritypriv->dot118021XGrpPrivacy = _WEP40_;
 
-                       if(rtw_set_802_11_add_wep(padapter, pwep) == (u8)_FAIL)
+                       if (wep_key_len == 13)
                        {
-                               ret = -EOPNOTSUPP ;
+                               psecuritypriv->dot11PrivacyAlgrthm = _WEP104_;
+                               psecuritypriv->dot118021XGrpPrivacy = _WEP104_;
                        }
+
+                       psecuritypriv->dot11PrivacyKeyIndex = wep_key_idx;
                }
-               else
-               {
-                       DBG_871X("wep, set_tx=0\n");
-                       
-                       //don't update "psecuritypriv->dot11PrivacyAlgrthm" and 
-                       //"psecuritypriv->dot11PrivacyKeyIndex=keyid", but can rtw_set_key to fw/cam
                        
-                       if (wep_key_idx >= WEP_KEYS) {
-                               ret = -EOPNOTSUPP ;
-                               goto exit;
-                       }                               
+               _rtw_memcpy(&(psecuritypriv->dot11DefKey[wep_key_idx].skey[0]), param->u.crypt.key, wep_key_len);
                        
-                     _rtw_memcpy(&(psecuritypriv->dot11DefKey[wep_key_idx].skey[0]), pwep->KeyMaterial, pwep->KeyLength);
-                       psecuritypriv->dot11DefKeylen[wep_key_idx]=pwep->KeyLength;     
-                       rtw_set_key(padapter, psecuritypriv, wep_key_idx, 0, _TRUE);
-               }
+               psecuritypriv->dot11DefKeylen[wep_key_idx] = wep_key_len;
+
+               psecuritypriv->key_mask |= BIT(wep_key_idx);
 
                goto exit;              
        }
@@ -1541,7 +1488,10 @@ _func_enter_;
                                        //DEBUG_ERR((" param->u.crypt.key_len=%d\n",param->u.crypt.key_len));
                                        DBG_871X(" ~~~~set sta key:unicastkey\n");
                                        
-                                       rtw_setstakey_cmd(padapter, psta, _TRUE, _TRUE);
+                                       rtw_setstakey_cmd(padapter, psta, UNICAST_KEY, _TRUE);
+                                       
+                                       psta->bpairwise_key_installed = _TRUE;
+                                       
                                }
                                else//group key
                                {                                       
@@ -1680,10 +1630,6 @@ _func_enter_;
 
 exit:
        
-       if (pwep) {
-               rtw_mfree((u8 *)pwep, wep_total_len);           
-       }       
-       
 _func_exit_;
 
        return ret;     
@@ -1962,10 +1908,60 @@ static int rtw_wx_set_freq(struct net_device *dev,
                             struct iw_request_info *info, 
                             union iwreq_data *wrqu, char *extra)
 {      
+
+       _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
+       HAL_DATA_TYPE *hal_data = GET_HAL_DATA(padapter);
+       struct  mlme_priv       *pmlmepriv = &(padapter->mlmepriv);
+       struct wlan_network  *cur_network = &(pmlmepriv->cur_network);
+       int exp = 1, freq = 0, div = 0;
+
        _func_enter_;
 
        RT_TRACE(_module_rtl871x_mlme_c_, _drv_notice_, ("+rtw_wx_set_freq\n"));
 
+       if (wrqu->freq.m <= 1000) {
+               if (wrqu->freq.flags == IW_FREQ_AUTO) {
+                       if (rtw_ch_set_search_ch(padapter->mlmeextpriv.channel_set, wrqu->freq.m) > 0) {
+                               padapter->mlmeextpriv.cur_channel = wrqu->freq.m;
+                               DBG_871X("%s: channel is auto, set to channel %d\n", __func__, wrqu->freq.m);
+                       } else {
+                               padapter->mlmeextpriv.cur_channel = 1;
+                               DBG_871X("%s: channel is auto, Channel Plan don't match just set to channel 1\n", __func__);
+                       }
+               } else {
+                       padapter->mlmeextpriv.cur_channel = wrqu->freq.m;
+                       DBG_871X("%s: set to channel %d\n", __func__, padapter->mlmeextpriv.cur_channel);
+               }
+       } else {
+               while (wrqu->freq.e) {
+                       exp *= 10;
+                       wrqu->freq.e--;
+               }
+
+               freq = wrqu->freq.m;
+
+               while (!(freq%10)) {
+                       freq /= 10;
+                       exp *= 10;
+               }
+
+               /* freq unit is MHz here */
+               div = 1000000/exp;
+
+               if (div)
+                       freq /= div;
+               else {
+                       div = exp/1000000;
+                       freq *= div;
+               }
+
+               /* If freq is invalid, rtw_freq2ch() will return channel 1 */
+               padapter->mlmeextpriv.cur_channel = rtw_freq2ch(freq);
+               DBG_871X("%s: set to channel %d\n", __func__, padapter->mlmeextpriv.cur_channel);
+       }
+
+       set_channel_bwmode(padapter, padapter->mlmeextpriv.cur_channel, HAL_PRIME_CHNL_OFFSET_DONT_CARE, CHANNEL_WIDTH_20);
+
        _func_exit_;
        
        return 0;
@@ -1978,16 +1974,14 @@ static int rtw_wx_get_freq(struct net_device *dev,
        _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
        struct  mlme_priv       *pmlmepriv = &(padapter->mlmepriv);
        WLAN_BSSID_EX  *pcur_bss = &pmlmepriv->cur_network.network;
-       
-       if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)
-       {
-               //wrqu->freq.m = ieee80211_wlan_frequencies[pcur_bss->Configuration.DSConfig-1] * 100000;
+
+       if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE && check_fwstate(pmlmepriv, WIFI_MONITOR_STATE) != _TRUE) {
+
                wrqu->freq.m = rtw_ch2freq(pcur_bss->Configuration.DSConfig) * 100000;
                wrqu->freq.e = 1;
                wrqu->freq.i = pcur_bss->Configuration.DSConfig;
 
-       }
-       else{
+       } else {
                wrqu->freq.m = rtw_ch2freq(padapter->mlmeextpriv.cur_channel) * 100000;
                wrqu->freq.e = 1;
                wrqu->freq.i = padapter->mlmeextpriv.cur_channel;
@@ -2000,6 +1994,7 @@ static int rtw_wx_set_mode(struct net_device *dev, struct iw_request_info *a,
                             union iwreq_data *wrqu, char *b)
 {
        _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
+       struct  mlme_priv       *pmlmepriv = &(padapter->mlmepriv);
        NDIS_802_11_NETWORK_INFRASTRUCTURE networkType ;
        int ret = 0;
        
@@ -2010,13 +2005,25 @@ static int rtw_wx_set_mode(struct net_device *dev, struct iw_request_info *a,
                goto exit;
        }
 
-       if (padapter->hw_init_completed==_FALSE){
+       if (!rtw_is_hw_init_completed(padapter)) {
                ret = -EPERM;
                goto exit;
        }
-       
+
+       /* initial default type */
+       dev->type = ARPHRD_ETHER;
+
        switch(wrqu->mode)
        {
+               case IW_MODE_MONITOR:
+                       networkType = Ndis802_11Monitor;
+#if 0
+                       dev->type = ARPHRD_IEEE80211; /* IEEE 802.11 : 801 */
+#endif
+                       dev->type = ARPHRD_IEEE80211_RADIOTAP; /* IEEE 802.11 + radiotap header : 803 */
+                       DBG_871X("set_mode = IW_MODE_MONITOR\n");
+                       break;
+
                case IW_MODE_AUTO:
                        networkType = Ndis802_11AutoUnknown;
                        DBG_871X("set_mode = IW_MODE_AUTO\n");  
@@ -2061,6 +2068,9 @@ static int rtw_wx_set_mode(struct net_device *dev, struct iw_request_info *a,
 
        rtw_setopmode_cmd(padapter, networkType,_TRUE);
 
+       if (check_fwstate(pmlmepriv, WIFI_MONITOR_STATE) == _TRUE)
+               rtw_indicate_connect(padapter);
+
 exit:
        
        _func_exit_;
@@ -2092,11 +2102,10 @@ static int rtw_wx_get_mode(struct net_device *dev, struct iw_request_info *a,
        else if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE)
        {
                wrqu->mode = IW_MODE_MASTER;
-       }
+       } else if (check_fwstate(pmlmepriv, WIFI_MONITOR_STATE) == _TRUE)
+               wrqu->mode = IW_MODE_MONITOR;
        else
-       {
                wrqu->mode = IW_MODE_AUTO;
-       }
 
        _func_exit_;
        
@@ -2270,18 +2279,52 @@ static int rtw_wx_get_range(struct net_device *dev,
 
        /* signal level threshold range */
 
+       /* Quality of link & SNR stuff */
+       /* Quality range (link, level, noise)
+        * If the quality is absolute, it will be in the range [0 ; max_qual],
+        * if the quality is dBm, it will be in the range [max_qual ; 0].
+        * Don't forget that we use 8 bit arithmetics...
+        *
+        * If percentage range is 0~100
+        * Signal strength dbm range logical is -100 ~ 0
+        * but usually value is -90 ~ -20
+        * When CONFIG_SIGNAL_SCALE_MAPPING is defined, dbm range is -95 ~ -45
+        */
+       range->max_qual.qual = 100;
+#ifdef CONFIG_SIGNAL_DISPLAY_DBM
+       range->max_qual.level = (u8)-100;
+       range->max_qual.noise = (u8)-100;
+       range->max_qual.updated = IW_QUAL_ALL_UPDATED; /* Updated all three */
+       range->max_qual.updated |= IW_QUAL_DBM;
+#else /* !CONFIG_SIGNAL_DISPLAY_DBM */
        //percent values between 0 and 100.
-       range->max_qual.qual = 100;     
        range->max_qual.level = 100;
        range->max_qual.noise = 100;
-       range->max_qual.updated = 7; /* Updated all three */
-
-
+       range->max_qual.updated = IW_QUAL_ALL_UPDATED; /* Updated all three */
+#endif /* !CONFIG_SIGNAL_DISPLAY_DBM */
+
+       /* This should contain the average/typical values of the quality
+        * indicator. This should be the threshold between a "good" and
+        * a "bad" link (example : monitor going from green to orange).
+        * Currently, user space apps like quality monitors don't have any
+        * way to calibrate the measurement. With this, they can split
+        * the range between 0 and max_qual in different quality level
+        * (using a geometric subdivision centered on the average).
+        * I expect that people doing the user space apps will feedback
+        * us on which value we need to put in each driver... */
        range->avg_qual.qual = 92; /* > 8% missed beacons is 'bad' */
-       /* TODO: Find real 'good' to 'bad' threshol value for RSSI */
-       range->avg_qual.level = 20 + -98;
+#ifdef CONFIG_SIGNAL_DISPLAY_DBM
+       /* TODO: Find real 'good' to 'bad' threshold value for RSSI */
+       range->avg_qual.level = (u8)-70;
        range->avg_qual.noise = 0;
-       range->avg_qual.updated = 7; /* Updated all three */
+       range->avg_qual.updated = IW_QUAL_ALL_UPDATED; /* Updated all three */
+       range->avg_qual.updated |= IW_QUAL_DBM;
+#else /* !CONFIG_SIGNAL_DISPLAY_DBM */
+       /* TODO: Find real 'good' to 'bad' threshol value for RSSI */
+       range->avg_qual.level = 30;
+       range->avg_qual.noise = 100;
+       range->avg_qual.updated = IW_QUAL_ALL_UPDATED; /* Updated all three */
+#endif /* !CONFIG_SIGNAL_DISPLAY_DBM */
 
        range->num_bitrates = RATE_COUNT;
 
@@ -2399,15 +2442,6 @@ static int rtw_wx_set_wap(struct net_device *dev,
        }
 #endif
 
-#ifdef CONFIG_DUALMAC_CONCURRENT
-       if (dc_check_fwstate(padapter, _FW_UNDER_SURVEY|_FW_UNDER_LINKING)== _TRUE)
-       {
-               DBG_871X("set bssid, but buddy_intf is under scanning or linking\n");
-               ret = -EINVAL;
-               goto exit;
-       }
-#endif
-
        rtw_ps_deny(padapter, PS_DENY_JOIN);
        if(_FAIL == rtw_pwr_wakeup(padapter))
        {
@@ -2564,12 +2598,12 @@ struct  iw_mlme
        {
                case IW_MLME_DEAUTH:
                                if(!rtw_set_802_11_disassociate(padapter))
-                               ret = -1;
+                                       ret = -1;
                                break;
 
                case IW_MLME_DISASSOC:
                                if(!rtw_set_802_11_disassociate(padapter))
-                                               ret = -1;
+                                       ret = -1;
 
                                break;
 
@@ -2616,14 +2650,14 @@ _func_enter_;
                                goto exit;
                }
 #ifdef CONFIG_CONCURRENT_MODE
-                       if (padapter->pbuddy_adapter) {
+               if (padapter->pbuddy_adapter) {
                                if (padapter->pbuddy_adapter->registrypriv.mp_mode == 1)
                                {
                                        DBG_871X(FUNC_ADPT_FMT ": MP mode block Scan request\n", FUNC_ADPT_ARG(padapter->pbuddy_adapter));
                                        ret = -1;
                                        goto exit;
                                }
-                       }
+               }
 #endif //CONFIG_CONCURRENT_MODE
 #endif
 
@@ -2634,8 +2668,8 @@ _func_enter_;
                goto exit;
        }
 
-       if(padapter->bDriverStopped){
-           DBG_871X("bDriverStopped=%d\n", padapter->bDriverStopped);
+       if (rtw_is_drv_stopped(padapter)) {
+               DBG_871X("%s bDriverStopped=_TRUE\n", __func__);
                ret= -1;
                goto exit;
        }
@@ -2645,11 +2679,12 @@ _func_enter_;
                goto exit;
        }
        
-       if (padapter->hw_init_completed==_FALSE){
+       if (!rtw_is_hw_init_completed(padapter)) {
                ret = -1;
                goto exit;
        }
 
+#ifndef CONFIG_DOSCAN_IN_BUSYTRAFFIC
        // When Busy Traffic, driver do not site survey. So driver return success.
        // wpa_supplicant will not issue SIOCSIWSCAN cmd again after scan timeout.
        // modify by thomas 2011-02-22.
@@ -2662,6 +2697,7 @@ _func_enter_;
                indicate_wx_scan_complete_event(padapter);
                goto exit;
        }
+#endif
 
        if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY|_FW_UNDER_LINKING) == _TRUE)
        {
@@ -2678,14 +2714,6 @@ _func_enter_;
        }
 #endif
 
-#ifdef CONFIG_DUALMAC_CONCURRENT
-       if (dc_check_fwstate(padapter, _FW_UNDER_SURVEY|_FW_UNDER_LINKING)== _TRUE)
-       {
-               indicate_wx_scan_complete_event(padapter);
-               goto exit;
-       }
-#endif
-
 #ifdef CONFIG_P2P
        if ( pwdinfo->p2p_state != P2P_STATE_NONE )
        {
@@ -2863,8 +2891,7 @@ static int rtw_wx_get_scan(struct net_device *dev, struct iw_request_info *a,
        }
 #endif
 */     
-       if(adapter_to_pwrctl(padapter)->brfoffbyhw && padapter->bDriverStopped)
-       {
+       if (adapter_to_pwrctl(padapter)->brfoffbyhw && rtw_is_drv_stopped(padapter)) {
                ret = -EINVAL;
                goto exit;
        }
@@ -2872,11 +2899,7 @@ static int rtw_wx_get_scan(struct net_device *dev, struct iw_request_info *a,
 #ifdef CONFIG_P2P
        if(!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))
        {
-               //      P2P is enabled
-               if ( padapter->chip_type == RTL8192D )
-                       wait_for_surveydone = 300;      //      Because the 8192du supports more channels.
-               else
-                       wait_for_surveydone = 200;
+               wait_for_surveydone = 200;
        }
        else
        {
@@ -2907,16 +2930,6 @@ static int rtw_wx_get_scan(struct net_device *dev, struct iw_request_info *a,
                #endif
        ;
 
-#ifdef CONFIG_DUALMAC_CONCURRENT
-       while(dc_check_fwstate(padapter, wait_status)== _TRUE)
-       {
-               rtw_msleep_os(30);
-               cnt++;
-               if(cnt > wait_for_surveydone )
-                       break;
-       }
-#endif // CONFIG_DUALMAC_CONCURRENT
-
        while(check_fwstate(pmlmepriv, wait_status) == _TRUE)
        {       
                rtw_msleep_os(30);
@@ -2999,7 +3012,10 @@ static int rtw_wx_set_essid(struct net_device *dev,
        #ifdef DBG_IOCTL
        DBG_871X("DBG_IOCTL %s:%d\n",__FUNCTION__, __LINE__);
        #endif
-       
+       #ifdef CONFIG_WEXT_DONT_JOIN_BYSSID
+       DBG_871X("%s: CONFIG_WEXT_DONT_JOIN_BYSSID be defined!! only allow bssid joining\n", __func__);
+       return -EPERM;
+       #endif
 /*
 #ifdef CONFIG_CONCURRENT_MODE
        if(padapter->iface_type > PRIMARY_IFACE)
@@ -3021,15 +3037,6 @@ static int rtw_wx_set_essid(struct net_device *dev,
        }
 #endif
 
-#ifdef CONFIG_DUALMAC_CONCURRENT
-       if (dc_check_fwstate(padapter, _FW_UNDER_SURVEY|_FW_UNDER_LINKING)== _TRUE)
-       {
-               DBG_871X("set bssid, but buddy_intf is under scanning or linking\n");
-               ret = -EINVAL;
-               goto exit;
-       }
-#endif
-
        RT_TRACE(_module_rtl871x_ioctl_os_c, _drv_info_,
                 ("+rtw_wx_set_essid: fw_state=0x%08x\n", get_fwstate(pmlmepriv)));
 
@@ -3824,7 +3831,7 @@ static int rtw_wx_set_auth(struct net_device *dev,
                        LeaveAllPowerSaveMode(padapter);
                        rtw_disassoc_cmd(padapter, 500, _FALSE);
                        DBG_871X("%s...call rtw_indicate_disconnect\n ",__FUNCTION__);
-                       rtw_indicate_disconnect(padapter);
+                       rtw_indicate_disconnect(padapter, 0, _FALSE);
                        rtw_free_assoc_resources(padapter, 1);
                }
                #endif
@@ -4209,20 +4216,10 @@ static int rtw_wx_set_channel_plan(struct net_device *dev,
                                union iwreq_data *wrqu, char *extra)
 {
        _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
-       struct registry_priv *pregistrypriv = &padapter->registrypriv;
        struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
-       extern int rtw_channel_plan;
        u8 channel_plan_req = (u8) (*((int *)wrqu));
 
-       #if 0
-       rtw_channel_plan = (int)wrqu->data.pointer;
-       pregistrypriv->channel_plan = rtw_channel_plan;
-       pmlmepriv->ChannelPlan = pregistrypriv->channel_plan;
-       #endif
-
-       if (_SUCCESS == rtw_set_chplan_cmd(padapter, channel_plan_req, 1, 1)) {
-               DBG_871X("%s set channel_plan = 0x%02X\n", __func__, pmlmepriv->ChannelPlan);
-       } else 
+       if (_SUCCESS != rtw_set_channel_plan(padapter, channel_plan_req))
                return -EPERM;
 
        return 0;
@@ -4631,8 +4628,7 @@ static int rtw_get_ap_info(struct net_device *dev,
 
        DBG_871X("+rtw_get_aplist_info\n");
 
-       if((padapter->bDriverStopped) || (pdata==NULL))
-       {                
+       if (rtw_is_drv_stopped(padapter) || (pdata == NULL)) {
                ret= -EINVAL;
                goto exit;
        }               
@@ -4735,8 +4731,7 @@ static int rtw_set_pid(struct net_device *dev,
        int *pdata = (int *)wrqu;
        int selector;
 
-       if((padapter->bDriverStopped) || (pdata==NULL))
-       {                
+       if (rtw_is_drv_stopped(padapter) || (pdata == NULL)) {
                ret= -EINVAL;
                goto exit;
        }               
@@ -4769,8 +4764,7 @@ static int rtw_wps_start(struct net_device *dev,
        u32   u32wps_start = 0;
         unsigned int uintRet = 0;
 
-       if((_TRUE == padapter->bDriverStopped) ||(_TRUE==padapter->bSurpriseRemoved) || (NULL== pdata))
-       {                
+       if (RTW_CANNOT_RUN(padapter) || (NULL == pdata)) {
                ret= -EINVAL;
                goto exit;
        }               
@@ -5400,8 +5394,7 @@ static int rtw_p2p_get_peer_wfd_session_available(struct net_device *dev,
        return ret;
                
 }
-
-#endif // CONFIG_WFD
+#endif /* CONFIG_WFD */
 
 static int rtw_p2p_get_go_device_address(struct net_device *dev,
                                                                                 struct iw_request_info *info,
@@ -5446,8 +5439,8 @@ static int rtw_p2p_get_go_device_address(struct net_device *dev,
                        //      Match the device address located in the P2P IE
                        //      This is for the case that the P2P device address is not the same as the P2P interface address.
 
-                       if ((p2pie = rtw_get_p2p_ie_from_scan_queue( &pnetwork->network.IEs[0], pnetwork->network.IELength, NULL, &p2pielen, pnetwork->network.Reserved[0])))
-                       {
+                       p2pie = rtw_bss_ex_get_p2p_ie(&pnetwork->network, NULL, &p2pielen);
+                       if (p2pie) {
                                while (p2pie)
                                {
                                        //      The P2P Device ID attribute is included in the Beacon frame.
@@ -5468,7 +5461,7 @@ static int rtw_p2p_get_go_device_address(struct net_device *dev,
                                        }
 
                                        //Get the next P2P IE
-                                       p2pie = rtw_get_p2p_ie(p2pie + p2pielen, pnetwork->network.IELength - 12 - (p2pie - &pnetwork->network.IEs[12] + p2pielen), NULL, &p2pielen);
+                                       p2pie = rtw_get_p2p_ie(p2pie + p2pielen, BSS_EX_TLV_IES_LEN(&pnetwork->network) - (p2pie + p2pielen - BSS_EX_TLV_IES(&pnetwork->network)), NULL, &p2pielen);
                                }
                        }
                }
@@ -5690,8 +5683,8 @@ static int rtw_p2p_get_invitation_procedure(struct net_device *dev,
                        //      Match the device address located in the P2P IE
                        //      This is for the case that the P2P device address is not the same as the P2P interface address.
 
-                       if ((p2pie = rtw_get_p2p_ie_from_scan_queue( &pnetwork->network.IEs[0], pnetwork->network.IELength, NULL, &p2pielen, pnetwork->network.Reserved[0])))
-                       {
+                       p2pie = rtw_bss_ex_get_p2p_ie(&pnetwork->network, NULL, &p2pielen);
+                       if (p2pie) {
                                while (p2pie)
                                {
                                        //_rtw_memset( attr_content, 0x00, 2);
@@ -5704,7 +5697,7 @@ static int rtw_p2p_get_invitation_procedure(struct net_device *dev,
                                        }
 
                                        //Get the next P2P IE
-                                       p2pie = rtw_get_p2p_ie(p2pie + p2pielen, pnetwork->network.IELength - 12 - (p2pie - &pnetwork->network.IEs[12] + p2pielen), NULL, &p2pielen);
+                                       p2pie = rtw_get_p2p_ie(p2pie + p2pielen, BSS_EX_TLV_IES_LEN(&pnetwork->network) - (p2pie + p2pielen - BSS_EX_TLV_IES(&pnetwork->network)), NULL, &p2pielen);
                                }
                        }
                }
@@ -5720,13 +5713,10 @@ static int rtw_p2p_get_invitation_procedure(struct net_device *dev,
                sprintf(inv_proc_str, "\nIP=-1");
        } else
        {
-               if (attr_content[0] && 0x20)
-               {
+               if ((attr_content[0] & 0x20) == 0x20)
                        sprintf(inv_proc_str, "\nIP=1");
-               } else
-               {
+               else
                        sprintf(inv_proc_str, "\nIP=0");
-               }
        }
 
        wrqu->data.length = strlen(inv_proc_str);
@@ -5804,7 +5794,15 @@ static int rtw_p2p_connect(struct net_device *dev,
                pnetwork = LIST_CONTAINOR(plist, struct wlan_network, list);
                if ( _rtw_memcmp( pnetwork->network.MacAddress, peerMAC, ETH_ALEN ) )
                {
-                       uintPeerChannel = pnetwork->network.Configuration.DSConfig;
+                       if (pnetwork->network.Configuration.DSConfig != 0)
+                               uintPeerChannel = pnetwork->network.Configuration.DSConfig;
+                       else if (pwdinfo->nego_req_info.peer_ch != 0)
+                               uintPeerChannel = pnetwork->network.Configuration.DSConfig = pwdinfo->nego_req_info.peer_ch;
+                       else{
+                               /* Unexpected case */
+                               uintPeerChannel = 0;
+                               DBG_871X("%s  uintPeerChannel = 0\n", __func__);
+                       }
                        break;
                }
 
@@ -5909,16 +5907,11 @@ static int rtw_p2p_invite_req(struct net_device *dev,
        uint                                            p2pielen = 0, attr_contentlen = 0;
        _irqL                                   irqL;
        struct tx_invite_req_info*      pinvite_req_info = &pwdinfo->invitereq_info;
-       u8 ie_offset = 12;
 #ifdef CONFIG_CONCURRENT_MODE
        _adapter                                        *pbuddy_adapter = padapter->pbuddy_adapter;
        struct mlme_priv                        *pbuddy_mlmepriv = &pbuddy_adapter->mlmepriv;
        struct mlme_ext_priv            *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv;
 #endif // CONFIG_CONCURRENT_MODE
-
-#ifdef CONFIG_WFD
-       struct wifi_display_info*       pwfd_info = pwdinfo->wfd_info;
-#endif // CONFIG_WFD
        
        //      Commented by Albert 20120321
        //      The input data contains two informations.
@@ -5973,9 +5966,8 @@ static int rtw_p2p_invite_req(struct net_device *dev,
                //      Match the device address located in the P2P IE
                //      This is for the case that the P2P device address is not the same as the P2P interface address.
 
-               ie_offset = (pnetwork->network.Reserved[0] == 2? 0:12);
-               if ( (p2pie=rtw_get_p2p_ie_from_scan_queue( &pnetwork->network.IEs[0], pnetwork->network.IELength, NULL, &p2pielen, pnetwork->network.Reserved[0])))
-               {
+               p2pie = rtw_bss_ex_get_p2p_ie(&pnetwork->network, NULL, &p2pielen);
+               if (p2pie) {
                        //      The P2P Device ID attribute is included in the Beacon frame.
                        //      The P2P Device Info attribute is included in the probe response frame.
 
@@ -6007,19 +5999,19 @@ static int rtw_p2p_invite_req(struct net_device *dev,
        _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
 
 #ifdef CONFIG_WFD
-       if ( uintPeerChannel )
-       {
-               u8      wfd_ie[ 128 ] = { 0x00 };
-               uint    wfd_ielen = 0;
-               
-               if ( rtw_get_wfd_ie_from_scan_queue( &pnetwork->network.IEs[0], pnetwork->network.IELength,  wfd_ie, &wfd_ielen, pnetwork->network.Reserved[0]) )
-               {
-                       u8      wfd_devinfo[ 6 ] = { 0x00 };
-                       uint    wfd_devlen = 6;
+       if (hal_chk_wl_func(padapter, WL_FUNC_MIRACAST) && uintPeerChannel) {
+               struct wifi_display_info *pwfd_info = pwdinfo->wfd_info;
+               u8 *wfd_ie;
+               uint wfd_ielen = 0;
+
+               wfd_ie = rtw_bss_ex_get_wfd_ie(&pnetwork->network, NULL, &wfd_ielen);
+               if (wfd_ie) {
+                       u8 *wfd_devinfo;
+                       uint wfd_devlen;
 
                        DBG_871X( "[%s] Found WFD IE!\n", __FUNCTION__ );
-                       if ( rtw_get_wfd_attr_content( wfd_ie, wfd_ielen, WFD_ATTR_DEVICE_INFO, wfd_devinfo, &wfd_devlen ) )
-                       {
+                       wfd_devinfo = rtw_get_wfd_attr_content(wfd_ie, wfd_ielen, WFD_ATTR_DEVICE_INFO, NULL, &wfd_devlen);
+                       if (wfd_devinfo) {
                                u16     wfd_devinfo_field = 0;
                                
                                //      Commented by Albert 20120319
@@ -6043,7 +6035,7 @@ static int rtw_p2p_invite_req(struct net_device *dev,
                        goto exit;
                }
        }
-#endif // CONFIG_WFD
+#endif /* CONFIG_WFD */
 
        if ( uintPeerChannel )
        {
@@ -6138,10 +6130,6 @@ static int rtw_p2p_set_persistent(struct net_device *dev,
        struct mlme_priv                        *pbuddy_mlmepriv = &pbuddy_adapter->mlmepriv;
        struct mlme_ext_priv            *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv;
 #endif // CONFIG_CONCURRENT_MODE
-
-#ifdef CONFIG_WFD
-       struct wifi_display_info*       pwfd_info = pwdinfo->wfd_info;
-#endif // CONFIG_WFD
        
        //      Commented by Albert 20120328
        //      The input data is 0 or 1
@@ -6313,8 +6301,8 @@ static int rtw_p2p_set_pc(struct net_device *dev,
                //      Match the device address located in the P2P IE
                //      This is for the case that the P2P device address is not the same as the P2P interface address.
 
-               if ( (p2pie=rtw_get_p2p_ie_from_scan_queue( &pnetwork->network.IEs[0], pnetwork->network.IELength, NULL, &p2pielen, pnetwork->network.Reserved[0])))
-               {
+               p2pie = rtw_bss_ex_get_p2p_ie(&pnetwork->network, NULL, &p2pielen);
+               if (p2pie) {
                        //      The P2P Device ID attribute is included in the Beacon frame.
                        //      The P2P Device Info attribute is included in the probe response frame.
                        printk( "[%s] Got P2P IE\n", __FUNCTION__ );
@@ -6350,18 +6338,17 @@ static int rtw_p2p_set_pc(struct net_device *dev,
 
        if ( uintPeerChannel )
        {
-               u8      wfd_ie[ 128 ] = { 0x00 };
-               uint    wfd_ielen = 0;
-               u8 ie_offset = (pnetwork->network.Reserved[0] == 2 ? 0:12);
+               u8 *wfd_ie;
+               uint wfd_ielen = 0;
 
-               if ( rtw_get_wfd_ie_from_scan_queue( &pnetwork->network.IEs[0], pnetwork->network.IELength,  wfd_ie, &wfd_ielen, pnetwork->network.Reserved[0]) )
-               {
-                       u8      wfd_devinfo[ 6 ] = { 0x00 };
-                       uint    wfd_devlen = 6;
+               wfd_ie = rtw_bss_ex_get_wfd_ie(&pnetwork->network, NULL, &wfd_ielen);
+               if (wfd_ie) {
+                       u8 *wfd_devinfo;
+                       uint wfd_devlen;
 
                        DBG_871X( "[%s] Found WFD IE!\n", __FUNCTION__ );
-                       if ( rtw_get_wfd_attr_content( wfd_ie, wfd_ielen, WFD_ATTR_DEVICE_INFO, wfd_devinfo, &wfd_devlen ) )
-                       {
+                       wfd_devinfo = rtw_get_wfd_attr_content(wfd_ie, wfd_ielen, WFD_ATTR_DEVICE_INFO, NULL, &wfd_devlen);
+                       if (wfd_devinfo) {
                                u16     wfd_devinfo_field = 0;
                                
                                //      Commented by Albert 20120319
@@ -6434,10 +6421,10 @@ static int rtw_p2p_set_wfd_enable(struct net_device *dev,
        _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
        struct wifidirect_info *pwdinfo= &(padapter->wdinfo);
 
-       if(*extra == '0' )
-               pwdinfo->wfd_info->wfd_enable = _FALSE;
-       else if(*extra == '1')
-               pwdinfo->wfd_info->wfd_enable = _TRUE;
+       if (*extra == '0')
+               rtw_wfd_enable(padapter, 0);
+       else if (*extra == '1')
+               rtw_wfd_enable(padapter, 1);
 
        DBG_871X( "[%s] wfd_enable = %d\n", __FUNCTION__, pwdinfo->wfd_info->wfd_enable );
        
@@ -6511,7 +6498,7 @@ exit:
        return ret;
                
 }
-#endif // CONFIG_WFD
+#endif /* CONFIG_WFD */
 
 static int rtw_p2p_prov_disc(struct net_device *dev,
                                struct iw_request_info *info,
@@ -6532,15 +6519,11 @@ static int rtw_p2p_prov_disc(struct net_device *dev,
        u8 *p2pie;
        uint                                    p2pielen = 0, attr_contentlen = 0;
        _irqL                           irqL;
-       u8                                      ie_offset = 12;
 #ifdef CONFIG_CONCURRENT_MODE
        _adapter                                *pbuddy_adapter = padapter->pbuddy_adapter;
        struct mlme_priv                *pbuddy_mlmepriv = &pbuddy_adapter->mlmepriv;
        struct mlme_ext_priv    *pbuddy_mlmeext = &pbuddy_adapter->mlmeextpriv;
 #endif // CONFIG_CONCURRENT_MODE       
-#ifdef CONFIG_WFD
-       struct wifi_display_info*       pwfd_info = pwdinfo->wfd_info;
-#endif // CONFIG_WFD
 
        //      Commented by Albert 20110301
        //      The input data contains two informations.
@@ -6622,9 +6605,8 @@ static int rtw_p2p_prov_disc(struct net_device *dev,
                //      Match the device address located in the P2P IE
                //      This is for the case that the P2P device address is not the same as the P2P interface address.
 
-               ie_offset = (pnetwork->network.Reserved[0] == 2? 0:12);
-               if ( (p2pie=rtw_get_p2p_ie_from_scan_queue( &pnetwork->network.IEs[0], pnetwork->network.IELength, NULL, &p2pielen, pnetwork->network.Reserved[0])))
-               {
+               p2pie = rtw_bss_ex_get_p2p_ie(&pnetwork->network, NULL, &p2pielen);
+               if (p2pie) {
                        while ( p2pie )
                        {
                                //      The P2P Device ID attribute is included in the Beacon frame.
@@ -6650,7 +6632,7 @@ static int rtw_p2p_prov_disc(struct net_device *dev,
                                }
 
                                //Get the next P2P IE
-                               p2pie = rtw_get_p2p_ie(p2pie+p2pielen, pnetwork->network.IELength - ie_offset -(p2pie -&pnetwork->network.IEs[ie_offset] + p2pielen), NULL, &p2pielen);
+                               p2pie = rtw_get_p2p_ie(p2pie + p2pielen, BSS_EX_TLV_IES_LEN(&pnetwork->network) - (p2pie + p2pielen - BSS_EX_TLV_IES(&pnetwork->network)), NULL, &p2pielen);
                        }
 
                }
@@ -6677,19 +6659,20 @@ static int rtw_p2p_prov_disc(struct net_device *dev,
 
        if ( uintPeerChannel )
        {
-#ifdef CONFIG_WFD
-               {
-                       u8      wfd_ie[ 128 ] = { 0x00 };
-                       uint    wfd_ielen = 0;
-                       
-                       if ( rtw_get_wfd_ie_from_scan_queue( &pnetwork->network.IEs[0], pnetwork->network.IELength,  wfd_ie, &wfd_ielen, pnetwork->network.Reserved[0]) )
-                       {
-                               u8      wfd_devinfo[ 6 ] = { 0x00 };
-                               uint    wfd_devlen = 6;
+               #ifdef CONFIG_WFD
+               if (hal_chk_wl_func(padapter, WL_FUNC_MIRACAST)) {
+                       struct wifi_display_info *pwfd_info = pwdinfo->wfd_info;
+                       u8 *wfd_ie;
+                       uint wfd_ielen = 0;
+
+                       wfd_ie = rtw_bss_ex_get_wfd_ie(&pnetwork->network, NULL, &wfd_ielen);
+                       if (wfd_ie) {
+                               u8 *wfd_devinfo;
+                               uint wfd_devlen;
 
                                DBG_871X( "[%s] Found WFD IE!\n", __FUNCTION__ );
-                               if ( rtw_get_wfd_attr_content( wfd_ie, wfd_ielen, WFD_ATTR_DEVICE_INFO, wfd_devinfo, &wfd_devlen ) )
-                               {
+                               wfd_devinfo = rtw_get_wfd_attr_content(wfd_ie, wfd_ielen, WFD_ATTR_DEVICE_INFO, NULL, &wfd_devlen);
+                               if (wfd_devinfo) {
                                        u16     wfd_devinfo_field = 0;
                                        
                                        //      Commented by Albert 20120319
@@ -6713,7 +6696,7 @@ static int rtw_p2p_prov_disc(struct net_device *dev,
                                goto exit;
                        }
                }
-#endif // CONFIG_WFD
+               #endif /* CONFIG_WFD */
                
                DBG_871X( "[%s] peer channel: %d!\n", __FUNCTION__, uintPeerChannel );
 #ifdef CONFIG_CONCURRENT_MODE
@@ -6927,36 +6910,29 @@ static int rtw_p2p_set(struct net_device *dev,
                wrqu->data.length -= 5;
                ret = rtw_p2p_set_wps_uuid( dev, info, wrqu, &extra[5] );
        }
+
 #ifdef CONFIG_WFD
-       else if ( _rtw_memcmp( extra, "sa=", 3 ) )
-       {
-               //      sa: WFD Session Available information
-               wrqu->data.length -= 3;
-               rtw_p2p_set_sa( dev, info, wrqu, &extra[3] );
-       }
-       else if ( _rtw_memcmp( extra, "pc=", 3 ) )
-       {
-               //      pc: WFD Preferred Connection
-               wrqu->data.length -= 3;
-               rtw_p2p_set_pc( dev, info, wrqu, &extra[3] );
-       }
-       else if ( _rtw_memcmp( extra, "wfd_type=", 9 ) )
-       {
-               //      pc: WFD Preferred Connection
-               wrqu->data.length -= 9;
-               rtw_p2p_set_wfd_device_type( dev, info, wrqu, &extra[9] );
-       }
-       else if ( _rtw_memcmp( extra, "wfd_enable=", 11 ) )
-       {
-               wrqu->data.length -= 11;
-               rtw_p2p_set_wfd_enable( dev, info, wrqu, &extra[11] );
-       }
-       else if ( _rtw_memcmp( extra, "driver_iface=", 13 ) )
-       {
-               wrqu->data.length -= 13;
-               rtw_p2p_set_driver_iface( dev, info, wrqu, &extra[13] );
-       }
-#endif //CONFIG_WFD
+       if (hal_chk_wl_func(padapter, WL_FUNC_MIRACAST)) {
+               if (_rtw_memcmp(extra, "sa=", 3)) {
+                       /* sa: WFD Session Available information */
+                       wrqu->data.length -= 3;
+                       rtw_p2p_set_sa(dev, info, wrqu, &extra[3]);
+               } else if (_rtw_memcmp(extra, "pc=", 3)) {
+                       /* pc: WFD Preferred Connection */
+                       wrqu->data.length -= 3;
+                       rtw_p2p_set_pc(dev, info, wrqu, &extra[3]);
+               } else if (_rtw_memcmp(extra, "wfd_type=", 9)) {
+                       wrqu->data.length -= 9;
+                       rtw_p2p_set_wfd_device_type(dev, info, wrqu, &extra[9]);
+               } else if (_rtw_memcmp(extra, "wfd_enable=", 11)) {
+                       wrqu->data.length -= 11;
+                       rtw_p2p_set_wfd_enable(dev, info, wrqu, &extra[11]);
+               } else if (_rtw_memcmp(extra, "driver_iface=", 13)) {
+                       wrqu->data.length -= 13;
+                       rtw_p2p_set_driver_iface(dev, info, wrqu, &extra[13]);
+               }
+       }
+#endif /* CONFIG_WFD */
 
 #endif //CONFIG_P2P
 
@@ -7018,20 +6994,17 @@ static int rtw_p2p_get(struct net_device *dev,
        {
                rtw_p2p_get_op_ch( dev, info, wrqu, extra);
        }
+
 #ifdef CONFIG_WFD
-       else if ( _rtw_memcmp( wrqu->data.pointer, "peer_port", 9 ) )
-       {
-               rtw_p2p_get_peer_wfd_port( dev, info, wrqu, extra );
-       }
-       else if ( _rtw_memcmp( wrqu->data.pointer, "wfd_sa", 6 ) )
-       {
-               rtw_p2p_get_peer_wfd_session_available( dev, info, wrqu, extra );
-       }
-       else if ( _rtw_memcmp( wrqu->data.pointer, "wfd_pc", 6 ) )
-       {
-               rtw_p2p_get_peer_wfd_preferred_connection( dev, info, wrqu, extra );
+       if (hal_chk_wl_func(padapter, WL_FUNC_MIRACAST)) {
+               if (_rtw_memcmp(wrqu->data.pointer, "peer_port", 9))
+                       rtw_p2p_get_peer_wfd_port(dev, info, wrqu, extra);
+               else if (_rtw_memcmp(wrqu->data.pointer, "wfd_sa", 6))
+                       rtw_p2p_get_peer_wfd_session_available(dev, info, wrqu, extra);
+               else if (_rtw_memcmp(wrqu->data.pointer, "wfd_pc", 6))
+                       rtw_p2p_get_peer_wfd_preferred_connection(dev, info, wrqu, extra);
        }
-#endif // CONFIG_WFD   
+#endif /* CONFIG_WFD */
        
 #endif //CONFIG_P2P
 
@@ -7059,7 +7032,7 @@ static int rtw_p2p_get2(struct net_device *dev,
 
        if (copy_from_user(buffer, wrqu->data.pointer, wrqu->data.length))
        {
-               ret EFAULT;
+               ret = -EFAULT;
                goto bad;
        }
 
@@ -7290,7 +7263,6 @@ static int rtw_dbg_port(struct net_device *dev,
                                case 0x01: //dbg mode
                                        padapter->recvpriv.is_signal_dbg = 1;
                                        extra_arg = extra_arg>100?100:extra_arg;
-                                       extra_arg = extra_arg<0?0:extra_arg;
                                        padapter->recvpriv.signal_strength_dbg=extra_arg;
                                        break;
                        }
@@ -7483,7 +7455,7 @@ static int rtw_dbg_port(struct net_device *dev,
                        break;
                case 0x7a:
                        receive_disconnect(padapter, pmlmeinfo->network.MacAddress
-                               , WLAN_REASON_EXPIRATION_CHK);
+                               , WLAN_REASON_EXPIRATION_CHK, _FALSE);
                        break;
                case 0x7F:
                        switch(minor_cmd)
@@ -7521,9 +7493,6 @@ static int rtw_dbg_port(struct net_device *dev,
                                        psta = rtw_get_stainfo(pstapriv, cur_network->network.MacAddress);
                                        if(psta)
                                        {
-                                               int i;
-                                               struct recv_reorder_ctrl *preorder_ctrl;
-                                       
                                                DBG_871X("SSID=%s\n", cur_network->network.Ssid.Ssid);
                                                DBG_871X("sta's macaddr:" MAC_FMT "\n", MAC_ARG(psta->hwaddr));
                                                DBG_871X("cur_channel=%d, cur_bwmode=%d, cur_ch_offset=%d\n", pmlmeext->cur_channel, pmlmeext->cur_bwmode, pmlmeext->cur_ch_offset);
@@ -7535,16 +7504,8 @@ static int rtw_dbg_port(struct net_device *dev,
                                                DBG_871X("ampdu_enable = %d\n", psta->htpriv.ampdu_enable);     
                                                DBG_871X("agg_enable_bitmap=%x, candidate_tid_bitmap=%x\n", psta->htpriv.agg_enable_bitmap, psta->htpriv.candidate_tid_bitmap);
 #endif //CONFIG_80211N_HT
-                                               
-                                               for(i=0;i<16;i++)
-                                               {                                                       
-                                                       preorder_ctrl = &psta->recvreorder_ctrl[i];
-                                                       if(preorder_ctrl->enable)
-                                                       {
-                                                               DBG_871X("tid=%d, indicate_seq=%d\n", i, preorder_ctrl->indicate_seq);
-                                                       }
-                                               }       
-                                                       
+
+                                               sta_rx_reorder_ctl_dump(RTW_DBGDUMP, psta);
                                        }
                                        else
                                        {                                                       
@@ -7552,18 +7513,13 @@ static int rtw_dbg_port(struct net_device *dev,
                                        }                                       
                                        break;
                                case 0x06:
-                                       {
-                                               u32     ODMFlag;
-                                               rtw_hal_get_hwreg(padapter, HW_VAR_DM_FLAG, (u8*)(&ODMFlag));
-                                               DBG_871X("(B)DMFlag=0x%x, arg=0x%x\n", ODMFlag, arg);
-                                               ODMFlag = (u32)(0x0f&arg);
-                                               DBG_871X("(A)DMFlag=0x%x\n", ODMFlag);
-                                               rtw_hal_set_hwreg(padapter, HW_VAR_DM_FLAG, (u8 *)(&ODMFlag));
+                                       {                                               
                                        }
                                        break;
                                case 0x07:
-                                       DBG_871X("bSurpriseRemoved=%d, bDriverStopped=%d\n", 
-                                               padapter->bSurpriseRemoved, padapter->bDriverStopped);
+                                       DBG_871X("bSurpriseRemoved=%s, bDriverStopped=%s\n"
+                                               , rtw_is_surprise_removed(padapter)?"True":"False"
+                                               , rtw_is_drv_stopped(padapter)?"True":"False");
                                        break;
                                case 0x08:
                                        {
@@ -7583,9 +7539,8 @@ static int rtw_dbg_port(struct net_device *dev,
                                        break;  
                                case 0x09:
                                        {
-                                               int i, j;
+                                               int i;
                                                _list   *plist, *phead;
-                                               struct recv_reorder_ctrl *preorder_ctrl;
                                                
 #ifdef CONFIG_AP_MODE
                                                DBG_871X("sta_dz_bitmap=0x%x, tim_bitmap=0x%x\n", pstapriv->sta_dz_bitmap, pstapriv->tim_bitmap);
@@ -7624,18 +7579,8 @@ static int rtw_dbg_port(struct net_device *dev,
                                                                        DBG_871X("qos_info=0x%x\n", psta->qos_info);
 #endif
                                                                        DBG_871X("dot118021XPrivacy=0x%x\n", psta->dot118021XPrivacy);
-                                                                       
-                                                                       
-                                               
-                                                                       for(j=0;j<16;j++)
-                                                                       {                                                       
-                                                                               preorder_ctrl = &psta->recvreorder_ctrl[j];
-                                                                               if(preorder_ctrl->enable)
-                                                                               {
-                                                                                       DBG_871X("tid=%d, indicate_seq=%d\n", j, preorder_ctrl->indicate_seq);
-                                                                               }
-                                                                       }               
-                                                                       
+
+                                                                       sta_rx_reorder_ctl_dump(RTW_DBGDUMP, psta);
                                                                }                                                       
                        
                                                        }
@@ -7645,13 +7590,7 @@ static int rtw_dbg_port(struct net_device *dev,
 
                                        }
                                        break;
-                               case 0x0a:
-                                       {
-                                               int max_mac_id = 0;
-                                               max_mac_id = rtw_search_max_mac_id( padapter);
-                                               printk("%s ==> max_mac_id = %d \n",__FUNCTION__,max_mac_id);
-                                       }       
-                                       break;
+
                                case 0x0b: //Enable=1, Disable=0 driver control vrtl_carrier_sense.
                                        {
                                                //u8 driver_vcs_en; //Enable=1, Disable=0 driver control vrtl_carrier_sense.
@@ -7685,17 +7624,6 @@ static int rtw_dbg_port(struct net_device *dev,
                                                }
                                        }
                                        break;
-#if 0                          
-                               case 0x0d://dump cam
-                                       {
-                                               //u8 entry = (u8) extra_arg;
-                                               u8 entry=0;
-                                               //dump cam
-                                               for(entry=0;entry<32;entry++)
-                                                       read_cam(padapter,entry);
-                                       }                               
-                                       break;
-#endif
                                case 0x0e:
                                        {
                                                if(arg == 0){
@@ -8021,31 +7949,9 @@ static int rtw_dbg_port(struct net_device *dev,
                                        }
                                        break;          
 
-                               case 0xee://turn on/off dynamic funcs
+                               case 0xee:
                                        {
-                                               u32 odm_flag;
-
-                                               if(0xf==extra_arg){
-                                                       rtw_hal_get_def_var(padapter, HAL_DEF_DBG_DM_FUNC,&odm_flag);                                                   
-                                                       DBG_871X(" === DMFlag(0x%08x) === \n",odm_flag);
-                                                       DBG_871X("extra_arg = 0  - disable all dynamic func \n");
-                                                       DBG_871X("extra_arg = 1  - disable DIG- BIT(0)\n");
-                                                       DBG_871X("extra_arg = 2  - disable High power - BIT(1)\n");
-                                                       DBG_871X("extra_arg = 3  - disable tx power tracking - BIT(2)\n");
-                                                       DBG_871X("extra_arg = 4  - disable BT coexistence - BIT(3)\n");
-                                                       DBG_871X("extra_arg = 5  - disable antenna diversity - BIT(4)\n");
-                                                       DBG_871X("extra_arg = 6  - enable all dynamic func \n");                                                        
-                                               }
-                                               else{
-                                                       /*      extra_arg = 0  - disable all dynamic func
-                                                               extra_arg = 1  - disable DIG
-                                                               extra_arg = 2  - disable tx power tracking
-                                                               extra_arg = 3  - turn on all dynamic func
-                                                       */                      
-                                                       rtw_hal_set_def_var(padapter, HAL_DEF_DBG_DM_FUNC, &(extra_arg));
-                                                       rtw_hal_get_def_var(padapter, HAL_DEF_DBG_DM_FUNC,&odm_flag);                                                   
-                                                       DBG_871X(" === DMFlag(0x%08x) === \n",odm_flag);
-                                               }
+                                               DBG_871X(" === please control /proc  to trun on/off PHYDM func === \n");
                                        }
                                        break;
 
@@ -8340,7 +8246,11 @@ static int rtw_set_encryption(struct net_device *dev, struct ieee_param *param,
            param->sta_addr[2] == 0xff && param->sta_addr[3] == 0xff &&
            param->sta_addr[4] == 0xff && param->sta_addr[5] == 0xff) 
        {
-               if (param->u.crypt.idx >= WEP_KEYS)
+               if (param->u.crypt.idx >= WEP_KEYS
+#ifdef CONFIG_IEEE80211W
+                       && param->u.crypt.idx > BIP_MAX_KEYID
+#endif /* CONFIG_IEEE80211W */
+                       )
                {
                        ret = -EINVAL;
                        goto exit;
@@ -8493,6 +8403,23 @@ static int rtw_set_encryption(struct net_device *dev, struct ieee_param *param,
 
                                _rtw_memcpy(psecuritypriv->dot118021XGrpKey[param->u.crypt.idx].skey,  param->u.crypt.key, (param->u.crypt.key_len>16 ?16:param->u.crypt.key_len));
                        }
+#ifdef CONFIG_IEEE80211W
+                       else if (strcmp(param->u.crypt.alg, "BIP") == 0) {
+                               int no;
+                               
+                               DBG_871X("BIP key_len=%d , index=%d\n", param->u.crypt.key_len, param->u.crypt.idx);
+                               /* save the IGTK key, length 16 bytes */
+                               _rtw_memcpy(padapter->securitypriv.dot11wBIPKey[param->u.crypt.idx].skey, param->u.crypt.key, (param->u.crypt.key_len > 16 ? 16:param->u.crypt.key_len));
+                               /* DBG_871X("IGTK key below:\n");
+                               for(no=0;no<16;no++)
+                                       printk(" %02x ", padapter->securitypriv.dot11wBIPKey[param->u.crypt.idx].skey[no]);
+                               DBG_871X("\n"); */
+                               padapter->securitypriv.dot11wBIPKeyid = param->u.crypt.idx;
+                               padapter->securitypriv.binstallBIPkey = _TRUE;
+                               DBG_871X(" ~~~~set sta key:IGKT\n");
+                               goto exit;
+                       }
+#endif /* CONFIG_IEEE80211W */
                        else
                        {
                                DBG_871X("%s, set group_key, none\n", __FUNCTION__);
@@ -8570,6 +8497,8 @@ static int rtw_set_encryption(struct net_device *dev, struct ieee_param *param,
                                rtw_ap_set_pairwise_key(padapter, psta);
                                        
                                psta->ieee8021x_blocked = _FALSE;
+                               
+                               psta->bpairwise_key_installed = _TRUE;
                                        
                        }                       
                        else//group key???
@@ -8684,7 +8613,7 @@ static int rtw_hostapd_sta_flush(struct net_device *dev)
 
        flush_all_cam_entry(padapter);  //clear CAM
 
-       ret = rtw_sta_flush(padapter);  
+       ret = rtw_sta_flush(padapter, _TRUE);
 
        return ret;
 
@@ -8814,12 +8743,12 @@ static int rtw_del_sta(struct net_device *dev, struct ieee_param *param)
                {                       
                        rtw_list_delete(&psta->asoc_list);
                        pstapriv->asoc_list_cnt--;
-                       updated = ap_free_sta(padapter, psta, _TRUE, WLAN_REASON_DEAUTH_LEAVING);
+                       updated = ap_free_sta(padapter, psta, _TRUE, WLAN_REASON_DEAUTH_LEAVING, _TRUE);
 
                }
                _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL);
                
-               associated_clients_update(padapter, updated);
+               associated_clients_update(padapter, updated, STA_INFO_UPDATE_ALL);
        
                psta = NULL;
                
@@ -9108,7 +9037,7 @@ static int rtw_set_hidden_ssid(struct net_device *dev, struct ieee_param *param,
        int ie_len;
        u8 *ssid_ie;
        char ssid[NDIS_802_11_LENGTH_SSID + 1];
-       sint ssid_len;
+       sint ssid_len = 0;
        u8 ignore_broadcast_ssid;
 
        if(check_fwstate(mlmepriv, WIFI_AP_STATE) != _TRUE)
@@ -9130,10 +9059,10 @@ static int rtw_set_hidden_ssid(struct net_device *dev, struct ieee_param *param,
                ssid[ssid_len] = 0x0;
 
                if(0)
-               DBG_871X(FUNC_ADPT_FMT" ssid:(%s,%d), from ie:(%s,%d), (%s,%d)\n", FUNC_ADPT_ARG(adapter),
-                       ssid, ssid_len,
-                       pbss_network->Ssid.Ssid, pbss_network->Ssid.SsidLength,
-                       pbss_network_ext->Ssid.Ssid, pbss_network_ext->Ssid.SsidLength);
+                       DBG_871X(FUNC_ADPT_FMT" ssid:(%s,%d), from ie:(%s,%d), (%s,%d)\n", FUNC_ADPT_ARG(adapter),
+                               ssid, ssid_len,
+                               pbss_network->Ssid.Ssid, pbss_network->Ssid.SsidLength,
+                               pbss_network_ext->Ssid.Ssid, pbss_network_ext->Ssid.SsidLength);
 
                _rtw_memcpy(pbss_network->Ssid.Ssid, (void *)ssid, ssid_len);
                pbss_network->Ssid.SsidLength = ssid_len;
@@ -9141,9 +9070,9 @@ static int rtw_set_hidden_ssid(struct net_device *dev, struct ieee_param *param,
                pbss_network_ext->Ssid.SsidLength = ssid_len;
 
                if(0)
-               DBG_871X(FUNC_ADPT_FMT" after ssid:(%s,%d), (%s,%d)\n", FUNC_ADPT_ARG(adapter),
-                       pbss_network->Ssid.Ssid, pbss_network->Ssid.SsidLength,
-                       pbss_network_ext->Ssid.Ssid, pbss_network_ext->Ssid.SsidLength);
+                       DBG_871X(FUNC_ADPT_FMT" after ssid:(%s,%d), (%s,%d)\n", FUNC_ADPT_ARG(adapter),
+                               pbss_network->Ssid.Ssid, pbss_network->Ssid.SsidLength,
+                               pbss_network_ext->Ssid.Ssid, pbss_network_ext->Ssid.SsidLength);
        }
 
        DBG_871X(FUNC_ADPT_FMT" ignore_broadcast_ssid:%d, %s,%d\n", FUNC_ADPT_ARG(adapter),
@@ -9223,7 +9152,7 @@ static int rtw_hostapd_ioctl(struct net_device *dev, struct iw_point *p)
        * so, we just check hw_init_completed
        */
 
-       if (padapter->hw_init_completed==_FALSE){
+       if (!rtw_is_hw_init_completed(padapter)) {
                ret = -EPERM;
                goto out;
        }
@@ -9556,12 +9485,6 @@ static int rtw_wowlan_ctrl(struct net_device *dev,
 
        DBG_871X("+rtw_wowlan_ctrl: %s\n", extra);
        
-       if(pwrctrlpriv->bSupportRemoteWakeup==_FALSE){
-               ret = -EPERM;
-               DBG_871X("+rtw_wowlan_ctrl: Device didn't support the remote wakeup!!\n");
-               goto _rtw_wowlan_ctrl_exit_free;
-       }
-
        if (!check_fwstate(pmlmepriv, _FW_LINKED) && 
                        check_fwstate(pmlmepriv, WIFI_STATION_STATE)) {
 #ifdef CONFIG_PNO_SUPPORT
@@ -9572,20 +9495,22 @@ static int rtw_wowlan_ctrl(struct net_device *dev,
 #endif //CONFIG_PNO_SUPPORT
        }
 
-       if (_rtw_memcmp( extra, "enable", 6 )) {
+       if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY))
+               rtw_scan_abort(padapter);
 
-               padapter->registrypriv.mp_mode = 1;
+       if (_rtw_memcmp(extra, "enable", 6)) {
 
-               pwrctrlpriv->wowlan_from_cmd = _TRUE;
+               padapter->registrypriv.mp_mode = 1;
 
                rtw_suspend_common(padapter);
 
-       } else if (_rtw_memcmp( extra, "disable", 6 )) {
-
+       } else if (_rtw_memcmp(extra, "disable", 7)) {
+#ifdef CONFIG_USB_HCI
+               RTW_ENABLE_FUNC(padapter, DF_RX_BIT);
+               RTW_ENABLE_FUNC(padapter, DF_TX_BIT);
+#endif
                rtw_resume_common(padapter);
 
-               pwrctrlpriv->wowlan_from_cmd = _FALSE;
-
 #ifdef CONFIG_PNO_SUPPORT
                pwrctrlpriv->wowlan_pno_enable = _FALSE;
 #endif //CONFIG_PNO_SUPPORT
@@ -9603,6 +9528,159 @@ _rtw_wowlan_ctrl_exit_free:
 _rtw_wowlan_ctrl_exit:
        return ret;
 }
+
+static bool rtw_wowlan_parser_pattern_cmd(u8 *input, char *pattern,
+                                         int *pattern_len, char *bit_mask)
+{
+       char *cp = NULL, *end = NULL;
+       size_t len = 0;
+       int pos = 0, mask_pos = 0, res = 0;
+       u8 member[2] = {0};
+
+       cp = strchr(input, '=');
+       if (cp) {
+               *cp = 0;
+               cp++;
+       }
+
+       input = cp;
+
+       while (1) {
+               cp = strchr(input, ':');
+
+               if (cp) {
+                       len = strlen(input) - strlen(cp);
+                       *cp = 0;
+                       cp++;
+               } else {
+                       len = 2;
+               }
+
+               if (bit_mask && (strcmp(input, "-") == 0 ||
+                                strcmp(input, "xx") == 0 ||
+                                strcmp(input, "--") == 0)) {
+                       /* skip this byte and leave mask bit unset */
+               } else {
+                       u8 hex;
+                       strncpy(member, input, len);
+                       if (!rtw_check_pattern_valid(member, sizeof(member))) {
+                               DBG_871X("%s:[ERROR] pattern is invalid!!\n",
+                                        __func__);
+                               goto error;
+                       }
+
+                       res = sscanf(member, "%02hhx", &hex);
+                       pattern[pos] = hex;
+                       mask_pos = pos / 8;
+                       if (bit_mask)
+                               bit_mask[mask_pos] |= 1 << (pos % 8);
+               }
+
+               pos++;
+               if (!cp)
+                       break;
+               input = cp;
+       }
+
+       (*pattern_len) = pos;
+
+       return _TRUE;
+error:
+       return _FALSE;
+}
+
+/*
+ * IP filter This pattern if for a frame containing a ip packet:
+ * AA:AA:AA:AA:AA:AA:BB:BB:BB:BB:BB:BB:CC:CC:DD:-:-:-:-:-:-:-:-:EE:-:-:FF:FF:FF:FF:GG:GG:GG:GG:HH:HH:II:II
+ *
+ * A: Ethernet destination address
+ * B: Ethernet source address
+ * C: Ethernet protocol type
+ * D: IP header VER+Hlen, use: 0x45 (4 is for ver 4, 5 is for len 20)
+ * E: IP protocol
+ * F: IP source address ( 192.168.0.4: C0:A8:00:2C )
+ * G: IP destination address ( 192.168.0.4: C0:A8:00:2C )
+ * H: Source port (1024: 04:00)
+ * I: Destination port (1024: 04:00) 
+ */
+
+static int rtw_wowlan_set_pattern(struct net_device *dev,
+                                 struct iw_request_info *info,
+                                 union iwreq_data *wrqu, char *extra)
+{
+       _adapter *padapter =  (_adapter *)rtw_netdev_priv(dev);
+       struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);
+       struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
+       struct wowlan_ioctl_param poidparam;
+       int ret = 0, len = 0, i = 0;
+       u32 start_time = rtw_get_current_time();
+       u8 input[wrqu->data.length];
+       u8 index = 0;
+
+       poidparam.subcode = 0;
+
+       if (!check_fwstate(pmlmepriv, _FW_LINKED) &&
+                       check_fwstate(pmlmepriv, WIFI_STATION_STATE)) {
+               ret = -EFAULT;
+               DBG_871X("Please Connect With AP First!!\n");
+               goto _rtw_wowlan_set_pattern_exit;
+       }
+
+       if (wrqu->data.length <= 0) {
+               ret = -EFAULT;
+               DBG_871X("ERROR: parameter length <= 0\n");
+               goto _rtw_wowlan_set_pattern_exit;
+       } else {
+               /* set pattern */
+               if (copy_from_user(input,
+                                  wrqu->data.pointer, wrqu->data.length))
+                       return -EFAULT;
+               /* leave PS first */
+               rtw_ps_deny(padapter, PS_DENY_IOCTL);
+               LeaveAllPowerSaveModeDirect(padapter);
+               if (strncmp(input, "pattern=", 8) == 0) {
+                       if (pwrpriv->wowlan_pattern_idx >= MAX_WKFM_NUM) {
+                               DBG_871X("WARNING: priv-pattern is full(%d)\n",
+                                               MAX_WKFM_NUM);
+                               DBG_871X("WARNING: please clean priv-pattern first\n");
+                               ret = -EINVAL;
+                               goto _rtw_wowlan_set_pattern_exit;
+                       } else {
+                               index = pwrpriv->wowlan_pattern_idx;
+
+                               ret = rtw_wowlan_parser_pattern_cmd(input,
+                                       pwrpriv->patterns[index].content,
+                                       &pwrpriv->patterns[index].len,
+                                       pwrpriv->patterns[index].mask);
+
+                               if (ret == _TRUE) {
+                                       pwrpriv->wowlan_pattern_idx++;
+                                       pwrpriv->wowlan_pattern = _TRUE;
+                               }
+                       }
+               } else if (strncmp(input, "clean", 5) == 0) {
+                       poidparam.subcode = WOWLAN_PATTERN_CLEAN;
+                       rtw_hal_set_hwreg(padapter,
+                                       HW_VAR_WOWLAN, (u8 *)&poidparam);
+                       pwrpriv->wowlan_pattern = _FALSE;
+               } else if (strncmp(input, "show", 4) == 0) {
+                       for (i = 0 ; i < MAX_WKFM_NUM ; i++) {
+                               DBG_871X("=======[%d]=======\n", i);
+                               rtw_read_from_frame_mask(padapter, i);
+                       }
+
+                       DBG_871X("********[RTK priv-patterns]*********\n");
+                       for (i = 0 ; i < MAX_WKFM_NUM ; i++)
+                               rtw_dump_priv_pattern(padapter, i);
+               } else {
+                       DBG_871X("ERROR: incorrect parameter!\n");
+                       ret = -EINVAL;
+               }
+               rtw_ps_deny_cancel(padapter, PS_DENY_IOCTL);
+       }
+_rtw_wowlan_set_pattern_exit:
+       return ret;
+}
 #endif //CONFIG_WOWLAN
 
 #ifdef CONFIG_AP_WOWLAN
@@ -9621,72 +9699,22 @@ static int rtw_ap_wowlan_ctrl(struct net_device *dev,
 
        DBG_871X("+rtw_ap_wowlan_ctrl: %s\n", extra);
 
-       if(pwrctrlpriv->bSupportRemoteWakeup==_FALSE){
-               ret = -EPERM;
-               DBG_871X("+rtw_wowlan_ctrl: Device didn't support the remote wakeup!!\n");
-               goto _rtw_ap_wowlan_ctrl_exit_free;
-       }
-
        if (!check_fwstate(pmlmepriv, WIFI_AP_STATE)) {
                DBG_871X("[%s] It is not AP mode!!\n", __func__);
                goto _rtw_ap_wowlan_ctrl_exit_free;
        }
 
-       if (_rtw_memcmp( extra, "enable", 6 )) {
-               pwrctrlpriv->wowlan_ap_mode = _TRUE;
-               while (pwrctrlpriv->bips_processing == _TRUE)
-                       rtw_msleep_os(1);
-
-               rtw_cancel_all_timer(padapter);
+       if (_rtw_memcmp(extra, "enable", 6)) {
 
-               padapter->bDriverStopped = _TRUE;       //for stop thread
-               rtw_stop_drv_threads(padapter);
-               padapter->bDriverStopped = _FALSE;      //for 32k command
+               pwrctrlpriv->wowlan_ap_mode = _TRUE;
 
-#ifdef CONFIG_LPS
-               LeaveAllPowerSaveModeDirect(padapter);
+               rtw_suspend_common(padapter);
+       } else if (_rtw_memcmp(extra, "disable", 7)) {
+#ifdef CONFIG_USB_HCI
+               RTW_ENABLE_FUNC(padapter, DF_RX_BIT);
+               RTW_ENABLE_FUNC(padapter, DF_TX_BIT);
 #endif
-               rtw_hal_disable_interrupt(padapter); // It need wait for leaving 32K.
-
-               // 2.1 clean interupt
-               if (padapter->HalFunc.clear_interrupt)
-                       padapter->HalFunc.clear_interrupt(padapter);
-
-               poidparam.subcode = WOWLAN_AP_ENABLE;
-
-               rtw_hal_set_hwreg(padapter, HW_VAR_AP_WOWLAN,(u8 *)&poidparam);
-       } else if (_rtw_memcmp( extra, "disable", 6 )) {
-#ifdef CONFIG_LPS
-               LeaveAllPowerSaveModeDirect(padapter);
-#endif //CONFIG_LPS
-               pwrctrlpriv->bFwCurrentInPSMode = _FALSE;
-
-               rtw_hal_disable_interrupt(padapter);
-
-               if (padapter->HalFunc.clear_interrupt)
-                       padapter->HalFunc.clear_interrupt(padapter);
-
-               poidparam.subcode = WOWLAN_AP_ENABLE;
-
-               rtw_hal_set_hwreg(padapter, HW_VAR_AP_WOWLAN,(u8 *)&poidparam);
-
-               pwrctrlpriv->wowlan_ap_mode = _FALSE;
-
-               psta = rtw_get_stainfo(&padapter->stapriv, get_bssid(&padapter->mlmepriv));
-               if (psta) {
-                       set_sta_rate(padapter, psta);
-               }
-
-               padapter->bDriverStopped = _FALSE;
-               DBG_871X("%s: wowmode resuming, DriverStopped:%d\n", __func__, padapter->bDriverStopped);
-               rtw_start_drv_threads(padapter);
-
-               rtw_hal_enable_interrupt(padapter);
-
-               _set_timer(&padapter->mlmepriv.dynamic_chk_timer, 2000);
-               pwrctrlpriv->bips_processing = _FALSE;
-               rtw_set_pwr_state_check_timer(pwrctrlpriv);
-
+               rtw_resume_common(padapter);
        } else {
                DBG_871X("[%s] Invalid Parameter.\n", __func__);
                goto _rtw_ap_wowlan_ctrl_exit_free;
@@ -9733,12 +9761,12 @@ static int rtw_mp_efuse_get(struct net_device *dev,
                        union iwreq_data *wdata, char *extra)
 {
        PADAPTER padapter = rtw_netdev_priv(dev);
-       EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(padapter);
-       PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(padapter);
+       
        PEFUSE_HAL pEfuseHal;
        struct iw_point *wrqu;
        
-       u8      *PROMContent = pEEPROM->efuse_eeprom_data;
+       u8      *PROMContent = pHalData->efuse_eeprom_data;
        u8 ips_mode = IPS_NUM; // init invalid value
        u8 lps_mode = PS_MODE_NUM; // init invalid value
        struct pwrctrl_priv *pwrctrlpriv ;
@@ -9746,7 +9774,7 @@ static int rtw_mp_efuse_get(struct net_device *dev,
        u8 *rawdata = NULL;
        char *pch, *ptmp, *token, *tmp[3]={0x00,0x00,0x00};
        u16 i=0, j=0, mapLen=0, addr=0, cnts=0;
-       u16 max_available_size=0, raw_cursize=0, raw_maxsize=0;
+       u16 max_available_len = 0, raw_cursize = 0, raw_maxsize = 0;
        int err;
        #ifdef CONFIG_IOL
        u8 org_fw_iol = padapter->registrypriv.fw_iol;// 0:Disable, 1:enable, 2:by usb speed
@@ -9801,8 +9829,10 @@ static int rtw_mp_efuse_get(struct net_device *dev,
        #endif
        
        if(strcmp(tmp[0], "status") == 0){
-               sprintf(extra, "Load File efuse=%s,Load File MAC=%s",(pEEPROM->bloadfile_fail_flag? "FAIL" : "OK"),(pEEPROM->bloadmac_fail_flag? "FAIL" : "OK"));
-
+               sprintf(extra, "Load File efuse=%s,Load File MAC=%s"
+                       , pHalData->efuse_file_status == EFUSE_FILE_FAILED ? "FAIL" : "OK"
+                       , pHalData->macaddr_file_status == MACADDR_FILE_FAILED ? "FAIL" : "OK"
+               );
                  goto exit;
        }
        else if (strcmp(tmp[0], "drvmap") == 0)
@@ -9832,7 +9862,7 @@ static int rtw_mp_efuse_get(struct net_device *dev,
        else if (strcmp(tmp[0], "realmap") == 0)
        {
                mapLen = EFUSE_MAP_SIZE;
-               if (rtw_efuse_map_read(padapter, EFUSE_WIFI , mapLen, pEfuseHal->fakeEfuseInitMap) == _FAIL)
+               if (rtw_efuse_mask_map_read(padapter, EFUSE_WIFI , mapLen, pEfuseHal->fakeEfuseInitMap) == _FAIL)
                {
                        DBG_871X("%s: read realmap Fail!!\n", __FUNCTION__);
                        err = -EFAULT;
@@ -9882,17 +9912,17 @@ static int rtw_mp_efuse_get(struct net_device *dev,
                }
                DBG_871X("%s: cnts=%d\n", __FUNCTION__, cnts);
 
-               EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_EFUSE_MAP_LEN , (PVOID)&max_available_size, _FALSE);
-               if ((addr+ cnts) > max_available_size)
+               EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_EFUSE_MAP_LEN , (PVOID)&max_available_len, _FALSE);
+               if ((addr + cnts) > max_available_len)
                {
                        DBG_871X("%s: addr(0x%X)+cnts(%d) parameter error!\n", __FUNCTION__, addr, cnts);
                        err = -EINVAL;
                        goto exit;
                }
 
-               if (rtw_efuse_map_read(padapter, addr, cnts, data) == _FAIL)
+               if (rtw_efuse_mask_map_read(padapter, addr, cnts, data) == _FAIL)
                {
-                       DBG_871X("%s: rtw_efuse_map_read error!\n", __FUNCTION__);
+                       DBG_871X("%s: rtw_efuse_mask_map_read error!\n", __func__);
                        err = -EFAULT;
                        goto exit;
                }
@@ -9909,6 +9939,37 @@ static int rtw_mp_efuse_get(struct net_device *dev,
        {
                addr = 0;
                mapLen = EFUSE_MAX_SIZE;
+               DBG_871X("EFUSE_MAX_SIZE = %d\n", EFUSE_MAX_SIZE);
+
+               if (rtw_efuse_access(padapter, _FALSE, addr, mapLen, rawdata) == _FAIL) {
+                       DBG_871X("%s: rtw_efuse_access Fail!!\n", __func__);
+                       err = -EFAULT;
+                       goto exit;
+               }
+
+               if (mapLen >= 512)
+                       mapLen = 512;
+
+               _rtw_memset(extra,'\0',strlen(extra));
+
+               sprintf(extra, "\n0x00\t");
+
+               for (i = 0; i < mapLen ; i++) {
+                       sprintf(extra, "%s%02X", extra, rawdata[i]);
+                       if ((i & 0xF) == 0xF) {
+                               sprintf(extra, "%s\n", extra);
+                               sprintf(extra, "%s0x%02x\t", extra, i+1);
+                       } else if ((i & 0x7) == 0x7) {
+                               sprintf(extra, "%s \t", extra);
+                       } else {
+                               sprintf(extra, "%s ", extra);
+                       }
+               }
+
+       } else if (strcmp(tmp[0], "realrawb") == 0) {
+               addr = 0;
+               mapLen = EFUSE_MAX_SIZE;
+               DBG_871X("EFUSE_MAX_SIZE =%d\n", EFUSE_MAX_SIZE);
                if (rtw_efuse_access(padapter, _FALSE, addr, mapLen, rawdata) == _FAIL)
                {
                        DBG_871X("%s: rtw_efuse_access Fail!!\n", __FUNCTION__);
@@ -9918,7 +9979,7 @@ static int rtw_mp_efuse_get(struct net_device *dev,
                _rtw_memset(extra,'\0',strlen(extra));
                //              DBG_871X("%s: realraw={\n", __FUNCTION__);
                                sprintf(extra, "\n0x00\t");
-                               for (i=0; i< mapLen; i++)
+                               for (i= 512; i< mapLen; i++)
                                {
                //                      DBG_871X("%02X", rawdata[i]);
                                        sprintf(extra, "%s%02X", extra, rawdata[i]);
@@ -9938,80 +9999,25 @@ static int rtw_mp_efuse_get(struct net_device *dev,
                //              DBG_871X("}\n");
        }
        else if (strcmp(tmp[0], "mac") == 0)
-       {
-               #ifdef CONFIG_RTL8192C
-               addr = EEPROM_MAC_ADDR_92C;
-               #endif // CONFIG_RTL8192C
-               #ifdef CONFIG_RTL8192D
-                       #ifdef CONFIG_USB_HCI
-                       if (pHalData->interfaceIndex == 0)
-                               addr = EEPROM_MAC_ADDR_MAC0_92DU;
-                       else
-                               addr = EEPROM_MAC_ADDR_MAC1_92DU;
-                       #else
-                       if (pHalData->interfaceIndex == 0)
-                               addr = EEPROM_MAC_ADDR_MAC0_92DE;
-                       else
-                               addr = EEPROM_MAC_ADDR_MAC1_92DE;
-                       #endif
-               #endif // CONFIG_RTL8192D
-               #ifdef CONFIG_RTL8723A
-                       #ifdef CONFIG_SDIO_HCI
-                       addr = EEPROM_MAC_ADDR_8723AS;
-                       #endif
-                       #ifdef CONFIG_GSPI_HCI
-                       addr = EEPROM_MAC_ADDR_8723AS;
-                       #endif
-                       #ifdef CONFIG_USB_HCI
-                       addr = EEPROM_MAC_ADDR_8723AU;
-                       #endif
-               #endif // CONFIG_RTL8723A
-               #ifdef CONFIG_RTL8188E
-                       #ifdef CONFIG_USB_HCI
-                       addr = EEPROM_MAC_ADDR_88EU;
-                       #endif
-                       #ifdef CONFIG_SDIO_HCI
-                       addr = EEPROM_MAC_ADDR_88ES;
-                       #endif
-                       #ifdef CONFIG_PCI_HCI
-                       addr = EEPROM_MAC_ADDR_88EE;
-                       #endif
-               #endif // CONFIG_RTL8188E
+       {               
+               if (hal_efuse_macaddr_offset(padapter) == -1) {
+                       err = -EFAULT;
+                       goto exit;
+               }
 
-               #ifdef CONFIG_RTL8192E
-                       #ifdef CONFIG_USB_HCI
-                       addr = EEPROM_MAC_ADDR_8192EU;
-                       #endif
-                       #ifdef CONFIG_SDIO_HCI
-                       addr = EEPROM_MAC_ADDR_8192ES;
-                       #endif
-                       #ifdef CONFIG_PCI_HCI
-                       addr = EEPROM_MAC_ADDR_8192EE;
-                       #endif
-               #endif
-               #ifdef CONFIG_RTL8723B
-               #ifdef CONFIG_SDIO_HCI
-               addr = EEPROM_MAC_ADDR_8723BS;
-               #endif
-               #ifdef CONFIG_GSPI_HCI
-               addr = EEPROM_MAC_ADDR_8723BS;
-               #endif
-               #ifdef CONFIG_USB_HCI
-               addr = EEPROM_MAC_ADDR_8723BU;
-               #endif
-               #endif // CONFIG_RTL8723B
+               addr = hal_efuse_macaddr_offset(padapter);
                cnts = 6;
 
-               EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&max_available_size, _FALSE);
-               if ((addr + cnts) > max_available_size) {
+               EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_EFUSE_MAP_LEN, (PVOID)&max_available_len, _FALSE);
+               if ((addr + cnts) > max_available_len) {
                        DBG_871X("%s: addr(0x%02x)+cnts(%d) parameter error!\n", __FUNCTION__, addr, cnts);
                        err = -EFAULT;
                        goto exit;
                }
 
-               if (rtw_efuse_map_read(padapter, addr, cnts, data) == _FAIL)
+               if (rtw_efuse_mask_map_read(padapter, addr, cnts, data) == _FAIL)
                {
-                       DBG_871X("%s: rtw_efuse_map_read error!\n", __FUNCTION__);
+                       DBG_871X("%s: rtw_efuse_mask_map_read error!\n", __func__);
                        err = -EFAULT;
                        goto exit;
                }
@@ -10032,21 +10038,6 @@ static int rtw_mp_efuse_get(struct net_device *dev,
        }
        else if (strcmp(tmp[0], "vidpid") == 0)
        {
-               #ifdef CONFIG_RTL8192C
-               addr = EEPROM_VID_92C;
-               #endif // CONFIG_RTL8192C
-               #ifdef CONFIG_RTL8192D
-                       #ifdef CONFIG_USB_HCI
-                       addr = EEPROM_VID_92DU;
-                       #else
-                       addr = EEPROM_VID_92DE;
-                       #endif
-               #endif // CONFIG_RTL8192D
-               #ifdef CONFIG_RTL8723A
-                       #ifdef CONFIG_USB_HCI
-                       addr = EEPROM_VID_8723AU;
-                       #endif
-               #endif // CONFIG_RTL8723A
                #ifdef CONFIG_RTL8188E
                        #ifdef CONFIG_USB_HCI
                        addr = EEPROM_VID_88EU;
@@ -10067,16 +10058,26 @@ static int rtw_mp_efuse_get(struct net_device *dev,
                #ifdef CONFIG_RTL8723B
                addr = EEPROM_VID_8723BU;
                #endif // CONFIG_RTL8192E
+
+               #ifdef CONFIG_RTL8188F
+               addr = EEPROM_VID_8188FU;
+               #endif /* CONFIG_RTL8188F */
+
+               #ifdef CONFIG_RTL8703B
+                       #ifdef CONFIG_USB_HCI
+                       addr = EEPROM_VID_8703BU;
+                       #endif
+               #endif /* CONFIG_RTL8703B */
+
                cnts = 4;
 
-               EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&max_available_size, _FALSE);
-               if ((addr + cnts) > max_available_size)
-               {
+               EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_EFUSE_MAP_LEN, (PVOID)&max_available_len, _FALSE);
+               if ((addr + cnts) > max_available_len) {
                        DBG_871X("%s: addr(0x%02x)+cnts(%d) parameter error!\n", __FUNCTION__, addr, cnts);
                        err = -EFAULT;
                        goto exit;
                }
-               if (rtw_efuse_map_read(padapter, addr, cnts, data) == _FAIL)
+               if (rtw_efuse_mask_map_read(padapter, addr, cnts, data) == _FAIL)
                {
                        DBG_871X("%s: rtw_efuse_access error!!\n", __FUNCTION__);
                        err = -EFAULT;
@@ -10096,15 +10097,16 @@ static int rtw_mp_efuse_get(struct net_device *dev,
                        }
                }
 //             DBG_871X("}\n");
-       }
-       else if (strcmp(tmp[0], "ableraw") == 0)
-       {
-               efuse_GetCurrentSize(padapter,&raw_cursize);
-               raw_maxsize = efuse_GetMaxSize(padapter);
-               sprintf(extra, "[available raw size]= %d bytes", raw_maxsize-raw_cursize);
-       }
-       else if (strcmp(tmp[0], "btfmap") == 0)
-       {
+       } else if (strcmp(tmp[0], "ableraw") == 0) {
+                       efuse_GetCurrentSize(padapter, &raw_cursize);
+                       raw_maxsize = efuse_GetMaxSize(padapter);
+                       sprintf(extra, "[available raw size]= %d bytes\n", raw_maxsize - raw_cursize);
+       } else if (strcmp(tmp[0], "btableraw") == 0) {
+                       efuse_bt_GetCurrentSize(padapter, &raw_cursize);
+                       raw_maxsize = efuse_bt_GetMaxSize(padapter);
+                       sprintf(extra, "[available raw size]= %d bytes\n", raw_maxsize - raw_cursize);
+       } else if (strcmp(tmp[0], "btfmap") == 0) {
+
                BTEfuse_PowerSwitch(padapter,1,_TRUE);
                                
                mapLen = EFUSE_BT_MAX_MAP_LEN;
@@ -10193,9 +10195,8 @@ static int rtw_mp_efuse_get(struct net_device *dev,
                }
                DBG_871X("%s: cnts=%d\n", __FUNCTION__, cnts);
 
-               EFUSE_GetEfuseDefinition(padapter, EFUSE_BT, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&max_available_size, _FALSE);
-               if ((addr + cnts) > max_available_size)
-               {
+               EFUSE_GetEfuseDefinition(padapter, EFUSE_BT, TYPE_EFUSE_MAP_LEN, (PVOID)&max_available_len, _FALSE);
+               if ((addr + cnts) > max_available_len) {
                        DBG_871X("%s: addr(0x%X)+cnts(%d) parameter error!\n", __FUNCTION__, addr, cnts);
                        err = -EFAULT;
                        goto exit;
@@ -10392,7 +10393,7 @@ static int rtw_mp_efuse_set(struct net_device *dev,
        u8 *ShadowMapWiFi = NULL;
        u8 *setrawdata = NULL;
        char *pch, *ptmp, *token, *tmp[3]={0x00,0x00,0x00};
-       u16 addr=0xFF, cnts=0, BTStatus=0 , max_available_size=0;
+       u16 addr = 0xFF, cnts = 0, BTStatus = 0 , max_available_len = 0;
        int err;
 
        wrqu = (struct iw_point*)wdata;
@@ -10497,14 +10498,10 @@ static int rtw_mp_efuse_set(struct net_device *dev,
                {
                        setdata[jj] = key_2char2num(tmp[2][kk], tmp[2][kk+1]);
                }
-#ifndef CONFIG_RTL8188E
-               EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&max_available_size, _FALSE);
-#else
-               //Change to check TYPE_EFUSE_MAP_LEN ,beacuse 8188E raw 256,logic map over 256.
-               EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_EFUSE_MAP_LEN, (PVOID)&max_available_size, _FALSE);
-#endif
-               if ((addr+cnts) > max_available_size)
-               {
+
+               EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_EFUSE_MAP_LEN, (PVOID)&max_available_len, _FALSE);
+
+               if ((addr + cnts) > max_available_len) {
                        DBG_871X("%s: addr(0x%X)+cnts(%d) parameter error!\n", __FUNCTION__, addr, cnts);
                        err = -EFAULT;
                        goto exit;
@@ -10517,8 +10514,8 @@ static int rtw_mp_efuse_set(struct net_device *dev,
                        goto exit;
                }
                *extra = 0;
-               DBG_871X("%s: after rtw_BT_efuse_map_write to _rtw_memcmp \n", __FUNCTION__);
-               if ( (rtw_efuse_map_read(padapter, addr, cnts, ShadowMapWiFi) == _SUCCESS ) )
+               DBG_871X("%s: after rtw_efuse_map_write to _rtw_memcmp\n", __func__);
+               if (rtw_efuse_mask_map_read(padapter, addr, cnts, ShadowMapWiFi) == _SUCCESS)
                {
                        if (_rtw_memcmp((void*)ShadowMapWiFi ,(void*)setdata,cnts))
                        { 
@@ -10585,82 +10582,13 @@ static int rtw_mp_efuse_set(struct net_device *dev,
                }
 
                //mac,00e04c871200
-               #ifdef CONFIG_RTL8192C
-               addr = EEPROM_MAC_ADDR_92C;
-               #endif
-               #ifdef CONFIG_RTL8192D
-                       #ifdef CONFIG_USB_HCI
-                       if (pHalData->interfaceIndex == 0)
-                               addr = EEPROM_MAC_ADDR_MAC0_92DU;
-                       else
-                               addr = EEPROM_MAC_ADDR_MAC1_92DU;
-                       #else
-                       if (pHalData->interfaceIndex == 0)
-                               addr = EEPROM_MAC_ADDR_MAC0_92DE;
-                       else
-                               addr = EEPROM_MAC_ADDR_MAC1_92DE;
-                       #endif
-               #endif
-               #ifdef CONFIG_RTL8723A
-               #ifdef CONFIG_SDIO_HCI
-               addr = EEPROM_MAC_ADDR_8723AS;
-               #endif
-               #ifdef CONFIG_GSPI_HCI
-               addr = EEPROM_MAC_ADDR_8723AS;
-               #endif
-               #ifdef CONFIG_USB_HCI
-               addr = EEPROM_MAC_ADDR_8723AU;
-               #endif
-               #endif // CONFIG_RTL8723A
-               #ifdef CONFIG_RTL8188E
-                       #ifdef CONFIG_USB_HCI
-                       addr = EEPROM_MAC_ADDR_88EU;
-                       #endif
-                       #ifdef CONFIG_SDIO_HCI
-                       addr = EEPROM_MAC_ADDR_88ES;
-                       #endif
-                       #ifdef CONFIG_PCI_HCI
-                       addr = EEPROM_MAC_ADDR_88EE;
-                       #endif
-               #endif //#ifdef CONFIG_RTL8188E
-
-               #ifdef CONFIG_RTL8192E
-                       #ifdef CONFIG_USB_HCI
-                       addr = EEPROM_MAC_ADDR_8192EU;
-                       #endif
-                       #ifdef CONFIG_SDIO_HCI
-                       addr = EEPROM_MAC_ADDR_8192ES;
-                       #endif
-                       #ifdef CONFIG_PCI_HCI
-                       addr = EEPROM_MAC_ADDR_8192EE;
-                       #endif
-               #endif //#ifdef CONFIG_RTL8192E
-               
-               #ifdef CONFIG_RTL8723B
-               #ifdef CONFIG_SDIO_HCI
-               addr = EEPROM_MAC_ADDR_8723BS;
-               #endif
-               #ifdef CONFIG_GSPI_HCI
-               addr = EEPROM_MAC_ADDR_8723BS;
-               #endif
-               #ifdef CONFIG_USB_HCI
-               addr = EEPROM_MAC_ADDR_8723BU;
-               #endif
-               #endif // CONFIG_RTL8723B
-               
-               #if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A)
-               #ifdef CONFIG_SDIO_HCI
-                               addr = EEPROM_MAC_ADDR_8821AS;
-               #endif
-               #ifdef CONFIG_PCI_HCI
-                               addr = EEPROM_MAC_ADDR_8821AE;
-               #endif
-               #ifdef CONFIG_USB_HCI
-                               addr = EEPROM_MAC_ADDR_8821AU;
-               #endif
-               
-               #endif // CONFIG_RTL8812A/CONFIG_RTL8821A
                
+               if (hal_efuse_macaddr_offset(padapter) == -1) {
+                       err = -EFAULT;
+                       goto exit;
+               }
+
+               addr = hal_efuse_macaddr_offset(padapter);
                cnts = strlen(tmp[1]);
                if (cnts%2)
                {
@@ -10688,14 +10616,10 @@ static int rtw_mp_efuse_set(struct net_device *dev,
                {
                        setdata[jj] = key_2char2num(tmp[1][kk], tmp[1][kk+1]);
                }
-#ifndef CONFIG_RTL8188E
-               EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&max_available_size, _FALSE);
-#else
-               //Change to check TYPE_EFUSE_MAP_LEN ,beacuse 8188E raw 256,logic map over 256.
-               EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_EFUSE_MAP_LEN, (PVOID)&max_available_size, _FALSE);
-#endif
-               if ((addr+cnts) > max_available_size)
-               {
+
+               EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_EFUSE_MAP_LEN, (PVOID)&max_available_len, _FALSE);
+
+               if ((addr + cnts) > max_available_len) {
                        DBG_871X("%s: addr(0x%X)+cnts(%d) parameter error!\n", __FUNCTION__, addr, cnts);
                        err = -EFAULT;
                        goto exit;
@@ -10716,22 +10640,7 @@ static int rtw_mp_efuse_set(struct net_device *dev,
                        goto exit;
                }
 
-               // pidvid,da0b7881
-               #ifdef CONFIG_RTL8192C
-               addr = EEPROM_VID_92C;
-               #endif // CONFIG_RTL8192C
-               #ifdef CONFIG_RTL8192D
-                       #ifdef CONFIG_USB_HCI
-                       addr = EEPROM_VID_92DU;
-                       #else
-                       addr = EEPROM_VID_92DE;
-                       #endif
-               #endif // CONFIG_RTL8192D
-               #ifdef CONFIG_RTL8723A
-                       #ifdef CONFIG_USB_HCI
-                       addr = EEPROM_VID_8723AU;
-                       #endif
-               #endif // CONFIG_RTL8723A
+               // pidvid,da0b7881              
                #ifdef CONFIG_RTL8188E
                        #ifdef CONFIG_USB_HCI
                        addr = EEPROM_VID_88EU;
@@ -10753,7 +10662,17 @@ static int rtw_mp_efuse_set(struct net_device *dev,
                #ifdef CONFIG_RTL8723B
                addr = EEPROM_VID_8723BU;
                #endif
-               
+
+               #ifdef CONFIG_RTL8188F
+               addr = EEPROM_VID_8188FU;
+               #endif
+
+               #ifdef CONFIG_RTL8703B
+                       #ifdef CONFIG_USB_HCI
+                       addr = EEPROM_VID_8703BU;
+                       #endif /* CONFIG_USB_HCI */
+               #endif /* CONFIG_RTL8703B */
+
                cnts = strlen(tmp[1]);
                if (cnts%2)
                {
@@ -10776,9 +10695,8 @@ static int rtw_mp_efuse_set(struct net_device *dev,
                        setdata[jj] = key_2char2num(tmp[1][kk], tmp[1][kk+1]);
                }
 
-               EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&max_available_size, _FALSE);
-               if ((addr+cnts) > max_available_size)
-               {
+               EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_EFUSE_MAP_LEN, (PVOID)&max_available_len, _FALSE);
+               if ((addr + cnts) > max_available_len) {
                        DBG_871X("%s: addr(0x%X)+cnts(%d) parameter error!\n", __FUNCTION__, addr, cnts);
                        err = -EFAULT;
                        goto exit;
@@ -10793,10 +10711,10 @@ static int rtw_mp_efuse_set(struct net_device *dev,
        }
         else if (strcmp(tmp[0], "wldumpfake") == 0)
        {
-               if (rtw_efuse_map_read(padapter, 0, EFUSE_MAP_SIZE,  pEfuseHal->fakeEfuseModifiedMap) == _SUCCESS) {
-                       DBG_871X("%s: WiFi hw efuse dump to Fake map success \n", __FUNCTION__); 
+               if (rtw_efuse_mask_map_read(padapter, 0, EFUSE_MAP_SIZE, pEfuseHal->fakeEfuseModifiedMap) == _SUCCESS) {
+                       DBG_871X("%s: WiFi hw efuse dump to Fake map success\n", __func__);
                } else {
-                       DBG_871X("%s: WiFi hw efuse dump to Fake map Fail \n", __FUNCTION__);
+                       DBG_871X("%s: WiFi hw efuse dump to Fake map Fail\n", __func__);
                        err = -EFAULT;
                }
        }
@@ -10851,10 +10769,24 @@ static int rtw_mp_efuse_set(struct net_device *dev,
                {
                        setdata[jj] = key_2char2num(tmp[2][kk], tmp[2][kk+1]);
                }
+#ifdef CONFIG_RTL8703B
+               if (cnts == 1 && addr == 0x189) {
+                       setdata[1] = setdata[0];
+                       setdata[0] = 0x00;
+                       cnts += 1;
+                       addr = 0x188;
+                       DBG_871X("addr 0x%x ,setdata=0x%X 0x%X\n", addr, setdata[0], setdata[1]);
+               } else if (cnts == 1 && addr == 0x161) {
+                       setdata[1] = setdata[0];
+                       setdata[0] = 0xFE;
+                       cnts += 1;
+                       addr = 0x160;
+                       DBG_871X("addr 0x%x ,setdata=0x%X 0x%X\n", addr, setdata[0], setdata[1]);
+               }
+#endif
 
-               EFUSE_GetEfuseDefinition(padapter, EFUSE_BT, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&max_available_size, _FALSE);
-               if ((addr+cnts) > max_available_size)
-               {
+               EFUSE_GetEfuseDefinition(padapter, EFUSE_BT, TYPE_EFUSE_MAP_LEN, (PVOID)&max_available_len, _FALSE);
+               if ((addr + cnts) > max_available_len) {
                        DBG_871X("%s: addr(0x%X)+cnts(%d) parameter error!\n", __FUNCTION__, addr, cnts);
                        err = -EFAULT;
                        goto exit;
@@ -10951,13 +10883,6 @@ static int rtw_mp_efuse_set(struct net_device *dev,
                rtw_read8(padapter, EFUSE_CTRL);
 
                _rtw_memcpy(pEfuseHal->BTEfuseModifiedMap, pEfuseHal->fakeBTEfuseModifiedMap, EFUSE_BT_MAX_MAP_LEN);
-                       
-               EFUSE_GetEfuseDefinition(padapter, EFUSE_BT, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&max_available_size, _FALSE);     
-               if (max_available_size < 1)
-               {
-                       err = -EFAULT;
-                       goto exit;
-               }
 
                if (rtw_BT_efuse_map_write(padapter, 0x00, EFUSE_BT_MAX_MAP_LEN, pEfuseHal->fakeBTEfuseModifiedMap) == _FAIL)
                {
@@ -11028,12 +10953,6 @@ static int rtw_mp_efuse_set(struct net_device *dev,
        }
        else if (strcmp(tmp[0], "wlfk2map") == 0)
        {
-               EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&max_available_size, _FALSE);                                   
-               if (max_available_size < 1)
-               {
-                       err = -EFAULT;
-                       goto exit;
-               }
                if (rtw_efuse_map_write(padapter, 0x00, EFUSE_MAP_SIZE, pEfuseHal->fakeEfuseModifiedMap) == _FAIL)
                {
                        DBG_871X("%s: rtw_efuse_map_write fakeEfuseModifiedMap error!\n", __FUNCTION__);
@@ -11041,8 +10960,8 @@ static int rtw_mp_efuse_set(struct net_device *dev,
                        goto exit;
                }
                *extra = 0;
-               DBG_871X("%s: after rtw_BT_efuse_map_write to _rtw_memcmp \n", __FUNCTION__);
-               if ( (rtw_efuse_map_read(padapter, 0x00, EFUSE_MAP_SIZE, ShadowMapWiFi) == _SUCCESS ) )
+               DBG_871X("%s: after rtw_BT_efuse_map_write to _rtw_memcmp\n", __func__);
+               if (rtw_efuse_mask_map_read(padapter, 0x00, EFUSE_MAP_SIZE, ShadowMapWiFi) == _SUCCESS)
                {
                        if (_rtw_memcmp((void*)ShadowMapWiFi ,(void*)setdata,cnts))
                        {
@@ -11092,6 +11011,8 @@ static int rtw_mp_efuse_set(struct net_device *dev,
                {
                        pEfuseHal->fakeEfuseModifiedMap[addr+jj] = key_2char2num(tmp[2][kk], tmp[2][kk+1]);
                }
+               _rtw_memset(extra, '\0', strlen(extra));
+               sprintf(extra, "wlwfake OK\n");
        }
 
 exit:
@@ -11120,1790 +11041,142 @@ exit:
        return err;
 }
 
-#if defined(CONFIG_MP_INCLUDED) && defined(CONFIG_MP_IWPRIV_SUPPORT)
-/*
- * Input Format: %s,%d,%d
- *     %s is width, could be
- *             "b" for 1 byte
- *             "w" for WORD (2 bytes)
- *             "dw" for DWORD (4 bytes)
- *     1st %d is address(offset)
- *     2st %d is data to write
- */
-static int rtw_mp_write_reg(struct net_device *dev,
-                       struct iw_request_info *info,
-                       struct iw_point *wrqu, char *extra)
+
+#ifdef CONFIG_MP_INCLUDED
+
+#ifdef CONFIG_SDIO_INDIRECT_ACCESS
+#define DBG_MP_SDIO_INDIRECT_ACCESS 1
+static int rtw_mp_sd_iread(struct net_device *dev
+       , struct iw_request_info *info
+       , struct iw_point *wrqu
+       , char *extra)
 {
-       char *pch, *pnext, *ptmp;
-       char *width_str;
-       char width;
-       u32 addr, data;
-       int ret;
+       char input[16];
+       u8 width;
+       unsigned long addr;
+       u32 ret = 0;
        PADAPTER padapter = rtw_netdev_priv(dev);
-       char input[wrqu->length];
 
-       if (copy_from_user(input, wrqu->pointer, wrqu->length))
-                                return -EFAULT;
-                                
-       _rtw_memset(extra, 0, wrqu->length);    
-         
-       pch = input;
+       if (wrqu->length > 16) {
+               DBG_871X(FUNC_ADPT_FMT" wrqu->length:%d\n", FUNC_ADPT_ARG(padapter), wrqu->length);
+               ret = -EINVAL;
+               goto exit;
+       }
+
+       if (copy_from_user(input, wrqu->pointer, wrqu->length)) {
+               DBG_871X(FUNC_ADPT_FMT" copy_from_user fail\n", FUNC_ADPT_ARG(padapter));
+               ret = -EFAULT;
+               goto exit;
+       }
 
-       pnext = strpbrk(pch, " ,.-");
-       if (pnext == NULL) return -EINVAL;
-       *pnext = 0;
-       width_str = pch;
+       _rtw_memset(extra, 0, wrqu->length);
 
-       pch = pnext + 1;
-       pnext = strpbrk(pch, " ,.-");
-       if (pnext == NULL) return -EINVAL;
-       *pnext = 0;
-       addr = simple_strtoul(pch, &ptmp, 16);
-       if (addr > 0x3FFF) return -EINVAL;
+       if (sscanf(input, "%hhu,%lx", &width, &addr) != 2) {
+               DBG_871X(FUNC_ADPT_FMT" sscanf fail\n", FUNC_ADPT_ARG(padapter));
+               ret = -EINVAL;
+               goto exit;
+       }
 
-       pch = pnext + 1;
-       if ((pch - extra) >= wrqu->length) return -EINVAL;
-       data = simple_strtoul(pch, &ptmp, 16);
+       if (addr > 0x3FFF) {
+               DBG_871X(FUNC_ADPT_FMT" addr:0x%lx\n", FUNC_ADPT_ARG(padapter), addr);
+               ret = -EINVAL;
+               goto exit;
+       }
+
+       if (DBG_MP_SDIO_INDIRECT_ACCESS)
+               DBG_871X(FUNC_ADPT_FMT" width:%u, addr:0x%lx\n", FUNC_ADPT_ARG(padapter), width, addr);
 
-       ret = 0;
-       width = width_str[0];
        switch (width) {
-               case 'b':
-                       // 1 byte
-                       if (data > 0xFF) {
-                               ret = -EINVAL;
-                               break;
-                       }
-                       rtw_write8(padapter, addr, data);
-                       break;
-               case 'w':
-                       // 2 bytes
-                       if (data > 0xFFFF) {
-                               ret = -EINVAL;
-                               break;
-                       }
-                       rtw_write16(padapter, addr, data);
-                       break;
-               case 'd':
-                       // 4 bytes
-                       rtw_write32(padapter, addr, data);
-                       break;
-               default:
-                       ret = -EINVAL;
-                       break;
-       }
-
-       return ret;
-}
-
-/*
- * Input Format: %s,%d
- *     %s is width, could be
- *             "b" for 1 byte
- *             "w" for WORD (2 bytes)
- *             "dw" for DWORD (4 bytes)
- *     %d is address(offset)
- *
- * Return:
- *     %d for data readed
- */
-static int rtw_mp_read_reg(struct net_device *dev,
-                       struct iw_request_info *info,
-                       struct iw_point *wrqu, char *extra)
-{
-       char input[wrqu->length];
-       char *pch, *pnext, *ptmp;
-       char *width_str;
-       char width;
-       char data[20],tmp[20];
-       u32 addr;
-       //u32 *data = (u32*)extra;
-       u32 ret, i=0, j=0, strtout=0;
-       PADAPTER padapter = rtw_netdev_priv(dev);
-
-
-       if (wrqu->length > 128) 
-               return -EFAULT;
-
-       if (copy_from_user(input, wrqu->pointer, wrqu->length))
-               return -EFAULT;
-
-       _rtw_memset(data, 0, 20);
-       _rtw_memset(tmp, 0, 20);
-       _rtw_memset(extra, 0, wrqu->length);
-
-       pch = input;
-       pnext = strpbrk(pch, " ,.-");
-       if (pnext == NULL) return -EINVAL;
-       *pnext = 0;
-       width_str = pch;
-
-       pch = pnext + 1;
-       if ((pch - input) >= wrqu->length) return -EINVAL;
-       
-       addr = simple_strtoul(pch, &ptmp, 16);
-       if (addr > 0x3FFF) return -EINVAL;
-
-       ret = 0;
-       width = width_str[0];
-       switch (width)
-       {
-               case 'b':
-                       // 1 byte
-                       // *(u8*)data = rtw_read8(padapter, addr);
-                       sprintf(extra, "%d\n",  rtw_read8(padapter, addr));
-                       wrqu->length = strlen(extra);
-                       break;
-               case 'w':
-                       // 2 bytes
-                       //*(u16*)data = rtw_read16(padapter, addr);
-                       sprintf(data, "%04x\n", rtw_read16(padapter, addr));
-                       for( i=0 ; i <= strlen(data) ; i++)
-                               {
-                                         if( i%2==0 )
-                                         {
-                                                  tmp[j]=' ';
-                                                  j++;
-                                         }
-                                         if ( data[i] != '\0' )
-                                                tmp[j] = data[i];
-                                               
-                                                j++;
-                               }
-                               pch = tmp;              
-                               DBG_871X("pch=%s",pch);
-                               
-                               while( *pch != '\0' )
-                               {
-                                       pnext = strpbrk(pch, " ");
-                                       if (!pnext)
-                                               break;
-                                       
-                                       pnext++;
-                                       if ( *pnext != '\0' )
-                                       {
-                                                 strtout = simple_strtoul (pnext , &ptmp, 16);
-                                                 sprintf( extra, "%s %d" ,extra ,strtout );
-                                       }
-                                       else{
-                                                 break;
-                                       }
-                                       pch = pnext;
-                               }
-                       wrqu->length = 7;
-                       break;
-               case 'd':
-                       // 4 bytes
-                       //*data = rtw_read32(padapter, addr);
-                       sprintf(data, "%08x", rtw_read32(padapter, addr));
-                               //add read data format blank
-                               for( i=0 ; i <= strlen(data) ; i++)
-                               {
-                                         if( i%2==0 )
-                                         {
-                                                  tmp[j]=' ';
-                                                  j++;
-                                         }
-                                         if ( data[i] != '\0' )
-                                         tmp[j] = data[i];
-                                         
-                                         j++;
-                               }
-                               pch = tmp;              
-                               DBG_871X("pch=%s",pch);
-                               
-                               while( *pch != '\0' )
-                               {
-                                       pnext = strpbrk(pch, " ");
-                                       if (!pnext)
-                                               break;
-                                       
-                                       pnext++;
-                                       if ( *pnext != '\0' )
-                                       {
-                                                 strtout = simple_strtoul (pnext , &ptmp, 16);
-                                                 sprintf( extra, "%s %d" ,extra ,strtout );
-                                       }
-                                       else{
-                       break;
-                                       }
-                                       pch = pnext;
-                               }
-                       wrqu->length = strlen(extra);
-                       break;
-                       
-               default:
-                       wrqu->length = 0;
-                       ret = -EINVAL;
-                       break;
-                       
+       case 1:
+               sprintf(extra, "0x%02x", rtw_sd_iread8(padapter, addr));
+               wrqu->length = strlen(extra);
+               break;
+       case 2:
+               sprintf(extra, "0x%04x", rtw_sd_iread16(padapter, addr));
+               wrqu->length = strlen(extra);
+               break;
+       case 4:
+               sprintf(extra, "0x%08x", rtw_sd_iread32(padapter, addr));
+               wrqu->length = strlen(extra);
+               break;
+       default:
+               wrqu->length = 0;
+               ret = -EINVAL;
+               break;
        }
 
+exit:
        return ret;
 }
 
-/*
- * Input Format: %d,%x,%x
- *     %d is RF path, should be smaller than MAX_RF_PATH_NUMS
- *     1st %x is address(offset)
- *     2st %x is data to write
- */
- static int rtw_mp_write_rf(struct net_device *dev,
-                       struct iw_request_info *info,
-                       struct iw_point *wrqu, char *extra)
-{                      
-/*static int rtw_mp_write_rf(struct net_device *dev,
-                       struct iw_request_info *info,
-                       union iwreq_data *wrqu, char *extra)
-*/
-       u32 path, addr, data;
-       int ret;
-       PADAPTER padapter = rtw_netdev_priv(dev);
-       char input[wrqu->length];
-
-       if (copy_from_user(input, wrqu->pointer, wrqu->length))
-                        return -EFAULT;
-
-
-       ret = sscanf(input, "%d,%x,%x", &path, &addr, &data);
-       if (ret < 3) return -EINVAL;
-
-       if (path >= GET_HAL_RFPATH_NUM(padapter)) return -EINVAL;
-       if (addr > 0xFF) return -EINVAL;
-       if (data > 0xFFFFF) return -EINVAL;
-       
-       _rtw_memset(extra, 0, wrqu->length);
-       
-       write_rfreg(padapter, path, addr, data);
-       
-       sprintf(extra, "write_rf completed \n");
-       wrqu->length = strlen(extra);
-       
-       return 0;
-}
-
-/*
- * Input Format: %d,%x
- *     %d is RF path, should be smaller than MAX_RF_PATH_NUMS
- *     %x is address(offset)
- *
- * Return:
- *     %d for data readed
- */
-static int rtw_mp_read_rf(struct net_device *dev,
-                       struct iw_request_info *info,
-                       struct iw_point *wrqu, char *extra)
-{
-       char input[wrqu->length];
-       char *pch, *pnext, *ptmp;
-       char data[20],tmp[20];
-       //u32 *data = (u32*)extra;
-       u32 path, addr;
-       u32 ret,i=0 ,j=0,strtou=0;
-       PADAPTER padapter = rtw_netdev_priv(dev);
-
-
-       if (wrqu->length > 128) return -EFAULT;
-       if (copy_from_user(input, wrqu->pointer, wrqu->length))
-               return -EFAULT;
-
-       ret = sscanf(input, "%d,%x", &path, &addr);
-       if (ret < 2) return -EINVAL;
-
-       if (path >= GET_HAL_RFPATH_NUM(padapter)) return -EINVAL;
-       if (addr > 0xFF) return -EINVAL;
-       
-       _rtw_memset(extra, 0, wrqu->length);
-       
-       //*data = read_rfreg(padapter, path, addr);
-       sprintf(data, "%08x", read_rfreg(padapter, path, addr));
-                               //add read data format blank
-                               for( i=0 ; i <= strlen(data) ; i++)
-                               {
-                                         if( i%2==0 )
-                                         {
-                                                  tmp[j]=' ';
-                                                  j++;
-                                         }
-                                         tmp[j] = data[i];
-                                         j++;
-                               }
-                               pch = tmp;              
-                               DBG_871X("pch=%s",pch);
-                               
-                               while( *pch != '\0' )
-                               {
-                                       pnext = strpbrk(pch, " ");
-                                       if (!pnext)
-                                               break;
-                                       pnext++;
-                                       if ( *pnext != '\0' )
-                                       {
-                                                 strtou = simple_strtoul (pnext , &ptmp, 16);
-                                                 sprintf( extra, "%s %d" ,extra ,strtou );
-                                       }
-                                       else{
-                                                 break;
-                                       }
-                                       pch = pnext;
-                               }
-                       wrqu->length = strlen(extra);   
-
-       return 0;
-}
-
-static int rtw_mp_start(struct net_device *dev,
-                       struct iw_request_info *info,
-                       struct iw_point *wrqu, char *extra)
-{
-       u8 val8;
-       PADAPTER padapter = rtw_netdev_priv(dev);
-       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(padapter);
-       struct dm_priv  *pdmpriv = &pHalData->dmpriv;
-       struct hal_ops *pHalFunc = &padapter->HalFunc;
-
-       rtw_pm_set_ips(padapter,IPS_NONE);
-       LeaveAllPowerSaveMode(padapter);
-
-       if(padapter->registrypriv.mp_mode ==0)
-       {
-
-#ifdef CONFIG_BT_COEXIST
-               pdmpriv->DMFlag &= ~DYNAMIC_FUNC_BT;
-#endif         
-               pHalFunc->hal_deinit(padapter);
-               padapter->registrypriv.mp_mode =1;
-               pHalFunc->hal_init(padapter);
-
-               rtw_pm_set_ips(padapter,IPS_NONE);
-               LeaveAllPowerSaveMode(padapter);
-       }
-
-       if (padapter->registrypriv.mp_mode == 0)
-               return -EPERM;
-
-       if (padapter->mppriv.mode == MP_OFF) {
-               if (mp_start_test(padapter) == _FAIL)
-                       return -EPERM;
-               padapter->mppriv.mode = MP_ON;
-               MPT_PwrCtlDM(padapter,0);
-       }
-       padapter->mppriv.bmac_filter = _FALSE;
-#ifdef CONFIG_RTL8723B
-#ifdef CONFIG_USB_HCI
-       rtw_write32(padapter, 0x765, 0x0000);
-       rtw_write32(padapter, 0x948, 0x0280);
-#else
-       rtw_write32(padapter, 0x765, 0x0000);
-       rtw_write32(padapter, 0x948, 0x0000);
-#endif 
-#ifdef CONFIG_FOR_RTL8723BS_VQ0
-       rtw_write32(padapter, 0x765, 0x0000);
-       rtw_write32(padapter, 0x948, 0x0280);
-#endif
-       rtw_write8(padapter, 0x66, 0x27); //Open BT uart Log
-       rtw_write8(padapter, 0xc50, 0x20); //for RX init Gain
-#endif 
-       ODM_Write_DIG(&pHalData->odmpriv,0x20);
-
-       return 0;
-}
-
-static int rtw_mp_stop(struct net_device *dev,
-                       struct iw_request_info *info,
-                       struct iw_point *wrqu, char *extra)
-{
-       PADAPTER padapter = rtw_netdev_priv(dev);
-       struct hal_ops *pHalFunc = &padapter->HalFunc;
-
-       if(padapter->registrypriv.mp_mode ==1)
-       {
-               
-               MPT_DeInitAdapter(padapter);
-               pHalFunc->hal_deinit(padapter);
-               padapter->registrypriv.mp_mode=0;
-               pHalFunc->hal_init(padapter);
-       }
-       
-       if (padapter->mppriv.mode != MP_OFF) {
-               mp_stop_test(padapter);
-               padapter->mppriv.mode = MP_OFF;
-       }
-
-       return 0;
-}
-
-extern int wifirate2_ratetbl_inx(unsigned char rate);
-
-static int rtw_mp_rate(struct net_device *dev,
-                       struct iw_request_info *info,
-                       struct iw_point *wrqu, char *extra)
-{
-       u32 rate = MPT_RATE_1M;
-       u8              input[wrqu->length];
-       PADAPTER padapter = rtw_netdev_priv(dev);
-
-       if (copy_from_user(input, wrqu->pointer, wrqu->length))
-                       return -EFAULT;
-                       
-       rate = rtw_mpRateParseFunc(padapter,input);
-
-       if (rate ==0 && strcmp(input,"1M")!=0)
-       {
-       rate = rtw_atoi(input); 
-       if(rate <= 0x7f)
-               rate = wifirate2_ratetbl_inx( (u8)rate);        
-       else if (rate < 0xC8)
-               rate =(rate - 0x80 + MPT_RATE_MCS0);
-               //HT  rate 0x80(MCS0)  ~ 0x8F(MCS15) ~ 0x9F(MCS31) 128~159 
-        //VHT1SS~2SS rate 0xA0 (VHT1SS_MCS0 44) ~ 0xB3 (VHT2SS_MCS9 #63) 160~179
-        //VHT rate 0xB4 (VHT3SS_MCS0 64) ~ 0xC7 (VHT2SS_MCS9 #83) 180~199 
-       //else
-               //VHT rate 0x90(VHT1SS_MCS0) ~ 0x99(VHT1SS_MCS9) 144~153
-       //      rate =(rate - MPT_RATE_VHT1SS_MCS0); 
-       }
-       _rtw_memset(extra, 0, wrqu->length);
-
-       sprintf( extra, "Set data rate to %s index %d" ,input,rate );
-       DBG_871X("%s: %s rate index=%d \n", __func__,input,rate);
-       
-       if (rate >= MPT_RATE_LAST )     
-       return -EINVAL;
-
-       padapter->mppriv.rateidx = rate;
-       Hal_SetDataRate(padapter);
-       
-       wrqu->length = strlen(extra);
-       return 0;
-}
-
-static int rtw_mp_channel(struct net_device *dev,
-                       struct iw_request_info *info,
-                       struct iw_point *wrqu, char *extra)
-{
-
-       PADAPTER padapter = rtw_netdev_priv(dev);
-       HAL_DATA_TYPE   *pHalData       = GET_HAL_DATA(padapter);
-       u8              input[wrqu->length];
-       u32     channel = 1;
-       int cur_ch_offset;
-
-       if (copy_from_user(input, wrqu->pointer, wrqu->length))
-                       return -EFAULT;
-       
-       channel = rtw_atoi(input);
-       //DBG_871X("%s: channel=%d\n", __func__, channel);
-       _rtw_memset(extra, 0, wrqu->length);
-       sprintf( extra, "Change channel %d to channel %d", padapter->mppriv.channel , channel );
-       padapter->mppriv.channel = channel;
-       Hal_SetChannel(padapter);
-       pHalData->CurrentChannel = channel;
-
-       wrqu->length = strlen(extra);
-       return 0;
-}
-
-static int rtw_mp_bandwidth(struct net_device *dev,
-                       struct iw_request_info *info,
-                       struct iw_point *wrqu, char *extra)
-{
-       u32 bandwidth=0, sg=0;
-       int cur_ch_offset;
-       //u8 buffer[40];
-       PADAPTER padapter = rtw_netdev_priv(dev);
-       HAL_DATA_TYPE   *pHalData       = GET_HAL_DATA(padapter);
-       //if (copy_from_user(buffer, (void*)wrqu->data.pointer, wrqu->data.length))
-    //            return -EFAULT;
-                
-       //DBG_871X("%s:iwpriv in=%s\n", __func__, extra);
-       
-       sscanf(extra, "40M=%d,shortGI=%d", &bandwidth, &sg);
-       
-       if (bandwidth == 1)
-               bandwidth=CHANNEL_WIDTH_40;
-       else if (bandwidth == 2)
-               bandwidth=CHANNEL_WIDTH_80;
-       DBG_871X("%s: bw=%d sg=%d \n", __func__, bandwidth , sg);
-       
-       padapter->mppriv.bandwidth = (u8)bandwidth;
-       padapter->mppriv.preamble = sg;
-       
-       SetBandwidth(padapter);
-       pHalData->CurrentChannelBW = bandwidth;
-       //cur_ch_offset =  rtw_get_offset_by_ch(padapter->mppriv.channel);
-       //set_channel_bwmode(padapter, padapter->mppriv.channel, cur_ch_offset, bandwidth);
-
-       return 0;
-}
-
-
-static int rtw_mp_txpower_index(struct net_device *dev,
-                       struct iw_request_info *info,
-                       struct iw_point *wrqu, char *extra)
-{
-       PADAPTER padapter = rtw_netdev_priv(dev);
-       char input[wrqu->length];
-       u32 rfpath;
-       u32 txpower_inx;
-
-       if (wrqu->length > 128)
-               return -EFAULT;
-
-       if (copy_from_user(input, wrqu->pointer, wrqu->length))
-               return -EFAULT;
-
-       rfpath = rtw_atoi(input);
-       txpower_inx = mpt_ProQueryCalTxPower(padapter, rfpath);
-       sprintf(extra, " %d", txpower_inx);
-       wrqu->length = strlen(extra);
-
-       return 0;
-}
-
-
-static int rtw_mp_txpower(struct net_device *dev,
-                       struct iw_request_info *info,
-                       struct iw_point *wrqu, char *extra)
-{
-       u32             idx_a=0,idx_b=0,MsetPower=1;
-       u8              input[wrqu->length];
-
-       PADAPTER padapter = rtw_netdev_priv(dev);
-
-       if (copy_from_user(input, wrqu->pointer, wrqu->length))
-                       return -EFAULT;
-
-       MsetPower = strncmp(input, "off", 3); 
-       sscanf(input,"patha=%d,pathb=%d",&idx_a,&idx_b);
-       //DBG_871X("%s: tx_pwr_idx_a=%x b=%x\n", __func__, idx_a, idx_b);
-       if(MsetPower==0)
-       {
-               padapter->mppriv.bSetTxPower = 0;
-               sprintf( extra, "MP Set power off");
-       }
-       else
-       {
-       sprintf( extra, "Set power level path_A:%d path_B:%d", idx_a , idx_b );
-       padapter->mppriv.txpoweridx = (u8)idx_a;
-       padapter->mppriv.txpoweridx_b = (u8)idx_b;
-       padapter->mppriv.bSetTxPower = 1;
-               Hal_SetAntennaPathPower(padapter);
-       }
-       wrqu->length = strlen(extra);
-       return 0;
-}
-
-static int rtw_mp_ant_tx(struct net_device *dev,
-                       struct iw_request_info *info,
-                       struct iw_point *wrqu, char *extra)
-{
-       u8 i;
-       u8              input[wrqu->length];
-       u16 antenna = 0;
-       PADAPTER padapter = rtw_netdev_priv(dev);
-
-       if (copy_from_user(input, wrqu->pointer, wrqu->length))
-                       return -EFAULT;
-                       
-       //DBG_871X("%s: input=%s\n", __func__, input);  
-       
-       sprintf( extra, "switch Tx antenna to %s", input);
-       
-       for (i=0; i < strlen(input); i++)
-       {
-               switch(input[i])
-                       {
-                               case 'a' :
-                                                               antenna|=ANTENNA_A;
-                                                               break;
-                               case 'b':
-                                                               antenna|=ANTENNA_B;
-                                                               break;
-                       }
-       }
-       //antenna |= BIT(extra[i]-'a');
-       //DBG_871X("%s: antenna=0x%x\n", __func__, antenna);            
-       padapter->mppriv.antenna_tx = antenna;
-       padapter->mppriv.antenna_rx = antenna;
-       //DBG_871X("%s:mppriv.antenna_rx=%d\n", __func__, padapter->mppriv.antenna_tx);
-       
-       Hal_SetAntenna(padapter);
-
-       wrqu->length = strlen(extra);
-       return 0;
-}
-
-static int rtw_mp_ant_rx(struct net_device *dev,
-                       struct iw_request_info *info,
-                       struct iw_point *wrqu, char *extra)
-{
-       u8 i;
-       u16 antenna = 0;
-       u8              input[wrqu->length];
-       PADAPTER padapter = rtw_netdev_priv(dev);
-
-       if (copy_from_user(input, wrqu->pointer, wrqu->length))
-                       return -EFAULT;
-       //DBG_871X("%s: input=%s\n", __func__, input);
-       _rtw_memset(extra, 0, wrqu->length);
-       
-       sprintf( extra, "switch Rx antenna to %s", input );
-       
-       for (i=0; i < strlen(input); i++) {
-       switch( input[i] )
-                       {
-                               case 'a' :
-                                                               antenna|=ANTENNA_A;
-                                                               break;
-                               case 'b':
-                                                               antenna|=ANTENNA_B;
-                                                               break;
-                               case 'c' :
-                                                               antenna|=ANTENNA_C;
-                                                               break;
-                       }
-       }
-       
-       //DBG_871X("%s: antenna=0x%x\n", __func__, antenna);            
-       padapter->mppriv.antenna_tx = antenna;
-       padapter->mppriv.antenna_rx = antenna;
-       //DBG_871X("%s:mppriv.antenna_rx=%d\n", __func__, padapter->mppriv.antenna_rx);
-       Hal_SetAntenna(padapter);
-       wrqu->length = strlen(extra);
-       
-       return 0;
-}
-
-static int rtw_mp_ctx(struct net_device *dev,
-                       struct iw_request_info *info,
-                       struct iw_point *wrqu, char *extra)
-{
-       u32 pkTx = 1, countPkTx = 1, cotuTx = 1, CarrSprTx = 1, scTx = 1, sgleTx = 1, stop = 1;
-       u32 bStartTest = 1;
-       u32 count = 0,pktinterval=0;
-       struct mp_priv *pmp_priv;
-       struct pkt_attrib *pattrib;
-
-       PADAPTER padapter = rtw_netdev_priv(dev);
-
-
-       pmp_priv = &padapter->mppriv;
-
-       if (copy_from_user(extra, wrqu->pointer, wrqu->length))
-                       return -EFAULT;
-                       
-       DBG_871X("%s: in=%s\n", __func__, extra);
-
-       countPkTx = strncmp(extra, "count=", 5); // strncmp TRUE is 0
-       cotuTx = strncmp(extra, "background", 20);
-       CarrSprTx = strncmp(extra, "background,cs", 20);
-       scTx = strncmp(extra, "background,sc", 20);
-       sgleTx = strncmp(extra, "background,stone", 20);
-       pkTx = strncmp(extra, "background,pkt", 20);
-       stop = strncmp(extra, "stop", 4);
-       sscanf(extra, "count=%d,pkt", &count);
-       sscanf(extra, "pktinterval=%d", &pktinterval);
-       
-       //DBG_871X("%s: count=%d countPkTx=%d cotuTx=%d CarrSprTx=%d scTx=%d sgleTx=%d pkTx=%d stop=%d\n", __func__, count, countPkTx, cotuTx, CarrSprTx, pkTx, sgleTx, scTx, stop);
-       _rtw_memset(extra, '\0', sizeof(extra));
-
-       if( pktinterval !=0 )
-       {
-               sprintf( extra, "Pkt Interval = %d",pktinterval);
-               padapter->mppriv.pktInterval = pktinterval;
-               
-               wrqu->length = strlen(extra);
-               return 0;
-       }
-       
-       if (stop == 0) {
-               bStartTest = 0; // To set Stop
-               pmp_priv->tx.stop = 1;
-               sprintf( extra, "Stop continuous Tx");
-       } else {
-               bStartTest = 1;
-               if (pmp_priv->mode != MP_ON) {
-                       if (pmp_priv->tx.stop != 1) {
-                               DBG_871X("%s: MP_MODE != ON %d\n", __func__, pmp_priv->mode);
-                               return  -EFAULT;
-                       }
-               }
-       }
-
-       if (pkTx == 0 || countPkTx == 0)
-               pmp_priv->mode = MP_PACKET_TX;
-       if (sgleTx == 0)
-               pmp_priv->mode = MP_SINGLE_TONE_TX;
-       if (cotuTx == 0)
-               pmp_priv->mode = MP_CONTINUOUS_TX;
-       if (CarrSprTx == 0)
-               pmp_priv->mode = MP_CARRIER_SUPPRISSION_TX;
-       if (scTx == 0)
-               pmp_priv->mode = MP_SINGLE_CARRIER_TX;
-
-       switch (pmp_priv->mode)
-       {
-               case MP_PACKET_TX:
-               
-                       //DBG_871X("%s:pkTx %d\n", __func__,bStartTest);
-                       if (bStartTest == 0)
-                       {
-                               pmp_priv->tx.stop = 1;
-                               pmp_priv->mode = MP_ON;
-                               sprintf( extra, "Stop continuous Tx");
-                       }
-                       else if (pmp_priv->tx.stop == 1)
-                       {
-                               sprintf( extra, "Start continuous DA=ffffffffffff len=1500 count=%u,\n",count);
-                               //DBG_871X("%s:countPkTx %d\n", __func__,count);
-                               pmp_priv->tx.stop = 0;
-                               pmp_priv->tx.count = count;
-                               pmp_priv->tx.payload = 2;
-#ifdef CONFIG_80211N_HT
-                               pmp_priv->tx.attrib.ht_en = 1;
-#endif
-#ifdef CONFIG_80211AC_VHT
-                               pmp_priv->tx.attrib.raid = RATEID_IDX_VHT_1SS; //10
-#endif
-                               pattrib = &pmp_priv->tx.attrib;
-                               pattrib->pktlen = 1000;
-                               _rtw_memset(pattrib->dst, 0xFF, ETH_ALEN);
-                               SetPacketTx(padapter);
-                       } 
-                       else {
-                               //DBG_871X("%s: pkTx not stop\n", __func__);
-                               return -EFAULT;
-                       }
-                               wrqu->length = strlen(extra);
-                               return 0;
-
-               case MP_SINGLE_TONE_TX:
-                       //DBG_871X("%s: sgleTx %d \n", __func__, bStartTest);
-                       if (bStartTest != 0){
-                               sprintf( extra, "Start continuous DA=ffffffffffff len=1500 \n infinite=yes.");
-            }
-                       Hal_SetSingleToneTx(padapter, (u8)bStartTest);
-                       break;
-
-               case MP_CONTINUOUS_TX:
-                       //DBG_871X("%s: cotuTx %d\n", __func__, bStartTest);
-                       if (bStartTest != 0){
-                               sprintf( extra, "Start continuous DA=ffffffffffff len=1500 \n infinite=yes.");
-                        }
-                       Hal_SetContinuousTx(padapter, (u8)bStartTest);
-                       break;
-
-               case MP_CARRIER_SUPPRISSION_TX:
-                       //DBG_871X("%s: CarrSprTx %d\n", __func__, bStartTest);
-                       if (bStartTest != 0){
-                               if( pmp_priv->rateidx <= MPT_RATE_11M ) 
-                               {
-                                       sprintf( extra, "Start continuous DA=ffffffffffff len=1500 \n infinite=yes.");
-                                       
-                               }else
-                                       sprintf( extra, "Specify carrier suppression but not CCK rate");
-                       }
-                       Hal_SetCarrierSuppressionTx(padapter, (u8)bStartTest);
-                       break;
-
-               case MP_SINGLE_CARRIER_TX:
-                       //DBG_871X("%s: scTx %d\n", __func__, bStartTest);
-                       if (bStartTest != 0){
-                               sprintf( extra, "Start continuous DA=ffffffffffff len=1500 \n infinite=yes.");
-                       }
-                       Hal_SetSingleCarrierTx(padapter, (u8)bStartTest);
-                       break;
-
-               default:
-                       //DBG_871X("%s:No Match MP_MODE\n", __func__);
-                       sprintf( extra, "Error! Continuous-Tx is not on-going.");
-                       return -EFAULT;
-       }
-
-       if ( bStartTest==1 && pmp_priv->mode != MP_ON) {
-               struct mp_priv *pmp_priv = &padapter->mppriv;
-               if (pmp_priv->tx.stop == 0) {
-                       pmp_priv->tx.stop = 1;
-                       //DBG_871X("%s: pkt tx is running...\n", __func__);
-                       rtw_msleep_os(5);
-               }
-#ifdef CONFIG_80211N_HT
-               pmp_priv->tx.attrib.ht_en = 1;
-#endif
-#ifdef CONFIG_80211AC_VHT
-               pmp_priv->tx.attrib.raid = RATEID_IDX_VHT_1SS; //10
-#endif
-               pmp_priv->tx.stop = 0;
-               pmp_priv->tx.count = 1;
-               SetPacketTx(padapter);
-       } else {
-               pmp_priv->mode = MP_ON;
-       }
-
-       wrqu->length = strlen(extra);
-       return 0;
-}
-
-
-static int rtw_mp_disable_bt_coexist(struct net_device *dev,
-                       struct iw_request_info *info,
-                       union iwreq_data *wrqu, char *extra)
-{
-       PADAPTER padapter = (PADAPTER)rtw_netdev_priv(dev);
-       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(padapter);
-       struct dm_priv  *pdmpriv = &pHalData->dmpriv;
-       struct hal_ops *pHalFunc = &padapter->HalFunc;
-       
-       u8 input[wrqu->data.length];
-       u32 bt_coexist;
-
-       if (copy_from_user(input, wrqu->data.pointer, wrqu->data.length))
-               return -EFAULT;
-       
-       bt_coexist = rtw_atoi(input);
-       
-       if( bt_coexist == 0 )
-       {
-               RT_TRACE(_module_mp_, _drv_info_,
-                       ("Set OID_RT_SET_DISABLE_BT_COEXIST: disable BT_COEXIST\n"));
-               DBG_871X("Set OID_RT_SET_DISABLE_BT_COEXIST: disable BT_COEXIST\n");
-#ifdef CONFIG_BT_COEXIST
-               rtw_btcoex_HaltNotify(padapter);
-               rtw_btcoex_SetManualControl(padapter, _TRUE);
-               pdmpriv->DMFlag &= ~DYNAMIC_FUNC_BT;
-               // Force to switch Antenna to WiFi
-               rtw_write16(padapter, 0x870, 0x300);
-               rtw_write16(padapter, 0x860, 0x110); 
-#endif // CONFIG_BT_COEXIST
-       }
-       else
-       {
-               RT_TRACE(_module_mp_, _drv_info_,
-                       ("Set OID_RT_SET_DISABLE_BT_COEXIST: enable BT_COEXIST\n"));
-#ifdef CONFIG_BT_COEXIST               
-               pdmpriv->DMFlag |= DYNAMIC_FUNC_BT;
-               rtw_btcoex_SetManualControl(padapter, _FALSE);
-#endif
-       }
-
-       return 0;       
-}
-
-
-static int rtw_mp_arx(struct net_device *dev,
-                       struct iw_request_info *info,
-                       struct iw_point *wrqu, char *extra)
-{
-       u8 bStartRx=0,bStopRx=0,bQueryPhy=0,bQueryMac=0,bSetBssid=0;
-       u8 bmac_filter = 0,bfilter_init=0;
-       u32 cckok=0,cckcrc=0,ofdmok=0,ofdmcrc=0,htok=0,htcrc=0,OFDM_FA=0,CCK_FA=0,DropPacket=0,vht_ok=0,vht_err=0;
-       u32             mac_cck_ok=0, mac_ofdm_ok=0, mac_ht_ok=0, mac_vht_ok=0;
-       u32             mac_cck_err=0, mac_ofdm_err=0, mac_ht_err=0, mac_vht_err=0;
-       u8              input[wrqu->length];
-       char *pch, *ptmp, *token, *tmp[2]={0x00,0x00};
-       u32 i=0,ii=0,jj=0,kk=0,cnts=0,bmon=0;
-       PADAPTER padapter = rtw_netdev_priv(dev);
-       struct mp_priv *pmppriv = &padapter->mppriv;
-
-       if (copy_from_user(input, wrqu->pointer, wrqu->length))
-                       return -EFAULT;
-
-       DBG_871X("%s: %s\n", __func__, input);
-
-       bStartRx = (strncmp(input, "start", 5)==0)?1:0; // strncmp TRUE is 0
-       bStopRx = (strncmp(input, "stop", 5)==0)?1:0; // strncmp TRUE is 0
-       bQueryPhy = (strncmp(input, "phy", 3)==0)?1:0; // strncmp TRUE is 0
-       bQueryMac = (strncmp(input, "mac", 3)==0)?1:0; // strncmp TRUE is 0
-       bSetBssid = (strncmp(input, "setbssid=", 8)==0)?1:0; // strncmp TRUE is 0
-       //bfilter_init = (strncmp(input, "filter_init",11)==0)?1:0;
-       bmac_filter = (strncmp(input, "accept_mac",10)==0)?1:0;
-       bmon = (strncmp(input, "mon=",4)==0)?1:0;
-
-       if(bSetBssid==1){
-               pch = input;
-               while ((token = strsep(&pch, "=")) != NULL)
-               {
-                       if (i > 1) break;
-                       tmp[i] = token;
-                       i++;
-               }
-               if ((tmp[0]==NULL) && (tmp[1]==NULL)){
-                       return -EFAULT;
-               }
-               else{
-                       cnts = strlen(tmp[1])/2;
-                       if (cnts<1) return -EFAULT;
-                       DBG_871X("%s: cnts=%d\n", __FUNCTION__, cnts);
-                       DBG_871X("%s: data=%s\n", __FUNCTION__, tmp[1]);
-                       for (jj=0, kk=0; jj < cnts ; jj++, kk+=2){
-                                        pmppriv->network_macaddr[jj] = key_2char2num(tmp[1][kk], tmp[1][kk+1]);
-                                       DBG_871X("network_macaddr[%d]=%x \n",jj, pmppriv->network_macaddr[jj]);
-                       }
-               }
-               pmppriv->bSetRxBssid = _TRUE;
-       }
-
-       if(bmac_filter)
-       {
-               pmppriv->bmac_filter = bmac_filter;
-               pch = input;
-               while ((token = strsep(&pch, "=")) != NULL)
-               {
-                       if (i > 1) break;
-                       tmp[i] = token;
-                       i++;
-               }
-               if ((tmp[0]==NULL) && (tmp[1]==NULL)){
-                       return -EFAULT;
-               }
-               else{
-                       cnts = strlen(tmp[1])/2;
-                       if (cnts<1) return -EFAULT;
-                       DBG_871X("%s: cnts=%d\n", __FUNCTION__, cnts);
-                       DBG_871X("%s: data=%s\n", __FUNCTION__, tmp[1]);
-                       for (jj=0, kk=0; jj < cnts ; jj++, kk+=2){
-                                       pmppriv->mac_filter[jj] = key_2char2num(tmp[1][kk], tmp[1][kk+1]);
-                                       DBG_871X("%s mac_filter[%d]=%x \n",__FUNCTION__,jj, pmppriv->mac_filter[jj]);
-                       }
-               }
-       }
-       
-       if(bStartRx)
-       {
-               sprintf( extra, "start");
-               SetPacketRx(padapter, bStartRx);
-       }
-       else if(bStopRx)
-       {
-               SetPacketRx(padapter, 0);
-               pmppriv->bmac_filter = _FALSE;
-               sprintf( extra, "Received packet OK:%d CRC error:%d ,Filter out:%d",padapter->mppriv.rx_pktcount,padapter->mppriv.rx_crcerrpktcount,padapter->mppriv.rx_pktcount_filter_out);
-       }
-       else if(bQueryPhy)
-       {          
-
-               if (IS_HARDWARE_TYPE_JAGUAR(padapter)) 
-               {
-                       cckok      = PHY_QueryBBReg(padapter, 0xF04, 0x3FFF);        // [13:0]  
-                       ofdmok     = PHY_QueryBBReg(padapter, 0xF14, 0x3FFF);        // [13:0]  
-                       htok       = PHY_QueryBBReg(padapter, 0xF10, 0x3FFF);     // [13:0]
-                       vht_ok      = PHY_QueryBBReg(padapter, 0xF0C, 0x3FFF);     // [13:0]
-                                                                 
-                       cckcrc     = PHY_QueryBBReg(padapter, 0xF04, 0x3FFF0000); // [29:16]                                            
-                       ofdmcrc    = PHY_QueryBBReg(padapter, 0xF14, 0x3FFF0000); // [29:16]
-                       htcrc      = PHY_QueryBBReg(padapter, 0xF10, 0x3FFF0000); // [29:16]            
-                       vht_err     = PHY_QueryBBReg(padapter, 0xF0C, 0x3FFF0000); // [29:16]   
-                       
-                       CCK_FA = PHY_QueryBBReg(padapter, 0xa5c, bMaskLWord);
-                       OFDM_FA = PHY_QueryBBReg(padapter, 0xF48, bMaskLWord);
-               } 
-               else
-               {
-                       cckok      = PHY_QueryBBReg(padapter, 0xF88, bMaskDWord);               
-                       ofdmok     = PHY_QueryBBReg(padapter, 0xF94, bMaskLWord);               
-                           htok       = PHY_QueryBBReg(padapter, 0xF90, bMaskLWord);
-                       vht_ok      = 0;
-                   
-                       cckcrc     = PHY_QueryBBReg(padapter, 0xF84, bMaskDWord);                                               
-                       ofdmcrc    = PHY_QueryBBReg(padapter, 0xF94, bMaskHWord);
-                       htcrc      = PHY_QueryBBReg(padapter, 0xF90, bMaskHWord);               
-                       vht_err     = 0;
-               
-               OFDM_FA = PHY_QueryBBReg(padapter, 0xCF0, bMaskLWord) + PHY_QueryBBReg(padapter, 0xCF2, bMaskLWord) + 
-                                       PHY_QueryBBReg(padapter, 0xDA2, bMaskLWord)+ PHY_QueryBBReg(padapter, 0xDA4, bMaskLWord) + 
-                                       PHY_QueryBBReg(padapter, 0xDA6, bMaskLWord) + PHY_QueryBBReg(padapter, 0xDA8, bMaskLWord);
-               
-               CCK_FA=(rtw_read8(padapter, 0xa5b )<<8 ) | (rtw_read8(padapter, 0xa5c));
-               }
-               DBG_871X("%s: OFDM_FA =%d\n", __FUNCTION__, OFDM_FA);
-               DBG_871X("%s: CCK_FA =%d\n", __FUNCTION__, CCK_FA);
-               sprintf( extra, "Phy Received packet OK:%d CRC error:%d FA Counter: %d",cckok+ofdmok+htok+vht_ok,cckcrc+ofdmcrc+htcrc+vht_err,OFDM_FA+CCK_FA);
-       }
-       else if(bQueryMac)
-       {
-               // for 8723A
-               {
-                       PHY_SetMacReg(padapter, 0x664, BIT28|BIT29|BIT30|BIT31, 0x3);
-                       mac_cck_ok      = PHY_QueryMacReg(padapter, 0x664, bMaskLWord);      // [15:0]    
-                       PHY_SetMacReg(padapter, 0x664, BIT28|BIT29|BIT30|BIT31, 0x0);
-                       mac_ofdm_ok     = PHY_QueryMacReg(padapter, 0x664, bMaskLWord);      // [15:0]   
-                       PHY_SetMacReg(padapter, 0x664, BIT28|BIT29|BIT30|BIT31, 0x6);
-                       mac_ht_ok       = PHY_QueryMacReg(padapter, 0x664, bMaskLWord);     // [15:0]   
-                       mac_vht_ok      = 0;
-                       
-                       PHY_SetMacReg(padapter, 0x664, BIT28|BIT29|BIT30|BIT31, 0x4);
-                       mac_cck_err     = PHY_QueryMacReg(padapter, 0x664, bMaskLWord); // [15:0]       
-                       PHY_SetMacReg(padapter, 0x664, BIT28|BIT29|BIT30|BIT31, 0x1);
-                       mac_ofdm_err    = PHY_QueryMacReg(padapter, 0x664, bMaskLWord); // [15:0]       
-                       PHY_SetMacReg(padapter, 0x664, BIT28|BIT29|BIT30|BIT31, 0x7);
-                       mac_ht_err      = PHY_QueryMacReg(padapter, 0x664, bMaskLWord); // [15:0]               
-                       mac_vht_err     = 0;
-                       //Mac_DropPacket
-                       rtw_write32(padapter, 0x664, (rtw_read32(padapter, 0x0664)& 0x0FFFFFFF)| Mac_DropPacket);
-                       DropPacket = rtw_read32(padapter, 0x664)& 0x0000FFFF;
-               } 
-               
-               sprintf( extra, "Mac Received packet OK: %d , CRC error: %d , Drop Packets: %d\n",
-                               mac_cck_ok+mac_ofdm_ok+mac_ht_ok+mac_vht_ok,mac_cck_err+mac_ofdm_err+mac_ht_err+mac_vht_err,DropPacket);                        
-       }
-
-       if( bmon==1 ) { 
-               sscanf(input, "mon=%d", &bmon);
-               
-               if(bmon==1)
-               {
-                       pmppriv->rx_bindicatePkt= _TRUE;
-                       sprintf( extra, "Indicating Receive Packet to network start\n");
-               }else {
-                       pmppriv->rx_bindicatePkt= _FALSE;
-                       sprintf( extra, "Indicating Receive Packet to network Stop\n");
-               }       
-       }
-       
-       wrqu->length = strlen(extra) + 1;
-
-       return 0;
-}
-
-static int rtw_mp_trx_query(struct net_device *dev,
-                       struct iw_request_info *info,
-                       struct iw_point *wrqu, char *extra)
-{
-       u32 txok,txfail,rxok,rxfail,rxfilterout;
-       PADAPTER padapter = rtw_netdev_priv(dev);
-       //if (copy_from_user(extra, wrqu->data.pointer, wrqu->data.length))
-       //      return -EFAULT;
-
-       txok=padapter->mppriv.tx.sended;
-       txfail=0;
-       rxok = padapter->mppriv.rx_pktcount;
-       rxfail = padapter->mppriv.rx_crcerrpktcount;
-       rxfilterout = padapter->mppriv.rx_pktcount_filter_out;
-
-       _rtw_memset(extra, '\0', 128);
-
-       sprintf(extra, "Tx OK:%d, Tx Fail:%d, Rx OK:%d, CRC error:%d ,Rx Filter out:%d \n", txok, txfail,rxok,rxfail,rxfilterout);
-
-       wrqu->length=strlen(extra)+1;
-
-       return 0;
-}
-
-static int rtw_mp_pwrtrk(struct net_device *dev,
-                       struct iw_request_info *info,
-                       struct iw_point *wrqu, char *extra)
-{
-       u8 enable;
-       u32 thermal;
-       s32 ret;
-       PADAPTER padapter = rtw_netdev_priv(dev);
-       HAL_DATA_TYPE                   *pHalData = GET_HAL_DATA(padapter);
-       u8              input[wrqu->length];
-
-       if (copy_from_user(input, wrqu->pointer, wrqu->length))
-                       return -EFAULT;
-
-       _rtw_memset(extra, 0, wrqu->length);
-
-       enable = 1;
-       if (wrqu->length > 1) { // not empty string
-               if (strncmp(input, "stop", 4) == 0)
-               {       
-                       enable = 0;
-                       sprintf(extra, "mp tx power tracking stop");
-                       pHalData->TxPowerTrackControl = _FALSE;
-               }
-               else if (sscanf(input, "ther=%d", &thermal)) {
-                       pHalData->TxPowerTrackControl = _TRUE;
-                       ret = Hal_SetThermalMeter(padapter, (u8)thermal);
-                       if (ret == _FAIL) return -EPERM;
-                               sprintf(extra, "mp tx power tracking start,target value=%d ok ",thermal);
-               }else{
-                       return -EINVAL;
-               }
-       }
-
-       ret = Hal_SetPowerTracking(padapter, enable);
-       if (ret == _FAIL) return -EPERM;
-
-       wrqu->length = strlen(extra);
-
-       return 0;
-}
-
-static int rtw_mp_psd(struct net_device *dev,
-                       struct iw_request_info *info,
-                       struct iw_point *wrqu, char *extra)
-{
-       PADAPTER padapter = rtw_netdev_priv(dev);
-       u8              input[wrqu->length];
-       
-       if (copy_from_user(input, wrqu->pointer, wrqu->length))
-               return -EFAULT;
-       
-       strcpy(extra,input);
-       
-       wrqu->length = mp_query_psd(padapter, extra);
-       
-       return 0;
-}
-
-static int rtw_mp_thermal(struct net_device *dev,
-                       struct iw_request_info *info,
-                       struct iw_point *wrqu, char *extra)
-{
-       u8 val;
-       int bwrite=1;
-       
-       #ifdef CONFIG_RTL8192C
-                       u16 addr=EEPROM_THERMAL_METER_92C;
-       #endif
-       #ifdef CONFIG_RTL8192D
-                       u16 addr=EEPROM_THERMAL_METER_92D;
-       #endif
-       #ifdef CONFIG_RTL8723A
-                       u16 addr=EEPROM_THERMAL_METER_8723A;
-       #endif
-       #ifdef CONFIG_RTL8188E
-                       u16 addr=EEPROM_THERMAL_METER_88E;
-       #endif
-       #if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A)
-                       u16 addr=EEPROM_THERMAL_METER_8812;
-       #endif
-       #ifdef CONFIG_RTL8192E
-                       u16 addr=EEPROM_THERMAL_METER_8192E;
-       #endif
-       #ifdef CONFIG_RTL8723B
-                       u16 addr=EEPROM_THERMAL_METER_8723B;
-       #endif
-       u16 cnt=1;
-       u16 max_available_size=0;
-       PADAPTER padapter = rtw_netdev_priv(dev);       
-
-       if (copy_from_user(extra, wrqu->pointer, wrqu->length))
-               return -EFAULT;
-
-       //DBG_871X("print extra %s \n",extra); 
-        
-        bwrite = strncmp(extra, "write", 6); // strncmp TRUE is 0
-        
-        Hal_GetThermalMeter(padapter, &val);
-        
-        if( bwrite == 0 )      
-        {
-                //DBG_871X("to write val:%d",val);
-                       EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&max_available_size, _FALSE);
-                       if( 2 > max_available_size )
-                       {                       
-                               DBG_871X("no available efuse!\n");
-                               return -EFAULT;
-                       }       
-                       if ( rtw_efuse_map_write(padapter, addr, cnt, &val) == _FAIL )
-                       {
-                               DBG_871X("rtw_efuse_map_write error \n");                       
-                               return -EFAULT;
-                       } 
-                       else
-                       {
-                                sprintf(extra, " efuse write ok :%d", val);    
-                       }
-         }
-         else
-         {
-                        sprintf(extra, "%d", val);
-         }
-       wrqu->length = strlen(extra);
-       
-       return 0;
-}
-
-static int rtw_mp_reset_stats(struct net_device *dev,
-                       struct iw_request_info *info,
-                       struct iw_point *wrqu, char *extra)
-{
-       struct mp_priv *pmp_priv;
-       struct pkt_attrib *pattrib;
-       PADAPTER padapter = rtw_netdev_priv(dev);
-       
-       pmp_priv = &padapter->mppriv;
-       
-       pmp_priv->tx.sended = 0;
-       pmp_priv->tx_pktcount = 0;
-       pmp_priv->rx_pktcount = 0;
-       pmp_priv->rx_pktcount_filter_out=0;
-       pmp_priv->rx_crcerrpktcount = 0;
-
-       //reset phy counter
-       if (IS_HARDWARE_TYPE_JAGUAR(padapter))
-       {
-               write_bbreg(padapter, 0xB58, BIT0, 0x1);
-               write_bbreg(padapter, 0xB58, BIT0, 0x0);
-
-               write_bbreg(padapter, 0x9A4, BIT17, 0x1);//reset  OFDA FA counter
-               write_bbreg(padapter, 0x9A4, BIT17, 0x0);
-               
-               write_bbreg(padapter, 0xA5C, BIT15, 0x0);//reset  CCK FA counter
-               write_bbreg(padapter, 0xA5C, BIT15, 0x1);
-       }
-       else
-       {
-               write_bbreg(padapter, 0xF14, BIT16, 0x1);
-               rtw_msleep_os(10);
-               write_bbreg(padapter, 0xF14, BIT16, 0x0);
-               
-               write_bbreg(padapter, 0xD00, BIT27, 0x1);//reset  OFDA FA counter
-               write_bbreg(padapter, 0xC0C, BIT31, 0x1);//reset  OFDA FA counter
-               write_bbreg(padapter, 0xD00, BIT27, 0x0);
-               write_bbreg(padapter, 0xC0C, BIT31, 0x0);
-               
-               write_bbreg(padapter, 0xA2C, BIT15, 0x0);//reset  CCK FA counter
-               write_bbreg(padapter, 0xA2C, BIT15, 0x1);
-       }
-       //reset mac counter
-       PHY_SetMacReg(padapter, 0x664, BIT27, 0x1); 
-       PHY_SetMacReg(padapter, 0x664, BIT27, 0x0);
-       return 0;
-}
-
-static int rtw_mp_dump(struct net_device *dev,
-                       struct iw_request_info *info,
-                       struct iw_point *wrqu, char *extra)
-{
-       struct mp_priv *pmp_priv;
-       struct pkt_attrib *pattrib;
-        u32 value;
-    u8         input[wrqu->length];
-       u8 rf_type,path_nums = 0;
-       u32 i,j=1,path;
-       PADAPTER padapter = rtw_netdev_priv(dev);
-       
-       pmp_priv = &padapter->mppriv;
-
-       if (copy_from_user(input, wrqu->pointer, wrqu->length))
-               return -EFAULT;
-       
-       if ( strncmp(input, "all", 4)==0 )
-       {
-               mac_reg_dump(RTW_DBGDUMP, padapter);
-               bb_reg_dump(RTW_DBGDUMP, padapter);
-               rf_reg_dump(RTW_DBGDUMP, padapter);
-       }
-       return 0;
-}
-
-static int rtw_mp_phypara(struct net_device *dev,
-                       struct iw_request_info *info,
-                       struct iw_point *wrqu, char *extra)
-{
-
-       PADAPTER padapter = rtw_netdev_priv(dev);
-       HAL_DATA_TYPE   *pHalData       = GET_HAL_DATA(padapter);
-       char    input[wrqu->length];
-       u32             valxcap;
-       
-       if (copy_from_user(input, wrqu->pointer, wrqu->length))
-                       return -EFAULT;
-       
-       DBG_871X("%s:iwpriv in=%s\n", __func__, input);
-       
-       sscanf(input, "xcap=%d", &valxcap);
-
-       pHalData->CrystalCap = (u8)valxcap;
-       Hal_ProSetCrystalCap( padapter , valxcap );
-
-       sprintf( extra, "Set xcap=%d",valxcap );
-       wrqu->length = strlen(extra) + 1;
-       
-return 0;
-
-}
-
-static int rtw_mp_SetRFPath(struct net_device *dev,
-                       struct iw_request_info *info,
-                       union iwreq_data *wrqu, char *extra)
-{
-       PADAPTER padapter = rtw_netdev_priv(dev);
-       char    input[wrqu->data.length];
-       s32             bMain=1,bTurnoff=1;
-       
-       if (copy_from_user(input, wrqu->data.pointer, wrqu->data.length))
-                       return -EFAULT;
-       DBG_871X("%s:iwpriv in=%s\n", __func__, input); 
-       
-       bMain = strncmp(input, "1", 2); // strncmp TRUE is 0
-       bTurnoff = strncmp(input, "0", 3); // strncmp TRUE is 0
-
-       if(bMain==0)
-       {
-               MP_PHY_SetRFPathSwitch(padapter,_TRUE);
-               DBG_871X("%s:PHY_SetRFPathSwitch=TRUE\n", __func__);    
-       }
-       else if(bTurnoff==0)
-       {
-               MP_PHY_SetRFPathSwitch(padapter,_FALSE);
-               DBG_871X("%s:PHY_SetRFPathSwitch=FALSE\n", __func__);   
-       }
-       
-       return 0;
-}
-
-static int rtw_mp_QueryDrv(struct net_device *dev,
-                       struct iw_request_info *info,
-                       union iwreq_data *wrqu, char *extra)
-{
-       PADAPTER padapter = rtw_netdev_priv(dev);
-       char    input[wrqu->data.length];
-       s32     qAutoLoad=1;
-
-       EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(padapter);
-       
-       if (copy_from_user(input, wrqu->data.pointer, wrqu->data.length))
-                       return -EFAULT;
-       DBG_871X("%s:iwpriv in=%s\n", __func__, input); 
-       
-       qAutoLoad = strncmp(input, "autoload", 8); // strncmp TRUE is 0
-
-       if(qAutoLoad==0)
-       {
-               DBG_871X("%s:qAutoLoad\n", __func__);
-               
-               if(pEEPROM->bautoload_fail_flag)
-                       sprintf(extra, "fail");
-               else
-               sprintf(extra, "ok");      
-       }
-               wrqu->data.length = strlen(extra) + 1;
-       return 0;
-}
-
-/* update Tx AGC offset */
-static int rtw_mp_antBdiff(struct net_device *dev,
-                       struct iw_request_info *info,
-                       struct iw_point *wrqu, char *extra)
-{
-
-
-       // MPT_ProSetTxAGCOffset
-       return 0;
-}
-
-
-static int rtw_mp_PwrCtlDM(struct net_device *dev,
-                       struct iw_request_info *info,
-                       struct iw_point *wrqu, char *extra)
-{
-       PADAPTER padapter = rtw_netdev_priv(dev);
-       u8              input[wrqu->length];
-       int             bstart=1;
-       
-       if (copy_from_user(input, wrqu->pointer, wrqu->length))
-                       return -EFAULT;
-
-       bstart = strncmp(input, "start", 5); // strncmp TRUE is 0
-       if(bstart==0){
-               sprintf(extra, "PwrCtlDM start \n");
-               MPT_PwrCtlDM(padapter,1);
-       }else{
-               sprintf(extra, "PwrCtlDM stop \n");
-               MPT_PwrCtlDM(padapter,0);
-       }
-       wrqu->length = strlen(extra);
-
-       return 0;
-}
-
-static int rtw_mp_getver(struct net_device *dev,
-                       struct iw_request_info *info,
-                       union iwreq_data *wrqu, char *extra)
-{
-       PADAPTER padapter = rtw_netdev_priv(dev);
-       struct mp_priv *pmp_priv;
-       
-       pmp_priv = &padapter->mppriv;
-       
-       if (copy_from_user(extra, wrqu->data.pointer, wrqu->data.length))
-                       return -EFAULT;
-
-       sprintf(extra, "rtwpriv=%d\n",RTWPRIV_VER_INFO);
-       wrqu->data.length = strlen(extra);
-       return 0;
-}
-
-#if (defined(CONFIG_RTL8723A) || defined(CONFIG_RTL8723B))
-/* update Tx AGC offset */
-static int rtw_mp_SetBT(struct net_device *dev,
-                       struct iw_request_info *info,
-                       union iwreq_data *wrqu, char *extra)
-{
-       PADAPTER padapter = rtw_netdev_priv(dev);
-       struct hal_ops *pHalFunc = &padapter->HalFunc;
-       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(padapter);
-       
-       BT_REQ_CMD      BtReq;
-       PMPT_CONTEXT    pMptCtx=&(padapter->mppriv.MptCtx);
-       PBT_RSP_CMD     pBtRsp=(PBT_RSP_CMD)&pMptCtx->mptOutBuf[0];
-       char    input[128];
-       char *pch, *ptmp, *token, *tmp[2]={0x00,0x00};
-       u8 setdata[100];
-       u8 resetbt=0x00;
-       u8 tempval,BTStatus;
-       u8 H2cSetbtmac[6];
-       u8 u1H2CBtMpOperParm[4]={0x01};
-       u16 testmode=1,ready=1,trxparam=1,setgen=1,getgen=1,testctrl=1,testbt=1,readtherm=1,setbtmac=1;
-       u32 i=0,ii=0,jj=0,kk=0,cnts=0,status=0;
-       PRT_MP_FIRMWARE pBTFirmware = NULL;
-       
-       if (copy_from_user(extra, wrqu->data.pointer, wrqu->data.length))
-                       return -EFAULT;
-       if(strlen(extra)<1) return -EFAULT;
-       
-       DBG_871X("%s:iwpriv in=%s\n", __FUNCTION__, extra); 
-       ready = strncmp(extra, "ready", 5); 
-       testmode = strncmp(extra, "testmode", 8); // strncmp TRUE is 0
-       trxparam = strncmp(extra, "trxparam", 8); 
-       setgen = strncmp(extra, "setgen", 6);
-       getgen = strncmp(extra, "getgen", 6); 
-       testctrl = strncmp(extra, "testctrl", 8);
-       testbt = strncmp(extra, "testbt", 6);
-       readtherm = strncmp(extra, "readtherm", 9);
-       setbtmac = strncmp(extra, "setbtmac", 8);
-
-       if ( strncmp(extra, "dlbt", 4) == 0)
-       {
-               pHalData->LastHMEBoxNum=0;
-               padapter->bBTFWReady = _FALSE;
-               rtw_write8(padapter, 0xa3, 0x05);
-               BTStatus=rtw_read8(padapter, 0xa0);
-               DBG_871X("%s: btwmap before read 0xa0 BT Status =0x%x \n", __FUNCTION__,BTStatus);
-               if (BTStatus != 0x04)
-               {
-                       sprintf(extra, "BT Status not Active DLFW FAIL\n");
-                       goto exit;
-               }
-
-               tempval = rtw_read8(padapter, 0x6B);
-               tempval |= BIT7;
-               rtw_write8(padapter, 0x6B, tempval);
-
-               // Attention!! Between 0x6A[14] and 0x6A[15] setting need 100us delay
-               // So don't wirte 0x6A[14]=1 and 0x6A[15]=0 together!
-               rtw_usleep_os(100);
-               // disable BT power cut
-               // 0x6A[14] = 0
-               tempval = rtw_read8(padapter, 0x6B);
-               tempval &= ~BIT6;
-               rtw_write8(padapter, 0x6B, tempval);
-               rtw_usleep_os(100);
-               MPT_PwrCtlDM(padapter,0);
-               rtw_write32(padapter, 0xcc, (rtw_read32(padapter, 0xcc)| 0x00000004));
-               rtw_write32(padapter, 0x6b, (rtw_read32(padapter, 0x6b)& 0xFFFFFFEF));
-               rtw_msleep_os(600);
-               rtw_write32(padapter, 0x6b, (rtw_read32(padapter, 0x6b)| 0x00000010));
-               rtw_write32(padapter, 0xcc, (rtw_read32(padapter, 0xcc)& 0xFFFFFFFB));
-               rtw_msleep_os(1200);            
-               pBTFirmware = (PRT_MP_FIRMWARE)rtw_zmalloc(sizeof(RT_MP_FIRMWARE));
-               if(pBTFirmware==NULL)
-                       goto exit;
-               padapter->bBTFWReady = _FALSE;
-               FirmwareDownloadBT(padapter, pBTFirmware);
-               if (pBTFirmware)
-                       rtw_mfree((u8*)pBTFirmware, sizeof(RT_MP_FIRMWARE));
-                       
-               DBG_871X("Wait for FirmwareDownloadBT fw boot!\n");
-               rtw_msleep_os(2000);
-               _rtw_memset(extra,'\0', wrqu->data.length);
-               BtReq.opCodeVer = 1;
-               BtReq.OpCode = 0;
-               BtReq.paraLength = 0;
-               mptbt_BtControlProcess(padapter, &BtReq);
-               rtw_msleep_os(100);
-
-               DBG_8192C("FirmwareDownloadBT ready = 0x%x 0x%x", pMptCtx->mptOutBuf[4],pMptCtx->mptOutBuf[5]);
-               if( (pMptCtx->mptOutBuf[4]==0x00) && (pMptCtx->mptOutBuf[5]==0x00))
-                       {
-                               if(padapter->mppriv.bTxBufCkFail==_TRUE)
-                                       sprintf(extra, "check TxBuf Fail.\n");
-                               else
-                                       sprintf(extra, "download FW Fail.\n");
-                       }
-                       else
-                       {
-                               sprintf(extra, "download FW OK.\n");
-                               goto exit;
-                       }
-               goto exit;
-               goto exit;      
-       }
-       if ( strncmp(extra, "dlfw", 4) == 0)
-       {
-               pHalData->LastHMEBoxNum=0;
-               padapter->bBTFWReady = _FALSE;
-               rtw_write8(padapter, 0xa3, 0x05);
-               BTStatus=rtw_read8(padapter, 0xa0);
-               DBG_871X("%s: btwmap before read 0xa0 BT Status =0x%x \n", __FUNCTION__,BTStatus);
-               if (BTStatus != 0x04)
-               {
-                       sprintf(extra, "BT Status not Active DLFW FAIL\n");
-                       goto exit;
-               }
-
-               tempval = rtw_read8(padapter, 0x6B);
-               tempval |= BIT7;
-               rtw_write8(padapter, 0x6B, tempval);
-
-               // Attention!! Between 0x6A[14] and 0x6A[15] setting need 100us delay
-               // So don't wirte 0x6A[14]=1 and 0x6A[15]=0 together!
-               rtw_usleep_os(100);
-               // disable BT power cut
-               // 0x6A[14] = 0
-               tempval = rtw_read8(padapter, 0x6B);
-               tempval &= ~BIT6;
-               rtw_write8(padapter, 0x6B, tempval);
-               rtw_usleep_os(100);
-       
-               MPT_PwrCtlDM(padapter,0);
-               rtw_write32(padapter, 0xcc, (rtw_read32(padapter, 0xcc)| 0x00000004));
-               rtw_write32(padapter, 0x6b, (rtw_read32(padapter, 0x6b)& 0xFFFFFFEF));
-               rtw_msleep_os(600);
-               rtw_write32(padapter, 0x6b, (rtw_read32(padapter, 0x6b)| 0x00000010));
-               rtw_write32(padapter, 0xcc, (rtw_read32(padapter, 0xcc)& 0xFFFFFFFB));
-               rtw_msleep_os(1200);
-
-#if defined(CONFIG_PLATFORM_SPRD) && (MP_DRIVER == 1)
-               // Pull up BT reset pin.
-               DBG_871X("%s: pull up BT reset pin when bt start mp test\n", __FUNCTION__);
-               rtw_wifi_gpio_wlan_ctrl(WLAN_BT_PWDN_ON);
-#endif
-               DBG_871X(" rtl8723a_FirmwareDownload!\n");
+static int rtw_mp_sd_iwrite(struct net_device *dev
+       , struct iw_request_info *info
+       , struct iw_point *wrqu
+       , char *extra)
+{
+       char width;
+       unsigned long addr, data;
+       int ret = 0;
+       PADAPTER padapter = rtw_netdev_priv(dev);
+       char input[32];
 
-#ifdef CONFIG_RTL8723A
-               status = rtl8723a_FirmwareDownload(padapter);
-#elif defined(CONFIG_RTL8723B)
-               status = rtl8723b_FirmwareDownload(padapter, _FALSE);
-#endif
-               DBG_871X("Wait for FirmwareDownloadBT fw boot!\n");
-               rtw_msleep_os(1000);
-#ifdef CONFIG_BT_COEXIST
-               rtw_btcoex_HaltNotify(padapter);
-               DBG_871X("SetBT btcoex HaltNotify !\n");
-               //hal_btcoex1ant_SetAntPath(padapter);
-               rtw_btcoex_SetManualControl(padapter, _TRUE);
-#endif         
-               _rtw_memset(extra,'\0', wrqu->data.length);
-               BtReq.opCodeVer = 1;
-               BtReq.OpCode = 0;
-               BtReq.paraLength = 0;
-               mptbt_BtControlProcess(padapter, &BtReq);
-               rtw_msleep_os(200);
-
-               DBG_8192C("FirmwareDownloadBT ready = 0x%x 0x%x", pMptCtx->mptOutBuf[4],pMptCtx->mptOutBuf[5]);
-               if( (pMptCtx->mptOutBuf[4]==0x00) && (pMptCtx->mptOutBuf[5]==0x00))
-                       {
-                               if(padapter->mppriv.bTxBufCkFail==_TRUE)
-                                       sprintf(extra, "check TxBuf Fail.\n");
-                               else
-                                       sprintf(extra, "download FW Fail.\n");
-                       }
-                       else
-                       {
-                               #ifdef CONFIG_BT_COEXIST
-                               rtw_btcoex_SwitchBtTRxMask(padapter);
-                               #endif
-                               rtw_msleep_os(200);
-                               sprintf(extra, "download FW OK.\n");
-                               goto exit;
-                       }
+       if (wrqu->length > 32) {
+               DBG_871X(FUNC_ADPT_FMT" wrqu->length:%d\n", FUNC_ADPT_ARG(padapter), wrqu->length);
+               ret = -EINVAL;
                goto exit;
        }
 
-       if ( strncmp(extra, "down", 4) == 0){
-               DBG_871X("SetBT down for to hal_init !\n");
-#ifdef CONFIG_BT_COEXIST               
-               rtw_btcoex_SetManualControl(padapter, _FALSE);
-               rtw_btcoex_Initialize(padapter);
-#endif         
-               pHalFunc->read_adapter_info(padapter);
-               pHalFunc->hal_deinit(padapter);
-               pHalFunc->hal_init(padapter);
-               rtw_pm_set_ips(padapter,IPS_NONE);
-               LeaveAllPowerSaveMode(padapter);
-               MPT_PwrCtlDM(padapter,0);
-               rtw_write32(padapter, 0xcc, (rtw_read32(padapter, 0xcc)| 0x00000004));
-               rtw_write32(padapter, 0x6b, (rtw_read32(padapter, 0x6b)& 0xFFFFFFEF));
-               rtw_msleep_os(600);
-                       //rtw_write32(padapter, 0x6a, (rtw_read32(padapter, 0x6a)& 0xFFFFFFFE));
-               rtw_write32(padapter, 0x6b, (rtw_read32(padapter, 0x6b)| 0x00000010));
-               rtw_write32(padapter, 0xcc, (rtw_read32(padapter, 0xcc)& 0xFFFFFFFB));
-               rtw_msleep_os(1200);
-               goto exit;
-       }
-       if ( strncmp(extra, "disable", 7) == 0){
-               DBG_871X("SetBT disable !\n");
-               rtw_write32(padapter, 0x6a, (rtw_read32(padapter, 0x6a)& 0xFFFFFFFB));
-               rtw_msleep_os(500);
-               goto exit;
-               }
-       if ( strncmp(extra, "enable", 6) == 0){
-               DBG_871X("SetBT enable !\n");
-               rtw_write32(padapter, 0x6a, (rtw_read32(padapter, 0x6a)| 0x00000004));
-               rtw_msleep_os(500);
-               goto exit;
-       }
-       if ( strncmp(extra, "h2c", 3) == 0){
-                       DBG_871X("SetBT h2c !\n");
-                       padapter->bBTFWReady = _TRUE;
-                       rtw_hal_fill_h2c_cmd(padapter, 0x63, 1, u1H2CBtMpOperParm);
-                       goto exit;
-               }
-       if ( strncmp(extra, "2ant", 4) == 0){
-               DBG_871X("Set BT 2ant use!\n");
-               PHY_SetMacReg(padapter,0x67,BIT5,0x1);
-               rtw_write32(padapter, 0x948, 0000);
-               
+       if (copy_from_user(input, wrqu->pointer, wrqu->length)) {
+               DBG_871X(FUNC_ADPT_FMT" copy_from_user fail\n", FUNC_ADPT_ARG(padapter));
+               ret = -EFAULT;
                goto exit;
        }
-               
-       if( ready!=0 && testmode!=0 && trxparam!=0 && setgen!=0 && getgen!=0 && testctrl!=0 && testbt!=0 && readtherm!=0 &&setbtmac!=0)
-               return -EFAULT;
-               
-       if( testbt==0 )
-       {
-                       BtReq.opCodeVer=1;
-                       BtReq.OpCode=6;
-                       BtReq.paraLength=cnts/2;
-                       goto todo;
-       }
-       if( ready==0 )
-       {
-               BtReq.opCodeVer=1;
-               BtReq.OpCode=0;
-               BtReq.paraLength=0; 
-               goto todo;
-       }
-
-       pch = extra;    
-       i = 0;
-       while ((token = strsep(&pch, ",")) != NULL)
-       {
-               if (i > 1) break;
-               tmp[i] = token;
-               i++;
-       }
-
-       if ((tmp[0]==NULL) && (tmp[1]==NULL))
-       {
-               return -EFAULT;
-       }
-       else
-       {
-               cnts = strlen(tmp[1]);
-               if (cnts<1) return -EFAULT;
-       
-               DBG_871X("%s: cnts=%d\n", __FUNCTION__, cnts);
-               DBG_871X("%s: data=%s\n", __FUNCTION__, tmp[1]);
-                               
-               for (jj=0, kk=0; jj<cnts; jj++, kk+=2)
-               {
-                       BtReq.pParamStart[jj] = key_2char2num(tmp[1][kk], tmp[1][kk+1]);
-//                     DBG_871X("BtReq.pParamStart[%d]=0x%02x\n", jj, BtReq.pParamStart[jj]);
-               }
-       }
-       
-       if( testmode==0 )       
-       {
-               BtReq.opCodeVer=1;
-               BtReq.OpCode=1;
-               BtReq.paraLength=1; 
-       }
-       if( trxparam==0 )
-       {
-               BtReq.opCodeVer=1;
-               BtReq.OpCode=2;
-               BtReq.paraLength=cnts/2; 
-       }
-       if( setgen==0 )
-       {       
-               DBG_871X("%s: BT_SET_GENERAL \n", __func__); 
-               BtReq.opCodeVer=1;
-               BtReq.OpCode=3; //BT_SET_GENERAL        3
-               BtReq.paraLength=cnts/2;        
-       }
-       if( getgen==0 )
-       {       
-               DBG_871X("%s: BT_GET_GENERAL \n", __func__); 
-               BtReq.opCodeVer=1;
-               BtReq.OpCode=4;         //BT_GET_GENERAL        4
-               BtReq.paraLength=cnts/2;        
-       }
-       if( readtherm==0 )
-       {       
-               DBG_871X("%s: BT_GET_GENERAL \n", __func__); 
-               BtReq.opCodeVer=1;
-               BtReq.OpCode=4;         //BT_GET_GENERAL        4
-               BtReq.paraLength=cnts/2;        
-       }
-       
-       if( testctrl==0 )
-       {       
-               DBG_871X("%s: BT_TEST_CTRL \n", __func__);
-               BtReq.opCodeVer=1;
-               BtReq.OpCode=5;         //BT_TEST_CTRL  5
-               BtReq.paraLength=cnts/2;        
-       }
-
-       DBG_871X("%s: Req opCodeVer=%d OpCode=%d paraLength=%d\n",
-               __FUNCTION__, BtReq.opCodeVer, BtReq.OpCode, BtReq.paraLength);
+                                
+       _rtw_memset(extra, 0, wrqu->length);    
 
-       if(BtReq.paraLength<1)
-               goto todo;
-       for (i=0; i<BtReq.paraLength; i++)
-       {
-               DBG_871X("%s: BtReq.pParamStart[%d] = 0x%02x \n",
-                       __FUNCTION__, i, BtReq.pParamStart[i]);
+       if (sscanf(input, "%hhu,%lx,%lx", &width, &addr, &data) != 3) {
+               DBG_871X(FUNC_ADPT_FMT" sscanf fail\n", FUNC_ADPT_ARG(padapter));
+               ret = -EINVAL;
+               goto exit;
        }
-       
-todo:
-       _rtw_memset(extra,'\0', wrqu->data.length);
 
-       if (padapter->bBTFWReady == _FALSE)
-       {
-               sprintf(extra, "BTFWReady = FALSE.\n");
+       if (addr > 0x3FFF) {
+               DBG_871X(FUNC_ADPT_FMT" addr:0x%lx\n", FUNC_ADPT_ARG(padapter), addr);
+               ret = -EINVAL;
                goto exit;
        }
 
-       mptbt_BtControlProcess(padapter, &BtReq);
-
-       if (readtherm == 0)
-       {
-               sprintf(extra, "BT thermal=");
-               for (i=4; i<pMptCtx->mptOutLen; i++)
-               {
-                       if ((pMptCtx->mptOutBuf[i]==0x00) && (pMptCtx->mptOutBuf[i+1]==0x00))
-                               goto exit;
+       if (DBG_MP_SDIO_INDIRECT_ACCESS)
+               DBG_871X(FUNC_ADPT_FMT" width:%u, addr:0x%lx, data:0x%lx\n", FUNC_ADPT_ARG(padapter), width, addr, data);
 
-#ifdef CONFIG_RTL8723A
-                       sprintf(extra, "%s %d ", extra, (pMptCtx->mptOutBuf[i]& 0x3f));
-#else
-                       sprintf(extra, "%s %d ", extra, (pMptCtx->mptOutBuf[i]& 0x1f));
-#endif
+       switch (width) {
+       case 1:
+               if (data > 0xFF) {
+                       ret = -EINVAL;
+                       break;
                }
-       }
-       else
-       {
-               for (i=4; i<pMptCtx->mptOutLen; i++)
-               {
-                       sprintf(extra, "%s 0x%x ", extra, pMptCtx->mptOutBuf[i]);
+               rtw_sd_iwrite8(padapter, addr, data);
+               break;
+       case 2:
+               if (data > 0xFFFF) {
+                       ret = -EINVAL;
+                       break;
                }
+               rtw_sd_iwrite16(padapter, addr, data);
+               break;
+       case 4:
+               rtw_sd_iwrite32(padapter, addr, data);
+               break;
+       default:
+               wrqu->length = 0;
+               ret = -EINVAL;
+               break;
        }
-       
-exit:
-       wrqu->data.length = strlen(extra) + 1;
-       DBG_871X("-%s: output len=%d data=%s\n", __FUNCTION__, wrqu->data.length, extra);
 
-       return status;
+exit:
+       return ret;
 }
-
-#endif //#ifdef CONFIG_RTL8723A
+#endif /* CONFIG_SDIO_INDIRECT_ACCESS */
 
 static int rtw_mp_set(struct net_device *dev,
                        struct iw_request_info *info,
@@ -12924,10 +11197,9 @@ static int rtw_mp_set(struct net_device *dev,
                return -ENETDOWN;
        }
 
-       if( (padapter->bSurpriseRemoved == _TRUE) || ( padapter->bDriverStopped == _TRUE))
-       {       
-               DBG_871X("%s fail =>(padapter->bSurpriseRemoved == _TRUE) || ( padapter->bDriverStopped == _TRUE) \n",__FUNCTION__);
-             return -ENETDOWN;
+       if (RTW_CANNOT_RUN(padapter)) {
+               DBG_871X("%s fail =>(bSurpriseRemoved == _TRUE) || ( bDriverStopped == _TRUE)\n", __func__);
+               return -ENETDOWN;
        }
 
        
@@ -12974,13 +11246,18 @@ static int rtw_mp_set(struct net_device *dev,
                break;
 #ifdef CONFIG_WOWLAN
        case MP_WOW_ENABLE:
-                       DBG_871X("set case MP_WOW_ENABLE: %s \n", extra);
+                       DBG_871X("set case MP_WOW_ENABLE: %s\n", extra);
+                       
                        rtw_wowlan_ctrl(dev, info, wdata, extra);
        break;
+       case MP_WOW_SET_PATTERN:
+                       DBG_871X("set case MP_WOW_SET_PATTERN: %s\n", extra);
+                       rtw_wowlan_set_pattern(dev, info, wdata, extra);
+       break;
 #endif
 #ifdef CONFIG_AP_WOWLAN
        case MP_AP_WOW_ENABLE:
-                       DBG_871X("set case MP_AP_WOW_ENABLE: %s \n", extra);
+                       DBG_871X("set case MP_AP_WOW_ENABLE: %s\n", extra);
                        rtw_ap_wowlan_ctrl(dev, info, wdata, extra);
        break;
 #endif
@@ -13011,139 +11288,166 @@ static int rtw_mp_get(struct net_device *dev,
                return -ENETDOWN;
        }
 
-       if( (padapter->bSurpriseRemoved == _TRUE) || ( padapter->bDriverStopped == _TRUE))
-       {       
-               DBG_871X("%s fail =>(padapter->bSurpriseRemoved == _TRUE) || ( padapter->bDriverStopped == _TRUE) \n",__FUNCTION__);
-             return -ENETDOWN;
+       if (RTW_CANNOT_RUN(padapter)) {
+               DBG_871X("%s fail =>(padapter->bSurpriseRemoved == _TRUE) || ( padapter->bDriverStopped == _TRUE)\n", __func__);
+               return -ENETDOWN;
        }
        
-       if (extra == NULL)
-       {
+       if (extra == NULL) {
                wrqu->length = 0;
                return -EIO;
        }
        
-       switch(subcmd)
-       {
-       case WRITE_REG :
-                       rtw_mp_write_reg (dev,info,wrqu,extra);
+       switch (subcmd) {
+       case WRITE_REG:
+                       rtw_mp_write_reg(dev, info, wrqu, extra);
                         break;
                         
        case WRITE_RF:
-                       rtw_mp_write_rf (dev,info,wrqu,extra);
+                       rtw_mp_write_rf(dev, info, wrqu, extra);
                         break; 
                         
        case MP_PHYPARA:
-                       DBG_871X("mp_get  MP_PHYPARA \n");
-                       rtw_mp_phypara(dev,info,wrqu,extra);    
+                       DBG_871X("mp_get  MP_PHYPARA\n");
+                       rtw_mp_phypara(dev, info, wrqu, extra);
                        break;
 
        case MP_CHANNEL:
-                       DBG_871X("set case mp_channel \n");
-                       rtw_mp_channel (dev,info,wrqu,extra);
+                       DBG_871X("set case mp_channel\n");
+                       rtw_mp_channel(dev , info, wrqu, extra);
                        break;
                        
        case READ_REG:
-                       DBG_871X("mp_get  READ_REG \n");
-                       rtw_mp_read_reg (dev,info,wrqu,extra);
+                       DBG_871X("mp_get  READ_REG\n");
+                       rtw_mp_read_reg(dev, info, wrqu, extra);
                         break; 
        case READ_RF:
-                       DBG_871X("mp_get  READ_RF \n");
-                       rtw_mp_read_rf (dev,info,wrqu,extra);
+                       DBG_871X("mp_get  READ_RF\n");
+                       rtw_mp_read_rf(dev, info, wrqu, extra);
                        break; 
                        
        case MP_RATE:
-                       DBG_871X("set case mp_rate \n");
-                       rtw_mp_rate (dev,info,wrqu,extra);
+                       DBG_871X("set case mp_rate\n");
+                       rtw_mp_rate(dev, info, wrqu, extra);
                        break;
                        
        case MP_TXPOWER:
-                       DBG_871X("set case MP_TXPOWER \n");
-                       rtw_mp_txpower (dev,info,wrqu,extra);
+                       DBG_871X("set case MP_TXPOWER\n");
+                       rtw_mp_txpower(dev, info, wrqu, extra);
                        break;
                        
        case MP_ANT_TX:
-                       DBG_871X("set case MP_ANT_TX \n");
-                       rtw_mp_ant_tx (dev,info,wrqu,extra);
+                       DBG_871X("set case MP_ANT_TX\n");
+                       rtw_mp_ant_tx(dev, info, wrqu, extra);
                        break;
                        
        case MP_ANT_RX:
-                       DBG_871X("set case MP_ANT_RX \n");
-                       rtw_mp_ant_rx (dev,info,wrqu,extra);
+                       DBG_871X("set case MP_ANT_RX\n");
+                       rtw_mp_ant_rx(dev, info, wrqu, extra);
                        break;
                        
        case MP_QUERY:
-                       //DBG_871X("mp_get mp_query MP_QUERY \n");
-                       rtw_mp_trx_query(dev,info,wrqu,extra);
+                       rtw_mp_trx_query(dev, info, wrqu, extra);
                        break;
                                        
        case MP_CTX:
-                       DBG_871X("set case MP_CTX \n");
-                       rtw_mp_ctx (dev,info,wrqu,extra);
+                       DBG_871X("set case MP_CTX\n");
+                       rtw_mp_ctx(dev, info, wrqu, extra);
                        break;
-                       
+                                       
        case MP_ARX:
-                       DBG_871X("set case MP_ARX \n");
-                       rtw_mp_arx (dev,info,wrqu,extra);
+                       DBG_871X("set case MP_ARX\n");
+                       rtw_mp_arx(dev, info, wrqu, extra);
                        break;
                        
        case EFUSE_GET:
-                       DBG_871X("efuse get EFUSE_GET \n");
-                       rtw_mp_efuse_get(dev,info,wdata,extra);
+                       DBG_871X("efuse get EFUSE_GET\n");
+                       rtw_mp_efuse_get(dev, info, wdata, extra);
                 break; 
                 
        case MP_DUMP:
-                       DBG_871X("set case MP_DUMP \n");
-                       rtw_mp_dump (dev,info,wrqu,extra);
+                       DBG_871X("set case MP_DUMP\n");
+                       rtw_mp_dump(dev, info, wrqu, extra);
                 break; 
        case MP_PSD:
-                       DBG_871X("set case MP_PSD \n");
-                       rtw_mp_psd (dev,info,wrqu,extra);
+                       DBG_871X("set case MP_PSD\n");
+                       rtw_mp_psd(dev, info, wrqu, extra);
                 break;
        case MP_THER:
-                       DBG_871X("set case MP_THER \n");
-                       rtw_mp_thermal (dev,info,wrqu,extra);
+                       DBG_871X("set case MP_THER\n");
+                       rtw_mp_thermal(dev, info, wrqu, extra);
                break;
        case MP_PwrCtlDM:
                        DBG_871X("set MP_PwrCtlDM\n");
-                       rtw_mp_PwrCtlDM (dev,info,wrqu,extra);
+                       rtw_mp_PwrCtlDM(dev, info, wrqu, extra);
                break;
        case MP_QueryDrvStats:          
-                       DBG_871X("mp_get MP_QueryDrvStats \n");
-                       rtw_mp_QueryDrv(dev,info,wdata,extra);
+                       DBG_871X("mp_get MP_QueryDrvStats\n");
+                       rtw_mp_QueryDrv(dev, info, wdata, extra);
                        break;
-               case MP_PWRTRK:
-                       DBG_871X("set case MP_PWRTRK \n");
-                       rtw_mp_pwrtrk(dev,info,wrqu,extra);
+       case MP_PWRTRK:
+                       DBG_871X("set case MP_PWRTRK\n");
+                       rtw_mp_pwrtrk(dev, info, wrqu, extra);
                        break;                   
        case EFUSE_SET:
-                       DBG_871X("set case efuse set \n");
-                       rtw_mp_efuse_set(dev,info,wdata,extra);
+                       DBG_871X("set case efuse set\n");
+                       rtw_mp_efuse_set(dev, info, wdata, extra);
                        break;                   
        case MP_GET_TXPOWER_INX:
-                       DBG_871X("mp_get MP_GET_TXPOWER_INX \n");
-                       rtw_mp_txpower_index(dev,info,wrqu,extra);
-               break;
+                       DBG_871X("mp_get MP_GET_TXPOWER_INX\n");
+                       rtw_mp_txpower_index(dev, info, wrqu, extra);
+                       break;
        case MP_GETVER:
-                       DBG_871X("mp_get MP_GETVER \n");
-                       rtw_mp_getver(dev,info,wdata,extra);
+                       DBG_871X("mp_get MP_GETVER\n");
+                       rtw_mp_getver(dev, info, wdata, extra);
                        break;
-#if defined(CONFIG_RTL8723A) || defined(CONFIG_RTL8723B)
+       case MP_MON:
+                       DBG_871X("mp_get MP_MON\n");
+                       rtw_mp_mon(dev, info, wdata, extra);
+                       break;
+       case EFUSE_MASK:
+                       DBG_871X("mp_get EFUSE_MASK\n");
+                       rtw_efuse_mask_file(dev, info, wdata, extra);
+                       break;
+       case  EFUSE_FILE:
+                       DBG_871X("mp_get EFUSE_FILE\n");
+                       rtw_efuse_file_map(dev, info, wdata, extra);
+                       break;
+       case  MP_TX:
+                       DBG_871X("mp_get MP_TX\n");
+                       rtw_mp_tx(dev, info, wdata, extra);
+                       break;
+       case  MP_RX:
+                       DBG_871X("mp_get MP_RX\n");
+                       rtw_mp_rx(dev, info, wdata, extra);
+                       break;
+       case MP_HW_TX_MODE:
+                       DBG_871X("mp_get MP_HW_TX_MODE\n");
+                       rtw_mp_hwtx(dev, info, wdata, extra);
+                       break;
+#if defined(CONFIG_RTL8723B)
        case MP_SetBT:          
-                       DBG_871X("set MP_SetBT \n");
-                       rtw_mp_SetBT(dev,info,wdata,extra);
+                       DBG_871X("set MP_SetBT\n");
+                       rtw_mp_SetBT(dev, info, wdata, extra);
                        break;           
 #endif
-
+#ifdef CONFIG_SDIO_INDIRECT_ACCESS
+       case MP_SD_IREAD:
+               rtw_mp_sd_iread(dev, info, wrqu, extra);
+               break;
+       case MP_SD_IWRITE:
+               rtw_mp_sd_iwrite(dev, info, wrqu, extra);
+               break;
+#endif
        }
 
        rtw_msleep_os(10); //delay 5ms for sending pkt before exit adb shell operation
 return 0;      
 }
 
-#endif //#if defined(CONFIG_MP_INCLUDED) && defined(CONFIG_MP_IWPRIV_SUPPORT)
+#endif /*#if defined(CONFIG_MP_INCLUDED)*/
 
-static int rtw_wfd_tdls_enable(struct net_device *dev,
+static int rtw_wx_tdls_wfd_enable(struct net_device *dev,
                                struct iw_request_info *info,
                                union iwreq_data *wrqu, char *extra)
 {
@@ -13154,19 +11458,15 @@ static int rtw_wfd_tdls_enable(struct net_device *dev,
 
        _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
 
-       printk( "[%s] %s %d\n", __FUNCTION__, extra, wrqu->data.length -1  );
+       DBG_871X( "[%s] %s %d\n", __FUNCTION__, extra, wrqu->data.length -1  );
 
        if ( extra[ 0 ] == '0' )
-       {
-               padapter->wdinfo.wfd_tdls_enable = 0;
-       }
+               rtw_tdls_wfd_enable(padapter, 0);
        else
-       {
-               padapter->wdinfo.wfd_tdls_enable = 1;
-       }
+               rtw_tdls_wfd_enable(padapter, 1);
 
-#endif //CONFIG_WFD
-#endif //CONFIG_TDLS
+#endif /* CONFIG_WFD */
+#endif /* CONFIG_TDLS */
        
        return ret;
 }
@@ -13185,14 +11485,11 @@ static int rtw_tdls_weaksec(struct net_device *dev,
        DBG_871X( "[%s] %s %d\n", __FUNCTION__, extra, wrqu->data.length -1  );
 
        if ( extra[ 0 ] == '0' )
-       {
                padapter->wdinfo.wfd_tdls_weaksec = 0;
-       }
        else
-       {
                padapter->wdinfo.wfd_tdls_weaksec = 1;
-       }
-#endif
+
+#endif /* CONFIG_TDLS */
        
        return ret;
 }
@@ -13217,56 +11514,48 @@ static int rtw_tdls_enable(struct net_device *dev,
        u8 empty_hwaddr[ETH_ALEN] = { 0x00 };
        struct tdls_txmgmt txmgmt;
 
-       printk( "[%s] %s %d\n", __FUNCTION__, extra, wrqu->data.length -1  );
+       DBG_871X( "[%s] %s %d\n", __FUNCTION__, extra, wrqu->data.length -1  );
 
        _rtw_memset(tdls_sta, 0x00, sizeof(tdls_sta));
        _rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt));
 
-       if ( extra[ 0 ] == '0' )
-       {
+       if (extra[ 0 ] == '0') {
                ptdlsinfo->tdls_enable = 0;
 
                if(pstapriv->asoc_sta_count==1)
                        return ret;
 
                _enter_critical_bh(&pstapriv->sta_hash_lock, &irqL);
-               for(index=0; index< NUM_STA; index++)
-               {
+               for (index=0; index< NUM_STA; index++) {
                        phead = &(pstapriv->sta_hash[index]);
                        plist = get_next(phead);
                        
-                       while ((rtw_end_of_queue_search(phead, plist)) == _FALSE)
-                       {
+                       while (rtw_end_of_queue_search(phead, plist) == _FALSE) {
                                psta = LIST_CONTAINOR(plist, struct sta_info ,hash_list);
 
                                plist = get_next(plist);
 
-                               if(psta->tdls_sta_state != TDLS_STATE_NONE)
-                               {
+                               if (psta->tdls_sta_state != TDLS_STATE_NONE) {
                                        _rtw_memcpy(tdls_sta[index], psta->hwaddr, ETH_ALEN);
                                }
                        }
                }
                _exit_critical_bh(&pstapriv->sta_hash_lock, &irqL);
 
-               for(index=0; index< NUM_STA; index++)
-               {
-                       if( !_rtw_memcmp(tdls_sta[index], empty_hwaddr, ETH_ALEN) )
-                       {
-                               printk("issue tear down to "MAC_FMT"\n", MAC_ARG(tdls_sta[index]));
+               for (index=0; index< NUM_STA; index++) {
+                       if (!_rtw_memcmp(tdls_sta[index], empty_hwaddr, ETH_ALEN)) {
+                               DBG_871X("issue tear down to "MAC_FMT"\n", MAC_ARG(tdls_sta[index]));
                                txmgmt.status_code = _RSON_TDLS_TEAR_UN_RSN_;
                                _rtw_memcpy(txmgmt.peer, tdls_sta[index], ETH_ALEN);
-                               issue_tdls_teardown(padapter, &txmgmt, _FALSE);
+                               issue_tdls_teardown(padapter, &txmgmt, _TRUE);
                        }
                }
-               rtw_tdls_cmd(padapter, myid(&(padapter->eeprompriv)), TDLS_RS_RCR);
+               rtw_tdls_cmd(padapter, NULL, TDLS_RS_RCR);
                rtw_reset_tdls_info(padapter);
-       }
-       else if ( extra[ 0 ] == '1' )
-       {
+       }       else if (extra[0] == '1') {
                ptdlsinfo->tdls_enable = 1;
        }
-#endif //CONFIG_TDLS
+#endif /* CONFIG_TDLS */
        
        return ret;
 }
@@ -13282,13 +11571,12 @@ static int rtw_tdls_setup(struct net_device *dev,
        struct tdls_txmgmt txmgmt;
 #ifdef CONFIG_WFD
        struct wifidirect_info *pwdinfo= &(padapter->wdinfo);
-#endif // CONFIG_WFD
+#endif /* CONFIG_WFD */
 
-       printk( "[%s] %s %d\n", __FUNCTION__, extra, wrqu->data.length -1  );
+       DBG_871X("[%s] %s %d\n", __FUNCTION__, extra, wrqu->data.length -1);
 
-       if(wrqu->data.length - 1 != 17 )
-       {
-               printk( "[%s] length:%d != 17\n", __FUNCTION__, (wrqu->data.length -1)  );
+       if (wrqu->data.length - 1 != 17) {
+               DBG_871X("[%s] length:%d != 17\n", __FUNCTION__, (wrqu->data.length -1));
                return ret;
        }
 
@@ -13298,128 +11586,291 @@ static int rtw_tdls_setup(struct net_device *dev,
        }
 
 #ifdef CONFIG_WFD
-       if ( _AES_ != padapter->securitypriv.dot11PrivacyAlgrthm )
-       {
-               //      Weak Security situation with AP.
-               if ( 0 == pwdinfo->wfd_tdls_weaksec )
-               {
-                       //      Can't send the tdls setup request out!!
-                       DBG_871X( "[%s] Current link is not AES, SKIP sending the tdls setup request!!\n", __FUNCTION__ );
-               }
-               else
-               {
+       if (_AES_ != padapter->securitypriv.dot11PrivacyAlgrthm) {
+               /* Weak Security situation with AP. */
+               if (0 == pwdinfo->wfd_tdls_weaksec)     {
+                       /* Can't send the tdls setup request out!! */
+                       DBG_871X("[%s] Current link is not AES, "
+                               "SKIP sending the tdls setup request!!\n", __FUNCTION__);
+               } else {
                        issue_tdls_setup_req(padapter, &txmgmt, _TRUE);
                }
-       }
-       else
-#endif // CONFIG_WFD
+       } else
+#endif /* CONFIG_WFD */
        {
                issue_tdls_setup_req(padapter, &txmgmt, _TRUE);
        }
-#endif
+#endif /* CONFIG_TDLS */
+       
+       return ret;
+}
+
+static int rtw_tdls_teardown(struct net_device *dev,
+                               struct iw_request_info *info,
+                               union iwreq_data *wrqu, char *extra)
+{
+       int ret = 0;
+
+#ifdef CONFIG_TDLS
+
+       u8 i,j;
+       _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
+       struct sta_info *ptdls_sta = NULL;
+       struct tdls_txmgmt txmgmt;
+
+       DBG_871X( "[%s] %s %d\n", __FUNCTION__, extra, wrqu->data.length -1  );
+
+       if (wrqu->data.length - 1 != 17 && wrqu->data.length - 1 != 19) {
+               DBG_871X("[%s] length:%d != 17 or 19\n",
+                       __FUNCTION__, (wrqu->data.length -1));
+               return ret;
+       }
+
+       _rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt));
+       for (i=0, j=0; i < ETH_ALEN; i++, j+=3)
+               txmgmt.peer[i]=key_2char2num(*(extra+j), *(extra+j+1));
+
+       ptdls_sta = rtw_get_stainfo( &(padapter->stapriv), txmgmt.peer);
+       
+       if (ptdls_sta != NULL) {
+               txmgmt.status_code = _RSON_TDLS_TEAR_UN_RSN_;
+               if (wrqu->data.length - 1 == 19)
+                       issue_tdls_teardown(padapter, &txmgmt, _FALSE);
+               else 
+                       issue_tdls_teardown(padapter, &txmgmt, _TRUE);
+       } else {
+               DBG_871X( "TDLS peer not found\n");
+       }
+#endif /* CONFIG_TDLS */
+       
+       return ret;
+}
+
+static int rtw_tdls_discovery(struct net_device *dev,
+                               struct iw_request_info *info,
+                               union iwreq_data *wrqu, char *extra)
+{
+       int ret = 0;
+
+#ifdef CONFIG_TDLS
+       
+       _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
+       struct tdls_txmgmt      txmgmt;
+       int i = 0, j=0;
+
+       DBG_871X( "[%s] %s %d\n", __FUNCTION__, extra, wrqu->data.length -1  );
+
+       _rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt));
+       for( i=0, j=0 ; i < ETH_ALEN; i++, j+=3 ){
+               txmgmt.peer[i]=key_2char2num(*(extra+j), *(extra+j+1));
+       }
+
+       issue_tdls_dis_req(padapter, &txmgmt);
+
+#endif /* CONFIG_TDLS */
+
+       return ret;
+}
+
+static int rtw_tdls_ch_switch(struct net_device *dev,
+                               struct iw_request_info *info,
+                               union iwreq_data *wrqu, char *extra)
+{
+       int ret = 0;
+
+#ifdef CONFIG_TDLS
+#ifdef CONFIG_TDLS_CH_SW       
+       _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
+       struct tdls_ch_switch *pchsw_info = &padapter->tdlsinfo.chsw_info;
+       u8 i, j;
+       struct sta_info *ptdls_sta = NULL;
+       u8 take_care_iqk;
+
+       DBG_8192C( "[%s] %s %d\n", __FUNCTION__, extra, wrqu->data.length -1  );
+
+       if (rtw_tdls_is_chsw_allowed(padapter) == _FALSE)
+       {
+               DBG_871X("TDLS channel switch is not allowed\n");
+               return ret;
+       }
+
+       for( i=0, j=0 ; i < ETH_ALEN; i++, j+=3 ){
+               pchsw_info->addr[i] = key_2char2num(*(extra+j), *(extra+j+1));
+       }
+
+       ptdls_sta = rtw_get_stainfo(&padapter->stapriv, pchsw_info->addr);
+       if( ptdls_sta == NULL )
+               return ret;
+
+       pchsw_info->ch_sw_state |= TDLS_CH_SW_INITIATOR_STATE;
+
+       if (ptdls_sta != NULL) {
+               if (pchsw_info->off_ch_num == 0)
+                       pchsw_info->off_ch_num = 11;
+       }else {
+               DBG_871X( "TDLS peer not found\n");
+       }
+
+       rtw_pm_set_lps(padapter, PS_MODE_ACTIVE);
+
+       rtw_hal_get_hwreg(padapter, HW_VAR_CH_SW_NEED_TO_TAKE_CARE_IQK_INFO, &take_care_iqk);
+       if (take_care_iqk == _TRUE) {
+               u8 central_chnl;
+               u8 bw_mode;
+
+               bw_mode = (pchsw_info->ch_offset) ? CHANNEL_WIDTH_40 : CHANNEL_WIDTH_20;
+               central_chnl = rtw_get_center_ch(pchsw_info->off_ch_num, bw_mode, pchsw_info->ch_offset);
+               if (rtw_hal_ch_sw_iqk_info_search(padapter, central_chnl, bw_mode) >= 0)
+                       rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_CH_SW_START);
+               else
+                       rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_CH_SW_PREPARE);
+       } else
+               rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_CH_SW_START);
        
+       //issue_tdls_ch_switch_req(padapter, ptdls_sta);
+       /* DBG_871X("issue tdls ch switch req\n"); */
+
+#endif /* CONFIG_TDLS_CH_SW */
+#endif /* CONFIG_TDLS */
+
        return ret;
 }
 
-static int rtw_tdls_teardown(struct net_device *dev,
+static int rtw_tdls_ch_switch_off(struct net_device *dev,
                                struct iw_request_info *info,
                                union iwreq_data *wrqu, char *extra)
 {
        int ret = 0;
 
 #ifdef CONFIG_TDLS
-
-       u8 i,j;
+#ifdef CONFIG_TDLS_CH_SW       
+       
        _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
+       struct tdls_ch_switch *pchsw_info = &padapter->tdlsinfo.chsw_info;
+       u8 i, j, mac_addr[ETH_ALEN];
        struct sta_info *ptdls_sta = NULL;
        struct tdls_txmgmt txmgmt;
 
+       _rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt));
+       
        DBG_871X( "[%s] %s %d\n", __FUNCTION__, extra, wrqu->data.length -1  );
 
-       if(wrqu->data.length - 1 != 17 && wrqu->data.length - 1 != 19)
+       if (rtw_tdls_is_chsw_allowed(padapter) == _FALSE)
        {
-               printk( "[%s] length:%d != 17 or 19\n", __FUNCTION__, (wrqu->data.length -1)  );
+               DBG_871X("TDLS channel switch is not allowed\n");
                return ret;
        }
 
-       _rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt));
-       for( i=0, j=0 ; i < ETH_ALEN; i++, j+=3 ){
-               txmgmt.peer[i]=key_2char2num(*(extra+j), *(extra+j+1));
+       if (wrqu->data.length >= 17) {
+               for (i=0, j=0 ; i < ETH_ALEN; i++, j+=3)
+               mac_addr[i]=key_2char2num(*(extra+j), *(extra+j+1));
+                       ptdls_sta = rtw_get_stainfo(&padapter->stapriv, mac_addr);
        }
 
-       ptdls_sta = rtw_get_stainfo( &(padapter->stapriv), txmgmt.peer);
-       
-       if(ptdls_sta != NULL)
-       {
-               txmgmt.status_code = _RSON_TDLS_TEAR_UN_RSN_;
-               if(wrqu->data.length - 1 == 17)
-                       issue_tdls_teardown(padapter, &txmgmt, _FALSE);
-               else if(wrqu->data.length - 1 == 19)
-                       issue_tdls_teardown(padapter, &txmgmt, _TRUE);
-       }
-       else
-               DBG_871X( "TDLS peer not found\n");
-#endif //CONFIG_TDLS
-       
+       if (ptdls_sta == NULL)
+               return ret;
+
+       rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_CH_SW_END_TO_BASE_CHNL);
+
+       pchsw_info->ch_sw_state &= ~(TDLS_CH_SW_INITIATOR_STATE |
+                                                               TDLS_CH_SWITCH_ON_STATE |
+                                                               TDLS_PEER_AT_OFF_STATE);
+       _rtw_memset(pchsw_info->addr, 0x00, ETH_ALEN);
+
+       ptdls_sta->ch_switch_time = 0;
+       ptdls_sta->ch_switch_timeout = 0;
+       _cancel_timer_ex(&ptdls_sta->ch_sw_timer);
+       _cancel_timer_ex(&ptdls_sta->delay_timer);
+       _cancel_timer_ex(&ptdls_sta->stay_on_base_chnl_timer);
+       _cancel_timer_ex(&ptdls_sta->ch_sw_monitor_timer);
+
+       rtw_pm_set_lps(padapter, PS_MODE_MAX);
+#endif /* CONFIG_TDLS_CH_SW */
+#endif /* CONFIG_TDLS */
+
        return ret;
 }
 
-static int rtw_tdls_discovery(struct net_device *dev,
+static int rtw_tdls_dump_ch(struct net_device *dev,
                                struct iw_request_info *info,
                                union iwreq_data *wrqu, char *extra)
 {
        int ret = 0;
 
 #ifdef CONFIG_TDLS
-       
+#ifdef CONFIG_TDLS_CH_SW       
        _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
-       struct mlme_ext_priv    *pmlmeext = &(padapter->mlmeextpriv);
-       struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);
-       struct tdls_txmgmt      txmgmt;
-       int i = 0, j=0;
+       struct tdls_info *ptdlsinfo = &padapter->tdlsinfo;
 
-       DBG_871X( "[%s] %s %d\n", __FUNCTION__, extra, wrqu->data.length -1  );
+       DBG_8192C("[%s] dump_stack:%s\n", __FUNCTION__, extra);
 
-       _rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt));
-       for( i=0, j=0 ; i < ETH_ALEN; i++, j+=3 ){
-               txmgmt.peer[i]=key_2char2num(*(extra+j), *(extra+j+1));
-       }
+       extra[ wrqu->data.length ] = 0x00;
+       ptdlsinfo->chsw_info.dump_stack = rtw_atoi( extra );
 
-       issue_tdls_dis_req(padapter, &txmgmt);
+       return ret;
 
-#endif //CONFIG_TDLS
+#endif
+#endif /* CONFIG_TDLS */
 
        return ret;
 }
 
-static int rtw_tdls_ch_switch(struct net_device *dev,
+static int rtw_tdls_off_ch_num(struct net_device *dev,
                                struct iw_request_info *info,
                                union iwreq_data *wrqu, char *extra)
 {
        int ret = 0;
 
 #ifdef CONFIG_TDLS
+#ifdef CONFIG_TDLS_CH_SW       
+       _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
+       struct tdls_info *ptdlsinfo = &padapter->tdlsinfo;
+
+       DBG_8192C("[%s] off_ch_num:%s\n", __FUNCTION__, extra);
+
+       extra[ wrqu->data.length ] = 0x00;
+       ptdlsinfo->chsw_info.off_ch_num = rtw_atoi(extra);
+
+       return ret;
        
+#endif
+#endif /* CONFIG_TDLS */
+
+       return ret;
+}
+
+static int rtw_tdls_ch_offset(struct net_device *dev,
+                               struct iw_request_info *info,
+                               union iwreq_data *wrqu, char *extra)
+{
+       int ret = 0;
+
+#ifdef CONFIG_TDLS
+#ifdef CONFIG_TDLS_CH_SW       
        _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
-       struct tdls_info        *ptdlsinfo = &padapter->tdlsinfo;
-       u8 i, j, mac_addr[ETH_ALEN];
-       struct sta_info *ptdls_sta = NULL;
+       struct tdls_info *ptdlsinfo = &padapter->tdlsinfo;
 
-       DBG_8192C( "[%s] %s %d\n", __FUNCTION__, extra, wrqu->data.length -1  );
+       DBG_8192C("[%s] ch_offset:%s\n", __FUNCTION__, extra);
 
-       for( i=0, j=0 ; i < ETH_ALEN; i++, j+=3 ){
-               mac_addr[i]=key_2char2num(*(extra+j), *(extra+j+1));
-       }
+       extra[ wrqu->data.length ] = 0x00;
+       switch (rtw_atoi(extra)) {
+       case SCA:
+               ptdlsinfo->chsw_info.ch_offset = HAL_PRIME_CHNL_OFFSET_LOWER;
+               break;
 
-       ptdls_sta = rtw_get_stainfo(&padapter->stapriv, mac_addr);
-       if( ptdls_sta == NULL )
-               return ret;
+       case SCB:
+               ptdlsinfo->chsw_info.ch_offset = HAL_PRIME_CHNL_OFFSET_UPPER;
+               break;
 
-//     ptdlsinfo->ch_sensing=1;
+       default:
+               ptdlsinfo->chsw_info.ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;
+               break;
+       }
 
-//     rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_INIT_CH_SEN);
+       return ret;
 
-#endif //CONFIG_TDLS
+#endif
+#endif /* CONFIG_TDLS */
 
                return ret;
 }
@@ -13433,22 +11884,19 @@ static int rtw_tdls_pson(struct net_device *dev,
 #ifdef CONFIG_TDLS
        
        _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
-       struct mlme_ext_priv    *pmlmeext = &(padapter->mlmeextpriv);
-       struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);
        u8 i, j, mac_addr[ETH_ALEN];
        struct sta_info *ptdls_sta = NULL;
 
        DBG_871X( "[%s] %s %d\n", __FUNCTION__, extra, wrqu->data.length -1  );
 
-       for( i=0, j=0 ; i < ETH_ALEN; i++, j+=3 ){
+       for (i=0, j=0; i < ETH_ALEN; i++, j+=3)
                mac_addr[i]=key_2char2num(*(extra+j), *(extra+j+1));
-       }
 
        ptdls_sta = rtw_get_stainfo(&padapter->stapriv, mac_addr);
 
        issue_nulldata_to_TDLS_peer_STA(padapter, ptdls_sta->hwaddr, 1, 3, 500);
 
-#endif //CONFIG_TDLS
+#endif /* CONFIG_TDLS */
 
                return ret;
 }
@@ -13462,25 +11910,20 @@ static int rtw_tdls_psoff(struct net_device *dev,
 #ifdef CONFIG_TDLS
        
        _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
-       struct mlme_ext_priv    *pmlmeext = &(padapter->mlmeextpriv);
-       struct mlme_ext_info    *pmlmeinfo = &(pmlmeext->mlmext_info);
        u8 i, j, mac_addr[ETH_ALEN];
        struct sta_info *ptdls_sta = NULL;
        
        DBG_8192C( "[%s] %s %d\n", __FUNCTION__, extra, wrqu->data.length -1  );
 
-       for( i=0, j=0 ; i < ETH_ALEN; i++, j+=3 ){
+       for (i=0, j=0; i < ETH_ALEN; i++, j+=3)
                mac_addr[i]=key_2char2num(*(extra+j), *(extra+j+1));
-       }
 
        ptdls_sta = rtw_get_stainfo(&padapter->stapriv, mac_addr);
 
        if(ptdls_sta)
-       {
-               //issue_tdls_peer_traffic_rsp(padapter, ptdls_sta);
                issue_nulldata_to_TDLS_peer_STA(padapter, ptdls_sta->hwaddr, 0, 3, 500);
-       }
-#endif //CONFIG_TDLS
+
+#endif /* CONFIG_TDLS */
 
        return ret;
 }
@@ -13497,17 +11940,13 @@ static int rtw_tdls_setip(struct net_device *dev,
        _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
        struct tdls_info *ptdlsinfo = &padapter->tdlsinfo;
        struct wifi_display_info *pwfd_info = ptdlsinfo->wfd_info;
-       u8 i=0, j=0, k=0, tag=0, ip[3] = { 0xff }, *ptr = extra;
-       
-       printk( "[%s] %s %d\n", __FUNCTION__, extra, wrqu->data.length - 1  );
+       u8 i=0, j=0, k=0, tag=0;
 
+       DBG_871X("[%s] %s %d\n", __FUNCTION__, extra, wrqu->data.length - 1);
 
-       while( i < 4 )
-       {
-               for( j=0; j < 4; j++)
-               {
-                       if( *( extra + j + tag ) == '.' || *( extra + j + tag ) == '\0' )
-                       {
+       while (i < 4) {
+               for (j=0; j < 4; j++) {
+                       if (*( extra + j + tag ) == '.' || *( extra + j + tag ) == '\0') {
                                if( j == 1 )
                                        pwfd_info->ip_address[i]=convert_ip_addr( '0', '0', *(extra+(j-1)+tag));
                                if( j == 2 )
@@ -13522,13 +11961,14 @@ static int rtw_tdls_setip(struct net_device *dev,
                i++;
        }
 
-       printk( "[%s] Set IP = %u.%u.%u.%u \n", __FUNCTION__, 
-               ptdlsinfo->wfd_info->ip_address[0], ptdlsinfo->wfd_info->ip_address[1],
-               ptdlsinfo->wfd_info->ip_address[2], ptdlsinfo->wfd_info->ip_address[3]
-       );
+       DBG_871X( "[%s] Set IP = %u.%u.%u.%u \n", __FUNCTION__, 
+               ptdlsinfo->wfd_info->ip_address[0],
+               ptdlsinfo->wfd_info->ip_address[1],
+               ptdlsinfo->wfd_info->ip_address[2],
+               ptdlsinfo->wfd_info->ip_address[3]);
 
-#endif //CONFIG_WFD    
-#endif //CONFIG_TDLS
+#endif /* CONFIG_WFD */
+#endif /* CONFIG_TDLS */
 
        return ret;
 }
@@ -13546,22 +11986,20 @@ static int rtw_tdls_getip(struct net_device *dev,
        struct tdls_info *ptdlsinfo = &padapter->tdlsinfo;
        struct wifi_display_info *pwfd_info = ptdlsinfo->wfd_info;
        
-       printk( "[%s]\n", __FUNCTION__);
+       DBG_871X( "[%s]\n", __FUNCTION__);
 
        sprintf( extra, "\n\n%u.%u.%u.%u\n", 
                pwfd_info->peer_ip_address[0], pwfd_info->peer_ip_address[1], 
-               pwfd_info->peer_ip_address[2], pwfd_info->peer_ip_address[3]
-               );
+               pwfd_info->peer_ip_address[2], pwfd_info->peer_ip_address[3]);
 
-       printk( "[%s] IP=%u.%u.%u.%u\n", __FUNCTION__,
+       DBG_871X( "[%s] IP=%u.%u.%u.%u\n", __FUNCTION__,
                pwfd_info->peer_ip_address[0], pwfd_info->peer_ip_address[1], 
-               pwfd_info->peer_ip_address[2], pwfd_info->peer_ip_address[3]
-               );
+               pwfd_info->peer_ip_address[2], pwfd_info->peer_ip_address[3]);
        
        wrqu->data.length = strlen( extra );
 
-#endif //CONFIG_WFD    
-#endif //CONFIG_TDLS
+#endif /* CONFIG_WFD */
+#endif /* CONFIG_TDLS */
 
        return ret;
 }
@@ -13580,21 +12018,22 @@ static int rtw_tdls_getport(struct net_device *dev,
        struct tdls_info *ptdlsinfo = &padapter->tdlsinfo;
        struct wifi_display_info *pwfd_info = ptdlsinfo->wfd_info;
 
-       printk( "[%s]\n", __FUNCTION__);
+       DBG_871X( "[%s]\n", __FUNCTION__);
 
        sprintf( extra, "\n\n%d\n", pwfd_info->peer_rtsp_ctrlport );
-       printk( "[%s] remote port = %d\n", __FUNCTION__, pwfd_info->peer_rtsp_ctrlport );
+       DBG_871X( "[%s] remote port = %d\n",
+               __FUNCTION__, pwfd_info->peer_rtsp_ctrlport );
        
        wrqu->data.length = strlen( extra );
 
-#endif //CONFIG_WFD
-#endif //CONFIG_TDLS
+#endif /* CONFIG_WFD */
+#endif /* CONFIG_TDLS */
 
        return ret;
                
 }
 
-//WFDTDLS, for sigma test
+/* WFDTDLS, for sigma test */
 static int rtw_tdls_dis_result(struct net_device *dev,
                                struct iw_request_info *info,
                                union iwreq_data *wrqu, char *extra)
@@ -13607,26 +12046,24 @@ static int rtw_tdls_dis_result(struct net_device *dev,
 
        _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
        struct tdls_info *ptdlsinfo = &padapter->tdlsinfo;
-       struct wifi_display_info *pwfd_info = ptdlsinfo->wfd_info;
 
-       printk( "[%s]\n", __FUNCTION__);
+       DBG_871X( "[%s]\n", __FUNCTION__);
 
-       if(ptdlsinfo->dev_discovered == 1 )
-       {
+       if (ptdlsinfo->dev_discovered == _TRUE) {
                sprintf( extra, "\n\nDis=1\n" );
-               ptdlsinfo->dev_discovered = 0;
+               ptdlsinfo->dev_discovered = _FALSE;
        }
        
        wrqu->data.length = strlen( extra );
 
-#endif //CONFIG_WFD
-#endif //CONFIG_TDLS
+#endif /* CONFIG_WFD */
+#endif /* CONFIG_TDLS */
 
        return ret;
                
 }
 
-//WFDTDLS, for sigma test
+/* WFDTDLS, for sigma test */
 static int rtw_wfd_tdls_status(struct net_device *dev,
                                struct iw_request_info *info,
                                union iwreq_data *wrqu, char *extra)
@@ -13639,20 +12076,39 @@ static int rtw_wfd_tdls_status(struct net_device *dev,
        _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
        struct tdls_info *ptdlsinfo = &padapter->tdlsinfo;
 
-       printk( "[%s]\n", __FUNCTION__);
+       DBG_871X("[%s]\n", __FUNCTION__);
 
-       sprintf( extra, "\nlink_established:0x%08x \n"
+       sprintf( extra, "\nlink_established:%d \n"
                "sta_cnt:%d \n"
                "sta_maximum:%d \n"
                "cur_channel:%d \n"
-               "tdls_enable:%d",
-               ptdlsinfo->link_established, ptdlsinfo->sta_cnt, ptdlsinfo->sta_maximum,
-               ptdlsinfo->cur_channel, ptdlsinfo->tdls_enable
-               );
+               "tdls_enable:%d"
+#ifdef CONFIG_TDLS_CH_SW
+               "ch_sw_state:%08x\n"
+               "chsw_on:%d\n"
+               "off_ch_num:%d\n"
+               "cur_time:%d\n"
+               "ch_offset:%d\n"
+               "delay_swtich_back:%d"
+#endif
+               ,
+               ptdlsinfo->link_established, ptdlsinfo->sta_cnt,
+               ptdlsinfo->sta_maximum, ptdlsinfo->cur_channel, 
+               ptdlsinfo->tdls_enable
+#ifdef CONFIG_TDLS_CH_SW
+,
+               ptdlsinfo->chsw_info.ch_sw_state,
+               ATOMIC_READ(&padapter->tdlsinfo.chsw_info.chsw_on),
+               ptdlsinfo->chsw_info.off_ch_num,
+               ptdlsinfo->chsw_info.cur_time,
+               ptdlsinfo->chsw_info.ch_offset,
+               ptdlsinfo->chsw_info.delay_switch_back
+#endif
+);
 
        wrqu->data.length = strlen( extra );
 
-#endif //CONFIG_TDLS
+#endif /* CONFIG_TDLS */
 
        return ret;
                
@@ -13671,68 +12127,102 @@ static int rtw_tdls_getsta(struct net_device *dev,
        char charmac[17];
        struct sta_info *ptdls_sta = NULL;
 
-       printk( "[%s] %s %d\n", __FUNCTION__, (char *)wrqu->data.pointer, wrqu->data.length -1  );
+       DBG_871X("[%s] %s %d\n", __FUNCTION__,
+               (char *)wrqu->data.pointer, wrqu->data.length -1);
 
        if(copy_from_user(charmac, wrqu->data.pointer+9, 17)){
                ret = -EFAULT;
                goto exit;
        }
        
-       printk("[%s] %d, charmac:%s\n", __FUNCTION__, __LINE__, charmac);
-       for( i=0, j=0 ; i < ETH_ALEN; i++, j+=3 ){
+       DBG_871X("[%s] %d, charmac:%s\n", __FUNCTION__, __LINE__, charmac);
+       for (i=0, j=0 ; i < ETH_ALEN; i++, j+=3)
                addr[i]=key_2char2num(*(charmac+j), *(charmac+j+1));
-       }
 
-       printk("[%s] %d, charmac:%s, addr:"MAC_FMT"\n", __FUNCTION__, __LINE__, charmac, MAC_ARG(addr));
+       DBG_871X("[%s] %d, charmac:%s, addr:"MAC_FMT"\n",
+               __FUNCTION__, __LINE__, charmac, MAC_ARG(addr));
        ptdls_sta = rtw_get_stainfo(&padapter->stapriv, addr);  
        if(ptdls_sta) {
-               sprintf(extra, "\n\ntdls_sta_state=%d\n", ptdls_sta->tdls_sta_state);
-               printk("\n\ntdls_sta_state=%d\n", ptdls_sta->tdls_sta_state);
-       }
-       else {
+               sprintf(extra, "\n\ntdls_sta_state=0x%08x\n", ptdls_sta->tdls_sta_state);
+               DBG_871X("\n\ntdls_sta_state=%d\n", ptdls_sta->tdls_sta_state);
+       } else {
                sprintf(extra, "\n\nNot found this sta\n");
-               printk("\n\nNot found this sta\n");
+               DBG_871X("\n\nNot found this sta\n");
        }
        wrqu->data.length = strlen( extra );
 
-#endif //CONFIG_TDLS
+#endif /* CONFIG_TDLS */
 exit:
        return ret;
                
 }
 
-static int rtw_tdls_ch_switch_off(struct net_device *dev,
+static int rtw_tdls_get_best_ch(struct net_device *dev,
                                struct iw_request_info *info,
                                union iwreq_data *wrqu, char *extra)
 {
-       int ret = 0;
-
-#ifdef CONFIG_TDLS
-       
+#ifdef CONFIG_FIND_BEST_CHANNEL        
        _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
-       u8 i, j, mac_addr[ETH_ALEN];
-       struct sta_info *ptdls_sta = NULL;
+       struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
+       u32 i, best_channel_24G = 1, best_channel_5G = 36, index_24G = 0, index_5G = 0;
+
+       for (i=0; pmlmeext->channel_set[i].ChannelNum !=0; i++) {
+               if (pmlmeext->channel_set[i].ChannelNum == 1)
+                       index_24G = i;
+               if (pmlmeext->channel_set[i].ChannelNum == 36)
+                       index_5G = i;
+       }
+       
+       for (i=0; pmlmeext->channel_set[i].ChannelNum !=0; i++) {
+               /* 2.4G */
+               if (pmlmeext->channel_set[i].ChannelNum == 6 || pmlmeext->channel_set[i].ChannelNum == 11) {
+                       if (pmlmeext->channel_set[i].rx_count < pmlmeext->channel_set[index_24G].rx_count) {
+                               index_24G = i;
+                               best_channel_24G = pmlmeext->channel_set[i].ChannelNum;
+                       }
+               }
+
+               /* 5G */
+               if (pmlmeext->channel_set[i].ChannelNum >= 36
+                       && pmlmeext->channel_set[i].ChannelNum < 140) {
+                        /* Find primary channel */
+                       if (((pmlmeext->channel_set[i].ChannelNum - 36) % 8 == 0)
+                               && (pmlmeext->channel_set[i].rx_count < pmlmeext->channel_set[index_5G].rx_count)) {
+                               index_5G = i;
+                               best_channel_5G = pmlmeext->channel_set[i].ChannelNum;
+                       }
+               }
+
+               if (pmlmeext->channel_set[i].ChannelNum >= 149
+                       && pmlmeext->channel_set[i].ChannelNum < 165) {
+                        /* Find primary channel */
+                       if (((pmlmeext->channel_set[i].ChannelNum - 149) % 8 == 0)
+                               && (pmlmeext->channel_set[i].rx_count < pmlmeext->channel_set[index_5G].rx_count)) {
+                               index_5G = i;
+                               best_channel_5G = pmlmeext->channel_set[i].ChannelNum;
+                       }
+               }
+#if 1 /* debug */
+               DBG_871X("The rx cnt of channel %3d = %d\n", 
+                                       pmlmeext->channel_set[i].ChannelNum,
+                                       pmlmeext->channel_set[i].rx_count);
+#endif
+       }
        
-       DBG_871X( "[%s] %s %d\n", __FUNCTION__, extra, wrqu->data.length -1  );
+       sprintf( extra, "\nbest_channel_24G = %d\n", best_channel_24G );
+       DBG_871X("best_channel_24G = %d\n", best_channel_24G);
 
-       for( i=0, j=0 ; i < ETH_ALEN; i++, j+=3 ){
-               mac_addr[i]=key_2char2num(*(extra+j), *(extra+j+1));
+       if (index_5G != 0) {
+               sprintf(extra, "best_channel_5G = %d\n", best_channel_5G);
+               DBG_871X("best_channel_5G = %d\n", best_channel_5G);
        }
 
-       ptdls_sta = rtw_get_stainfo(&padapter->stapriv, mac_addr);
+       wrqu->data.length = strlen( extra );
 
-       ptdls_sta->tdls_sta_state |= TDLS_SW_OFF_STATE;
-/*
-       if((ptdls_sta->tdls_sta_state & TDLS_AT_OFF_CH_STATE) && (ptdls_sta->tdls_sta_state & TDLS_PEER_AT_OFF_STATE)){
-               pmlmeinfo->tdls_candidate_ch= pmlmeext->cur_channel;
-               issue_tdls_ch_switch_req(padapter, mac_addr);
-               DBG_871X("issue tdls ch switch req back to base channel\n");
-       }
-*/
-       
-#endif //CONFIG_TDLS
+#endif
+
+       return 0;
 
-       return ret;
 }
 
 static int rtw_tdls(struct net_device *dev,
@@ -13742,85 +12232,85 @@ static int rtw_tdls(struct net_device *dev,
        int ret = 0;
 
 #ifdef CONFIG_TDLS
+
        _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
 
+       DBG_871X( "[%s] extra = %s\n", __FUNCTION__, extra );
 
+       if (hal_chk_wl_func(padapter, WL_FUNC_TDLS) == _FALSE) {
+               DBG_871X("Discard tdls oper since hal doesn't support tdls\n");
+               return 0;
+       }
 
-       DBG_871X( "[%s] extra = %s\n", __FUNCTION__, extra );
-       //      WFD Sigma will use the tdls enable command to let the driver know we want to test the tdls now!
-       if ( _rtw_memcmp( extra, "wfdenable=", 10 ) )
-       {
-               wrqu->data.length -=10;
-               rtw_wfd_tdls_enable( dev, info, wrqu, &extra[10] );
-               return ret;
+       if (padapter->tdlsinfo.tdls_enable == 0) {
+               DBG_871X("tdls haven't enabled\n");
+               return 0;
        }
-       else if ( _rtw_memcmp( extra, "weaksec=", 8 ) )
-       {
+
+       /* WFD Sigma will use the tdls enable command to let the driver know we want to test the tdls now! */
+
+       if (hal_chk_wl_func(padapter, WL_FUNC_MIRACAST)) {
+               if (_rtw_memcmp(extra, "wfdenable=", 10)) {
+                       wrqu->data.length -= 10;
+                       rtw_wx_tdls_wfd_enable(dev, info, wrqu, &extra[10]);
+                       return ret;
+               }
+       }
+
+       if (_rtw_memcmp(extra, "weaksec=", 8)) {
                wrqu->data.length -=8;
                rtw_tdls_weaksec( dev, info, wrqu, &extra[8] );
                return ret;
-       }
-       else if ( _rtw_memcmp( extra, "tdlsenable=", 11 ) )
-       {
+       } else if (_rtw_memcmp( extra, "tdlsenable=", 11)) {
                wrqu->data.length -=11;
                rtw_tdls_enable( dev, info, wrqu, &extra[11] );
                return ret;
        }
 
-       if( padapter->tdlsinfo.tdls_enable == 0 )
-       {
-               printk("tdls haven't enabled\n");
-               return 0;
-       }
-
-       if ( _rtw_memcmp( extra, "setup=", 6 ) )
-       {
+       if (_rtw_memcmp(extra, "setup=", 6)) {
                wrqu->data.length -=6;
                rtw_tdls_setup( dev, info, wrqu, &extra[6] );
-       }
-       else if (_rtw_memcmp( extra, "tear=", 5 ) )
-       {
+       } else if (_rtw_memcmp(extra, "tear=", 5)) {
                wrqu->data.length -= 5;
                rtw_tdls_teardown( dev, info, wrqu, &extra[5] );
-       }
-       else if (_rtw_memcmp( extra, "dis=", 4 ) )
-       {
+       } else if (_rtw_memcmp(extra, "dis=", 4)) {
                wrqu->data.length -= 4;
                rtw_tdls_discovery( dev, info, wrqu, &extra[4] );
-       }
-       else if (_rtw_memcmp( extra, "sw=", 3 ) )
-       {
+       } else if (_rtw_memcmp(extra, "swoff=", 6)) {
+               wrqu->data.length -= 6;
+               rtw_tdls_ch_switch_off(dev, info, wrqu, &extra[6]);
+       } else if (_rtw_memcmp(extra, "sw=", 3)) {
                wrqu->data.length -= 3;
                rtw_tdls_ch_switch( dev, info, wrqu, &extra[3] );
-       }
-       else if (_rtw_memcmp( extra, "swoff=", 6 ) )
-       {
-               wrqu->data.length -= 6;
-               rtw_tdls_ch_switch_off( dev, info, wrqu, &extra[6] );
-       }       
-       else if (_rtw_memcmp( extra, "pson=", 5 ) )
-       {
+       } else if (_rtw_memcmp(extra, "dumpstack=", 10)) {
+               wrqu->data.length -= 10;
+               rtw_tdls_dump_ch(dev, info, wrqu, &extra[10]);
+       } else if (_rtw_memcmp(extra, "offchnum=", 9)) {
+               wrqu->data.length -= 9;
+               rtw_tdls_off_ch_num(dev, info, wrqu, &extra[9]);
+       } else if (_rtw_memcmp(extra, "choffset=", 9)) {
+               wrqu->data.length -= 9;
+               rtw_tdls_ch_offset(dev, info, wrqu, &extra[9]);
+       } else if (_rtw_memcmp(extra, "pson=", 5)) {
                wrqu->data.length -= 5;
                rtw_tdls_pson( dev, info, wrqu, &extra[5] );
-       }
-       else if (_rtw_memcmp( extra, "psoff=", 6 ) )
-       {
+       } else if (_rtw_memcmp(extra, "psoff=", 6)) {
                wrqu->data.length -= 6;
                rtw_tdls_psoff( dev, info, wrqu, &extra[6] );
        }
+
 #ifdef CONFIG_WFD
-       else if (_rtw_memcmp( extra, "setip=", 6 ) )
-       {
-               wrqu->data.length -= 6;
-               rtw_tdls_setip( dev, info, wrqu, &extra[6] );
-       }
-       else if (_rtw_memcmp( extra, "tprobe=", 6 ) )
-       {
-               issue_tunneled_probe_req((_adapter *)rtw_netdev_priv(dev));
+       if (hal_chk_wl_func(padapter, WL_FUNC_MIRACAST)) {
+               if (_rtw_memcmp(extra, "setip=", 6)) {
+                       wrqu->data.length -= 6;
+                       rtw_tdls_setip(dev, info, wrqu, &extra[6]);
+               } else if (_rtw_memcmp(extra, "tprobe=", 6)) {
+                       issue_tunneled_probe_req((_adapter *)rtw_netdev_priv(dev));
+               }
        }
-#endif //CONFIG_WFD
+#endif /* CONFIG_WFD */
 
-#endif //CONFIG_TDLS
+#endif /* CONFIG_TDLS */
        
        return ret;
 }
@@ -13832,33 +12322,24 @@ static int rtw_tdls_get(struct net_device *dev,
 {
        int ret = 0;
 
-#ifdef CONFIG_WFD
+#ifdef CONFIG_TDLS
 
        DBG_871X( "[%s] extra = %s\n", __FUNCTION__, (char*) wrqu->data.pointer );
 
        if ( _rtw_memcmp( wrqu->data.pointer, "ip", 2 ) )
-       {
                rtw_tdls_getip( dev, info, wrqu, extra );
-       }
-       if ( _rtw_memcmp( wrqu->data.pointer, "port", 4 ) )
-       {
+       else if (_rtw_memcmp(wrqu->data.pointer, "port", 4))
                rtw_tdls_getport( dev, info, wrqu, extra );
-       }
-       //WFDTDLS, for sigma test
-       if ( _rtw_memcmp( wrqu->data.pointer, "dis", 3 ) )
-       {
+       /* WFDTDLS, for sigma test */
+       else if ( _rtw_memcmp(wrqu->data.pointer, "dis", 3))
                rtw_tdls_dis_result( dev, info, wrqu, extra );
-       }
-       if ( _rtw_memcmp( wrqu->data.pointer, "status", 6 ) )
-       {
+       else if ( _rtw_memcmp(wrqu->data.pointer, "status", 6))
                rtw_wfd_tdls_status( dev, info, wrqu, extra );
-       }
-       if ( _rtw_memcmp( wrqu->data.pointer, "tdls_sta=", 9 ) )
-       {
+       else if ( _rtw_memcmp(wrqu->data.pointer, "tdls_sta=", 9))
                rtw_tdls_getsta( dev, info, wrqu, extra );
-       }
-
-#endif //CONFIG_WFD
+       else if (_rtw_memcmp(wrqu->data.pointer, "best_ch", 7))
+               rtw_tdls_get_best_ch(dev, info, wrqu, extra);
+#endif /* CONFIG_TDLS */
 
        return ret;
 }
@@ -13906,12 +12387,6 @@ static int rtw_widi_set_probe_request(struct net_device *dev,
 
 #ifdef CONFIG_MAC_LOOPBACK_DRIVER
 
-#ifdef CONFIG_RTL8723A
-extern void rtl8723a_cal_txdesc_chksum(struct tx_desc *ptxdesc);
-#define cal_txdesc_chksum rtl8723a_cal_txdesc_chksum
-extern void rtl8723a_fill_default_txdesc(struct xmit_frame *pxmitframe, u8 *pbuf);
-#define fill_default_txdesc rtl8723a_fill_default_txdesc
-#endif
 #if defined(CONFIG_RTL8188E)
 #include <rtl8188e_hal.h>
 extern void rtl8188e_cal_txdesc_chksum(struct tx_desc *ptxdesc);
@@ -13927,6 +12402,14 @@ extern void rtl8723b_cal_txdesc_chksum(struct tx_desc *ptxdesc);
 extern void rtl8723b_fill_default_txdesc(struct xmit_frame *pxmitframe, u8 *pbuf);
 #define fill_default_txdesc rtl8723b_fill_default_txdesc
 #endif // CONFIG_RTL8723B
+
+#if defined(CONFIG_RTL8703B)
+/* extern void rtl8703b_cal_txdesc_chksum(struct tx_desc *ptxdesc); */
+#define cal_txdesc_chksum rtl8703b_cal_txdesc_chksum
+/* extern void rtl8703b_fill_default_txdesc(struct xmit_frame *pxmitframe, u8 *pbuf); */
+#define fill_default_txdesc rtl8703b_fill_default_txdesc
+#endif /* CONFIG_RTL8703B */
+
 #if defined(CONFIG_RTL8192E)
 extern void rtl8192e_cal_txdesc_chksum(struct tx_desc *ptxdesc);
 #define cal_txdesc_chksum rtl8192e_cal_txdesc_chksum
@@ -14019,7 +12502,7 @@ static s32 createpseudoadhoc(PADAPTER padapter)
        _exit_critical_bh(&pmlmepriv->lock, &irqL);
 
 #if 0
-       err = rtw_createbss_cmd(padapter);
+       err = rtw_create_ibss_cmd(padapter, 0);
        if (err == _FAIL) return _FAIL;
 #else
 {
@@ -14103,7 +12586,7 @@ static struct xmit_frame* createloopbackpkt(PADAPTER padapter, u32 size)
        _rtw_memset(pattrib, 0, sizeof(struct pkt_attrib));
 
        pattrib->ether_type = 0x8723;
-       _rtw_memcpy(pattrib->src, padapter->eeprompriv.mac_addr, ETH_ALEN);
+       _rtw_memcpy(pattrib->src, adapter_mac_addr(padapter), ETH_ALEN);
        _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN);
        _rtw_memset(pattrib->dst, 0xFF, ETH_ALEN);
        _rtw_memcpy(pattrib->ra, pattrib->dst, ETH_ALEN);
@@ -14415,11 +12898,9 @@ static void loopbackTest(PADAPTER padapter, u32 cnt, u32 size, u8* pmsg)
                return;
        }
 
-       // disable dynamic algorithm
-       {
-       u32 DMFlag = DYNAMIC_FUNC_DISABLE;
-       rtw_hal_get_hwreg(padapter, HW_VAR_DM_FLAG, (u8*)&DMFlag);
-       }
+       // disable dynamic algorithm    
+       rtw_phydm_ability_backup(padapter);
+       rtw_phydm_func_disable_all(padapter);
 
        // create pseudo ad-hoc connection
        err = initpseudoadhoc(padapter);
@@ -14522,51 +13003,22 @@ static int rtw_test(
                loopbackTest(padapter, cnt, size, extra);
                wrqu->data.length = strlen(extra) + 1;
 
-               rtw_mfree(pbuf, len);
-               return 0;
+               goto free_buf;
        }
 #endif
 
-#if 0
-//#ifdef CONFIG_RTL8723A
-       if (strcmp(pch, "poweron") == 0)
-       {
-               s32 ret;
-
-               ret = _InitPowerOn(padapter);
-               DBG_871X("%s: power on %s\n", __func__, (_FAIL==ret) ? "FAIL!":"OK.");
-               sprintf(extra, "Power ON %s", (_FAIL==ret) ? "FAIL!":"OK.");
-               wrqu->data.length = strlen(extra) + 1;
-
-               rtw_mfree(pbuf, len);
-               return 0;
-       }
-
-       if (strcmp(pch, "dlfw") == 0)
-       {
-               s32 ret;
-
-               ret = rtl8723a_FirmwareDownload(padapter);
-               DBG_871X("%s: download FW %s\n", __func__, (_FAIL==ret) ? "FAIL!":"OK.");
-               sprintf(extra, "download FW %s", (_FAIL==ret) ? "FAIL!":"OK.");
-               wrqu->data.length = strlen(extra) + 1;
-
-               rtw_mfree(pbuf, len);
-               return 0;
-       }
-#endif
 
 #ifdef CONFIG_BT_COEXIST
-       if (strcmp(pch, "bton") == 0)
-       {
+       if (strcmp(pch, "bton") == 0) {
                rtw_btcoex_SetManualControl(padapter, _FALSE);
-       }
-       else if (strcmp(pch, "btoff") == 0)
-       {
+               goto free_buf;
+       } else if (strcmp(pch, "btoff") == 0) {
                rtw_btcoex_SetManualControl(padapter, _TRUE);
+               goto free_buf;
        }
-       else if (strcmp(pch, "h2c") == 0)
-       {
+#endif
+
+       if (strcmp(pch, "h2c") == 0) {
                u8 param[8];
                u8 count = 0;
                u32 tmp;
@@ -14574,7 +13026,6 @@ static int rtw_test(
                u32 pos;
                s32 ret;
 
-
                do {
                        pch = strsep(&ptmp, delim);
                        if ((pch == NULL) || (strlen(pch) == 0))
@@ -14601,23 +13052,11 @@ static int rtw_test(
                pos += sprintf(extra+pos, " %s", ret==_FAIL?"FAIL":"OK");
 
                wrqu->data.length = strlen(extra) + 1;
-       }
-       else if (strcmp(pch, "ba_rxbuf_sz") == 0)
-       {
-               u8 ba_rxbuf_bz;
 
-               pch = strsep(&ptmp, delim);
-               if ((pch != NULL) && (strlen(pch) != 0)) {
-                       sscanf(pch, "%hhu", &ba_rxbuf_bz);
-                       DBG_871X("%s set ba_rxbuf_bz as %u\n", __func__, ba_rxbuf_bz);
-                       padapter->fix_ba_rxbuf_bz = ba_rxbuf_bz;
-                       rtw_btcoex_RejectApAggregatedPacket(padapter, _TRUE);
-                       rtw_btcoex_RejectApAggregatedPacket(padapter, _FALSE);
-               }
+               goto free_buf;
        }
 
-#endif // CONFIG_BT_COEXIST
-
+free_buf:
        rtw_mfree(pbuf, len);
        return 0;
 }
@@ -14834,19 +13273,29 @@ static const struct iw_priv_args rtw_private_args[] = {
                { MP_PwrCtlDM, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "mp_pwrctldm" },                
                { MP_GET_TXPOWER_INX, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "mp_get_txpower" },
                { MP_GETVER, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "mp_priv_ver" },
-               
-#if defined(CONFIG_RTL8723A) || defined(CONFIG_RTL8723B)
+               { MP_MON, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "mp_mon" },
+               { EFUSE_MASK, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "efuse_mask" },
+               { EFUSE_FILE, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "efuse_file" },
+               { MP_TX, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "mp_tx" },
+               { MP_RX, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "mp_rx" },
+               { MP_HW_TX_MODE, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "mp_hxtx" },
+#if defined(CONFIG_RTL8723B)
                { MP_SetBT, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "mp_setbt" },
         { MP_DISABLE_BT_COEXIST, IW_PRIV_TYPE_CHAR | 1024, 0, "mp_disa_btcoex"},
 #endif
                { CTA_TEST, IW_PRIV_TYPE_CHAR | 1024, 0, "cta_test"},
 #endif
 #ifdef CONFIG_WOWLAN
-               { MP_WOW_ENABLE , IW_PRIV_TYPE_CHAR | 1024, 0, "wow_mode" }, //set 
+               { MP_WOW_ENABLE , IW_PRIV_TYPE_CHAR | 1024, 0, "wow_mode" },
+               { MP_WOW_SET_PATTERN , IW_PRIV_TYPE_CHAR | 1024, 0, "wow_set_pattern" },
 #endif
 #ifdef CONFIG_AP_WOWLAN
                { MP_AP_WOW_ENABLE , IW_PRIV_TYPE_CHAR | 1024, 0, "ap_wow_mode" }, //set 
 #endif
+#ifdef CONFIG_SDIO_INDIRECT_ACCESS
+               { MP_SD_IREAD, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "sd_iread" },
+               { MP_SD_IWRITE, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "sd_iwrite" },
+#endif
 };
 
 static iw_handler rtw_private_handler[] = 
@@ -14929,7 +13378,9 @@ static struct iw_statistics *rtw_get_wireless_stats(struct net_device *dev)
                #ifdef CONFIG_SIGNAL_DISPLAY_DBM
                tmp_level = translate_percentage_to_dbm(padapter->recvpriv.signal_strength); 
                #else
-               #ifdef CONFIG_SKIP_SIGNAL_SCALE_MAPPING
+               #ifdef CONFIG_SIGNAL_SCALE_MAPPING
+               tmp_level = padapter->recvpriv.signal_strength;
+               #else
                {
                        /* Do signal scale mapping when using percentage as the unit of signal strength, since the scale mapping is skipped in odm */
                        
@@ -14937,32 +13388,11 @@ static struct iw_statistics *rtw_get_wireless_stats(struct net_device *dev)
                        
                        tmp_level = (u8)odm_SignalScaleMapping(&pHal->odmpriv, padapter->recvpriv.signal_strength);
                }
-               #else
-               tmp_level = padapter->recvpriv.signal_strength;
                #endif
                #endif
                
                tmp_qual = padapter->recvpriv.signal_qual;
-#if defined(CONFIG_SIGNAL_DISPLAY_DBM) && defined(CONFIG_BACKGROUND_NOISE_MONITOR)
-               if(rtw_linked_check(padapter)){                 
-                       struct mlme_ext_priv    *pmlmeext = &padapter->mlmeextpriv;
-                       struct noise_info info;
-                       info.bPauseDIG = _TRUE;
-                       info.IGIValue = 0x1e;
-                       info.max_time = 100;//ms                
-                       info.chan = pmlmeext->cur_channel ;//rtw_get_oper_ch(padapter);
-                       rtw_ps_deny(padapter, PS_DENY_IOCTL);   
-                       LeaveAllPowerSaveModeDirect(padapter);  
-
-                       rtw_hal_set_odm_var(padapter, HAL_ODM_NOISE_MONITOR,&info, _FALSE);     
-                       //ODM_InbandNoise_Monitor(podmpriv,_TRUE,0x20,100);
-                       rtw_ps_deny_cancel(padapter, PS_DENY_IOCTL);
-                       rtw_hal_get_odm_var(padapter, HAL_ODM_NOISE_MONITOR,&(info.chan), &(padapter->recvpriv.noise)); 
-                       #ifdef DBG_NOISE_MONITOR
-                       DBG_871X("chan:%d,noise_level:%d\n",info.chan,padapter->recvpriv.noise);
-                       #endif
-               }
-#endif         
+               rtw_get_noise(padapter);
                tmp_noise = padapter->recvpriv.noise;
                //DBG_871X("level:%d, qual:%d, noise:%d, rssi (%d)\n", tmp_level, tmp_qual, tmp_noise,padapter->recvpriv.rssi);
 
@@ -15067,14 +13497,21 @@ static int _rtw_ioctl_wext_private(struct net_device *dev, union iwreq_data *wrq
 
        input_len = wdata.data.length;
        input = rtw_zmalloc(input_len);
-       if (NULL == input)
+       if (NULL == input || input_len == 0)
                return -ENOMEM;
        if (copy_from_user(input, wdata.data.pointer, input_len)) {
                err = -EFAULT;
                goto exit;
        }
+       input[input_len - 1] = '\0';
        ptr = input;
        len = input_len;
+
+       if (ptr == NULL) {
+               err = -EOPNOTSUPP;
+               goto exit;
+       }
+
        sscanf(ptr, "%16s", cmdname);
        cmdlen = strlen(cmdname);
        DBG_871X("%s: cmd=%s\n", __func__, cmdname);
@@ -15439,7 +13876,7 @@ int rtw_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
                case RTL_IOCTL_HOSTAPD:
                        ret = rtw_hostapd_ioctl(dev, &wrq->u.data);
                        break;
-#ifdef CONFIG_NO_WIRELESS_HANDLERS
+#ifdef CONFIG_WIRELESS_EXT
                case SIOCSIWMODE:
                        ret = rtw_wx_set_mode(dev, NULL, &wrq->u, NULL);
                        break;