M7350/wlan/8192es/DriverSrcPkg/Driver/rtl8192cd_92es/8192cd_ioctl.c
2024-09-09 08:59:52 +00:00

11261 lines
365 KiB
C
Executable File

/*
* io-control handling routines
*
* $Id: 8192cd_ioctl.c,v 1.36.2.14 2011/01/06 07:50:09 button Exp $
*
* Copyright (c) 2009 Realtek Semiconductor Corp.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
#define _8192CD_IOCTL_C_
#ifdef __KERNEL__
#include <linux/module.h>
#include <linux/init.h>
#include <asm/uaccess.h>
#include <linux/unistd.h>
#include <linux/file.h>
#include <linux/fs.h>
#include <linux/delay.h>
#elif defined(__ECOS)
#include <cyg/io/eth/rltk/819x/wrapper/sys_support.h>
#include <cyg/io/eth/rltk/819x/wrapper/skbuff.h>
#include <cyg/io/eth/rltk/819x/wrapper/timer.h>
#include <cyg/io/eth/rltk/819x/wrapper/wrapper.h>
#endif
#include "./8192cd_cfg.h"
#ifdef __LINUX_2_6__
#include <linux/initrd.h>
#include <linux/syscalls.h>
#endif
#if !defined(__KERNEL__) && !defined(__ECOS)
#include "./sys-support.h"
#endif
#include "./8192cd_headers.h"
#include "./8192cd_debug.h"
#ifdef CONFIG_RTL_COMAPI_WLTOOLS
#include <linux/if_arp.h>
#include <net/iw_handler.h>
#include "./8192cd_comapi.h"
#endif
#ifdef CONFIG_RTK_MESH
// for commu with 802.11s path selection deamon;plus note
#include "../mesh_ext/mesh_route.h"
#include "../mesh_ext/hash_table.h"
#endif
#if defined(WIFI_HAPD) || defined(RTK_NL80211)
#include <linux/wireless.h>
#include "net80211/ieee80211.h"
#include "net80211/ieee80211_crypto.h"
#include "net80211/ieee80211_ioctl.h"
#include "./8192cd_net80211.h"
#ifdef RTK_NL80211
#include "8192cd_cfg80211.h"
#endif
#define HAPD_IOCTL_SETCONFIG SIOCIWLASTPRIV //0x8BFF
#endif
#ifdef WIFI_WPAS
#define WPAS_IOCTL_CUSTOM SIOCIWLASTPRIV //0x8BFF
#endif
#define RTL8192CD_IOCTL_SET_MIB (SIOCDEVPRIVATE + 0x1) // 0x89f1
#define RTL8192CD_IOCTL_GET_MIB (SIOCDEVPRIVATE + 0x2) // 0x89f2
#define RTL8192CD_IOCTL_WRITE_REG (SIOCDEVPRIVATE + 0x3) // 0x89f3
#define RTL8192CD_IOCTL_READ_REG (SIOCDEVPRIVATE + 0x4) // 0x89f4
#define RTL8192CD_IOCTL_WRITE_MEM (SIOCDEVPRIVATE + 0x5) // 0x89f5
#define RTL8192CD_IOCTL_READ_MEM (SIOCDEVPRIVATE + 0x6) // 0x89f6
#define RTL8192CD_IOCTL_DEL_STA (SIOCDEVPRIVATE + 0x7) // 0x89f7
#define RTL8192CD_IOCTL_WRITE_EEPROM (SIOCDEVPRIVATE + 0x8) // 0x89f8
#define RTL8192CD_IOCTL_READ_EEPROM (SIOCDEVPRIVATE + 0x9) // 0x89f9
#define RTL8192CD_IOCTL_WRITE_BB_REG (SIOCDEVPRIVATE + 0xa) // 0x89fa
#define RTL8192CD_IOCTL_READ_BB_REG (SIOCDEVPRIVATE + 0xb) // 0x89fb
#define RTL8192CD_IOCTL_WRITE_RF_REG (SIOCDEVPRIVATE + 0xc) // 0x89fc
#define RTL8192CD_IOCTL_READ_RF_REG (SIOCDEVPRIVATE + 0xd) // 0x89fd
#define RTL8192CD_IOCTL_USER_DAEMON_REQUEST (SIOCDEVPRIVATE + 0xf) // 0x89ff
#ifdef CONFIG_RTK_MESH
#define RTL8192CD_IOCTL_STATIC_ROUTE (SIOCDEVPRIVATE + 0xe)
#define RTL8192CD_IOCTL_MANUAL_METRIC 0x8BCA
#endif
#define RTL8192CD_IOCTL_SHOWSC 0x8BCD
#define SIOCGIWRTLSTAINFO 0x8B30
#define SIOCGIWRTLSTANUM 0x8B31
#define SIOCGIWRTLDRVVERSION 0x8B32
#define SIOCGIWRTLSCANREQ 0x8B33
#define SIOCGIWRTLGETBSSDB 0x8B34
#define SIOCGIWRTLJOINREQ 0x8B35
#define SIOCGIWRTLJOINREQSTATUS 0x8B36
#define SIOCGIWRTLGETBSSINFO 0x8B37
#ifdef WDS
#define SIOCGIWRTLGETWDSINFO 0x8B38
#endif
#define SIOCSIWRTLSTATXRATE 0x8B39
#ifdef MICERR_TEST
#define SIOCSIWRTLMICERROR 0x8B3A
#define SIOCSIWRTLMICREPORT 0x8B3B
#endif
#ifdef SUPPORT_SNMP_MIB
#define SIOCGSNMPMIB 0x8B3D
#endif
#ifdef USE_PID_NOTIFY
#define SIOCSIWRTLSETPID 0x8B3E
#endif
#ifdef CONFIG_RTL_WAPI_SUPPORT
#define SIOCSIWRTLSETWAPIPID 0x8B3F
#endif
#define SIOCSMIBDATA 0x8B41
#define SIOCMIBINIT 0x8B42
#define SIOCMIBSYNC 0x8B43
#define SIOCGMIBDATA 0x8B44
#define SIOCSACLADD 0x8B45
#define SIOCSACLDEL 0x8B46
#define SIOCSACLQUERY 0x8B47
#define SIOCGMISCDATA 0x8B48
#ifdef RTK_WOW
#define SIOCGRTKWOW 0x8B49
#define SIOCGRTKWOWSTAINFO 0x8B5A
#endif
#define SIOCSRFPWRADJ 0x8B5B
#ifdef AUTO_TEST_SUPPORT
#define SIOCSSREQ 0x8B5C
#define SIOCJOINREQ 0x8B5D
#endif
#ifdef MCR_WIRELESS_EXTEND
#ifdef CONFIG_WLAN_HAL_8814AE
#define SIORXANTSELECT 0x8B5E
#endif
#endif
#ifdef BT_COEXIST
#define SIOBTCH2C 0x8B60
#endif
#ifdef MP_TEST
#define MP_START_TEST 0x8B61
#define MP_STOP_TEST 0x8B62
#define MP_SET_RATE 0x8B63
#define MP_SET_CHANNEL 0x8B64
#define MP_SET_TXPOWER 0x8B65
#define MP_CONTIOUS_TX 0x8B66
#define MP_ARX 0x8B67
#define MP_SET_BSSID 0x8B68
#define MP_ANTENNA_TX 0x8B69
#define MP_ANTENNA_RX 0x8B6A
#define MP_SET_BANDWIDTH 0x8B6B
#define MP_SET_PHYPARA 0x8B6C
#define MP_QUERY_STATS 0x8B6D
#define MP_TXPWR_TRACK 0x8B6E
#define MP_QUERY_TSSI 0x8B6F
#define MP_QUERY_THER 0x8B77
#if defined(CONFIG_RTL_92D_SUPPORT) || defined(CONFIG_RTL_8812_SUPPORT) || defined(CONFIG_WLAN_HAL_8881A)
#define MP_SET_BAND 0x8B85
#endif
#define MP_RESET_STATS 0x8B86
#define MP_GET_TXPOWER 0x8B87
#if defined(CONFIG_RTL_8812_SUPPORT)
#define MP_DIG 0x8B88
#endif
#ifdef B2B_TEST
// set/get convention: set(even number) get (odd number)
#define MP_TX_PACKET 0x8B71
#define MP_RX_PACKET 0x8B70
#define MP_BRX_PACKET 0x8B73
#endif
#endif // MP_TEST
#if (defined(SW_ANT_SWITCH) || defined(HW_ANT_SWITCH))
#define SIOCANTSELECT 0x8b9d
#endif
#define SIOCGIWRTLREGDUMP 0x8B78
#if defined(MBSSID) || defined(UNIVERSAL_REPEATER)
#define SIOCSICOPYMIB 0x8B79
#endif
#ifdef SUPPORT_TX_MCAST2UNI
#define SIOCGIMCAST_ADD 0x8B80
#define SIOCGIMCAST_DEL 0x8B81
#endif
#ifdef CONFIG_RTL8186_KB
#define SIOCGIREADGUESTMAC 0x8B82
#define SIOCSIWRTGUESTMAC 0x8B83
#endif
#if defined(CONFIG_RTL8186_KB_N)
#define SIOCGIWRTLAUTH 0x8B84//To get wireless auth result
#endif
#ifdef MULTI_MAC_CLONE
#define SIOCSIMCLONE 0x8B8a
#define SIOCGIMCLONE 0x8B8b
#define SIOCSIMCLONE_DEL 0x8B8c // io come from user space
#define SIOCSIMCLONE_DEL2 0x8B8d // io come from bridge
#endif
#define SIOCRADIOOFF 0x8B8E
#if defined(PCIE_POWER_SAVING) || defined(RF_MIMO_SWITCH) || defined(RF_MIMO_PS)
#define SIOCEPDN 0x8B8F
#endif
#ifdef EN_EFUSE
#define SIOCEFUSE_GET 0x8b9b
#define SIOCEFUSE_SET 0x8b9a
#define SIOCEFUSE_SYNC 0x8b9c
#endif
#define SIOCANTSTS 0x8b9d
#define SIOCACS 0x8b9f
#ifdef P2P_SUPPORT
#define SIOCP2PCMD 0x8BD1 // command for p2p
#define SIOCP2PSCANREQ 0x8BD2 // issue p2p discovery request
#define SIOCP2PGETRESULT 0x8BD3 // get p2p discovery result
#define SIOCP2PPROVREQ 0x8BD4 // issue provision discovery request
#define SIOCP2WSCMETHODCONF 0x8BD5 // report event and state
#define SIOCP2PPGETEVNIND 0x8BD6 // get event and state
#define SIOCP2P_WSC_REPORT_STATE 0x8BD7
#define SIOCP2P_REPORT_CLIENT_STATE 0x8BD8 // report client connect state
#endif
#define SIOCSTOPPS 0x8b90
#ifdef BR_SHORTCUT
#define SIOCLEARBRSC 0x8B91
#define SIOCLONEEARBRSC 0x8B92
#endif
#ifdef D_ACL//tsananiu
#define RTL8192CD_IOCTL_ADD_ACL_TABLE 0x8B96
#define RTL8192CD_IOCTL_REMOVE_ACL_TABLE 0x8B97
#define RTL8192CD_IOCTL_GET_ACL_TABLE 0x8B98
#define RTL8192CD_IOCTL_CLEAR_ACL_TABLE 0x8B9E
#define ACL_allow 1
#define ACL_deny 2
#endif//tsananiu//d
#ifdef CONFIG_RTK_MESH
#ifdef _11s_TEST_MODE_
#define SAVE_RECEIBVER_PID 0x8B92 //PID ioctl
#define DEQUEUE_RECEIBVER_IOCTL 0x8B93 //DEQUEUE ioctl
#endif
// ==== inserted by GANTOE for manual site survey 2008/12/25 ====
#define SIOCJOINMESH 0x8B94
#define SIOCCHECKMESHLINK 0x8B95 // This OID might be removed when the mesh peerlink precedure has been completed
// GANTOE
#define SIOCQPATHTABLE 0x8BA0 // query pathselection table
#define SIOCUPATHTABLE 0x8BA1 // update existing entry's date in pathselection table
#define SIOCAPATHTABLE 0x8BA2 // add a new entry into pathselection table
#define GET_STA_LIST 0x8BA6
#define SET_PORTAL_POOL 0x8BA8
#define SIOC_NOTIFY_PATH_CREATE 0x8BA9 // path selection daemon notify dirver that the path to des mac has created
#define SIOC_UPDATE_ROOT_INFO 0x8BAA // update root mac into driver
#define SIOC_GET_ROUTING_INFO 0x8BAB // send routing info to user space
#define REMOVE_PATH_ENTRY 0x8BAC // remove specified path entry
#define SIOC_SET_ROUTING_INFO 0x8BAD // set MESH routing info from user space
#define SAVEPID_IOCTL 0x8BB0 //PID ioctl
#define DEQUEUEDATA_IOCTL 0x8BB1 //DEQUEUE ioctl
#ifdef _MESH_ACL_ENABLE_
#define SIOCSMESHACLADD 0x8BB5
#define SIOCSMESHACLDEL 0x8BB6
#define SIOCSMESHACLQUERY 0x8BB7
#endif
#define SIOCSMESHPXADD 0x8BB8
#define SIOCSMESHPXDEL 0x8BB9
#endif // CONFIG_RTK_MESH
#define SIOC92DAUTOCH 0x8BC5 // manual auto channel
#if defined(CONFIG_OFFLOAD_FUNCTION) || defined(SDIO_AP_OFFLOAD)
#define SIOOFFLOADTEST 0x8BC6
#endif
#ifdef CONFIG_8814_AP_MAC_VERI
#define SIO_8814_AP_MAC_VERI 0x8BC8
#endif //#ifdef CONFIG_8814_AP_MAC_VERI
#ifdef CONFIG_RTL_COMAPI_CFGFILE
#define SIOCCOMAPIFILE 0x8BC0
#endif
#ifdef CONFIG_RTL_92D_SUPPORT
#define SIOC92DIQK 0x8BC1
#ifdef EN_EFUSE
#define SIOC92DSBANDADDR 0x8BC4 // set hwaddr by band
#endif
#ifdef NON_INTR_ANTDIV
#define SIOC92DATNDIV 0x8BC6 // set hwaddr by band
#endif
#ifdef DPK_92D
#define SIOC92DDPK 0x8BC7 // dpk
#endif
#endif
#ifdef MP_PSD_SUPPORT
#define MP_QUERY_PSD 0x8BC9
#endif
#if defined(RTK_AC_SUPPORT) || defined(HS2_SUPPORT) || defined(CONFIG_IEEE80211W)
/* SIOC8812SIGMA for Hotsport 2.0 Release 1 */
#define SIOC8812SIGMA 0x8BCB
#endif
#if defined(RTK_AC_SUPPORT)
#define SIOC8812SIGMATB 0x8BCC
#endif
#define SIOCRESETNOPCHANNEL 0x8BCE
#define SIOCTXPWRAPPLY 0x8BCF
#define _OFFSET(field) ((int)(long *)&(((struct wifi_mib *)0)->field))
#define _SIZE(field) sizeof(((struct wifi_mib *)0)->field)
#define _OFFSET_RFFT(field) ((int)(long *)&(((struct rf_finetune_var *)0)->field))
#define _SIZE_RFFT(field) sizeof(((struct rf_finetune_var *)0)->field)
#ifdef USE_OUT_SRC
#define ODEBUG(fmt, args...) printk("odm[%s %d]"fmt,__FUNCTION__,__LINE__,## args)
#define _OFFSET_ODM_DM(field) ((int)(long *)&((( struct DM_Out_Source_Dynamic_Mechanism_Structure *)0)->field))
#define _SIZE_ODM_DM(field) sizeof((( struct DM_Out_Source_Dynamic_Mechanism_Structure *)0)->field)
#endif
#if defined (NOT_RTK_BSP) && defined(SMP_SYNC) && defined(__KERNEL__)
unsigned long _ioctl_copy_from_user (struct rtl8192cd_priv *priv, void * to, const void * from, unsigned long n);
unsigned long _ioctl_copy_to_user (struct rtl8192cd_priv *priv, void * to, const void * from, unsigned long n);
#endif
typedef enum {BYTE_T, INT_T, SSID_STRING_T, BYTE_ARRAY_T, ACL_T, IDX_BYTE_ARRAY_T, MULTI_BYTE_T,
#ifdef _DEBUG_RTL8192CD_
DEBUG_T,
#endif
DEF_SSID_STRING_T, STRING_T, RFFT_T, VARLEN_BYTE_T,
#ifdef WIFI_SIMPLE_CONFIG
PIN_IND_T,
/* WPS2DOTX */
WSC_SELF_PIN_IND_T,
WSC_SEPC_SSID_CONN_IND_T,
WSC_SEPC_MAC_CONN_IND_T,
/* WPS2DOTX */
#ifdef INCLUDE_WPS
#ifndef CONFIG_MSC
WSC_IND_T,
#endif
FLASH_RESTORE_T,
#endif
#ifdef CONFIG_RTL_COMAPI_CFGFILE
WSC_START_IND_T,
//EV_MODE, EV_STATUS, EV_MEHOD, EV_STEP, EV_OOB
WSC_MODE_IND_T,
WSC_STATUS_IND_T,
WSC_METHOD_IND_T,
WSC_STEP_IND_T,
WSC_OOB_IND_T,
#endif //ifdef CONFIG_RTL_COMAPI_CFGFILE
#endif
#ifdef CONFIG_RTK_MESH
WORD_T,
#endif
ACL_INT_T, // mac address + 1 int
#ifdef CONFIG_RTL_WAPI_SUPPORT
INT_ARRAY_T,
WAPI_KEY_T,
#endif
#ifdef CONFIG_RTL_COMAPI_CFGFILE
SSID2SCAN_STRING_T,
#endif
RFFT_ACL_T,
#ifdef SUPPORT_MULTI_PROFILE
AP_PROFILE_T,
#endif
#ifdef SWITCH_CHAN
SWITCH_CHAN_T,
#endif
#ifdef USE_OUT_SRC
ODM_DM_1UT,
ODM_DM_2UT,
ODM_DM_4UT,
ODM_DM_8UT,
#endif
} TYPE_T;
struct iw_priv_args privtab[] = {
{ RTL8192CD_IOCTL_SET_MIB, IW_PRIV_TYPE_CHAR | 450, 0, "set_mib" },
{ RTL8192CD_IOCTL_GET_MIB, IW_PRIV_TYPE_CHAR | 40, IW_PRIV_TYPE_BYTE | 128, "get_mib" },
#ifdef _IOCTL_DEBUG_CMD_
{ RTL8192CD_IOCTL_WRITE_REG, IW_PRIV_TYPE_CHAR | 128, 0, "write_reg" },
{ RTL8192CD_IOCTL_READ_REG, IW_PRIV_TYPE_CHAR | 128, IW_PRIV_TYPE_BYTE | 128, "read_reg" },
{ RTL8192CD_IOCTL_WRITE_MEM, IW_PRIV_TYPE_CHAR | 128, 0, "write_mem" },
{ RTL8192CD_IOCTL_READ_MEM, IW_PRIV_TYPE_CHAR | 128, IW_PRIV_TYPE_BYTE | 128, "read_mem" },
{ RTL8192CD_IOCTL_WRITE_BB_REG, IW_PRIV_TYPE_CHAR | 128, 0, "write_bb" },
{ RTL8192CD_IOCTL_READ_BB_REG, IW_PRIV_TYPE_CHAR | 128, IW_PRIV_TYPE_BYTE | 128, "read_bb" },
{ RTL8192CD_IOCTL_WRITE_RF_REG, IW_PRIV_TYPE_CHAR | 128, 0, "write_rf" },
{ RTL8192CD_IOCTL_READ_RF_REG, IW_PRIV_TYPE_CHAR | 128, IW_PRIV_TYPE_BYTE | 128, "read_rf" },
#endif
{ RTL8192CD_IOCTL_DEL_STA, IW_PRIV_TYPE_CHAR | 128, 0, "del_sta" },
{ RTL8192CD_IOCTL_WRITE_EEPROM, IW_PRIV_TYPE_CHAR | 128, 0, "write_eeprom" },
{ RTL8192CD_IOCTL_READ_EEPROM, IW_PRIV_TYPE_CHAR | 128, IW_PRIV_TYPE_BYTE | 128, "read_eeprom" },
#ifdef SUPPORT_SNMP_MIB
{ SIOCGSNMPMIB, IW_PRIV_TYPE_CHAR | 40, IW_PRIV_TYPE_BYTE | 128, "get_snmp_mib" },
#endif
{ SIOCSRFPWRADJ, IW_PRIV_TYPE_CHAR | 40, IW_PRIV_TYPE_CHAR | 128, "rf_pwr" },
#ifdef AUTO_TEST_SUPPORT
{ SIOCSSREQ, IW_PRIV_TYPE_NONE,0,"at_ss" },
{ SIOCJOINREQ, IW_PRIV_TYPE_CHAR|40,0,"at_join" },
#endif
#ifdef MCR_WIRELESS_EXTEND
#ifdef CONFIG_WLAN_HAL_8814AE
{ SIORXANTSELECT, IW_PRIV_TYPE_CHAR | 40, 0, "set_ant_rx" },
#endif
#endif
#ifdef CONFIG_RTL_COMAPI_CFGFILE
{ SIOCCOMAPIFILE, IW_PRIV_TYPE_NONE, 0, "cfgfile" },
#endif
#ifdef MP_TEST
{ MP_START_TEST, IW_PRIV_TYPE_NONE, 0, "mp_start" },
{ MP_STOP_TEST, IW_PRIV_TYPE_NONE, 0, "mp_stop" },
{ MP_SET_RATE, IW_PRIV_TYPE_CHAR | 40, 0, "mp_rate" },
{ MP_SET_CHANNEL, IW_PRIV_TYPE_CHAR | 40, 0, "mp_channel" },
{ MP_SET_TXPOWER, IW_PRIV_TYPE_CHAR | 40, 0, "mp_txpower" },
{ MP_CONTIOUS_TX, IW_PRIV_TYPE_CHAR | 128, 0, "mp_ctx" },
{ MP_ARX, IW_PRIV_TYPE_CHAR | 40, IW_PRIV_TYPE_CHAR | 128, "mp_arx" },
{ MP_SET_BSSID, IW_PRIV_TYPE_CHAR | 40, 0, "mp_bssid" },
{ MP_ANTENNA_TX, IW_PRIV_TYPE_CHAR | 40, 0, "mp_ant_tx" },
{ MP_ANTENNA_RX, IW_PRIV_TYPE_CHAR | 40, 0, "mp_ant_rx" },
{ MP_SET_BANDWIDTH, IW_PRIV_TYPE_CHAR | 40, 0, "mp_bandwidth" },
{ MP_SET_PHYPARA, IW_PRIV_TYPE_CHAR | 40, 0, "mp_phypara" },
#ifdef B2B_TEST
{ MP_TX_PACKET, IW_PRIV_TYPE_CHAR | 128, IW_PRIV_TYPE_CHAR | 128, "mp_tx" },
{ MP_BRX_PACKET, IW_PRIV_TYPE_CHAR | 40, IW_PRIV_TYPE_CHAR | 128, "mp_brx" },
#if 0
{ MP_RX_PACKET, IW_PRIV_TYPE_CHAR | 40, 0, "mp_rx" },
#endif
#endif
{ MP_QUERY_STATS, IW_PRIV_TYPE_CHAR | 40, IW_PRIV_TYPE_CHAR | 128, "mp_query" },
{ MP_TXPWR_TRACK, IW_PRIV_TYPE_CHAR | 40, 0, "mp_pwrtrk" },
{ MP_QUERY_TSSI, IW_PRIV_TYPE_CHAR | 40, IW_PRIV_TYPE_CHAR | 128, "mp_tssi" },
#ifdef MP_PSD_SUPPORT
{ MP_QUERY_PSD, IW_PRIV_TYPE_CHAR | 40, IW_PRIV_TYPE_CHAR | 128, "mp_psd" },
#endif
{ MP_QUERY_THER, IW_PRIV_TYPE_CHAR | 40, IW_PRIV_TYPE_CHAR | 128, "mp_ther" },
#ifdef CONFIG_RTL_92D_SUPPORT
{ MP_SET_BAND, IW_PRIV_TYPE_CHAR | 40, IW_PRIV_TYPE_CHAR | 128, "mp_phyband" },
#endif
{ MP_RESET_STATS, IW_PRIV_TYPE_CHAR | 40, IW_PRIV_TYPE_CHAR | 128, "mp_reset_stats" },
{ MP_GET_TXPOWER, IW_PRIV_TYPE_CHAR | 40, IW_PRIV_TYPE_CHAR | 128, "mp_get_pwr" },
#if defined(CONFIG_RTL_8812_SUPPORT)
{ MP_DIG, IW_PRIV_TYPE_CHAR | 40, 0, "mp_dig" },
#endif
#endif // MP_TEST
#if (defined(SW_ANT_SWITCH) || defined(HW_ANT_SWITCH))
{ SIOCANTSELECT, IW_PRIV_TYPE_CHAR | 128, IW_PRIV_TYPE_CHAR | 128, "dvyAnt_set" },
#endif
#ifdef MICERR_TEST
{ SIOCSIWRTLMICERROR, IW_PRIV_TYPE_CHAR | 40, 0, "mic_error" },
{ SIOCSIWRTLMICREPORT, IW_PRIV_TYPE_CHAR | 40, 0, "mic_report" },
#endif
{ SIOCGIWRTLREGDUMP, IW_PRIV_TYPE_CHAR | 40, 0, "reg_dump" },
#if defined(MBSSID) || defined(UNIVERSAL_REPEATER)
{ SIOCSICOPYMIB, IW_PRIV_TYPE_CHAR | 40, 0, "copy_mib" },
#endif
#ifdef CONFIG_RTL8186_KB
{ SIOCGIREADGUESTMAC, IW_PRIV_TYPE_CHAR | 40, 0, "read_guestmac" },
{ SIOCSIWRTGUESTMAC, IW_PRIV_TYPE_CHAR | 40, 0, "write_guestmac" },
#endif
#ifdef MULTI_MAC_CLONE
{ SIOCGIMCLONE, IW_PRIV_TYPE_CHAR | 40, IW_PRIV_TYPE_CHAR | 128, "get_mclone" },
{ SIOCSIMCLONE, IW_PRIV_TYPE_CHAR | 40, 0, "set_mclone" },
{ SIOCSIMCLONE_DEL, IW_PRIV_TYPE_CHAR | 40, 0, "del_mclone" },
#endif
#ifdef CONFIG_RTK_MESH
{ RTL8192CD_IOCTL_STATIC_ROUTE, IW_PRIV_TYPE_CHAR | 40, 0, "strt" },
{ RTL8192CD_IOCTL_MANUAL_METRIC, IW_PRIV_TYPE_CHAR | 40, IW_PRIV_TYPE_BYTE | 128, "manual_metric" },
{ RTL8192CD_IOCTL_SHOWSC, IW_PRIV_TYPE_CHAR | 40, IW_PRIV_TYPE_BYTE | 128, "showsc" },
#endif
#ifdef D_ACL//tsananiu
{ RTL8192CD_IOCTL_ADD_ACL_TABLE, IW_PRIV_TYPE_CHAR | 40, IW_PRIV_TYPE_BYTE | 128, "add_acl_table" },
{ RTL8192CD_IOCTL_REMOVE_ACL_TABLE, IW_PRIV_TYPE_CHAR | 40, IW_PRIV_TYPE_BYTE | 128, "del_acl_table" },
{ RTL8192CD_IOCTL_GET_ACL_TABLE, IW_PRIV_TYPE_CHAR | 40, IW_PRIV_TYPE_BYTE | 128, "get_acl_table" },
{ RTL8192CD_IOCTL_CLEAR_ACL_TABLE, IW_PRIV_TYPE_CHAR | 40, IW_PRIV_TYPE_BYTE | 128, "clear_acl_table" },
#endif//tsananiu//
#ifdef BR_SHORTCUT
{ SIOCLEARBRSC, IW_PRIV_TYPE_CHAR | 40, 0, "clear_brsc" },
{ SIOCLONEEARBRSC, IW_PRIV_TYPE_CHAR | 40, 0, "clear_onebrsc" },
#endif
{ SIOCRADIOOFF, IW_PRIV_TYPE_CHAR | 128, 0, "radio_off" },
#ifdef PCIE_POWER_SAVING
#ifdef PCIE_POWER_SAVING_DEBUG
{ SIOCEPDN, IW_PRIV_TYPE_CHAR | 128, 128, "epdn" },
#else
{ SIOCEPDN, IW_PRIV_TYPE_CHAR | 128, 128, "stopps" },
#endif
#elif defined(RF_MIMO_SWITCH) || defined(RF_MIMO_PS)
{ SIOCEPDN, IW_PRIV_TYPE_CHAR | 128, 128, "mimo" },
#endif
#ifdef SDIO_AP_OFFLOAD
{ SIOCSTOPPS, IW_PRIV_TYPE_CHAR | 128, 128, "stopps" },
#endif
{ SIOCACS, IW_PRIV_TYPE_CHAR | 128, 128, "acs" },
{ SIOCANTSTS, IW_PRIV_TYPE_CHAR | 128, IW_PRIV_TYPE_CHAR | 512, "ant_sts" },
#ifdef EN_EFUSE
{ SIOCEFUSE_GET, IW_PRIV_TYPE_CHAR | 128, IW_PRIV_TYPE_CHAR | 512, "efuse_get" },
{ SIOCEFUSE_SET, IW_PRIV_TYPE_CHAR | 512, IW_PRIV_TYPE_CHAR | 128, "efuse_set" },
{ SIOCEFUSE_SYNC, IW_PRIV_TYPE_CHAR | 128, IW_PRIV_TYPE_CHAR | 128, "efuse_sync" },
#endif
#ifdef P2P_SUPPORT
{ SIOCP2PCMD, IW_PRIV_TYPE_CHAR | 128, IW_PRIV_TYPE_CHAR | 128, "p2pcmd" },
#endif
#ifdef CONFIG_RTL_92D_SUPPORT
{ SIOC92DIQK, IW_PRIV_TYPE_CHAR | 128, 0, "iqk" },
#ifdef EN_EFUSE
{ SIOC92DSBANDADDR, IW_PRIV_TYPE_CHAR | 128, IW_PRIV_TYPE_CHAR | 128, "bandadd" },
#endif
#ifdef NON_INTR_ANTDIV
{ SIOC92DATNDIV, IW_PRIV_TYPE_CHAR | 128, 0 | 128, "antdiv" },
#endif
#ifdef DPK_92D
{ SIOC92DDPK, IW_PRIV_TYPE_CHAR | 128, 0 | 128, "dpk" },
#endif
#endif // CONFIG_RTL_92D_SUPPORT
#if defined(RTK_AC_SUPPORT) || defined(HS2_SUPPORT) || defined(CONFIG_IEEE80211W) //for 11ac logo, hs2.0 release 1 logo
{ SIOC8812SIGMA, IW_PRIV_TYPE_CHAR | 128, 0 | 128, "sigma_default" },
#endif
#if defined(RTK_AC_SUPPORT)
{ SIOC8812SIGMATB, IW_PRIV_TYPE_CHAR | 128, 0 | 128, "sigma_default_tb" },
#endif
{ SIOC92DAUTOCH, IW_PRIV_TYPE_CHAR | 128, 0, "autoch" },
#if defined(CONFIG_OFFLOAD_FUNCTION) || defined(SDIO_AP_OFFLOAD)
{ SIOOFFLOADTEST, IW_PRIV_TYPE_CHAR | 128, 0, "offload" },
#endif
#ifdef CONFIG_8814_AP_MAC_VERI
{ SIO_8814_AP_MAC_VERI, IW_PRIV_TYPE_CHAR | 128, 0, "apTest" },
#endif //#ifdef CONFIG_8814_AP_MAC_VERI
#ifdef D_ACL//tsananiu
{ RTL8192CD_IOCTL_ADD_ACL_TABLE, IW_PRIV_TYPE_CHAR | 40, IW_PRIV_TYPE_BYTE | 128, "add_acl_table" },
{ RTL8192CD_IOCTL_REMOVE_ACL_TABLE, IW_PRIV_TYPE_CHAR | 40, IW_PRIV_TYPE_BYTE | 128, "del_acl_table" },
{ RTL8192CD_IOCTL_GET_ACL_TABLE, IW_PRIV_TYPE_CHAR | 40, IW_PRIV_TYPE_BYTE | 128, "get_acl_table" },
{ RTL8192CD_IOCTL_CLEAR_ACL_TABLE, IW_PRIV_TYPE_CHAR | 40, IW_PRIV_TYPE_BYTE | 128, "clear_acl_table" },
#endif//tsananiu//
{ SIOCRESETNOPCHANNEL, IW_PRIV_TYPE_CHAR | 128, 0 | 128, "reset_nop" },
{ SIOCTXPWRAPPLY, IW_PRIV_TYPE_CHAR | 128, 0 | 128, "txpwr_apply" },
};
#if defined (CONFIG_RTL_COMAPI_WLTOOLS) || defined(SUPPORT_MONITOR)
static const iw_handler rtl_iwhandler[] =
{
(iw_handler) NULL, /* SIOCSIWCOMMIT */
#ifdef WIFI_WPAS_CLI
(iw_handler) rtl_wx_get_name, /* SIOCGIWNAME */
(iw_handler) rtl_wx_dummy, /* SIOCSIWNWID */
(iw_handler) rtl_wx_dummy, /* SIOCGIWNWID */
#else
(iw_handler) NULL /* supported */, /* SIOCGIWNAME */
(iw_handler) NULL, /* SIOCSIWNWID */
(iw_handler) NULL, /* SIOCGIWNWID */
#endif
(iw_handler) rtl_siwfreq, /* SIOCSIWFREQ */
#ifdef WIFI_WPAS_CLI
(iw_handler) rtl_wx_get_freq, /* SIOCGIWFREQ */
(iw_handler) rtl_wx_set_mode, /* SIOCSIWMODE */
#else
(iw_handler) rtl_giwfreq, /* SIOCGIWFREQ */
(iw_handler) rtl_siwmode, /* SIOCSIWMODE */
#endif
(iw_handler) rtl_giwmode, /* SIOCGIWMODE */
#ifdef WIFI_WPAS_CLI
(iw_handler) rtl_wx_dummy, /* SIOCSIWSENS */
(iw_handler) rtl_wx_get_sens, /* SIOCGIWSENS */
#else
(iw_handler) NULL, /* SIOCSIWSENS */
(iw_handler) NULL, /* SIOCGIWSENS */
#endif
(iw_handler) NULL /* not used */, /* SIOCSIWRANGE */
(iw_handler) rtl_giwrange, /* SIOCGIWRANGE */
#ifdef BALONG_PLT
(iw_handler) rtl_gipriv, /* SIOCSIWPRIV */
(iw_handler) rtl_sipriv /* kernel code */, /* SIOCGIWPRIV */
#else
(iw_handler) NULL /* not used */, /* SIOCSIWPRIV */
(iw_handler) NULL /* kernel code */, /* SIOCGIWPRIV */
#endif
(iw_handler) NULL /* not used */, /* SIOCSIWSTATS */
(iw_handler) NULL /*rtl8192cd_get_wireless_stats*//* kernel code */, /* SIOCGIWSTATS */
(iw_handler) NULL, /* SIOCSIWSPY */
(iw_handler) NULL, /* SIOCGIWSPY */
(iw_handler) NULL, /* SIOCSIWTHRSPY */
(iw_handler) NULL, /* SIOCGIWTHRSPY */
(iw_handler) rtl_siwap, /* SIOCSIWAP */
(iw_handler) rtl_giwap, /* SIOCGIWAP */
#ifdef WIFI_WPAS_CLI
(iw_handler) rtl_wx_set_mlme, /* SIOCSIWMLME */
#else
#ifdef SIOCSIWMLME
(iw_handler) NULL, // rt_ioctl_siwmlme, /* SIOCSIWMLME */ //chris: deauth, disassoc for client mode
#else
(iw_handler) NULL, /* SIOCSIWMLME */
#endif // SIOCSIWMLME //
#endif
(iw_handler) rtl_iwaplist, /* SIOCGIWAPLIST */
#ifdef SIOCGIWSCAN
(iw_handler) rtl_siwscan, /* SIOCSIWSCAN */
(iw_handler) rtl_giwscan, /* SIOCGIWSCAN */
#else
(iw_handler) NULL, /* SIOCSIWSCAN */
(iw_handler) NULL, /* SIOCGIWSCAN */
#endif /* SIOCGIWSCAN */
(iw_handler) rtl_siwessid, /* SIOCSIWESSID */
(iw_handler) rtl_giwessid, /* SIOCGIWESSID */
(iw_handler) NULL, // rt_ioctl_siwnickn, /* SIOCSIWNICKN */
(iw_handler) NULL, // rt_ioctl_giwnickn, /* SIOCGIWNICKN */
(iw_handler) NULL, /* -- hole -- */
(iw_handler) NULL, /* -- hole -- */
(iw_handler) rtl_siwrate, /* SIOCSIWRATE */
(iw_handler) rtl_giwrate, /* SIOCGIWRATE */
(iw_handler) rtl_siwrts, /* SIOCSIWRTS */
(iw_handler) rtl_giwrts, /* SIOCGIWRTS */
(iw_handler) rtl_siwfrag, /* SIOCSIWFRAG */
(iw_handler) rtl_giwfrag, /* SIOCGIWFRAG */
(iw_handler) NULL, /* SIOCSIWTXPOW */
(iw_handler) NULL, /* SIOCGIWTXPOW */
(iw_handler) rtl_siwretry, /* SIOCSIWRETRY */
(iw_handler) rtl_giwretry, /* SIOCGIWRETRY */
(iw_handler) rtl_siwencode, /* SIOCSIWENCODE */
(iw_handler) rtl_giwencode, /* SIOCGIWENCODE */
(iw_handler) NULL, /* SIOCSIWPOWER */
(iw_handler) rtl_giwpower, /* SIOCGIWPOWER */
(iw_handler) NULL, /* -- hole -- */
(iw_handler) NULL, /* -- hole -- */
#if WIRELESS_EXT > 17 // for wpa_supplicant
#ifdef WIFI_WPAS_CLI
(iw_handler) rtl_siwgenie, /* SIOCSIWGENIE */
(iw_handler) NULL, /* SIOCGIWGENIE */
(iw_handler) rtl_siwauth, /* SIOCSIWAUTH */
(iw_handler) rtl_giwauth, /* SIOCGIWAUTH */
(iw_handler) rtl_siwencodeext, /* SIOCSIWENCODEEXT */
(iw_handler) rtl_giwencodeext, /* SIOCGIWENCODEEXT */
(iw_handler) rtl_siwpmkid, /* SIOCSIWPMKSA */
#else
(iw_handler) NULL, //rt_ioctl_siwgenie, /* SIOCSIWGENIE */
(iw_handler) NULL, //rt_ioctl_giwgenie, /* SIOCGIWGENIE */
(iw_handler) NULL, //rt_ioctl_siwauth, /* SIOCSIWAUTH */
(iw_handler) NULL, //rt_ioctl_giwauth, /* SIOCGIWAUTH */
(iw_handler) NULL, //rt_ioctl_siwencodeext, /* SIOCSIWENCODEEXT */
(iw_handler) NULL, //rt_ioctl_giwencodeext, /* SIOCGIWENCODEEXT */
(iw_handler) NULL, //rt_ioctl_siwpmksa, /* SIOCSIWPMKSA */
#endif
#endif
};
static iw_handler rtl_private_handler[] =
{
#if 0
NULL, //set_mib,
NULL, //get_mib,
#ifdef _IOCTL_DEBUG_CMD_
NULL, //read_reg,
NULL, //read_mem,
NULL, //read_bb,
NULL, //read_rf,
#endif
NULL, //del_sta,
NULL, //write_eeprom,
NULL, //read_eeprom,
#ifdef SUPPORT_SNMP_MIB
NULL, //get_snmp_mib,
#endif
NULL, //rf_pwr,
#ifdef AUTO_TEST_SUPPORT
NULL, //at_ss,
NULL, //at_join,
#endif
#ifdef CONFIG_RTL_COMAPI_CFGFILE
NULL, //cfgfile,
#endif
#ifdef MP_TEST
NULL, //mp_start,
NULL, //mp_stop,
NULL, //mp_rate,
NULL, //mp_channel,
NULL, //mp_txpower,
NULL, //mp_ctx,
NULL, //mp_arx,
NULL, //mp_bssid,
NULL, //mp_ant_tx,
NULL, //mp_ant_rx,
NULL, //mp_bandwidth,
NULL, //mp_phypara,
#ifdef B2B_TEST
NULL, //mp_tx,
NULL, //mp_brx,
#if 0
mp_rx,
#endif
#endif
NULL, //mp_query,
NULL, //mp_tssi,
#ifdef RTL8192SE
NULL, //mp_ther,
#endif
#endif // MP_TEST
#if (defined(CONFIG_RTL865X) && defined(CONFIG_RTL865X_CLE) && defined(MP_TEST)) || defined(MP_TEST_CFG)
NULL, //mp_cfg,
#endif
#ifdef MICERR_TEST
NULL, //mic_error,
NULL, //mic_report,
#endif
#ifdef DEBUG_8190
NULL, //reg_dump,
#endif
#if defined(MBSSID) || defined(UNIVERSAL_REPEATER)
NULL, //copy_mib,
#endif
#ifdef CONFIG_RTL8186_KB
NULL, //read_guestmac,
NULL, //write_guestmac,
#endif
#ifdef CONFIG_RTK_MESH
NULL, //strt,
#ifdef D_ACL //tsananiu
NULL, //add_acl_table,
NULL, //remove_acl_table,
NULL, //get_acl_table,
#endif
#endif
#ifdef BR_SHORTCUT
NULL, //clear_brsc,
#endif
#else
NULL, // return NULL to redirect to dev->ioctl
#endif
};
const struct iw_handler_def rtl8192cd_iw_handler_def =
{
#define N(a) (sizeof (a) / sizeof (a[0]))
.standard = (iw_handler *) rtl_iwhandler,
.num_standard = sizeof(rtl_iwhandler) / sizeof(iw_handler),
.private = rtl_private_handler,
.private_args = (struct iw_priv_args *)privtab,
.num_private = sizeof(rtl_private_handler) / sizeof(iw_handler),
.num_private_args = sizeof(privtab) / sizeof(struct iw_priv_args),
#if 0 // IW_HANDLER_VERSION >= 6
.get_wireless_stats = rtl8192cd_get_wireless_stats,
#endif
};
#endif
struct iwpriv_arg {
char name[32]; /* mib name */
TYPE_T type; /* Type and number of args */
int offset; /* mib offset */
int len; /* mib byte len */
int Default; /* mib default value */
};
/* Bit mask value for flags, compatiable with old driver */
#define STA_INFO_FLAG_AUTH_OPEN 0x01
#define STA_INFO_FLAG_AUTH_WEP 0x02
#define STA_INFO_FLAG_ASOC 0x04
#define STA_INFO_FLAG_ASLEEP 0x08
/* BSS info, reported to web server */
typedef struct _bss_info_2_web {
unsigned char state;
unsigned char channel;
unsigned char txRate;
unsigned char bssid[6];
unsigned char rssi, sq;
unsigned char ssid[33];
} bss_info_2_web;
typedef enum _wlan_mac_state {
STATE_DISABLED=0, STATE_IDLE, STATE_SCANNING, STATE_STARTED, STATE_CONNECTED, STATE_WAITFORKEY
} wlan_mac_state;
#ifdef WDS
typedef enum _wlan_wds_state {
STATE_WDS_EMPTY=0, STATE_WDS_DISABLED, STATE_WDS_ACTIVE
} wlan_wds_state;
typedef struct _wds_info {
unsigned char state;
unsigned char addr[6];
unsigned long tx_packets;
unsigned long rx_packets;
unsigned long tx_errors;
unsigned char TxOperaRate;
} web_wds_info;
#endif
struct _wlan_sta_rateset {
unsigned char mac[6];
unsigned char txrate;
};
struct _misc_data_ {
unsigned char mimo_tr_hw_support;
unsigned char mimo_tr_used;
unsigned char resv[30];
};
/* MIB table */
static struct iwpriv_arg mib_table[] = {
// struct Dot11RFEntry
{"channel", BYTE_T, _OFFSET(dot11RFEntry.dot11channel), _SIZE(dot11RFEntry.dot11channel), 0},
{"ch_low", INT_T, _OFFSET(dot11RFEntry.dot11ch_low), _SIZE(dot11RFEntry.dot11ch_low), 0},
{"ch_hi", INT_T, _OFFSET(dot11RFEntry.dot11ch_hi), _SIZE(dot11RFEntry.dot11ch_hi), 0},
{"pwrlevelCCK_A", BYTE_ARRAY_T, _OFFSET(dot11RFEntry.pwrlevelCCK_A), _SIZE(dot11RFEntry.pwrlevelCCK_A), 0},
{"pwrlevelCCK_B", BYTE_ARRAY_T, _OFFSET(dot11RFEntry.pwrlevelCCK_B), _SIZE(dot11RFEntry.pwrlevelCCK_B), 0},
{"pwrlevelHT40_1S_A", BYTE_ARRAY_T, _OFFSET(dot11RFEntry.pwrlevelHT40_1S_A), _SIZE(dot11RFEntry.pwrlevelHT40_1S_A), 0},
{"pwrlevelHT40_1S_B", BYTE_ARRAY_T, _OFFSET(dot11RFEntry.pwrlevelHT40_1S_B), _SIZE(dot11RFEntry.pwrlevelHT40_1S_B), 0},
{"pwrdiffHT40_2S", BYTE_ARRAY_T, _OFFSET(dot11RFEntry.pwrdiffHT40_2S), _SIZE(dot11RFEntry.pwrdiffHT40_2S), 0},
{"pwrdiffHT20", BYTE_ARRAY_T, _OFFSET(dot11RFEntry.pwrdiffHT20), _SIZE(dot11RFEntry.pwrdiffHT20), 0},
{"pwrdiffOFDM", BYTE_ARRAY_T, _OFFSET(dot11RFEntry.pwrdiffOFDM), _SIZE(dot11RFEntry.pwrdiffOFDM), 0},
#if defined(CONFIG_RTL_92D_SUPPORT) || defined(CONFIG_RTL_8812_SUPPORT) || defined(CONFIG_WLAN_HAL_8881A)
{"pwrlevel5GHT40_1S_A", BYTE_ARRAY_T, _OFFSET(dot11RFEntry.pwrlevel5GHT40_1S_A), _SIZE(dot11RFEntry.pwrlevel5GHT40_1S_A), 0},
{"pwrlevel5GHT40_1S_B", BYTE_ARRAY_T, _OFFSET(dot11RFEntry.pwrlevel5GHT40_1S_B), _SIZE(dot11RFEntry.pwrlevel5GHT40_1S_B), 0},
#endif
#ifdef CONFIG_RTL_92D_SUPPORT
{"pwrdiff5GHT40_2S", BYTE_ARRAY_T, _OFFSET(dot11RFEntry.pwrdiff5GHT40_2S), _SIZE(dot11RFEntry.pwrdiff5GHT40_2S), 0},
{"pwrdiff5GHT20", BYTE_ARRAY_T, _OFFSET(dot11RFEntry.pwrdiff5GHT20), _SIZE(dot11RFEntry.pwrdiff5GHT20), 0},
{"pwrdiff5GOFDM", BYTE_ARRAY_T, _OFFSET(dot11RFEntry.pwrdiff5GOFDM), _SIZE(dot11RFEntry.pwrdiff5GOFDM), 0},
#endif
#ifdef POWER_PERCENT_ADJUSTMENT
{"powerpercent", BYTE_T, _OFFSET(dot11RFEntry.power_percent), _SIZE(dot11RFEntry.power_percent), 100},
#endif
{"preamble", INT_T, _OFFSET(dot11RFEntry.shortpreamble), _SIZE(dot11RFEntry.shortpreamble), 0},
{"trswitch", INT_T, _OFFSET(dot11RFEntry.trswitch), _SIZE(dot11RFEntry.trswitch), 0},
{"disable_ch14_ofdm", INT_T, _OFFSET(dot11RFEntry.disable_ch14_ofdm), _SIZE(dot11RFEntry.disable_ch14_ofdm), 0},
{"disable_ch1213", INT_T, _OFFSET(dot11RFEntry.disable_ch1213), _SIZE(dot11RFEntry.disable_ch1213), 1},
{"xcap", INT_T, _OFFSET(dot11RFEntry.xcap), _SIZE(dot11RFEntry.xcap), 0},
{"tssi1", INT_T, _OFFSET(dot11RFEntry.tssi1), _SIZE(dot11RFEntry.tssi1), 0},
{"tssi2", INT_T, _OFFSET(dot11RFEntry.tssi2), _SIZE(dot11RFEntry.tssi2), 0},
{"ther", INT_T, _OFFSET(dot11RFEntry.ther), _SIZE(dot11RFEntry.ther), 0},
{"deltaIQK", INT_T, _OFFSET(dot11RFEntry.deltaIQK), _SIZE(dot11RFEntry.deltaIQK), 0},
{"deltaLCK", INT_T, _OFFSET(dot11RFEntry.deltaLCK), _SIZE(dot11RFEntry.deltaLCK), 0},
{"MIMO_TR_mode", INT_T, _OFFSET(dot11RFEntry.MIMO_TR_mode), _SIZE(dot11RFEntry.MIMO_TR_mode), MIMO_2T2R},
{"phyBandSelect", BYTE_T, _OFFSET(dot11RFEntry.phyBandSelect), _SIZE(dot11RFEntry.phyBandSelect), PHY_BAND_2G},
{"band5GSelected", BYTE_T, _OFFSET(dot11RFEntry.band5GSelected), _SIZE(dot11RFEntry.band5GSelected), PHY_BAND_5G_1 | PHY_BAND_5G_2 | PHY_BAND_5G_3 | PHY_BAND_5G_4},
{"macPhyMode", BYTE_T, _OFFSET(dot11RFEntry.macPhyMode), _SIZE(dot11RFEntry.macPhyMode), SINGLEMAC_SINGLEPHY},
{"smcc", INT_T, _OFFSET(dot11RFEntry.smcc), _SIZE(dot11RFEntry.smcc), 1},
{"smcc_t", INT_T, _OFFSET(dot11RFEntry.smcc_t), _SIZE(dot11RFEntry.smcc_t), 6},
#ifdef PHASE2_TEST
{"smcc_p", INT_T, _OFFSET(dot11RFEntry.smcc_p), _SIZE(dot11RFEntry.smcc_p), 18},
#endif
{"trsw_pape_C9", BYTE_T, _OFFSET(dot11RFEntry.trsw_pape_C9), _SIZE(dot11RFEntry.trsw_pape_C9), 0x0},
{"trsw_pape_CC", BYTE_T, _OFFSET(dot11RFEntry.trsw_pape_CC), _SIZE(dot11RFEntry.trsw_pape_CC), 0xFF},
{"tx2path", INT_T, _OFFSET(dot11RFEntry.tx2path), _SIZE(dot11RFEntry.tx2path), 1},
{"txbf", INT_T, _OFFSET(dot11RFEntry.txbf), _SIZE(dot11RFEntry.txbf), 1},
{"txbfer", INT_T, _OFFSET(dot11RFEntry.txbfer), _SIZE(dot11RFEntry.txbfer), 1},
{"txbfee", INT_T, _OFFSET(dot11RFEntry.txbfee), _SIZE(dot11RFEntry.txbfee), 1},
{"target_pwr", INT_T, _OFFSET(dot11RFEntry.target_pwr), _SIZE(dot11RFEntry.target_pwr), 0},
{"pa_type", INT_T, _OFFSET(dot11RFEntry.pa_type), _SIZE(dot11RFEntry.pa_type), 0},
{"bcn2path", BYTE_T, _OFFSET(dot11RFEntry.bcn2path), _SIZE(dot11RFEntry.bcn2path), 0},
{"add_cck1M_pwr", BYTE_T, _OFFSET(dot11RFEntry.add_cck1M_pwr), _SIZE(dot11RFEntry.add_cck1M_pwr), 0},
{"rfe_type", BYTE_T, _OFFSET(dot11RFEntry.rfe_type), _SIZE(dot11RFEntry.rfe_type), 0},
{"acs_type", INT_T, _OFFSET(dot11RFEntry.acs_type), _SIZE(dot11RFEntry.acs_type), 1},
// struct Dot11StationConfigEntry
{"ssid", SSID_STRING_T, _OFFSET(dot11StationConfigEntry.dot11DesiredSSID), _SIZE(dot11StationConfigEntry.dot11DesiredSSID), 0},
{"defssid", DEF_SSID_STRING_T, _OFFSET(dot11StationConfigEntry.dot11DefaultSSID), _SIZE(dot11StationConfigEntry.dot11DefaultSSID), 0},
{"bssid2join", BYTE_ARRAY_T, _OFFSET(dot11StationConfigEntry.dot11DesiredBssid), _SIZE(dot11StationConfigEntry.dot11DesiredBssid), 0},
{"bcnint", INT_T, _OFFSET(dot11StationConfigEntry.dot11BeaconPeriod), _SIZE(dot11StationConfigEntry.dot11BeaconPeriod), 100},
{"dtimperiod", INT_T, _OFFSET(dot11StationConfigEntry.dot11DTIMPeriod), _SIZE(dot11StationConfigEntry.dot11DTIMPeriod), 1},
{"swcrypto", INT_T, _OFFSET(dot11StationConfigEntry.dot11swcrypto), _SIZE(dot11StationConfigEntry.dot11swcrypto), 0},
{"aclmode", INT_T, _OFFSET(dot11StationConfigEntry.dot11AclMode), _SIZE(dot11StationConfigEntry.dot11AclMode), 0},
{"aclnum", INT_T, _OFFSET(dot11StationConfigEntry.dot11AclNum), _SIZE(dot11StationConfigEntry.dot11AclNum), 0},
{"acladdr", ACL_T, _OFFSET(dot11StationConfigEntry.dot11AclAddr), _SIZE(dot11StationConfigEntry.dot11AclAddr), 0},
{"oprates", INT_T, _OFFSET(dot11StationConfigEntry.dot11SupportedRates), _SIZE(dot11StationConfigEntry.dot11SupportedRates), 0xfff},
{"basicrates", INT_T, _OFFSET(dot11StationConfigEntry.dot11BasicRates), _SIZE(dot11StationConfigEntry.dot11BasicRates), 0xf},
#if defined(RTK_NL80211)
{"regdomain", INT_T, _OFFSET(dot11StationConfigEntry.dot11RegDomain), _SIZE(dot11StationConfigEntry.dot11RegDomain), DOMAIN_TEST},
#else
{"regdomain", INT_T, _OFFSET(dot11StationConfigEntry.dot11RegDomain), _SIZE(dot11StationConfigEntry.dot11RegDomain), 1},
#endif
{"txpwr_lmt_index", INT_T, _OFFSET(dot11StationConfigEntry.txpwr_lmt_index), _SIZE(dot11StationConfigEntry.txpwr_lmt_index), 0},
{"autorate", INT_T, _OFFSET(dot11StationConfigEntry.autoRate), _SIZE(dot11StationConfigEntry.autoRate), 1},
{"fixrate", INT_T, _OFFSET(dot11StationConfigEntry.fixedTxRate), _SIZE(dot11StationConfigEntry.fixedTxRate), 0},
{"swTkipMic", INT_T, _OFFSET(dot11StationConfigEntry.swTkipMic), _SIZE(dot11StationConfigEntry.swTkipMic), 1},
{"disable_protection", INT_T, _OFFSET(dot11StationConfigEntry.protectionDisabled), _SIZE(dot11StationConfigEntry.protectionDisabled), 0},
{"disable_olbc", INT_T, _OFFSET(dot11StationConfigEntry.olbcDetectDisabled), _SIZE(dot11StationConfigEntry.olbcDetectDisabled), 0},
{"disable_nmlsc", INT_T, _OFFSET(dot11StationConfigEntry.nmlscDetectDisabled), _SIZE(dot11StationConfigEntry.nmlscDetectDisabled), 0},
{"deny_legacy", INT_T, _OFFSET(dot11StationConfigEntry.legacySTADeny), _SIZE(dot11StationConfigEntry.legacySTADeny), 0},
{"probe_info_enable", INT_T, _OFFSET(dot11StationConfigEntry.probe_info_enable), _SIZE(dot11StationConfigEntry.probe_info_enable), 0},
#ifdef CLIENT_MODE
{"fast_roaming", INT_T, _OFFSET(dot11StationConfigEntry.fastRoaming), _SIZE(dot11StationConfigEntry.fastRoaming), 0},
#endif
{"lowestMlcstRate", INT_T, _OFFSET(dot11StationConfigEntry.lowestMlcstRate), _SIZE(dot11StationConfigEntry.lowestMlcstRate), 0},
{"stanum", INT_T, _OFFSET(dot11StationConfigEntry.supportedStaNum), _SIZE(dot11StationConfigEntry.supportedStaNum), 0},
#ifdef RX_LOOP_LIMIT
{"limit_rxloop", INT_T, _OFFSET(dot11StationConfigEntry.limit_rxloop), _SIZE(dot11StationConfigEntry.limit_rxloop), 0},
#endif
#ifdef CONFIG_RTL_SIMPLE_CONFIG
{"sc_enabled", INT_T, _OFFSET(dot11StationConfigEntry.sc_enabled), _SIZE(dot11StationConfigEntry.sc_enabled), 0},
{"sc_duration_time", INT_T, _OFFSET(dot11StationConfigEntry.sc_duration_time), _SIZE(dot11StationConfigEntry.sc_duration_time), -1},
{"sc_get_sync_time", INT_T, _OFFSET(dot11StationConfigEntry.sc_get_sync_time), _SIZE(dot11StationConfigEntry.sc_get_sync_time), 30},
{"sc_get_profile_time", INT_T, _OFFSET(dot11StationConfigEntry.sc_get_profile_time), _SIZE(dot11StationConfigEntry.sc_get_profile_time), 30},
{"sc_connect_timeout", INT_T, _OFFSET(dot11StationConfigEntry.sc_connect_timeout), _SIZE(dot11StationConfigEntry.sc_connect_timeout), 60},
{"sc_vxd_rescan_time", INT_T, _OFFSET(dot11StationConfigEntry.sc_vxd_rescan_time), _SIZE(dot11StationConfigEntry.sc_vxd_rescan_time), 10},
{"sc_pin_enabled", INT_T, _OFFSET(dot11StationConfigEntry.sc_pin_enabled), _SIZE(dot11StationConfigEntry.sc_pin_enabled), 1},
{"sc_status", INT_T, _OFFSET(dot11StationConfigEntry.sc_status), _SIZE(dot11StationConfigEntry.sc_status), 0},
{"sc_pin", STRING_T, _OFFSET(dot11StationConfigEntry.sc_pin), _SIZE(dot11StationConfigEntry.sc_pin), 0},
{"sc_default_pin", STRING_T, _OFFSET(dot11StationConfigEntry.sc_default_pin), _SIZE(dot11StationConfigEntry.sc_default_pin), 0},
{"sc_passwd", STRING_T, _OFFSET(dot11StationConfigEntry.sc_passwd), _SIZE(dot11StationConfigEntry.sc_passwd), 0},
{"sc_device_name", STRING_T, _OFFSET(dot11StationConfigEntry.sc_device_name), _SIZE(dot11StationConfigEntry.sc_device_name), 0},
{"sc_ack_round", INT_T, _OFFSET(dot11StationConfigEntry.sc_ack_round), _SIZE(dot11StationConfigEntry.sc_ack_round), 0},
{"sc_check_link_time", INT_T, _OFFSET(dot11StationConfigEntry.sc_check_link_time), _SIZE(dot11StationConfigEntry.sc_check_link_time), 10},
{"sc_sync_vxd_to_root", INT_T, _OFFSET(dot11StationConfigEntry.sc_sync_vxd_to_root), _SIZE(dot11StationConfigEntry.sc_sync_vxd_to_root), 0},
{"sc_control_ip", INT_T, _OFFSET(dot11StationConfigEntry.sc_control_ip), _SIZE(dot11StationConfigEntry.sc_control_ip), 0},
{"sc_debug", INT_T, _OFFSET(dot11StationConfigEntry.sc_debug), _SIZE(dot11StationConfigEntry.sc_debug), 1},
{"sc_check_level", INT_T, _OFFSET(dot11StationConfigEntry.sc_check_level), _SIZE(dot11StationConfigEntry.sc_check_level), 2},
{"sc_ignore_overlap", INT_T, _OFFSET(dot11StationConfigEntry.sc_ignore_overlap), _SIZE(dot11StationConfigEntry.sc_ignore_overlap), 0},
{"sc_reset_beacon_psk", INT_T, _OFFSET(dot11StationConfigEntry.sc_reset_beacon_psk), _SIZE(dot11StationConfigEntry.sc_reset_beacon_psk), 1},
{"sc_security_type", INT_T, _OFFSET(dot11StationConfigEntry.sc_security_type), _SIZE(dot11StationConfigEntry.sc_security_type), 0},
{"sc_fix_channel", INT_T, _OFFSET(dot11StationConfigEntry.sc_fix_channel), _SIZE(dot11StationConfigEntry.sc_fix_channel), 0},
#endif
#ifdef CONFIG_RTK_MESH
{"mesh_enable", BYTE_T, _OFFSET(dot1180211sInfo.mesh_enable), _SIZE(dot1180211sInfo.mesh_enable), 0},
{"mesh_root_enable", BYTE_T, _OFFSET(dot1180211sInfo.mesh_root_enable), _SIZE(dot1180211sInfo.mesh_root_enable), 0},
{"mesh_ap_enable", BYTE_T, _OFFSET(dot1180211sInfo.mesh_ap_enable), _SIZE(dot1180211sInfo.mesh_ap_enable), 0},
{"mesh_portal_enable", BYTE_T, _OFFSET(dot1180211sInfo.mesh_portal_enable), _SIZE(dot1180211sInfo.mesh_portal_enable), 0},
{"mesh_id", STRING_T, _OFFSET(dot1180211sInfo.mesh_id), _SIZE(dot1180211sInfo.mesh_id), 0},
{"mesh_max_neightbor", WORD_T, _OFFSET(dot1180211sInfo.mesh_max_neightbor), _SIZE(dot1180211sInfo.mesh_max_neightbor), MAX_MPP_NUM},
{"log_enabled", BYTE_T, _OFFSET(dot1180211sInfo.log_enabled), _SIZE(dot1180211sInfo.log_enabled), 0},
{"mesh_privacy", INT_T, _OFFSET(dot11sKeysTable.dot11Privacy), _SIZE(dot11sKeysTable.dot11Privacy), 0},
{"mesh_passphrase", STRING_T, _OFFSET(dot1180211sInfo.dot11PassPhrase), _SIZE(dot1180211sInfo.dot11PassPhrase), 0},
{"mesh_igmp_enable", BYTE_T, _OFFSET(dot1180211sInfo.mesh_igmp_enable), _SIZE(dot1180211sInfo.mesh_igmp_enable), 1},
#ifdef _MESH_ACL_ENABLE_
{"meshaclmode", INT_T, _OFFSET(dot1180211sInfo.mesh_acl_mode), _SIZE(dot1180211sInfo.mesh_acl_mode), 0},
{"meshaclnum", INT_T, _OFFSET(dot1180211sInfo.mesh_acl_num), _SIZE(dot1180211sInfo.mesh_acl_num), 0},
{"meshacladdr", ACL_T, _OFFSET(dot1180211sInfo.mesh_acl_addr), _SIZE(dot1180211sInfo.mesh_acl_addr), 0},
#endif
#ifdef _11s_TEST_MODE_
{"mesh_reserved1", WORD_T, _OFFSET(dot1180211sInfo.mesh_reserved1), _SIZE(dot1180211sInfo.mesh_reserved1), 0},
{"mesh_reserved2", WORD_T, _OFFSET(dot1180211sInfo.mesh_reserved2), _SIZE(dot1180211sInfo.mesh_reserved2), 0},
{"mesh_reserved3", WORD_T, _OFFSET(dot1180211sInfo.mesh_reserved3), _SIZE(dot1180211sInfo.mesh_reserved3), 0},
{"mesh_reserved4", WORD_T, _OFFSET(dot1180211sInfo.mesh_reserved4), _SIZE(dot1180211sInfo.mesh_reserved4), 0},
{"mesh_reserved5", WORD_T, _OFFSET(dot1180211sInfo.mesh_reserved5), _SIZE(dot1180211sInfo.mesh_reserved5), 0},
{"mesh_reserved6", WORD_T, _OFFSET(dot1180211sInfo.mesh_reserved6), _SIZE(dot1180211sInfo.mesh_reserved6), 0},
{"mesh_reserved7", WORD_T, _OFFSET(dot1180211sInfo.mesh_reserved7), _SIZE(dot1180211sInfo.mesh_reserved7), 0},
{"mesh_reserved8", WORD_T, _OFFSET(dot1180211sInfo.mesh_reserved8), _SIZE(dot1180211sInfo.mesh_reserved8), 0},
{"mesh_reserved9", WORD_T, _OFFSET(dot1180211sInfo.mesh_reserved9), _SIZE(dot1180211sInfo.mesh_reserved9), 0},
{"mesh_reserveda", WORD_T, _OFFSET(dot1180211sInfo.mesh_reserveda), _SIZE(dot1180211sInfo.mesh_reserveda), 0},
{"mesh_reservedb", WORD_T, _OFFSET(dot1180211sInfo.mesh_reservedb), _SIZE(dot1180211sInfo.mesh_reservedb), 0},
{"mesh_reservedc", WORD_T, _OFFSET(dot1180211sInfo.mesh_reservedc), _SIZE(dot1180211sInfo.mesh_reservedc), 0},
{"mesh_reservedd", WORD_T, _OFFSET(dot1180211sInfo.mesh_reservedd), _SIZE(dot1180211sInfo.mesh_reservedd), 0},
{"mesh_reservede", WORD_T, _OFFSET(dot1180211sInfo.mesh_reservede), _SIZE(dot1180211sInfo.mesh_reservede), 0},
{"mesh_reservedf", WORD_T, _OFFSET(dot1180211sInfo.mesh_reservedf), _SIZE(dot1180211sInfo.mesh_reservedf), 0},
{"mesh_reservedstr1", STRING_T, _OFFSET(dot1180211sInfo.mesh_reservedstr1), _SIZE(dot1180211sInfo.mesh_reservedstr1), 0},
#endif
#endif
// struct Dot1180211AuthEntry
{"authtype", INT_T, _OFFSET(dot1180211AuthEntry.dot11AuthAlgrthm), _SIZE(dot1180211AuthEntry.dot11AuthAlgrthm), 0},
{"encmode", BYTE_T, _OFFSET(dot1180211AuthEntry.dot11PrivacyAlgrthm), _SIZE(dot1180211AuthEntry.dot11PrivacyAlgrthm), 0},
{"wepdkeyid", INT_T, _OFFSET(dot1180211AuthEntry.dot11PrivacyKeyIndex), _SIZE(dot1180211AuthEntry.dot11PrivacyKeyIndex), 0},
#if defined(INCLUDE_WPA_PSK) || defined(WIFI_HAPD) || defined(RTK_NL80211)
{"psk_enable", INT_T, _OFFSET(dot1180211AuthEntry.dot11EnablePSK), _SIZE(dot1180211AuthEntry.dot11EnablePSK), 0},
{"wpa_cipher", INT_T, _OFFSET(dot1180211AuthEntry.dot11WPACipher), _SIZE(dot1180211AuthEntry.dot11WPACipher), 0},
#ifdef RTL_WPA2
{"wpa2_cipher", INT_T, _OFFSET(dot1180211AuthEntry.dot11WPA2Cipher), _SIZE(dot1180211AuthEntry.dot11WPA2Cipher), 0},
#endif
{"passphrase", STRING_T, _OFFSET(dot1180211AuthEntry.dot11PassPhrase), _SIZE(dot1180211AuthEntry.dot11PassPhrase), 0},
#ifdef CONFIG_RTL8186_KB
{"passphrase_guest", STRING_T, _OFFSET(dot1180211AuthEntry.dot11PassPhraseGuest), _SIZE(dot1180211AuthEntry.dot11PassPhraseGuest), 0},
#endif
{"gk_rekey", INT_T, _OFFSET(dot1180211AuthEntry.dot11GKRekeyTime), _SIZE(dot1180211AuthEntry.dot11GKRekeyTime), 0},
{"uk_rekey", INT_T, _OFFSET(dot1180211AuthEntry.dot11UKRekeyTime), _SIZE(dot1180211AuthEntry.dot11UKRekeyTime), 0},
#endif
// struct Dot118021xAuthEntry
{"802_1x", INT_T, _OFFSET(dot118021xAuthEntry.dot118021xAlgrthm), _SIZE(dot118021xAuthEntry.dot118021xAlgrthm), 0},
{"default_port",INT_T, _OFFSET(dot118021xAuthEntry.dot118021xDefaultPort), _SIZE(dot118021xAuthEntry.dot118021xDefaultPort), 0},
{"acct_enabled",INT_T, _OFFSET(dot118021xAuthEntry.acct_enabled), _SIZE(dot118021xAuthEntry.acct_enabled), 0},
{"acct_timeout_INT",INT_T,_OFFSET(dot118021xAuthEntry.acct_timeout_period), _SIZE(dot118021xAuthEntry.acct_timeout_period), 0},
{"acct_timeout_TP",INT_T,_OFFSET(dot118021xAuthEntry.acct_timeout_throughput), _SIZE(dot118021xAuthEntry.acct_timeout_throughput), 0},
// struct Dot11DefaultKeysTable
{"wepkey1", BYTE_ARRAY_T, _OFFSET(dot11DefaultKeysTable.keytype[0]), _SIZE(dot11DefaultKeysTable.keytype[0]), 0},
{"wepkey2", BYTE_ARRAY_T, _OFFSET(dot11DefaultKeysTable.keytype[1]), _SIZE(dot11DefaultKeysTable.keytype[1]), 0},
{"wepkey3", BYTE_ARRAY_T, _OFFSET(dot11DefaultKeysTable.keytype[2]), _SIZE(dot11DefaultKeysTable.keytype[2]), 0},
{"wepkey4", BYTE_ARRAY_T, _OFFSET(dot11DefaultKeysTable.keytype[3]), _SIZE(dot11DefaultKeysTable.keytype[3]), 0},
// struct Dot11OperationEntry
{"opmode", INT_T, _OFFSET(dot11OperationEntry.opmode), _SIZE(dot11OperationEntry.opmode), 0x10},
{"hiddenAP", INT_T, _OFFSET(dot11OperationEntry.hiddenAP), _SIZE(dot11OperationEntry.hiddenAP), 0},
{"rtsthres", INT_T, _OFFSET(dot11OperationEntry.dot11RTSThreshold), _SIZE(dot11OperationEntry.dot11RTSThreshold), 2347},
#ifdef __ECOS
{"fragthres", INT_T, _OFFSET(dot11OperationEntry.dot11FragmentationThreshold), _SIZE(dot11OperationEntry.dot11FragmentationThreshold), 2346},
#else
{"fragthres", INT_T, _OFFSET(dot11OperationEntry.dot11FragmentationThreshold), _SIZE(dot11OperationEntry.dot11FragmentationThreshold), 2347},
#endif
{"shortretry", INT_T, _OFFSET(dot11OperationEntry.dot11ShortRetryLimit), _SIZE(dot11OperationEntry.dot11ShortRetryLimit), 0},
{"longretry", INT_T, _OFFSET(dot11OperationEntry.dot11LongRetryLimit), _SIZE(dot11OperationEntry.dot11LongRetryLimit), 0},
{"expired_time",INT_T, _OFFSET(dot11OperationEntry.expiretime), _SIZE(dot11OperationEntry.expiretime), 30000}, /*in 10ms*/
#if defined(CONFIG_RTL8672)
{"led_type", INT_T, _OFFSET(dot11OperationEntry.ledtype), _SIZE(dot11OperationEntry.ledtype), LEDTYPE_SW_LED2_GPIO8_LINKTXRX},
#else
{"led_type", INT_T, _OFFSET(dot11OperationEntry.ledtype), _SIZE(dot11OperationEntry.ledtype), 0},
#endif
#ifdef RTL8190_SWGPIO_LED
{"led_route", INT_T, _OFFSET(dot11OperationEntry.ledroute), _SIZE(dot11OperationEntry.ledroute), 0},
#endif
{"iapp_enable", INT_T, _OFFSET(dot11OperationEntry.iapp_enable), _SIZE(dot11OperationEntry.iapp_enable), 0},
{"block_relay", INT_T, _OFFSET(dot11OperationEntry.block_relay), _SIZE(dot11OperationEntry.block_relay), 0},
{"deny_any", INT_T, _OFFSET(dot11OperationEntry.deny_any), _SIZE(dot11OperationEntry.deny_any), 0},
{"crc_log", INT_T, _OFFSET(dot11OperationEntry.crc_log), _SIZE(dot11OperationEntry.crc_log), 0},
{"wifi_specific",INT_T, _OFFSET(dot11OperationEntry.wifi_specific), _SIZE(dot11OperationEntry.wifi_specific), 2},
#ifdef TX_SHORTCUT
{"disable_txsc",INT_T, _OFFSET(dot11OperationEntry.disable_txsc), _SIZE(dot11OperationEntry.disable_txsc), 0},
#endif
#ifdef RX_SHORTCUT
{"disable_rxsc",INT_T, _OFFSET(dot11OperationEntry.disable_rxsc), _SIZE(dot11OperationEntry.disable_rxsc), 0},
#endif
#ifdef BR_SHORTCUT
{"disable_brsc",INT_T, _OFFSET(dot11OperationEntry.disable_brsc), _SIZE(dot11OperationEntry.disable_brsc), 0},
#endif
{"keep_rsnie", INT_T, _OFFSET(dot11OperationEntry.keep_rsnie), _SIZE(dot11OperationEntry.keep_rsnie), 0},
{"guest_access",INT_T, _OFFSET(dot11OperationEntry.guest_access), _SIZE(dot11OperationEntry.guest_access), 0},
{"tdls_prohibited",INT_T, _OFFSET(dot11OperationEntry.tdls_prohibited), _SIZE(dot11OperationEntry.tdls_prohibited), 0},
{"tdls_cs_prohibited",INT_T, _OFFSET(dot11OperationEntry.tdls_cs_prohibited), _SIZE(dot11OperationEntry.tdls_cs_prohibited), 0},
#ifdef CONFIG_POWER_SAVE
{"ps_level",INT_T, _OFFSET(dot11OperationEntry.ps_level), _SIZE(dot11OperationEntry.ps_level), 2},
{"ps_32k_en",INT_T, _OFFSET(dot11OperationEntry.ps_32k_en), _SIZE(dot11OperationEntry.ps_32k_en), 1},
{"ps_timeout",INT_T, _OFFSET(dot11OperationEntry.ps_timeout), _SIZE(dot11OperationEntry.ps_timeout), 1000},
{"ps_sleep_time",INT_T, _OFFSET(dot11OperationEntry.ps_sleep_time), _SIZE(dot11OperationEntry.ps_sleep_time), 0},
#endif
// struct bss_type
{"band", BYTE_T, _OFFSET(dot11BssType.net_work_type), _SIZE(dot11BssType.net_work_type), 3},
// struct erp_mib
{"cts2self", INT_T, _OFFSET(dot11ErpInfo.ctsToSelf), _SIZE(dot11ErpInfo.ctsToSelf), 0},
#ifdef WDS
// struct wds_info
{"wds_enable", INT_T, _OFFSET(dot11WdsInfo.wdsEnabled), _SIZE(dot11WdsInfo.wdsEnabled), 0},
{"wds_pure", INT_T, _OFFSET(dot11WdsInfo.wdsPure), _SIZE(dot11WdsInfo.wdsPure), 0},
{"wds_priority",INT_T, _OFFSET(dot11WdsInfo.wdsPriority), _SIZE(dot11WdsInfo.wdsPriority), 0},
{"wds_num", INT_T, _OFFSET(dot11WdsInfo.wdsNum), _SIZE(dot11WdsInfo.wdsNum), 0},
{"wds_add", ACL_INT_T, _OFFSET(dot11WdsInfo.entry), _SIZE(dot11WdsInfo.entry), 0},
{"wds_encrypt", INT_T, _OFFSET(dot11WdsInfo.wdsPrivacy), _SIZE(dot11WdsInfo.wdsPrivacy), 0},
{"wds_wepkey", BYTE_ARRAY_T, _OFFSET(dot11WdsInfo.wdsWepKey), _SIZE(dot11WdsInfo.wdsWepKey), 0},
{"wds_keyid", INT_T, _OFFSET(dot11WdsInfo.wdsKeyId), _SIZE(dot11WdsInfo.wdsKeyId), 0},
#if defined(INCLUDE_WPA_PSK) || defined(WIFI_HAPD) || defined(RTK_NL80211)
{"wds_passphrase", STRING_T, _OFFSET(dot11WdsInfo.wdsPskPassPhrase), _SIZE(dot11WdsInfo.wdsPskPassPhrase), 0},
#endif
#endif
#ifdef RTK_BR_EXT
// struct br_ext_info
{"nat25_disable", INT_T, _OFFSET(ethBrExtInfo.nat25_disable), _SIZE(ethBrExtInfo.nat25_disable), 0},
{"macclone_enable", INT_T, _OFFSET(ethBrExtInfo.macclone_enable), _SIZE(ethBrExtInfo.macclone_enable), 0},
{"dhcp_bcst_disable", INT_T, _OFFSET(ethBrExtInfo.dhcp_bcst_disable), _SIZE(ethBrExtInfo.dhcp_bcst_disable), 0},
{"add_pppoe_tag", INT_T, _OFFSET(ethBrExtInfo.addPPPoETag), _SIZE(ethBrExtInfo.addPPPoETag), 1},
{"clone_mac_addr", BYTE_ARRAY_T, _OFFSET(ethBrExtInfo.nat25_dmzMac), _SIZE(ethBrExtInfo.nat25_dmzMac), 0},
{"nat25sc_disable", INT_T, _OFFSET(ethBrExtInfo.nat25sc_disable), _SIZE(ethBrExtInfo.nat25sc_disable), 0},
#endif
#ifdef DFS
//struct Dot11DFSEntry
{"disable_DFS", INT_T, _OFFSET(dot11DFSEntry.disable_DFS), _SIZE(dot11DFSEntry.disable_DFS), 0},
{"disable_tx", INT_T, _OFFSET(dot11DFSEntry.disable_tx), _SIZE(dot11DFSEntry.disable_tx), 0},
{"DFS_timeout", INT_T, _OFFSET(dot11DFSEntry.DFS_timeout), _SIZE(dot11DFSEntry.DFS_timeout), 10}, /*in 10ms*/
{"DFS_detected",INT_T, _OFFSET(dot11DFSEntry.DFS_detected), _SIZE(dot11DFSEntry.DFS_detected), 0},
{"NOP_timeout", INT_T, _OFFSET(dot11DFSEntry.NOP_timeout), _SIZE(dot11DFSEntry.NOP_timeout), 180500}, /*in 10ms*/
{"DFS_TXPAUSE_timeout", INT_T, _OFFSET(dot11DFSEntry.DFS_TXPAUSE_timeout), _SIZE(dot11DFSEntry.DFS_TXPAUSE_timeout), 1000}, /*in 10ms*/
{"CAC_enable", INT_T, _OFFSET(dot11DFSEntry.CAC_enable), _SIZE(dot11DFSEntry.CAC_enable), 1},
#endif
//struct miscEntry
{"show_hidden_bss",INT_T, _OFFSET(miscEntry.show_hidden_bss), _SIZE(miscEntry.show_hidden_bss), 0},
{"ack_timeout", INT_T, _OFFSET(miscEntry.ack_timeout), _SIZE(miscEntry.ack_timeout), 0},
{"private_ie", VARLEN_BYTE_T, _OFFSET(miscEntry.private_ie), _SIZE(miscEntry.private_ie), 0},
{"rxInt", INT_T, _OFFSET(miscEntry.rxInt_thrd), _SIZE(miscEntry.rxInt_thrd), 300},
#ifdef DRVMAC_LB
{"dmlb", INT_T, _OFFSET(miscEntry.drvmac_lb), _SIZE(miscEntry.drvmac_lb), 1},
{"lb_da", BYTE_ARRAY_T, _OFFSET(miscEntry.lb_da), _SIZE(miscEntry.lb_da), 0},
{"lb_tps", INT_T, _OFFSET(miscEntry.lb_tps), _SIZE(miscEntry.lb_tps), 0},
{"lb_mlmp", INT_T, _OFFSET(miscEntry.lb_mlmp), _SIZE(miscEntry.lb_mlmp), 0},
#endif
{"groupID", INT_T, _OFFSET(miscEntry.groupID), _SIZE(miscEntry.groupID), 0},
#ifdef MBSSID
{"vap_enable", INT_T, _OFFSET(miscEntry.vap_enable), _SIZE(miscEntry.vap_enable), 0},
#endif
#ifdef RESERVE_TXDESC_FOR_EACH_IF
{"rsv_txdesc", INT_T, _OFFSET(miscEntry.rsv_txdesc), _SIZE(miscEntry.rsv_txdesc), 1},
#endif
#ifdef USE_TXQUEUE
{"use_txq", INT_T, _OFFSET(miscEntry.use_txq), _SIZE(miscEntry.use_txq), 1},
#endif
{"func_off", INT_T, _OFFSET(miscEntry.func_off), _SIZE(miscEntry.func_off), 0},
#ifdef AUTO_CHANNEL_TIMEOUT
{"autoch_timeout", INT_T, _OFFSET(miscEntry.autoch_timeout), _SIZE(miscEntry.autoch_timeout), 0},
#endif
{"ss_loop_delay", INT_T, _OFFSET(miscEntry.ss_loop_delay), _SIZE(miscEntry.ss_loop_delay), 0},
#ifdef SUPPORT_MONITOR
{"chan_switch_time", BYTE_T, _OFFSET(miscEntry.chan_switch_time), _SIZE(miscEntry.chan_switch_time), 500},
#endif
#ifdef DFS
{"passive_ss_int", INT_T, _OFFSET(miscEntry.passive_ss_int), _SIZE(miscEntry.passive_ss_int), 120},
{"ss_delay", INT_T, _OFFSET(miscEntry.ss_delay), _SIZE(miscEntry.ss_delay), 3000},
#endif
#ifdef AUTOCH_SS_SPEEDUP
{"autoch_ss_to", INT_T, _OFFSET(miscEntry.autoch_ss_to), _SIZE(miscEntry.autoch_ss_to), 0},
{"autoch_ss_cnt", INT_T, _OFFSET(miscEntry.autoch_ss_cnt), _SIZE(miscEntry.autoch_ss_cnt), 0},
{"autoch_1611_enable", INT_T, _OFFSET(miscEntry.autoch_1611_enable), _SIZE(miscEntry.autoch_1611_enable), 0},
#endif
#if defined(CONFIG_USB_TX_AGGREGATION) || defined(CONFIG_SDIO_TX_AGGREGATION)
{"max_xmitbuf_agg", INT_T, _OFFSET(miscEntry.max_xmitbuf_agg), _SIZE(miscEntry.max_xmitbuf_agg), MAX_XMITBUF_PKT},
#endif
#ifdef CONFIG_SDIO_HCI
{"max_recvbuf_agg", INT_T, _OFFSET(miscEntry.max_recvbuf_agg), _SIZE(miscEntry.max_recvbuf_agg), 1},
{"max_handle_xmitbuf", INT_T, _OFFSET(miscEntry.max_handle_xmitbuf), _SIZE(miscEntry.max_handle_xmitbuf), 6},
{"max_handle_recvbuf", INT_T, _OFFSET(miscEntry.max_handle_recvbuf), _SIZE(miscEntry.max_handle_recvbuf), 2},
#endif
//struct Dot11QosEntry
#ifdef WIFI_WMM
{"qos_enable", INT_T, _OFFSET(dot11QosEntry.dot11QosEnable), _SIZE(dot11QosEntry.dot11QosEnable), 1},
#ifdef WMM_APSD
{"apsd_enable", INT_T, _OFFSET(dot11QosEntry.dot11QosAPSD), _SIZE(dot11QosEntry.dot11QosAPSD), 0},
#ifdef CLIENT_MODE
{"apsd_sta_be", INT_T, _OFFSET(dot11QosEntry.UAPSD_AC_BE), _SIZE(dot11QosEntry.UAPSD_AC_BE), 0},
{"apsd_sta_bk", INT_T, _OFFSET(dot11QosEntry.UAPSD_AC_BK), _SIZE(dot11QosEntry.UAPSD_AC_BK), 0},
{"apsd_sta_vi", INT_T, _OFFSET(dot11QosEntry.UAPSD_AC_VI), _SIZE(dot11QosEntry.UAPSD_AC_VI), 0},
{"apsd_sta_vo", INT_T, _OFFSET(dot11QosEntry.UAPSD_AC_VO), _SIZE(dot11QosEntry.UAPSD_AC_VO), 0},
#endif
#endif
#ifdef RTL_MANUAL_EDCA
{"manual_edca", INT_T, _OFFSET(dot11QosEntry.ManualEDCA), _SIZE(dot11QosEntry.ManualEDCA), 0},
{"sta_bkq_acm", INT_T, _OFFSET(dot11QosEntry.STA_manualEDCA[BK].ACM), _SIZE(dot11QosEntry.STA_manualEDCA[BK].ACM), 0},
{"sta_bkq_aifsn", INT_T, _OFFSET(dot11QosEntry.STA_manualEDCA[BK].AIFSN), _SIZE(dot11QosEntry.STA_manualEDCA[BK].AIFSN), 7},
{"sta_bkq_cwmin", INT_T, _OFFSET(dot11QosEntry.STA_manualEDCA[BK].ECWmin), _SIZE(dot11QosEntry.STA_manualEDCA[BK].ECWmin), 4},
{"sta_bkq_cwmax", INT_T, _OFFSET(dot11QosEntry.STA_manualEDCA[BK].ECWmax), _SIZE(dot11QosEntry.STA_manualEDCA[BK].ECWmax), 10},
{"sta_bkq_txoplimit", INT_T, _OFFSET(dot11QosEntry.STA_manualEDCA[BK].TXOPlimit), _SIZE(dot11QosEntry.STA_manualEDCA[BK].TXOPlimit), 0},
{"sta_beq_acm", INT_T, _OFFSET(dot11QosEntry.STA_manualEDCA[BE].ACM), _SIZE(dot11QosEntry.STA_manualEDCA[BE].ACM), 0},
{"sta_beq_aifsn", INT_T, _OFFSET(dot11QosEntry.STA_manualEDCA[BE].AIFSN), _SIZE(dot11QosEntry.STA_manualEDCA[BE].AIFSN), 3},
{"sta_beq_cwmin", INT_T, _OFFSET(dot11QosEntry.STA_manualEDCA[BE].ECWmin), _SIZE(dot11QosEntry.STA_manualEDCA[BE].ECWmin), 4},
{"sta_beq_cwmax", INT_T, _OFFSET(dot11QosEntry.STA_manualEDCA[BE].ECWmax), _SIZE(dot11QosEntry.STA_manualEDCA[BE].ECWmax), 10},
{"sta_beq_txoplimit", INT_T, _OFFSET(dot11QosEntry.STA_manualEDCA[BE].TXOPlimit), _SIZE(dot11QosEntry.STA_manualEDCA[BE].TXOPlimit), 0},
{"sta_viq_acm", INT_T, _OFFSET(dot11QosEntry.STA_manualEDCA[VI].ACM), _SIZE(dot11QosEntry.STA_manualEDCA[VI].ACM), 0},
{"sta_viq_aifsn", INT_T, _OFFSET(dot11QosEntry.STA_manualEDCA[VI].AIFSN), _SIZE(dot11QosEntry.STA_manualEDCA[VI].AIFSN), 2},
{"sta_viq_cwmin", INT_T, _OFFSET(dot11QosEntry.STA_manualEDCA[VI].ECWmin), _SIZE(dot11QosEntry.STA_manualEDCA[VI].ECWmin), 3},
{"sta_viq_cwmax", INT_T, _OFFSET(dot11QosEntry.STA_manualEDCA[VI].ECWmax), _SIZE(dot11QosEntry.STA_manualEDCA[VI].ECWmax), 4},
{"sta_viq_txoplimit", INT_T, _OFFSET(dot11QosEntry.STA_manualEDCA[VI].TXOPlimit), _SIZE(dot11QosEntry.STA_manualEDCA[VI].TXOPlimit), 188},
//{"ap_viq_txoplimit", INT_T, _OFFSET(dot11QosEntry.AP_manualEDCA[VI].TXOPlimit), _SIZE(dot11QosEntry.AP_manualEDCA[VI].TXOPlimit), (B band)?188:94},
{"sta_voq_acm", INT_T, _OFFSET(dot11QosEntry.STA_manualEDCA[VO].ACM), _SIZE(dot11QosEntry.STA_manualEDCA[VO].ACM), 0},
{"sta_voq_aifsn", INT_T, _OFFSET(dot11QosEntry.STA_manualEDCA[VO].AIFSN), _SIZE(dot11QosEntry.STA_manualEDCA[VO].AIFSN), 2},
{"sta_voq_cwmin", INT_T, _OFFSET(dot11QosEntry.STA_manualEDCA[VO].ECWmin), _SIZE(dot11QosEntry.STA_manualEDCA[VO].ECWmin), 2},
{"sta_voq_cwmax", INT_T, _OFFSET(dot11QosEntry.STA_manualEDCA[VO].ECWmax), _SIZE(dot11QosEntry.STA_manualEDCA[VO].ECWmax), 3},
{"sta_voq_txoplimit", INT_T, _OFFSET(dot11QosEntry.STA_manualEDCA[VO].TXOPlimit), _SIZE(dot11QosEntry.STA_manualEDCA[VO].TXOPlimit), 102},
//{"ap_voq_txoplimit", INT_T, _OFFSET(dot11QosEntry.AP_manualEDCA[VO].TXOPlimit), _SIZE(dot11QosEntry.AP_manualEDCA[VO].TXOPlimit), (B band)?102:47},
//{"ap_beq_acm", INT_T, _OFFSET(dot11QosEntry.AP_manualEDCA[BE].ACM), _SIZE(dot11QosEntry.AP_manualEDCA[BE].ACM), 0},
{"ap_beq_aifsn", INT_T, _OFFSET(dot11QosEntry.AP_manualEDCA[BE].AIFSN), _SIZE(dot11QosEntry.AP_manualEDCA[BE].AIFSN), 3},
{"ap_beq_cwmin", INT_T, _OFFSET(dot11QosEntry.AP_manualEDCA[BE].ECWmin), _SIZE(dot11QosEntry.AP_manualEDCA[BE].ECWmin), 4},
{"ap_beq_cwmax", INT_T, _OFFSET(dot11QosEntry.AP_manualEDCA[BE].ECWmax), _SIZE(dot11QosEntry.AP_manualEDCA[BE].ECWmax), 6},
{"ap_beq_txoplimit", INT_T, _OFFSET(dot11QosEntry.AP_manualEDCA[BE].TXOPlimit), _SIZE(dot11QosEntry.AP_manualEDCA[BE].TXOPlimit), 0},
//{"ap_bkq_acm", INT_T, _OFFSET(dot11QosEntry.AP_manualEDCA[BK].ACM), _SIZE(dot11QosEntry.AP_manualEDCA[BK].ACM), 0},
{"ap_bkq_aifsn", INT_T, _OFFSET(dot11QosEntry.AP_manualEDCA[BK].AIFSN), _SIZE(dot11QosEntry.AP_manualEDCA[BK].AIFSN), 7},
{"ap_bkq_cwmin", INT_T, _OFFSET(dot11QosEntry.AP_manualEDCA[BK].ECWmin), _SIZE(dot11QosEntry.AP_manualEDCA[BK].ECWmin), 4},
{"ap_bkq_cwmax", INT_T, _OFFSET(dot11QosEntry.AP_manualEDCA[BK].ECWmax), _SIZE(dot11QosEntry.AP_manualEDCA[BK].ECWmax), 10},
{"ap_bkq_txoplimit", INT_T, _OFFSET(dot11QosEntry.AP_manualEDCA[BK].TXOPlimit), _SIZE(dot11QosEntry.AP_manualEDCA[BK].TXOPlimit), 0},
//{"ap_viq_acm", INT_T, _OFFSET(dot11QosEntry.AP_manualEDCA[VI].ACM), _SIZE(dot11QosEntry.AP_manualEDCA[VI].ACM), 0},
{"ap_viq_aifsn", INT_T, _OFFSET(dot11QosEntry.AP_manualEDCA[VI].AIFSN), _SIZE(dot11QosEntry.AP_manualEDCA[VI].AIFSN), 1},
{"ap_viq_cwmin", INT_T, _OFFSET(dot11QosEntry.AP_manualEDCA[VI].ECWmin), _SIZE(dot11QosEntry.AP_manualEDCA[VI].ECWmin), 3},
{"ap_viq_cwmax", INT_T, _OFFSET(dot11QosEntry.AP_manualEDCA[VI].ECWmax), _SIZE(dot11QosEntry.AP_manualEDCA[VI].ECWmax), 4},
{"ap_viq_txoplimit", INT_T, _OFFSET(dot11QosEntry.AP_manualEDCA[VI].TXOPlimit), _SIZE(dot11QosEntry.AP_manualEDCA[VI].TXOPlimit), 188},
//{"ap_viq_txoplimit", INT_T, _OFFSET(dot11QosEntry.AP_manualEDCA[VI].TXOPlimit), _SIZE(dot11QosEntry.AP_manualEDCA[VI].TXOPlimit), (B band)?188:94},
//{"ap_voq_acm", INT_T, _OFFSET(dot11QosEntry.AP_manualEDCA[VO].ACM), _SIZE(dot11QosEntry.AP_manualEDCA[VO].ACM), 0},
{"ap_voq_aifsn", INT_T, _OFFSET(dot11QosEntry.AP_manualEDCA[VO].AIFSN), _SIZE(dot11QosEntry.AP_manualEDCA[VO].AIFSN), 1},
{"ap_voq_cwmin", INT_T, _OFFSET(dot11QosEntry.AP_manualEDCA[VO].ECWmin), _SIZE(dot11QosEntry.AP_manualEDCA[VO].ECWmin), 2},
{"ap_voq_cwmax", INT_T, _OFFSET(dot11QosEntry.AP_manualEDCA[VO].ECWmax), _SIZE(dot11QosEntry.AP_manualEDCA[VO].ECWmax), 3},
{"ap_voq_txoplimit", INT_T, _OFFSET(dot11QosEntry.AP_manualEDCA[VO].TXOPlimit), _SIZE(dot11QosEntry.AP_manualEDCA[VO].TXOPlimit), 102},
//{"ap_voq_txoplimit", INT_T, _OFFSET(dot11QosEntry.AP_manualEDCA[VO].TXOPlimit), _SIZE(dot11QosEntry.AP_manualEDCA[VO].TXOPlimit), (B band)?102:47},
{"tid0_mapping", BYTE_T, _OFFSET(dot11QosEntry.TID_mapping[0]), _SIZE(dot11QosEntry.TID_mapping[0]), BE_QUEUE},
{"tid1_mapping", BYTE_T, _OFFSET(dot11QosEntry.TID_mapping[1]), _SIZE(dot11QosEntry.TID_mapping[1]), BK_QUEUE},
{"tid2_mapping", BYTE_T, _OFFSET(dot11QosEntry.TID_mapping[2]), _SIZE(dot11QosEntry.TID_mapping[2]), BK_QUEUE},
{"tid3_mapping", BYTE_T, _OFFSET(dot11QosEntry.TID_mapping[3]), _SIZE(dot11QosEntry.TID_mapping[3]), BE_QUEUE},
{"tid4_mapping", BYTE_T, _OFFSET(dot11QosEntry.TID_mapping[4]), _SIZE(dot11QosEntry.TID_mapping[4]), VI_QUEUE},
{"tid5_mapping", BYTE_T, _OFFSET(dot11QosEntry.TID_mapping[5]), _SIZE(dot11QosEntry.TID_mapping[5]), VI_QUEUE},
{"tid6_mapping", BYTE_T, _OFFSET(dot11QosEntry.TID_mapping[6]), _SIZE(dot11QosEntry.TID_mapping[6]), VO_QUEUE},
{"tid7_mapping", BYTE_T, _OFFSET(dot11QosEntry.TID_mapping[7]), _SIZE(dot11QosEntry.TID_mapping[7]), VO_QUEUE},
#endif //RTL_MANUAL_EDCA
#endif //WIFI_WMM
#ifdef WIFI_SIMPLE_CONFIG
// struct WifiSimpleConfigEntry
{"wsc_enable", INT_T, _OFFSET(wscEntry.wsc_enable), _SIZE(wscEntry.wsc_enable), 0},
{"pin", PIN_IND_T, 0, 0},
/* WPS2DOTX */
/* support Assigned MAC Addr,Assigned SSID,dymanic change STA's PIN code, 2011-0505 */
{"wsc_mypin", WSC_SELF_PIN_IND_T, 0, 0},
{"wsc_specssid",WSC_SEPC_SSID_CONN_IND_T, 0, 0},
{"wsc_specmac", WSC_SEPC_MAC_CONN_IND_T, 0, 0},
/* WPS2DOTX */
#ifdef INCLUDE_WPS
#ifndef CONFIG_MSC
{"wsc_start2", WSC_IND_T, 0, 0},
{"wsc_end", WSC_IND_T, 0, 0},
{"wsc_soap_action", WSC_IND_T, 0, 0},
{"wps_led_control", WSC_IND_T, 0, 0},
{"wps_get_config", WSC_IND_T, 0, 0},
{"wps_debug", WSC_IND_T, 0, 0},
{"wps_reinit", WSC_IND_T, 0, 0},
#endif
#endif
#ifdef CONFIG_RTL_COMAPI_CFGFILE
{"wsc_start", WSC_START_IND_T, 0, 0},
{"wsc_mode", WSC_MODE_IND_T, 0, 0},
{"wsc_status", WSC_STATUS_IND_T, 0, 0},
{"wsc_method", WSC_METHOD_IND_T, 0, 0},
{"wsc_step", WSC_STEP_IND_T, 0, 0},
{"wsc_oob", WSC_OOB_IND_T, 0, 0},
#endif //CONFIG_RTL_COMAPI_CFGFILE
#endif
#ifdef GBWC
// struct GroupBandWidthControl
{"gbwcmode", INT_T, _OFFSET(gbwcEntry.GBWCMode), _SIZE(gbwcEntry.GBWCMode), 0},
{"gbwcnum", INT_T, _OFFSET(gbwcEntry.GBWCNum), _SIZE(gbwcEntry.GBWCNum), 0},
{"gbwcaddr", ACL_T, _OFFSET(gbwcEntry.GBWCAddr), _SIZE(gbwcEntry.GBWCAddr), 0},
{"gbwcthrd_tx", INT_T, _OFFSET(gbwcEntry.GBWCThrd_tx), _SIZE(gbwcEntry.GBWCThrd_tx), 30000},
{"gbwcthrd_rx", INT_T, _OFFSET(gbwcEntry.GBWCThrd_rx), _SIZE(gbwcEntry.GBWCThrd_rx), 30000},
#endif
// struct Dot11nConfigEntry
{"supportedmcs",INT_T, _OFFSET(dot11nConfigEntry.dot11nSupportedMCS), _SIZE(dot11nConfigEntry.dot11nSupportedMCS), 0xffff},
{"basicmcs", INT_T, _OFFSET(dot11nConfigEntry.dot11nBasicMCS), _SIZE(dot11nConfigEntry.dot11nBasicMCS), 0},
{"use40M", INT_T, _OFFSET(dot11nConfigEntry.dot11nUse40M), _SIZE(dot11nConfigEntry.dot11nUse40M), 0},
{"2ndchoffset", INT_T, _OFFSET(dot11nConfigEntry.dot11n2ndChOffset), _SIZE(dot11nConfigEntry.dot11n2ndChOffset), 1},
{"shortGI20M", INT_T, _OFFSET(dot11nConfigEntry.dot11nShortGIfor20M), _SIZE(dot11nConfigEntry.dot11nShortGIfor20M), 0},
{"shortGI40M", INT_T, _OFFSET(dot11nConfigEntry.dot11nShortGIfor40M), _SIZE(dot11nConfigEntry.dot11nShortGIfor40M), 0},
{"shortGI80M", INT_T, _OFFSET(dot11nConfigEntry.dot11nShortGIfor80M), _SIZE(dot11nConfigEntry.dot11nShortGIfor80M), 0},
{"stbc", INT_T, _OFFSET(dot11nConfigEntry.dot11nSTBC), _SIZE(dot11nConfigEntry.dot11nSTBC), 1},
#if defined(CONFIG_RTL8672) && defined(CONFIG_WLAN_HAL_8192EE)
{"ldpc", INT_T, _OFFSET(dot11nConfigEntry.dot11nLDPC), _SIZE(dot11nConfigEntry.dot11nLDPC), 0},
#else
{"ldpc", INT_T, _OFFSET(dot11nConfigEntry.dot11nLDPC), _SIZE(dot11nConfigEntry.dot11nLDPC), 1},
#endif
{"ampdu", INT_T, _OFFSET(dot11nConfigEntry.dot11nAMPDU), _SIZE(dot11nConfigEntry.dot11nAMPDU), 0},
{"amsdu", INT_T, _OFFSET(dot11nConfigEntry.dot11nAMSDU), _SIZE(dot11nConfigEntry.dot11nAMSDU), 0},
// for support SIGMA_TEST
{"addba_reject",INT_T, _OFFSET(dot11nConfigEntry.dot11nAddBAreject), _SIZE(dot11nConfigEntry.dot11nAddBAreject), 0},
{"ampduSndSz", INT_T, _OFFSET(dot11nConfigEntry.dot11nAMPDUSendSz), _SIZE(dot11nConfigEntry.dot11nAMPDUSendSz), 0},
#ifdef CONFIG_WLAN_HAL_8814AE
{"supportedvht",INT_T, _OFFSET(dot11acConfigEntry.dot11SupportedVHT), _SIZE(dot11acConfigEntry.dot11SupportedVHT), 0xffea},
#else
{"supportedvht",INT_T, _OFFSET(dot11acConfigEntry.dot11SupportedVHT), _SIZE(dot11acConfigEntry.dot11SupportedVHT), 0xfffa},
#endif
{"vht_txmap",INT_T, _OFFSET(dot11acConfigEntry.dot11VHT_TxMap), _SIZE(dot11acConfigEntry.dot11VHT_TxMap), 0x3fffffff},
#ifdef RX_BUFFER_GATHER
{"amsduMax", INT_T, _OFFSET(dot11nConfigEntry.dot11nAMSDURecvMax), _SIZE(dot11nConfigEntry.dot11nAMSDURecvMax), 1},
#else
#if defined(CONFIG_RTL8196B_GW_8M) || defined(CONFIG_RTL8196C_AP_ROOT) || defined(CONFIG_RTL_8198_AP_ROOT) || defined(CONFIG_RTL8196C_CLIENT_ONLY)
{"amsduMax", INT_T, _OFFSET(dot11nConfigEntry.dot11nAMSDURecvMax), _SIZE(dot11nConfigEntry.dot11nAMSDURecvMax), 0},
#else
{"amsduMax", INT_T, _OFFSET(dot11nConfigEntry.dot11nAMSDURecvMax), _SIZE(dot11nConfigEntry.dot11nAMSDURecvMax), 0},
#endif
#endif
{"amsduTimeout",INT_T, _OFFSET(dot11nConfigEntry.dot11nAMSDUSendTimeout), _SIZE(dot11nConfigEntry.dot11nAMSDUSendTimeout), 400}, /*in us*/
{"amsduNum", INT_T, _OFFSET(dot11nConfigEntry.dot11nAMSDUSendNum), _SIZE(dot11nConfigEntry.dot11nAMSDUSendNum), 15},
{"lgyEncRstrct",INT_T, _OFFSET(dot11nConfigEntry.dot11nLgyEncRstrct), _SIZE(dot11nConfigEntry.dot11nLgyEncRstrct), 15},
#ifdef WIFI_11N_2040_COEXIST
#ifdef CONFIG_SDIO_HCI
{"coexist", INT_T, _OFFSET(dot11nConfigEntry.dot11nCoexist), _SIZE(dot11nConfigEntry.dot11nCoexist), 1},
#else
{"coexist", INT_T, _OFFSET(dot11nConfigEntry.dot11nCoexist), _SIZE(dot11nConfigEntry.dot11nCoexist), 0},
{"coexist_ch_chk", INT_T, _OFFSET(dot11nConfigEntry.dot11nCoexist_ch_chk), _SIZE(dot11nConfigEntry.dot11nCoexist_ch_chk), 0},
#endif
{"bg_ap_rssi_chk_th", INT_T, _OFFSET(dot11nConfigEntry.dot11nBGAPRssiChkTh), _SIZE(dot11nConfigEntry.dot11nBGAPRssiChkTh), 20},
#endif
{"txnoack", INT_T, _OFFSET(dot11nConfigEntry.dot11nTxNoAck), _SIZE(dot11nConfigEntry.dot11nTxNoAck), 0},
// struct ReorderControlEntry
{"rc_enable", INT_T, _OFFSET(reorderCtrlEntry.ReorderCtrlEnable), _SIZE(reorderCtrlEntry.ReorderCtrlEnable), 1},
{"rc_winsz", INT_T, _OFFSET(reorderCtrlEntry.ReorderCtrlWinSz), _SIZE(reorderCtrlEntry.ReorderCtrlWinSz), RC_ENTRY_NUM},
{"rc_timeout", INT_T, _OFFSET(reorderCtrlEntry.ReorderCtrlTimeout), _SIZE(reorderCtrlEntry.ReorderCtrlTimeout), 30000}, /*in us*/
#ifdef CONFIG_RTK_VLAN_SUPPORT
// struct VlanConfig
{"global_vlan", INT_T, _OFFSET(vlan.global_vlan), _SIZE(vlan.global_vlan), 0},
{"is_lan", INT_T, _OFFSET(vlan.is_lan), _SIZE(vlan.is_lan), 1},
{"vlan_enable", INT_T, _OFFSET(vlan.vlan_enable), _SIZE(vlan.vlan_enable), 0},
{"vlan_tag", INT_T, _OFFSET(vlan.vlan_tag), _SIZE(vlan.vlan_tag), 0},
{"vlan_id", INT_T, _OFFSET(vlan.vlan_id), _SIZE(vlan.vlan_id), 0},
{"vlan_pri", INT_T, _OFFSET(vlan.vlan_pri), _SIZE(vlan.vlan_pri), 0},
{"vlan_cfi", INT_T, _OFFSET(vlan.vlan_cfi), _SIZE(vlan.vlan_cfi), 0},
#endif
#ifdef CONFIG_RTL_WAPI_SUPPORT
{"wapiType", INT_T, _OFFSET(wapiInfo.wapiType), _SIZE(wapiInfo.wapiType), 0},
#ifdef WAPI_SUPPORT_MULTI_ENCRYPT
{"wapiUCastEncodeType", INT_T, _OFFSET(wapiInfo.wapiUCastEncodeType), _SIZE(wapiInfo.wapiUCastEncodeType), 0},
{"wapiMCastEncodeType", INT_T, _OFFSET(wapiInfo.wapiMCastEncodeType), _SIZE(wapiInfo.wapiMCastEncodeType), 0},
#endif
{"wapiPsk", WAPI_KEY_T, _OFFSET(wapiInfo.wapiPsk), _SIZE(wapiInfo.wapiPsk), 0},
{"wapiPsklen", INT_T, _OFFSET(wapiInfo.wapiPsk.len), _SIZE(wapiInfo.wapiPsk.len), 0},
{"wapiUCastKeyType", INT_T, _OFFSET(wapiInfo.wapiUpdateUCastKeyType), _SIZE(wapiInfo.wapiUpdateUCastKeyType), 0},
{"wapiUCastKeyTimeout", INT_T, _OFFSET(wapiInfo.wapiUpdateUCastKeyTimeout), _SIZE(wapiInfo.wapiUpdateUCastKeyTimeout), 0},
{"wapiUCastKeyPktNum", INT_T, _OFFSET(wapiInfo.wapiUpdateUCastKeyPktNum), _SIZE(wapiInfo.wapiUpdateUCastKeyPktNum), 0},
{"wapiMCastKeyType", INT_T, _OFFSET(wapiInfo.wapiUpdateMCastKeyType), _SIZE(wapiInfo.wapiUpdateMCastKeyType), 0},
{"wapiMCastKeyTimeout", INT_T, _OFFSET(wapiInfo.wapiUpdateMCastKeyTimeout), _SIZE(wapiInfo.wapiUpdateMCastKeyTimeout), 0},
{"wapiMCastKeyPktNum", INT_T, _OFFSET(wapiInfo.wapiUpdateMCastKeyPktNum), _SIZE(wapiInfo.wapiUpdateMCastKeyPktNum), 0},
{"wapiTimeout", INT_ARRAY_T, _OFFSET(wapiInfo.wapiTimeout), _SIZE(wapiInfo.wapiTimeout), 0},
#endif
#ifdef DOT11D
{"countrycode", INT_T, _OFFSET(dot11dCountry.dot11CountryCodeSwitch), _SIZE(dot11dCountry.dot11CountryCodeSwitch), 1},
#endif
#if defined(DOT11D) || defined(DOT11H)
{"countrystr", STRING_T, _OFFSET(dot11dCountry.dot11CountryString), _SIZE(dot11dCountry.dot11CountryString), 0},
#endif
#ifdef SUPPORT_MULTI_PROFILE
{"ap_profile_enable", INT_T, _OFFSET(ap_profile.enable_profile), _SIZE(ap_profile.enable_profile), 0},
{"ap_profile_num", INT_T, _OFFSET(ap_profile.profile_num), _SIZE(ap_profile.profile_num), 0},
{"ap_profile_add", AP_PROFILE_T, _OFFSET(ap_profile), _SIZE(ap_profile), 0},
{"sortbyprofile", INT_T, _OFFSET(ap_profile.sortbyprofile), _SIZE(ap_profile.sortbyprofile), 0},
#endif
/* Hotspot 2.0 */
#ifdef HS2_SUPPORT
/* Release 1 */
{"cubeaconintval", INT_T, _OFFSET(hs2Entry.channel_utili_beaconIntval), _SIZE(hs2Entry.channel_utili_beaconIntval), 10},
{"timedtimintval", INT_T, _OFFSET(hs2Entry.timeadvt_DTIMIntval), _SIZE(hs2Entry.timeadvt_DTIMIntval), 1},
{"reqmode", INT_T, _OFFSET(hs2Entry.reqmode), _SIZE(hs2Entry.reqmode), 16},
{"distime", INT_T, _OFFSET(hs2Entry.disassoc_timer), _SIZE(hs2Entry.disassoc_timer), 10},
{"valintval", INT_T, _OFFSET(hs2Entry.validity_intval), _SIZE(hs2Entry.validity_intval), 0},
{"surl", STRING_T, _OFFSET(hs2Entry.session_url), _SIZE(hs2Entry.session_url), 0},
{"redir_mac", BYTE_ARRAY_T, _OFFSET(hs2Entry.redir_mac), _SIZE(hs2Entry.redir_mac), 0},
{"tsm_req", BYTE_ARRAY_T, _OFFSET(hs2Entry.sta_mac), _SIZE(hs2Entry.sta_mac), 0},
{"roam_enable", INT_T, _OFFSET(hs2Entry.roam_enable), _SIZE(hs2Entry.roam_enable), 1},
{"mmpdu_limit", INT_T, _OFFSET(hs2Entry.mmpdu_limit), _SIZE(hs2Entry.mmpdu_limit), 600},
{"ICMPv4ECHO", INT_T, _OFFSET(hs2Entry.ICMPv4ECHO), _SIZE(hs2Entry.ICMPv4ECHO), 2},
#ifdef HS2_DEBUGMSG
{"HS2_debug_info", INT_T, ((int)(long *)&(_HS2_debug_info)), sizeof(_HS2_debug_info), 1},
{"HS2_debug_err", INT_T, ((int)(long *)&(_HS2_debug_err)), sizeof(_HS2_debug_err), 1},
{"HS2_debug_trace", INT_T, ((int)(long *)&(_HS2_debug_trace)), sizeof(_HS2_debug_trace), 0},
{"HS2_debug_warn", INT_T, ((int)(long *)&(_HS2_debug_warn)), sizeof(_HS2_debug_warn), 0},
#endif
#endif //HS2_SUPPORT
#if defined(SWITCH_CHAN) && defined(UNIVERSAL_REPEATER)
{"switch_chan", SWITCH_CHAN_T, _OFFSET(dot11RFEntry.dot11channel), _SIZE(dot11RFEntry.dot11channel), 0},
#endif
#ifdef _DEBUG_RTL8192CD_
// debug flag
{"debug_err", DEBUG_T, 1, sizeof(rtl8192cd_debug_err), 0},
{"debug_info", DEBUG_T, 2, sizeof(rtl8192cd_debug_info), 0},
{"debug_trace", DEBUG_T, 3, sizeof(rtl8192cd_debug_trace), 0},
{"debug_warn", DEBUG_T, 4, sizeof(rtl8192cd_debug_warn), 0},
#endif
// for RF debug
{"ofdm_1ss_oneAnt", RFFT_T, _OFFSET_RFFT(ofdm_1ss_oneAnt), _SIZE_RFFT(ofdm_1ss_oneAnt), 0},// 1ss and ofdm rate using one ant
{"pathB_1T", RFFT_T, _OFFSET_RFFT(pathB_1T), _SIZE_RFFT(pathB_1T), 0},// using pathB as 1T2R/1T1R tx path
{"rssi_dump", RFFT_T, _OFFSET_RFFT(rssi_dump), _SIZE_RFFT(rssi_dump), 0},
{"rxfifoO", RFFT_T, _OFFSET_RFFT(rxfifoO), _SIZE_RFFT(rxfifoO), 0},
{"raGoDownUpper", RFFT_T, _OFFSET_RFFT(raGoDownUpper), _SIZE_RFFT(raGoDownUpper), 50},
{"raGoDown20MLower",RFFT_T, _OFFSET_RFFT(raGoDown20MLower), _SIZE_RFFT(raGoDown20MLower), 18},
{"raGoDown40MLower",RFFT_T, _OFFSET_RFFT(raGoDown40MLower), _SIZE_RFFT(raGoDown40MLower), 15},
{"raGoUpUpper", RFFT_T, _OFFSET_RFFT(raGoUpUpper), _SIZE_RFFT(raGoUpUpper), 55},
{"raGoUp20MLower", RFFT_T, _OFFSET_RFFT(raGoUp20MLower), _SIZE_RFFT(raGoUp20MLower), 23},
{"raGoUp40MLower", RFFT_T, _OFFSET_RFFT(raGoUp40MLower), _SIZE_RFFT(raGoUp40MLower), 20},
{"dig_enable", RFFT_T, _OFFSET_RFFT(dig_enable), _SIZE_RFFT(dig_enable), 1},
{"adaptivity_enable", RFFT_T, _OFFSET_RFFT(adaptivity_enable), _SIZE_RFFT(adaptivity_enable), 0},
{"nbi_filter_enable", RFFT_T, _OFFSET_RFFT(nbi_filter_enable), _SIZE_RFFT(nbi_filter_enable), 1},
{"dig_cov_enable", RFFT_T, _OFFSET_RFFT(dig_cov_enable), _SIZE_RFFT(dig_cov_enable), 0},
{"adap_debug", RFFT_T, _OFFSET_RFFT(adap_debug), _SIZE_RFFT(adap_debug), 0},
#ifdef INTERFERENCE_CONTROL
{"digGoLowerLevel", RFFT_T, _OFFSET_RFFT(digGoLowerLevel), _SIZE_RFFT(digGoLowerLevel), 30},
{"digGoUpperLevel", RFFT_T, _OFFSET_RFFT(digGoUpperLevel), _SIZE_RFFT(digGoUpperLevel), 35},
#else
{"digGoLowerLevel", RFFT_T, _OFFSET_RFFT(digGoLowerLevel), _SIZE_RFFT(digGoLowerLevel), 35},
{"digGoUpperLevel", RFFT_T, _OFFSET_RFFT(digGoUpperLevel), _SIZE_RFFT(digGoUpperLevel), 40},
#endif
{"dcThUpper", RFFT_T, _OFFSET_RFFT(dcThUpper), _SIZE_RFFT(dcThUpper), 30},
{"dcThLower", RFFT_T, _OFFSET_RFFT(dcThLower), _SIZE_RFFT(dcThLower), 25},
{"rssiTx20MUpper", RFFT_T, _OFFSET_RFFT(rssiTx20MUpper), _SIZE_RFFT(rssiTx20MUpper), 20},
{"rssiTx20MLower", RFFT_T, _OFFSET_RFFT(rssiTx20MLower), _SIZE_RFFT(rssiTx20MLower), 15},
{"rssi_expire_to", RFFT_T, _OFFSET_RFFT(rssi_expire_to), _SIZE_RFFT(rssi_expire_to), 60},
{"rts_init_rate", RFFT_T, _OFFSET_RFFT(rts_init_rate), _SIZE_RFFT(rts_init_rate), 0},
{"auto_rts_rate", RFFT_T, _OFFSET_RFFT(auto_rts_rate), _SIZE_RFFT(auto_rts_rate), 1},
{"cck_pwr_max", RFFT_T, _OFFSET_RFFT(cck_pwr_max), _SIZE_RFFT(cck_pwr_max), 0},
{"cck_tx_pathB", RFFT_T, _OFFSET_RFFT(cck_tx_pathB), _SIZE_RFFT(cck_tx_pathB), 0},
{"tx_pwr_ctrl", RFFT_T, _OFFSET_RFFT(tx_pwr_ctrl), _SIZE_RFFT(tx_pwr_ctrl), 1},
// 11n ap AES debug
{"aes_check_th", RFFT_T, _OFFSET_RFFT(aes_check_th), _SIZE_RFFT(aes_check_th), 2},
// Tx power tracking
{"tpt_period", RFFT_T, _OFFSET_RFFT(tpt_period), _SIZE_RFFT(tpt_period), 30},
// TXOP enlarge
{"txop_enlarge_upper", RFFT_T, _OFFSET_RFFT(txop_enlarge_upper), _SIZE_RFFT(txop_enlarge_upper), 20},
{"txop_enlarge_lower", RFFT_T, _OFFSET_RFFT(txop_enlarge_lower), _SIZE_RFFT(txop_enlarge_lower), 15},
#ifdef LOW_TP_TXOP
{"low_tp_txop", RFFT_T, _OFFSET_RFFT(low_tp_txop), _SIZE_RFFT(low_tp_txop), 1},
{"low_tp_txop_thd_n", RFFT_T, _OFFSET_RFFT(low_tp_txop_thd_n), _SIZE_RFFT(low_tp_txop_thd_n), 22},
{"low_tp_txop_thd_g", RFFT_T, _OFFSET_RFFT(low_tp_txop_thd_g), _SIZE_RFFT(low_tp_txop_thd_g), 17},
{"low_tp_txop_thd_low", RFFT_T, _OFFSET_RFFT(low_tp_txop_thd_low), _SIZE_RFFT(low_tp_txop_thd_low), 0},
{"low_tp_txop_delay", RFFT_T, _OFFSET_RFFT(low_tp_txop_delay), _SIZE_RFFT(low_tp_txop_delay), 1},
{"cwmax_enhance_thd", RFFT_T, _OFFSET_RFFT(cwmax_enhance_thd), _SIZE_RFFT(cwmax_enhance_thd), 2000},
#endif
// 2.3G support
{"frq_2_3G", RFFT_T, _OFFSET_RFFT(use_frq_2_3G), _SIZE_RFFT(use_frq_2_3G), 0},
// for mp test
#ifdef MP_TEST
{"mp_specific", RFFT_T, _OFFSET_RFFT(mp_specific), _SIZE_RFFT(mp_specific), 0},
#endif
#ifdef IGMP_FILTER_CMO
{"igmp_deny", RFFT_T, _OFFSET_RFFT(igmp_deny), _SIZE_RFFT(igmp_deny), 0},
#endif
//Support IP multicast->unicast
#ifdef SUPPORT_TX_MCAST2UNI
{"mc2u_disable", RFFT_T, _OFFSET_RFFT(mc2u_disable), _SIZE_RFFT(mc2u_disable), 0},
#ifdef CONFIG_RTL8672
{"mc2u_drop_unknown", RFFT_T, _OFFSET_RFFT(mc2u_drop_unknown), _SIZE_RFFT(mc2u_drop_unknown), 1},
#else
{"mc2u_drop_unknown", RFFT_T, _OFFSET_RFFT(mc2u_drop_unknown), _SIZE_RFFT(mc2u_drop_unknown), 0},
#endif
{"mc2u_flood_ctrl", RFFT_T, _OFFSET_RFFT(mc2u_flood_ctrl), _SIZE_RFFT(mc2u_flood_ctrl), 0},
{"mc2u_flood_mac_num", RFFT_T, _OFFSET_RFFT(mc2u_flood_mac_num), _SIZE_RFFT(mc2u_flood_mac_num), 0},
{"mc2u_flood_mac", RFFT_ACL_T, _OFFSET_RFFT(mc2u_flood_mac), _SIZE_RFFT(mc2u_flood_mac), 0},
#endif
#ifdef HIGH_POWER_EXT_PA
{"use_ext_pa", RFFT_T, _OFFSET_RFFT(use_ext_pa), _SIZE_RFFT(use_ext_pa), 0},
{"hp_ofdm_max", RFFT_T, _OFFSET_RFFT(hp_ofdm_pwr_max), _SIZE_RFFT(hp_ofdm_pwr_max), 63},
{"hp_cck_max", RFFT_T, _OFFSET_RFFT(hp_cck_pwr_max), _SIZE_RFFT(hp_cck_pwr_max), 63},
#endif
#if defined(CONFIG_RTL_NOISE_CONTROL) || defined(CONFIG_RTL_NOISE_CONTROL_92C)
{"dnc_enable", RFFT_T, _OFFSET_RFFT(dnc_enable), _SIZE_RFFT(dnc_enable), 1},
#endif
#if defined(WIFI_11N_2040_COEXIST_EXT)
{"bws_thd", RFFT_T, _OFFSET_RFFT(bws_Thd), _SIZE_RFFT(bws_Thd), 1000},
{"bws_enable", RFFT_T, _OFFSET_RFFT(bws_enable), _SIZE_RFFT(bws_enable), 1},
#endif
#ifdef HIGH_POWER_EXT_LNA
{"use_ext_lna", RFFT_T, _OFFSET_RFFT(use_ext_lna), _SIZE_RFFT(use_ext_lna), 0},
{"ext_lna_gain", RFFT_T, _OFFSET_RFFT(ext_lna_gain), _SIZE_RFFT(ext_lna_gain), 0},
#endif
{"ndsi_support", RFFT_T, _OFFSET_RFFT(NDSi_support), _SIZE_RFFT(NDSi_support), 0},
{"TH_L2H_ini", RFFT_T, _OFFSET_RFFT(TH_L2H_ini_backup), _SIZE_RFFT(TH_L2H_ini_backup), 0xf3},// 0xf3
{"TH_HL_diff", RFFT_T, _OFFSET_RFFT(TH_EDCCA_HL_diff), _SIZE_RFFT(TH_EDCCA_HL_diff), 7},//Adaptivity()
{"dcbackoff", RFFT_T, _OFFSET_RFFT(dcbackoff), _SIZE_RFFT(dcbackoff), 2},//Adaptivity()
#ifdef EN_EFUSE
{"use_efuse", INT_T, _OFFSET(efuseEntry.enable_efuse), _SIZE(efuseEntry.enable_efuse), 1},
#endif
#ifdef RF_MIMO_SWITCH
{"rf_mode", RFFT_T, _OFFSET_RFFT(rf_mode), _SIZE_RFFT(rf_mode), 2},
#endif
#ifdef PCIE_POWER_SAVING
{"ps", RFFT_T, _OFFSET_RFFT(power_save), _SIZE_RFFT(power_save), (/*L2_en|*/ L1_en|_1x1_en|offload_en|stop_dma_en)},
#if defined(RTL8676_WAKE_GPIO) && defined(WIFI_SIMPLE_CONFIG)
{"wps_led_active", RFFT_T, _OFFSET_RFFT(wps_led_active), _SIZE_RFFT(wps_led_active), 0},
#endif
#endif
#ifdef SW_ANT_SWITCH
{"antSw_enable", RFFT_T, _OFFSET_RFFT(antSw_enable), _SIZE_RFFT(antSw_enable), 1},
// {"antSw_dump", RFFT_T, _OFFSET_RFFT(antSw_dump), _SIZE_RFFT(antSw_dump), 0},
#endif
#ifdef HW_ANT_SWITCH
{"antHw_enable", RFFT_T, _OFFSET_RFFT(antHw_enable), _SIZE_RFFT(antHw_enable), 1},
#endif
#if defined(HW_ANT_SWITCH) || defined(SW_ANT_SWITCH)
{"antdump", RFFT_T, _OFFSET_RFFT(ant_dump), _SIZE_RFFT(ant_dump), 0},
{"antSw_select", RFFT_T, _OFFSET_RFFT(antSw_select), _SIZE_RFFT(antSw_select), 1},
#endif
#ifdef ADD_TX_POWER_BY_CMD
{"txPowerPlus_cck_1", RFFT_T, _OFFSET_RFFT(txPowerPlus_cck_1), _SIZE_RFFT(txPowerPlus_cck_1), 0x7f},
{"txPowerPlus_cck_2", RFFT_T, _OFFSET_RFFT(txPowerPlus_cck_2), _SIZE_RFFT(txPowerPlus_cck_2), 0x7f},
{"txPowerPlus_cck_5", RFFT_T, _OFFSET_RFFT(txPowerPlus_cck_5), _SIZE_RFFT(txPowerPlus_cck_5), 0x7f},
{"txPowerPlus_cck_11", RFFT_T, _OFFSET_RFFT(txPowerPlus_cck_11), _SIZE_RFFT(txPowerPlus_cck_11), 0x7f},
{"txPowerPlus_ofdm_6", RFFT_T, _OFFSET_RFFT(txPowerPlus_ofdm_6), _SIZE_RFFT(txPowerPlus_ofdm_6), 0x7f},
{"txPowerPlus_ofdm_9", RFFT_T, _OFFSET_RFFT(txPowerPlus_ofdm_9), _SIZE_RFFT(txPowerPlus_ofdm_9), 0x7f},
{"txPowerPlus_ofdm_12", RFFT_T, _OFFSET_RFFT(txPowerPlus_ofdm_12), _SIZE_RFFT(txPowerPlus_ofdm_12), 0x7f},
{"txPowerPlus_ofdm_18", RFFT_T, _OFFSET_RFFT(txPowerPlus_ofdm_18), _SIZE_RFFT(txPowerPlus_ofdm_18), 0x7f},
{"txPowerPlus_ofdm_24", RFFT_T, _OFFSET_RFFT(txPowerPlus_ofdm_24), _SIZE_RFFT(txPowerPlus_ofdm_24), 0x7f},
{"txPowerPlus_ofdm_36", RFFT_T, _OFFSET_RFFT(txPowerPlus_ofdm_36), _SIZE_RFFT(txPowerPlus_ofdm_36), 0x7f},
{"txPowerPlus_ofdm_48", RFFT_T, _OFFSET_RFFT(txPowerPlus_ofdm_48), _SIZE_RFFT(txPowerPlus_ofdm_48), 0x7f},
{"txPowerPlus_ofdm_54", RFFT_T, _OFFSET_RFFT(txPowerPlus_ofdm_54), _SIZE_RFFT(txPowerPlus_ofdm_54), 0x7f},
{"txPowerPlus_mcs_0", RFFT_T, _OFFSET_RFFT(txPowerPlus_mcs_0), _SIZE_RFFT(txPowerPlus_mcs_0), 0x7f},
{"txPowerPlus_mcs_1", RFFT_T, _OFFSET_RFFT(txPowerPlus_mcs_1), _SIZE_RFFT(txPowerPlus_mcs_1), 0x7f},
{"txPowerPlus_mcs_2", RFFT_T, _OFFSET_RFFT(txPowerPlus_mcs_2), _SIZE_RFFT(txPowerPlus_mcs_2), 0x7f},
{"txPowerPlus_mcs_3", RFFT_T, _OFFSET_RFFT(txPowerPlus_mcs_3), _SIZE_RFFT(txPowerPlus_mcs_3), 0x7f},
{"txPowerPlus_mcs_4", RFFT_T, _OFFSET_RFFT(txPowerPlus_mcs_4), _SIZE_RFFT(txPowerPlus_mcs_4), 0x7f},
{"txPowerPlus_mcs_5", RFFT_T, _OFFSET_RFFT(txPowerPlus_mcs_5), _SIZE_RFFT(txPowerPlus_mcs_5), 0x7f},
{"txPowerPlus_mcs_6", RFFT_T, _OFFSET_RFFT(txPowerPlus_mcs_6), _SIZE_RFFT(txPowerPlus_mcs_6), 0x7f},
{"txPowerPlus_mcs_7", RFFT_T, _OFFSET_RFFT(txPowerPlus_mcs_7), _SIZE_RFFT(txPowerPlus_mcs_7), 0x7f},
{"txPowerPlus_mcs_8", RFFT_T, _OFFSET_RFFT(txPowerPlus_mcs_8), _SIZE_RFFT(txPowerPlus_mcs_8), 0x7f},
{"txPowerPlus_mcs_9", RFFT_T, _OFFSET_RFFT(txPowerPlus_mcs_9), _SIZE_RFFT(txPowerPlus_mcs_9), 0x7f},
{"txPowerPlus_mcs_10", RFFT_T, _OFFSET_RFFT(txPowerPlus_mcs_10), _SIZE_RFFT(txPowerPlus_mcs_10), 0x7f},
{"txPowerPlus_mcs_11", RFFT_T, _OFFSET_RFFT(txPowerPlus_mcs_11), _SIZE_RFFT(txPowerPlus_mcs_11), 0x7f},
{"txPowerPlus_mcs_12", RFFT_T, _OFFSET_RFFT(txPowerPlus_mcs_12), _SIZE_RFFT(txPowerPlus_mcs_12), 0x7f},
{"txPowerPlus_mcs_13", RFFT_T, _OFFSET_RFFT(txPowerPlus_mcs_13), _SIZE_RFFT(txPowerPlus_mcs_13), 0x7f},
{"txPowerPlus_mcs_14", RFFT_T, _OFFSET_RFFT(txPowerPlus_mcs_14), _SIZE_RFFT(txPowerPlus_mcs_14), 0x7f},
{"txPowerPlus_mcs_15", RFFT_T, _OFFSET_RFFT(txPowerPlus_mcs_15), _SIZE_RFFT(txPowerPlus_mcs_15), 0x7f},
#endif
{"rootFwBeacon", RFFT_T, _OFFSET_RFFT(rootFwBeacon), _SIZE_RFFT(rootFwBeacon), 1},
{"ledBlinkingFreq", RFFT_T, _OFFSET_RFFT(ledBlinkingFreq), _SIZE_RFFT(ledBlinkingFreq), 1},
{"diffAmpduSz", RFFT_T, _OFFSET_RFFT(diffAmpduSz), _SIZE_RFFT(diffAmpduSz), 1},
{"1rcca", RFFT_T, _OFFSET_RFFT(one_path_cca), _SIZE_RFFT(one_path_cca), 0},
#ifdef CONFIG_1RCCA_RF_POWER_SAVING
{"1rcca_ps", RFFT_T, _OFFSET_RFFT(_1rcca_ps), _SIZE_RFFT(_1rcca_ps), 2},
{"1rcca_ps_rssi_thd", RFFT_T, _OFFSET_RFFT(_1rcca_ps_rssi_thd), _SIZE_RFFT(_1rcca_ps_rssi_thd), 30},
#endif
#if defined(CONFIG_RTL_COMAPI_CFGFILE) || defined(SDIO_2_PORT)
{"hwaddr", BYTE_ARRAY_T, _OFFSET(dot11OperationEntry.hwaddr), _SIZE(dot11OperationEntry.hwaddr), 0},
#endif
#ifdef CONFIG_IEEE80211W_CMD
{"pmf_sta_mac", BYTE_ARRAY_T, _OFFSET(dot11StationConfigEntry.deauth_mac), _SIZE(dot11StationConfigEntry.deauth_mac), 0},
#ifdef CONFIG_IEEE80211W_CLI
{"pmf_sa_mac", BYTE_ARRAY_T, _OFFSET(dot11StationConfigEntry.sa_req_mac), _SIZE(dot11StationConfigEntry.sa_req_mac), 0},
{"pmf_cli_test", BYTE_T, _OFFSET(dot11StationConfigEntry.pmf_cli_test), _SIZE(dot11StationConfigEntry.pmf_cli_test), 0},
#endif
{"pmftest", BYTE_T, _OFFSET(dot11StationConfigEntry.pmftest), _SIZE(dot11StationConfigEntry.pmftest), 0},
{"enableSHA256", BYTE_T, _OFFSET(dot1180211AuthEntry.dot11EnableSHA256), _SIZE(dot1180211AuthEntry.dot11EnableSHA256), 0},
{"dot11IEEE80211W", BYTE_T, _OFFSET(dot1180211AuthEntry.dot11IEEE80211W), _SIZE(dot1180211AuthEntry.dot11IEEE80211W), 0},
#endif
#ifdef CONFIG_RTL_COMAPI_CFGFILE
{"ssid2scan", SSID2SCAN_STRING_T, _OFFSET(dot11StationConfigEntry.dot11SSIDtoScan), _SIZE(dot11StationConfigEntry.dot11SSIDtoScan), 0},
#ifdef CONFIG_RTK_MESH
{"meshSilence", BYTE_T, _OFFSET(dot1180211sInfo.meshSilence), _SIZE(dot1180211sInfo.meshSilence), 0},
#endif
#endif
#ifdef DFS
{"dfsdbgmode", RFFT_T, _OFFSET_RFFT(dfsdbgmode), _SIZE_RFFT(dfsdbgmode), 0},
{"force_TP_mode", RFFT_T, _OFFSET_RFFT(dfs_force_TP_mode), _SIZE_RFFT(dfs_force_TP_mode), 0},
{"dfsdelayiqk", RFFT_T, _OFFSET_RFFT(dfsdelayiqk), _SIZE_RFFT(dfsdelayiqk), 1},
{"dfs_next_ch", RFFT_T, _OFFSET_RFFT(dfs_next_ch), _SIZE_RFFT(dfs_next_ch), 0},
{"det_off", RFFT_T, _OFFSET_RFFT(dfs_det_off), _SIZE_RFFT(dfs_det_off), 0},
#if defined(CONFIG_WLAN_HAL_8814AE)
{"radar_diff_on", RFFT_T, _OFFSET_RFFT(dfs_radar_diff_on), _SIZE_RFFT(dfs_radar_diff_on), 0},
{"radar_diff_print", RFFT_T, _OFFSET_RFFT(dfs_radar_diff_print), _SIZE_RFFT(dfs_radar_diff_print), 0},
{"print_hist_report", RFFT_T, _OFFSET_RFFT(dfs_print_hist_report), _SIZE_RFFT(dfs_print_hist_report), 0},
#endif
{"det_reset", RFFT_T, _OFFSET_RFFT(dfs_det_reset), _SIZE_RFFT(dfs_det_reset), 0},
{"fa_lower", RFFT_T, _OFFSET_RFFT(dfs_fa_cnt_lower), _SIZE_RFFT(dfs_fa_cnt_lower), 25},
{"fa_mid", RFFT_T, _OFFSET_RFFT(dfs_fa_cnt_mid), _SIZE_RFFT(dfs_fa_cnt_mid), 35},
{"fa_upper", RFFT_T, _OFFSET_RFFT(dfs_fa_cnt_upper), _SIZE_RFFT(dfs_fa_cnt_upper), 50},
{"fa_hist", RFFT_T, _OFFSET_RFFT(dfs_fa_hist), _SIZE_RFFT(dfs_fa_hist), 50},
{"fa_inc_ratio", RFFT_T, _OFFSET_RFFT(dfs_fa_cnt_inc_ratio), _SIZE_RFFT(dfs_fa_cnt_inc_ratio), 2},
{"crc32_lower", RFFT_T, _OFFSET_RFFT(dfs_crc32_cnt_lower), _SIZE_RFFT(dfs_crc32_cnt_lower), 10},
{"ratio_th", RFFT_T, _OFFSET_RFFT(dfs_fa_ratio_th), _SIZE_RFFT(dfs_fa_ratio_th), 15},
{"det_period", RFFT_T, _OFFSET_RFFT(dfs_det_period), _SIZE_RFFT(dfs_det_period), 20},
{"det_period_jp_w53", RFFT_T, _OFFSET_RFFT(dfs_det_period_jp_w53), _SIZE_RFFT(dfs_det_period_jp_w53), 15},
{"det_print", RFFT_T, _OFFSET_RFFT(dfs_det_print), _SIZE_RFFT(dfs_det_print), 0},
{"det_print1", RFFT_T, _OFFSET_RFFT(dfs_det_print1), _SIZE_RFFT(dfs_det_print1), 1},
{"det_print2", RFFT_T, _OFFSET_RFFT(dfs_det_print2), _SIZE_RFFT(dfs_det_print2), 0},
{"det_print3", RFFT_T, _OFFSET_RFFT(dfs_det_print3), _SIZE_RFFT(dfs_det_print3), 0},
{"det_print4", RFFT_T, _OFFSET_RFFT(dfs_det_print4), _SIZE_RFFT(dfs_det_print4), 0},
{"det_print_psd", RFFT_T, _OFFSET_RFFT(dfs_det_print_psd), _SIZE_RFFT(dfs_det_print_psd), 0},
{"pulse_print", RFFT_T, _OFFSET_RFFT(dfs_pulse_print), _SIZE_RFFT(dfs_pulse_print), 0},
{"hist_len", RFFT_T, _OFFSET_RFFT(dfs_det_hist_len), _SIZE_RFFT(dfs_det_hist_len), 5},
{"sum_th", RFFT_T, _OFFSET_RFFT(dfs_det_sum_th), _SIZE_RFFT(dfs_det_sum_th), 2},
{"flag_offset", RFFT_T, _OFFSET_RFFT(dfs_det_flag_offset), _SIZE_RFFT(dfs_det_flag_offset), 2},
{"DPT_FA_TH_upper", RFFT_T, _OFFSET_RFFT(dfs_dpt_fa_th_upper), _SIZE_RFFT(dfs_dpt_fa_th_upper), 1000},
{"DPT_FA_TH_lower", RFFT_T, _OFFSET_RFFT(dfs_dpt_fa_th_lower), _SIZE_RFFT(dfs_dpt_fa_th_lower), 80},
{"DPT_Pulse_TH_mid", RFFT_T, _OFFSET_RFFT(dfs_dpt_pulse_th_mid), _SIZE_RFFT(dfs_dpt_pulse_th_mid), 3},
{"DPT_Pulse_TH_lower", RFFT_T, _OFFSET_RFFT(dfs_dpt_pulse_th_lower), _SIZE_RFFT(dfs_dpt_pulse_th_lower), 1},
{"DPT_ST_L2H_max", RFFT_T, _OFFSET_RFFT(dfs_dpt_st_l2h_max), _SIZE_RFFT(dfs_dpt_st_l2h_max), 0x4e},
{"DPT_ST_L2H_min", RFFT_T, _OFFSET_RFFT(dfs_dpt_st_l2h_min), _SIZE_RFFT(dfs_dpt_st_l2h_min), 0x20},
{"DPT_ST_L2H_add", RFFT_T, _OFFSET_RFFT(dfs_dpt_st_l2h_add), _SIZE_RFFT(dfs_dpt_st_l2h_add), 0},
{"DPT_ST_L2H_idle_offset", RFFT_T, _OFFSET_RFFT(dfs_dpt_st_l2h_idle_offset), _SIZE_RFFT(dfs_dpt_st_l2h_idle_offset), 0},
{"DPT_ini_gain_th", RFFT_T, _OFFSET_RFFT(dpt_ini_gain_th), _SIZE_RFFT(dpt_ini_gain_th), 0x30},
{"pwdb_th", RFFT_T, _OFFSET_RFFT(dfs_pwdb_th), _SIZE_RFFT(dfs_pwdb_th), 0x08},
{"pwdb_scalar_factor", RFFT_T, _OFFSET_RFFT(dfs_pwdb_scalar_factor), _SIZE_RFFT(dfs_pwdb_scalar_factor), 12},
{"psd_pw_th", RFFT_T, _OFFSET_RFFT(dfs_psd_pw_th), _SIZE_RFFT(dfs_psd_pw_th), 65},
{"dfs_psd_idle_on", RFFT_T, _OFFSET_RFFT(dfs_psd_idle_on), _SIZE_RFFT(dfs_psd_idle_on), 0},
{"dfs_psd_TP_on", RFFT_T, _OFFSET_RFFT(dfs_psd_TP_on), _SIZE_RFFT(dfs_psd_TP_on), 0},
{"psd_skip_lookup_table", RFFT_T, _OFFSET_RFFT(psd_skip_lookup_table), _SIZE_RFFT(psd_skip_lookup_table), 0},
{"dfs_psd_delay", RFFT_T, _OFFSET_RFFT(dfs_psd_delay), _SIZE_RFFT(dfs_psd_delay), 30},
{"psd_fir_decay", RFFT_T, _OFFSET_RFFT(dfs_psd_fir_decay), _SIZE_RFFT(dfs_psd_fir_decay), 23},
{"skip_iqk", RFFT_T, _OFFSET_RFFT(dfs_skip_iqk), _SIZE_RFFT(dfs_skip_iqk), 0},
{"scan_inband", RFFT_T, _OFFSET_RFFT(dfs_scan_inband), _SIZE_RFFT(dfs_scan_inband), 0},
{"psd_op", RFFT_T, _OFFSET_RFFT(dfs_psd_op), _SIZE_RFFT(dfs_psd_op), 1},
{"psd_tp_th", RFFT_T, _OFFSET_RFFT(dfs_psd_tp_th), _SIZE_RFFT(dfs_psd_tp_th), 2},
{"pc0_th_idle_w53", RFFT_T, _OFFSET_RFFT(dfs_pc0_th_idle_w53), _SIZE_RFFT(dfs_pc0_th_idle_w53), 14},
{"pc0_th_idle_w56", RFFT_T, _OFFSET_RFFT(dfs_pc0_th_idle_w56), _SIZE_RFFT(dfs_pc0_th_idle_w56), 6},
{"max_sht_pusle_cnt_th",RFFT_T, _OFFSET_RFFT(dfs_max_sht_pusle_cnt_th), _SIZE_RFFT(dfs_max_sht_pusle_cnt_th), 5},
#endif
#ifdef SW_TX_QUEUE
{"swqh", RFFT_T, _OFFSET_RFFT(swq_en_highthd), _SIZE_RFFT(swq_en_highthd), 400},
{"swql", RFFT_T, _OFFSET_RFFT(swq_dis_lowthd), _SIZE_RFFT(swq_dis_lowthd), 80},
{"swqen", RFFT_T, _OFFSET_RFFT(swq_enable), _SIZE_RFFT(swq_enable), 1},
{"swqdbg", RFFT_T, _OFFSET_RFFT(swq_dbg), _SIZE_RFFT(swq_dbg), 0},
{"swqaggnum", RFFT_T, _OFFSET_RFFT(swq_aggnum), _SIZE_RFFT(swq_aggnum), 8},
{"thd1", RFFT_T, _OFFSET_RFFT(timeout_thd), _SIZE_RFFT(timeout_thd), 60},
{"thd2", RFFT_T, _OFFSET_RFFT(timeout_thd2), _SIZE_RFFT(timeout_thd2), 150},
{"thd3", RFFT_T, _OFFSET_RFFT(timeout_thd3), _SIZE_RFFT(timeout_thd3), 300},
#endif
#ifdef A4_STA
{"a4_enable", RFFT_T, _OFFSET_RFFT(a4_enable), _SIZE_RFFT(a4_enable), 1},
#endif
#ifdef RTL8192D_INT_PA
{"use_intpa92d", RFFT_T, _OFFSET_RFFT(use_intpa92d), _SIZE_RFFT(use_intpa92d), 0},
#endif
#ifdef CONFIG_WLAN_HAL_8881A
{"use_intpa8881A", RFFT_T, _OFFSET_RFFT(use_intpa8881A), _SIZE_RFFT(use_intpa8881A), 0},
#endif
{"pwr_by_rate", RFFT_T, _OFFSET_RFFT(pwr_by_rate), _SIZE_RFFT(pwr_by_rate), 0},
#ifdef _TRACKING_TABLE_FILE
{"pwr_track_file", RFFT_T, _OFFSET_RFFT(pwr_track_file), _SIZE_RFFT(pwr_track_file), 1},
#endif
#ifdef CONFIG_SDIO_HCI
{"disable_pwr_by_rate", RFFT_T, _OFFSET_RFFT(disable_pwr_by_rate), _SIZE_RFFT(disable_pwr_by_rate), 1},
#else
{"disable_pwr_by_rate", RFFT_T, _OFFSET_RFFT(disable_pwr_by_rate), _SIZE_RFFT(disable_pwr_by_rate), 0},
#endif
#ifdef TXPWR_LMT
#ifdef CONFIG_SDIO_HCI
{"disable_txpwrlmt", RFFT_T, _OFFSET_RFFT(disable_txpwrlmt), _SIZE_RFFT(disable_txpwrlmt), 1},
#else
{"disable_txpwrlmt", RFFT_T, _OFFSET_RFFT(disable_txpwrlmt), _SIZE_RFFT(disable_txpwrlmt), 0},
#endif
{"disable_txpwrlmt2path", RFFT_T, _OFFSET_RFFT(disable_txpwrlmt2path), _SIZE_RFFT(disable_txpwrlmt2path), 0},
#endif
#ifdef CONFIG_RTL_92D_DMDP
{"peerReinit", RFFT_T, _OFFSET_RFFT(peerReinit), _SIZE_RFFT(peerReinit), 0},
#endif
#ifdef CONFIG_SDIO_TX_FILTER_BY_PRI
{"tx_filter_enable", RFFT_T, _OFFSET_RFFT(tx_filter_enable), _SIZE_RFFT(tx_filter_enable), 1},
#endif
#ifdef WIFI_WMM
{"wifi_beq_iot", RFFT_T, _OFFSET_RFFT(wifi_beq_iot), _SIZE_RFFT(wifi_beq_iot), 0},
#endif
{"bcast_to_dzq", RFFT_T, _OFFSET_RFFT(bcast_to_dzq), _SIZE_RFFT(bcast_to_dzq), 0},
#ifdef TLN_STATS
{"stats_time_interval", RFFT_T, _OFFSET_RFFT(stats_time_interval), _SIZE_RFFT(stats_time_interval), 86400},
#endif
#ifdef TX_EARLY_MODE
{"em_enable", RFFT_T, _OFFSET_RFFT(em_enable), _SIZE_RFFT(em_enable), 1},
#endif
#ifdef CLIENT_MODE
{"sta_mode_ps", RFFT_T, _OFFSET_RFFT(sta_mode_ps), _SIZE_RFFT(sta_mode_ps), 0},
#endif
#ifdef CONFIG_RTL_WLAN_DOS_FILTER
{"dos_block_time", RFFT_T, _OFFSET_RFFT(dos_block_time), _SIZE_RFFT(dos_block_time), 20},
#endif
{"intel_tp", RFFT_T, _OFFSET_RFFT(intel_rtylmt_tp_margin), _SIZE_RFFT(intel_rtylmt_tp_margin), 125*1024}, /* unit: byte */
{"enable_macid_sleep", RFFT_T, _OFFSET_RFFT(enable_macid_sleep), _SIZE_RFFT(enable_macid_sleep), 1},
#ifdef CONFIG_RTL_88E_SUPPORT
{"disable_pkt_pause", RFFT_T, _OFFSET_RFFT(disable_pkt_pause), _SIZE_RFFT(disable_pkt_pause), 0},
{"disable_pkt_nolink", RFFT_T, _OFFSET_RFFT(disable_pkt_nolink), _SIZE_RFFT(disable_pkt_nolink), 0},
{"maxpktfail", RFFT_T, _OFFSET_RFFT(max_pkt_fail), _SIZE_RFFT(max_pkt_fail), 50},
{"minpktfail", RFFT_T, _OFFSET_RFFT(min_pkt_fail), _SIZE_RFFT(min_pkt_fail), 30},
#endif
{"low_tp_no_aggr", RFFT_T, _OFFSET_RFFT(low_tp_no_aggr), _SIZE_RFFT(low_tp_no_aggr), 0},
#if defined(TX_EARLY_MODE)
{"em_que_num", RFFT_T, _OFFSET_RFFT(em_que_num), _SIZE_RFFT(em_que_num), 10},
{"em_swq_thd_high", RFFT_T, _OFFSET_RFFT(em_swq_thd_high), _SIZE_RFFT(em_swq_thd_high), 70},
{"em_swq_thd_low", RFFT_T, _OFFSET_RFFT(em_swq_thd_low), _SIZE_RFFT(em_swq_thd_low), 60},
#endif
#ifdef CONFIG_TCP_ACK_TXAGG
{"tcpack_agg", RFFT_T, _OFFSET_RFFT(tcpack_agg), _SIZE_RFFT(tcpack_agg), 1},
#ifdef CONFIG_TCP_ACK_MERGE
{"tcpack_merge", RFFT_T, _OFFSET_RFFT(tcpack_merge), _SIZE_RFFT(tcpack_merge), 0},
#endif
#endif // CONFIG_TCP_ACK_TXAGG
#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)
{"low_traffic_xmit_thd", RFFT_T, _OFFSET_RFFT(low_traffic_xmit_thd), _SIZE_RFFT(low_traffic_xmit_thd), 20},
#endif
{"low_retry_rssi_thd", RFFT_T, _OFFSET_RFFT(low_retry_rssi_thd), _SIZE_RFFT(low_retry_rssi_thd), 30},
{"low_rate_low_retry", RFFT_T, _OFFSET_RFFT(low_rate_low_retry), _SIZE_RFFT(low_rate_low_retry), 1},
#ifdef RSSI_MIN_ADV_SEL
{"rssi_min_advsel", RFFT_T, _OFFSET_RFFT(rssi_min_advsel), _SIZE_RFFT(rssi_min_advsel), 1},
#endif
#ifdef BEAMFORMING_SUPPORT
{"sndperiod", RFFT_T, _OFFSET_RFFT(soundingPeriod), _SIZE_RFFT(soundingPeriod), 4000}, // 40ms
{"dumpcsi", RFFT_T, _OFFSET_RFFT(dumpcsi), _SIZE_RFFT(dumpcsi), 100}, // 100
{"sndenable", RFFT_T, _OFFSET_RFFT(soundingEnable), _SIZE_RFFT(soundingEnable), 1}, // enable
{"ndparate", RFFT_T, _OFFSET_RFFT(ndparate), _SIZE_RFFT(ndparate), 0},
{"ndpaaid", RFFT_T, _OFFSET_RFFT(ndpaaid), _SIZE_RFFT(ndpaaid), 0xff},
{"applyVmatrix", RFFT_T, _OFFSET_RFFT(applyVmatrix), _SIZE_RFFT(applyVmatrix), 1},
{"Nsnding3SS", RFFT_T, _OFFSET_RFFT(Nsnding3SS), _SIZE_RFFT(Nsnding3SS), 1},
#endif
#ifdef DOT11H
{"tpc_enable", BYTE_T, _OFFSET(dot11hTPCEntry.tpc_enable), _SIZE(dot11hTPCEntry.tpc_enable), 1},
{"tpc_tx_power", BYTE_T, _OFFSET(dot11hTPCEntry.tpc_tx_power), _SIZE(dot11hTPCEntry.tpc_tx_power), 12},
{"tpc_link_margin", BYTE_T, _OFFSET(dot11hTPCEntry.tpc_link_margin), _SIZE(dot11hTPCEntry.tpc_link_margin), 0}, // set 0 for AP
{"lpwrc", RFFT_T, _OFFSET_RFFT(lpwrc), _SIZE_RFFT(lpwrc), 0},
#if defined(CLIENT_MODE) || defined(CONFIG_RTK_MESH)
{"min_tx_power", BYTE_T, _OFFSET(dot11hTPCEntry.min_tx_power), _SIZE(dot11hTPCEntry.min_tx_power), 0},// for power capability ie
{"max_tx_power", BYTE_T, _OFFSET(dot11hTPCEntry.max_tx_power), _SIZE(dot11hTPCEntry.max_tx_power), 20},// for power capability ie
#endif
#endif
{"no_rtscts", RFFT_T, _OFFSET_RFFT(no_rtscts), _SIZE_RFFT(no_rtscts), 0},
#ifdef RTK_AC_SUPPORT
// operating mode notification
{"opm", RFFT_T, _OFFSET_RFFT(oper_mode_field), _SIZE_RFFT(oper_mode_field), 0x00},
{"opmtest", RFFT_T, _OFFSET_RFFT(opmtest), _SIZE_RFFT(opmtest), 0x00},
// channel switch
{"csa", RFFT_T, _OFFSET_RFFT(csa), _SIZE_RFFT(csa), 0x00},
{"lgirate", RFFT_T, _OFFSET_RFFT(lgirate), _SIZE_RFFT(lgirate), 0xffff},
{"cca_rts", RFFT_T, _OFFSET_RFFT(cca_rts), _SIZE_RFFT(cca_rts), 0x00}, // 1: static, 2: dynamic
// Tx Power Diff
{"pwrdiff_20BW1S_OFDM1T_A", BYTE_ARRAY_T, _OFFSET(dot11RFEntry.pwrdiff_20BW1S_OFDM1T_A), _SIZE(dot11RFEntry.pwrdiff_20BW1S_OFDM1T_A), 0},
{"pwrdiff_40BW2S_20BW2S_A", BYTE_ARRAY_T, _OFFSET(dot11RFEntry.pwrdiff_40BW2S_20BW2S_A), _SIZE(dot11RFEntry.pwrdiff_40BW2S_20BW2S_A), 0},
{"pwrdiff_5G_20BW1S_OFDM1T_A", BYTE_ARRAY_T, _OFFSET(dot11RFEntry.pwrdiff_5G_20BW1S_OFDM1T_A), _SIZE(dot11RFEntry.pwrdiff_5G_20BW1S_OFDM1T_A), 0},
{"pwrdiff_5G_40BW2S_20BW2S_A", BYTE_ARRAY_T, _OFFSET(dot11RFEntry.pwrdiff_5G_40BW2S_20BW2S_A), _SIZE(dot11RFEntry.pwrdiff_5G_40BW2S_20BW2S_A), 0},
{"pwrdiff_5G_80BW1S_160BW1S_A", BYTE_ARRAY_T, _OFFSET(dot11RFEntry.pwrdiff_5G_80BW1S_160BW1S_A), _SIZE(dot11RFEntry.pwrdiff_5G_80BW1S_160BW1S_A), 0},
{"pwrdiff_5G_80BW2S_160BW2S_A", BYTE_ARRAY_T, _OFFSET(dot11RFEntry.pwrdiff_5G_80BW2S_160BW2S_A), _SIZE(dot11RFEntry.pwrdiff_5G_80BW2S_160BW2S_A), 0},
{"pwrdiff_20BW1S_OFDM1T_B", BYTE_ARRAY_T, _OFFSET(dot11RFEntry.pwrdiff_20BW1S_OFDM1T_B), _SIZE(dot11RFEntry.pwrdiff_20BW1S_OFDM1T_B), 0},
{"pwrdiff_40BW2S_20BW2S_B", BYTE_ARRAY_T, _OFFSET(dot11RFEntry.pwrdiff_40BW2S_20BW2S_B), _SIZE(dot11RFEntry.pwrdiff_40BW2S_20BW2S_B), 0},
{"pwrdiff_5G_20BW1S_OFDM1T_B", BYTE_ARRAY_T, _OFFSET(dot11RFEntry.pwrdiff_5G_20BW1S_OFDM1T_B), _SIZE(dot11RFEntry.pwrdiff_5G_20BW1S_OFDM1T_B), 0},
{"pwrdiff_5G_40BW2S_20BW2S_B", BYTE_ARRAY_T, _OFFSET(dot11RFEntry.pwrdiff_5G_40BW2S_20BW2S_B), _SIZE(dot11RFEntry.pwrdiff_5G_40BW2S_20BW2S_B), 0},
{"pwrdiff_5G_80BW1S_160BW1S_B", BYTE_ARRAY_T, _OFFSET(dot11RFEntry.pwrdiff_5G_80BW1S_160BW1S_B), _SIZE(dot11RFEntry.pwrdiff_5G_80BW1S_160BW1S_B), 0},
{"pwrdiff_5G_80BW2S_160BW2S_B", BYTE_ARRAY_T, _OFFSET(dot11RFEntry.pwrdiff_5G_80BW2S_160BW2S_B), _SIZE(dot11RFEntry.pwrdiff_5G_80BW2S_160BW2S_B), 0},
#endif
{"txforce", RFFT_T, _OFFSET_RFFT(txforce), _SIZE_RFFT(txforce), 0xff},
{"sgiforce", RFFT_T, _OFFSET_RFFT(sgiforce), _SIZE_RFFT(sgiforce), 2},
#ifdef CONFIG_WLAN_HAL_8192EE
{"delay_8b4", RFFT_T, _OFFSET_RFFT(delay_8b4), _SIZE_RFFT(delay_8b4), 30},
{"thrd_8b4", RFFT_T, _OFFSET_RFFT(thrd_8b4), _SIZE_RFFT(thrd_8b4), 0x16},
{"loop_8b4", RFFT_T, _OFFSET_RFFT(loop_8b4), _SIZE_RFFT(loop_8b4), 50},
{"disable_ACPR", RFFT_T, _OFFSET_RFFT(disable_ACPR), _SIZE_RFFT(disable_ACPR), 1},
{"ldpc_92e", RFFT_T, _OFFSET_RFFT(ldpc_92e), _SIZE_RFFT(ldpc_92e), 0},
#endif
#ifdef RTK_NL80211
//mark_priv , for some parameter that not support in nl80211
{"rtk_ac_enable", RFFT_T, _OFFSET_RFFT(rtk_uci_AcEnable), _SIZE_RFFT(rtk_uci_AcEnable), 0},
// rtk_ac_enable = 0 or 1
{"rtk_priv_bw", RFFT_T,_OFFSET_RFFT(rtk_uci_PrivBandwidth), _SIZE_RFFT(rtk_uci_PrivBandwidth), 0},
// rtk_priv_bw = 5M , 10M ,80M ...
#endif
#ifdef AC2G_256QAM
{"ac2g_enable", RFFT_T, _OFFSET_RFFT(ac2g_enable), _SIZE_RFFT(ac2g_enable), 1},
{"ac2g_phy_type", RFFT_T, _OFFSET_RFFT(ac2g_phy_type), _SIZE_RFFT(ac2g_phy_type), 0},
{"ac2g_thd_ldpc", RFFT_T, _OFFSET_RFFT(ac2g_thd_ldpc), _SIZE_RFFT(ac2g_thd_ldpc), 35},
#endif
#ifdef CHECK_HANGUP
{"check_hang", RFFT_T, _OFFSET_RFFT(check_hang), _SIZE_RFFT(check_hang), 0xff},
#endif
#ifdef MCR_WIRELESS_EXTEND
{"mcr_ft", RFFT_T, _OFFSET_RFFT(mcr_ft), _SIZE_RFFT(mcr_ft), 1},
{"disable_ldpc_thd", RFFT_T, _OFFSET_RFFT(disable_ldpc_thd), _SIZE_RFFT(disable_ldpc_thd), 60},
#endif
{"auto_cipher", RFFT_T, _OFFSET_RFFT(auto_cipher), _SIZE_RFFT(auto_cipher), 0},
// {"mp_dig_enable", RFFT_T, _OFFSET_RFFT(mp_dig_enable), _OFFSET_RFFT(mp_dig_enable), 0},
#ifdef USE_OUT_SRC
{"odmrfpath", ODM_DM_1UT, _OFFSET_ODM_DM(RFPathRxEnable), _SIZE_ODM_DM(RFPathRxEnable), 0},// test for ODM DM (byte)
{"odmdebuglev", ODM_DM_4UT, _OFFSET_ODM_DM(DebugLevel), _SIZE_ODM_DM(DebugLevel), 0},// test for ODM DM (4byte)
{"odmdebugcom", ODM_DM_8UT, _OFFSET_ODM_DM(DebugComponents), _SIZE_ODM_DM(DebugComponents), 0},// test for ODM DM (long long)
{"TH_L2H_Ini", ODM_DM_1UT, _OFFSET_ODM_DM(TH_L2H_default), _SIZE_ODM_DM(TH_L2H_default), 0xf3},// for odm_Adaptivity()
{"TH_HL_Diff", ODM_DM_1UT, _OFFSET_ODM_DM(TH_EDCCA_HL_diff_default), _SIZE_ODM_DM(TH_EDCCA_HL_diff_default), 7},// for odm_Adaptivity()
{"TH_L2H_Ini_mode2", ODM_DM_1UT, _OFFSET_ODM_DM(TH_L2H_ini_mode2), _SIZE_ODM_DM(TH_L2H_ini_mode2), 20},// for odm_Adaptivity()
{"TH_HL_Diff_mode2", ODM_DM_1UT, _OFFSET_ODM_DM(TH_EDCCA_HL_diff_mode2), _SIZE_ODM_DM(TH_EDCCA_HL_diff_mode2), 8},// for odm_Adaptivity()
{"EDCCA_enable", ODM_DM_1UT, _OFFSET_ODM_DM(EDCCA_enable), _SIZE_ODM_DM(EDCCA_enable), 1},// for odm_Adaptivity()
{"DCbackoff", ODM_DM_1UT, _OFFSET_ODM_DM(DCbackoff), _SIZE_ODM_DM(DCbackoff), 2},// for odm_Adaptivity()
{"ada_IGI_upper", ODM_DM_1UT, _OFFSET_ODM_DM(Adaptivity_IGI_upper), _SIZE_ODM_DM(Adaptivity_IGI_upper), 0x0},// for odm_Adaptivity()
{"antdiv_rssi", ODM_DM_1UT, _OFFSET_ODM_DM(antdiv_rssi), _SIZE_ODM_DM(antdiv_rssi), 0},// for ODM_AntennaDiversity_92E()
{"antdiv_intvl", ODM_DM_1UT, _OFFSET_ODM_DM(antdiv_intvl), _SIZE_ODM_DM(antdiv_intvl), 0},
{"fat_comb_a", ODM_DM_1UT, _OFFSET_ODM_DM(fat_comb_a), _SIZE_ODM_DM(fat_comb_a), 0},
{"fat_comb_b", ODM_DM_1UT, _OFFSET_ODM_DM(fat_comb_b), _SIZE_ODM_DM(fat_comb_b), 0},
{"antdiv_period", ODM_DM_1UT, _OFFSET_ODM_DM(antdiv_period), _SIZE_ODM_DM(antdiv_period), 0},// for ODM_AntennaDiversity()
{"antdiv_select", ODM_DM_1UT, _OFFSET_ODM_DM(antdiv_select), _SIZE_ODM_DM(antdiv_select), 0},// for ODM_AntennaDiversity()
{"bdc_holdstate", ODM_DM_1UT, _OFFSET_ODM_DM(bdc_holdstate), _SIZE_ODM_DM(bdc_holdstate), 0},// for BDC algorithm {"dm_dig_max_TH", ODM_DM_1UT, _OFFSET_ODM_DM(dm_dig_max_TH), _SIZE_ODM_DM(dm_dig_max_TH), 0}, {"dm_dig_min_TH", ODM_DM_1UT, _OFFSET_ODM_DM(dm_dig_min_TH), _SIZE_ODM_DM(dm_dig_min_TH), 0},
{"dm_dig_max_TH", ODM_DM_1UT, _OFFSET_ODM_DM(dm_dig_max_TH), _SIZE_ODM_DM(dm_dig_max_TH), 0},
{"dm_dig_min_TH", ODM_DM_1UT, _OFFSET_ODM_DM(dm_dig_min_TH), _SIZE_ODM_DM(dm_dig_min_TH), 0},
{"Carrier_Sense_enable", ODM_DM_1UT, _OFFSET_ODM_DM(Carrier_Sense_enable), _SIZE_ODM_DM(Carrier_Sense_enable), 0},// for odm_Adaptivity()
{"print_agc", ODM_DM_1UT, _OFFSET_ODM_DM(print_agc), _SIZE_ODM_DM(print_agc), 0},
{"antdiv_evm_en", ODM_DM_1UT, _OFFSET_ODM_DM(antdiv_evm_en), _SIZE_ODM_DM(antdiv_evm_en), 0},
#endif
#ifdef CONFIG_WLAN_HAL_8881A
{"pwrtrk_TxAGC_enable", RFFT_T, _OFFSET_RFFT(pwrtrk_TxAGC_enable), _SIZE_RFFT(pwrtrk_TxAGC_enable), 1},
{"pwrtrk_TxAGC", RFFT_T, _OFFSET_RFFT(pwrtrk_TxAGC), _SIZE_RFFT(pwrtrk_TxAGC), 0},
#endif
#ifdef CONFIG_RTL_P2P_SUPPORT
{"p2p_type", INT_T, _OFFSET(p2p_mib.p2p_type), _SIZE(p2p_mib.p2p_type),0},
{"p2p_state", INT_T, _OFFSET(p2p_mib.p2p_state), _SIZE(p2p_mib.p2p_state),0},
{"p2p_on_discovery", INT_T, _OFFSET(p2p_mib.p2p_on_discovery), _SIZE(p2p_mib.p2p_type),0},
{"p2p_intent", BYTE_T, _OFFSET(p2p_mib.p2p_intent), _SIZE(p2p_mib.p2p_intent),0},
{"p2p_listen_channel",BYTE_T, _OFFSET(p2p_mib.p2p_listen_channel), _SIZE(p2p_mib.p2p_listen_channel),0},
{"p2p_op_channel", BYTE_T, _OFFSET(p2p_mib.p2p_op_channel), _SIZE(p2p_mib.p2p_op_channel),0},
{"p2p_event_indiate", BYTE_T, _OFFSET(p2p_mib.p2p_event_indiate), _SIZE(p2p_mib.p2p_event_indiate),0},
{"p2p_device_name", STRING_T, _OFFSET(p2p_mib.p2p_device_name), _SIZE(p2p_mib.p2p_device_name),0},
{"p2p_wsc_pin_code",STRING_T, _OFFSET(p2p_mib.p2p_wsc_pin_code), _SIZE(p2p_mib.p2p_wsc_pin_code),0},
{"p2p_wsc_config_method",INT_T, _OFFSET(p2p_mib.p2p_wsc_config_method),_SIZE(p2p_mib.p2p_wsc_config_method),0},
#endif
{"bcn_dont_ignore_edcca", RFFT_T, _OFFSET_RFFT(bcn_dont_ignore_edcca), _SIZE_RFFT(bcn_dont_ignore_edcca), 0},
};
#ifdef _DEBUG_RTL8192CD_
unsigned long rtl8192cd_debug_err=0xffffffff;
unsigned long rtl8192cd_debug_info=0;
unsigned long rtl8192cd_debug_trace=0;
unsigned long rtl8192cd_debug_warn=0;
#endif
#ifdef HS2_DEBUGMSG
unsigned int _HS2_debug_info=0; /* info flag */
unsigned int _HS2_debug_err=0; /* err flag */
unsigned int _HS2_debug_trace=0; /* trace flag */
unsigned int _HS2_debug_warn=0; /* warn flag */
#endif
#ifdef __ECOS
static sta_info_2_web sta_info[NUM_STAT + 1];
#endif
void MDL_DEVINIT set_mib_default_tbl(struct rtl8192cd_priv *priv)
{
int i;
int arg_num = sizeof(mib_table)/sizeof(struct iwpriv_arg);
for (i=0; i<arg_num; i++) {
if (mib_table[i].Default) {
if (mib_table[i].type == BYTE_T)
*(((unsigned char *)priv->pmib)+mib_table[i].offset) = (unsigned char)mib_table[i].Default;
else if (mib_table[i].type == INT_T)
memcpy(((unsigned char *)priv->pmib)+mib_table[i].offset, (unsigned char *)&mib_table[i].Default, sizeof(int));
#if defined(CONFIG_RTK_MESH)
else if (mib_table[i].type == WORD_T)
memcpy(((unsigned char *)priv->pmib)+mib_table[i].offset, (unsigned char *)&mib_table[i].Default, sizeof(unsigned short));
#endif //CONFIG_RTK_MESH
else if (mib_table[i].type == RFFT_T && mib_table[i].len == 1)
*(((unsigned char *)&(priv->pshare->rf_ft_var))+mib_table[i].offset) = (unsigned char)mib_table[i].Default;
else if (mib_table[i].type == RFFT_T && mib_table[i].len == 4)
memcpy(((unsigned char *)&(priv->pshare->rf_ft_var))+mib_table[i].offset, (unsigned char *)&mib_table[i].Default, sizeof(int));
#ifdef USE_OUT_SRC
else if (mib_table[i].type == ODM_DM_1UT && mib_table[i].len == 1)
*(((unsigned char *)&(priv->pshare->_dmODM))+mib_table[i].offset) = (unsigned char)mib_table[i].Default;
else if ((mib_table[i].type == ODM_DM_4UT && mib_table[i].len == 4))
memcpy(((unsigned char *)&(priv->pshare->_dmODM))+mib_table[i].offset, (unsigned char *)&mib_table[i].Default, sizeof(int));
#endif
else {
// We only give default value of types of BYTE_T and INT_T here.
// Some others are gave in set_mib_default().
}
}
}
}
int _convert_2_pwr_dot(char *s, int base)
{
int k = 0, i=0;
int flag = 0;
char *data = s;
k = 0;
while(s[i] && (s[i] == ' ' || s[i] == '\t'))
i++;
data = &s[i];
if (base == 10) {
while ((*data >= '0') && (*data <= '9')) {
flag = 1;
k = 10 * k + (*data - '0');
data++;
}
k = k*2;
if(*data == '.'){
flag = 1;
data++;
if(*data >= '5' && *data <= '9')
k++;
}
}
else
return 0;
if (!flag)
return -1;
return k;
}
int _atoi(char *s, int base)
{
int k = 0;
int sign = 1;
k = 0;
if (base == 10) {
if(*s== '-') {
sign = -1;
s++;
}
while (*s != '\0' && *s >= '0' && *s <= '9') {
k = 10 * k + (*s - '0');
s++;
}
k *= sign;
}
else {
while (*s != '\0') {
int v;
if ( *s >= '0' && *s <= '9')
v = *s - '0';
else if ( *s >= 'a' && *s <= 'f')
v = *s - 'a' + 10;
else if ( *s >= 'A' && *s <= 'F')
v = *s - 'A' + 10;
else {
_DEBUG_ERR("error hex format!\n");
#if 1//defined(CONFIG_RTL_8812_SUPPORT) || defined(CONFIG_RTL_88E_SUPPORT) || defined(CONFIG_WLAN_HAL_8192EE) //TXPWR_LMT_8812 TXPWR_LMT_88E
return k;
#else
return 0;
#endif
}
k = 16 * k + v;
s++;
}
}
return k;
}
#ifdef USE_OUT_SRC
unsigned long long _atoi_u8(char *s, int base)
{
unsigned long long k = 0;
int sign = 1;
k = 0;
if (base == 10) {
if(*s== '-') {
sign = -1;
s++;
}
while (*s != '\0' && *s >= '0' && *s <= '9') {
k = 10 * k + (*s - '0');
s++;
}
k *= sign;
}
else {
while (*s != '\0') {
int v;
if ( *s >= '0' && *s <= '9')
v = *s - '0';
else if ( *s >= 'a' && *s <= 'f')
v = *s - 'a' + 10;
else if ( *s >= 'A' && *s <= 'F')
v = *s - 'A' + 10;
else {
_DEBUG_ERR("error hex format!\n");
return 0;
}
k = 16 * k + v;
s++;
}
}
return k;
}
#endif
static struct iwpriv_arg *get_tbl_entry(char *pstr)
{
int i=0;
int arg_num = sizeof(mib_table)/sizeof(struct iwpriv_arg);
volatile char name[128];
while (*pstr && *pstr != '=')
name[i++] = *pstr++;
name[i] = '\0';
for (i=0; i<arg_num; i++) {
if (!strcmp((char *)name, mib_table[i].name)) {
return &mib_table[i];
}
}
return NULL;
}
int get_array_val(unsigned char *dst, char *src, int len)
{
char tmpbuf[4];
int num=0;
while (len > 0) {
memcpy(tmpbuf, src, 2);
tmpbuf[2]='\0';
*dst++ = (unsigned char)_atoi(tmpbuf, 16);
len-=2;
src+=2;
num++;
}
return num;
}
char *get_arg(char *src, char *val)
{
int len=0;
while (*src && *src!=',') {
*val++ = *src++;
len++;
}
if (len == 0)
return NULL;
*val = '\0';
if (*src==',')
src++;
return src;
}
#ifdef SUPPORT_MULTI_PROFILE
static int add_ap_profile(struct rtl8192cd_priv *priv, unsigned char *data)
{
char tmpbuf[100], *ptr;
struct ap_profile profile;
if (priv->pmib->ap_profile.profile_num >= PROFILE_NUM) {
panic_printk("Can't add new one because profile table is full!\n");
return -1;
}
if (data == NULL) {
panic_printk("invalid ap_profile_add value [%s] !\n", data);
return -1;
}
ptr = get_arg((char *)data, tmpbuf);
if (ptr == NULL || strlen(tmpbuf) == 0) {
panic_printk("SSID must be set!\n");
return -1;
}
strcpy(profile.ssid, tmpbuf);
ptr = get_arg(ptr, tmpbuf);
if (ptr == NULL) {
panic_printk("encryption must be set!\n");
return -1;
}
profile.encryption = _atoi(tmpbuf, 10);
if (profile.encryption > 4) {
panic_printk("Invalid encryption value!\n");
return -1;
}
ptr = get_arg(ptr, tmpbuf);
if (ptr == NULL) {
panic_printk("auth_type must be set!\n");
return -1;
}
profile.auth_type = _atoi(tmpbuf, 10);
if (profile.auth_type == 0)
goto copy_profile;
if (profile.encryption == 1 || profile.encryption == 2) {
ptr = get_arg(ptr, tmpbuf);
if (ptr == NULL) {
panic_printk("default wep tx key must be set!\n");
return -1;
}
profile.wep_default_key = _atoi(tmpbuf, 10);
ptr = get_arg(ptr, tmpbuf);
if (ptr == NULL) {
panic_printk("wep key1 must be set!\n");
return -1;
}
if (profile.encryption == 1 && strlen(tmpbuf) != 10) {
panic_printk("Invalid wep64 key1 value!\n");
return -1;
}
if (profile.encryption == 2 && strlen(tmpbuf) != 26) {
panic_printk("Invalid wep128 key1 value!\n");
return -1;
}
get_array_val(profile.wep_key1, tmpbuf, strlen(tmpbuf));
ptr = get_arg(ptr, tmpbuf);
if (ptr == NULL) {
panic_printk("wep key2 must be set!\n");
return -1;
}
if (profile.encryption == 1 && strlen(tmpbuf) != 10) {
panic_printk("Invalid wep64 key2 value!\n");
return -1;
}
if (profile.encryption == 2 && strlen(tmpbuf) != 26) {
panic_printk("Invalid wep128 key2 value!\n");
return -1;
}
get_array_val(profile.wep_key2, tmpbuf, strlen(tmpbuf));
ptr = get_arg(ptr, tmpbuf);
if (ptr == NULL) {
panic_printk("wep key3 must be set!\n");
return -1;
}
if (profile.encryption == 1 && strlen(tmpbuf) != 10) {
panic_printk("Invalid wep64 key3 value!\n");
return -1;
}
if (profile.encryption == 2 && strlen(tmpbuf) != 26) {
panic_printk("Invalid wep128 key3 value!\n");
return -1;
}
get_array_val(profile.wep_key3, tmpbuf, strlen(tmpbuf));
ptr = get_arg(ptr, tmpbuf);
if (ptr == NULL) {
panic_printk("wep key4 must be set!\n");
return -1;
}
if (profile.encryption == 1 && strlen(tmpbuf) != 10) {
panic_printk("Invalid wep64 key4 value!\n");
return -1;
}
if (profile.encryption == 2 && strlen(tmpbuf) != 26) {
panic_printk("Invalid wep128 key4 value!\n");
return -1;
}
get_array_val(profile.wep_key4, tmpbuf, strlen(tmpbuf));
}
else {
ptr = get_arg(ptr, tmpbuf);
if (ptr == NULL) {
panic_printk("wpa cipher must be set!\n");
return -1;
}
profile.wpa_cipher = _atoi(tmpbuf, 10);
ptr = get_arg(ptr, tmpbuf);
if (ptr == NULL || strlen(tmpbuf) == 0 || strlen(tmpbuf) < 8 || strlen(tmpbuf) > 64) {
panic_printk("Invalid wpa psk!\n");
return -1;
}
strcpy(profile.wpa_psk, tmpbuf);
#ifdef CONFIG_IEEE80211W_CLI
if((priv->wpa_global_info->rsnie_cap & BIT(6)) && (priv->wpa_global_info->rsnie_cap & BIT(7))){
PMFDEBUG("AP PMF capability = Required\n");
profile.bss_PMF = MGMT_FRAME_PROTECTION_REQUIRED ;
}
else if(priv->wpa_global_info->rsnie_cap & BIT(7)){
PMFDEBUG("AP PMF capability = MFPC\n");
profile.bss_PMF = MGMT_FRAME_PROTECTION_OPTIONAL ;
}
else{
PMFDEBUG("AP PMF capability = None\n");
profile.bss_PMF = NO_MGMT_FRAME_PROTECTION ;
}
#endif
}
copy_profile:
memset(&priv->pmib->ap_profile.profile[priv->pmib->ap_profile.profile_num], '\0', sizeof(profile));
memcpy(&priv->pmib->ap_profile.profile[priv->pmib->ap_profile.profile_num], &profile, sizeof(profile));
priv->pmib->ap_profile.profile_num++;
return 0;
}
#endif // SUPPORT_MULTI_PROFILE
#if defined(SWITCH_CHAN) && defined(UNIVERSAL_REPEATER)
/* switch channel
*
* iwpriv wlan0 set_mib switch_chan=1,N //switch channel to N
* iwpriv wlan0 set_mib switch_chan=0 //switch channel back to root channel
*/
static int switch_chan(struct rtl8192cd_priv *priv, unsigned char *data)
{
char tmpbuf[100], *ptr;
int mode, chan, i;
if (data == NULL) {
panic_printk("invalid switch_chan value [%s] !\n", data);
return -1;
}
if (!IS_ROOT_INTERFACE(priv)) {
panic_printk("Must issue command in root interface !\n");
return -1;
}
if (!(OPMODE & WIFI_AP_STATE)) {
panic_printk("root interface must be AP !\n");
return -1;
}
if (!IS_DRV_OPEN(GET_VXD_PRIV(priv))) {
panic_printk("vxd interface did not be started yet !\n");
return -1;
}
ptr = get_arg((char *)data, tmpbuf);
if (ptr == NULL) {
panic_printk("argument error, mode must be set !\n");
return -1;
}
mode =_atoi(tmpbuf, 10);
if (mode) { // switch to vxd chan
if (!priv->pmib->dot11RFEntry.dot11channel) {
panic_printk("channel is not stable in root interface !\n");
return -1;
}
ptr = get_arg((char *)ptr, tmpbuf);
if (ptr == NULL) {
panic_printk("argument error, channel number must be set !\n");
return -1;
}
chan =_atoi(tmpbuf, 10);
for (i=0; i<priv->available_chnl_num; i++) {
if (chan == priv->available_chnl[i])
break;
}
if (i == priv->available_chnl_num) {
panic_printk("invalid chan [%d] !\n", chan);
return -1;
}
priv->chan_backup = priv->pmib->dot11RFEntry.dot11channel;
priv->bw_backup = priv->pshare->CurrentChannelBW;
priv->offset_backup = priv->pshare->offset_2nd_chan;
priv->func_backup = priv->pmib->miscEntry.func_off;
priv->pshare->CurrentChannelBW = HT_CHANNEL_WIDTH_20;
priv->pshare->offset_2nd_chan = 0;
priv->pmib->dot11RFEntry.dot11channel = chan;
priv->pmib->miscEntry.func_off = 1;
}
else {
priv->pmib->dot11RFEntry.dot11channel = priv->chan_backup;
priv->pshare->CurrentChannelBW = priv->bw_backup;
priv->pshare->offset_2nd_chan = priv->offset_backup;
priv->pmib->miscEntry.func_off = priv->func_backup;
}
SwBWMode(priv, priv->pshare->CurrentChannelBW, priv->pshare->offset_2nd_chan);
SwChnl(priv, priv->pmib->dot11RFEntry.dot11channel, priv->pshare->offset_2nd_chan);
#ifdef CONFIG_RTL_92D_SUPPORT
if (GET_CHIP_VER(priv) == VERSION_8192D)
PHY_IQCalibrate(priv);
#endif
return 0;
}
#endif // SUPPORT_MULTI_PROFILE
#if (!defined(CONFIG_RTL_COMAPI_CFGFILE) && !defined(CONFIG_RTL_COMAPI_WLTOOLS) && !defined(INCLUDE_WPS))
static
#endif
int set_mib(struct rtl8192cd_priv *priv, unsigned char *data)
{
struct iwpriv_arg *entry;
int int_val, int_idx, len, *int_ptr;
int is_hex_type=0;
unsigned char byte_val;
#ifdef USE_OUT_SRC
unsigned short short_val;
unsigned long long longlong_val;
#endif
char *arg_val, tmpbuf[100];
#ifdef CONFIG_RTK_MESH
unsigned short word;
#endif
DEBUG_TRACE;
DEBUG_INFO("set_mib %s\n", data);
entry = get_tbl_entry((char *)data);
if (entry == NULL) {
DEBUG_ERR("invalid mib name [%s] !\n", data);
return -1;
}
// search value
arg_val = (char *)data;
while (*arg_val && *arg_val != '='){
arg_val++;
}
if (!*arg_val) {
DEBUG_ERR("mib value empty [%s] !\n", data);
return -1;
}
//printk("[%s %d] %c \n",__FUNCTION__,__LINE__ , *arg_val);
arg_val++;
// skip space
while (*arg_val && *arg_val == 0x7f)
arg_val++;
if(*arg_val=='0' && (*(arg_val+1)== 'x' || *(arg_val+1)== 'X')){
is_hex_type=1;
arg_val+=2;
printk("[%s %d]hex format\n",__FUNCTION__,__LINE__);
}
switch (entry->type) {
case BYTE_T:
byte_val = (unsigned char)_atoi(arg_val, 10);
memcpy(((unsigned char *)priv->pmib)+entry->offset, &byte_val, 1);
break;
#ifdef CONFIG_RTK_MESH
case WORD_T:
word = (unsigned short)_atoi(arg_val, 10);
memcpy(((unsigned char *)priv->pmib)+entry->offset, &word, 2);
break;
#endif
case INT_T:
if(is_hex_type)
int_val = _atoi(arg_val, 16);
else
int_val = _atoi(arg_val, 10);
#ifdef WIFI_SIMPLE_CONFIG
if (strcmp(entry->name, "wsc_enable") == 0) {
if (int_val == 4) { // disable hidden AP
if (HIDDEN_AP && priv->pbeacon_ssid) {
memcpy(priv->pbeacon_ssid+2, SSID, SSID_LEN);
priv->hidden_ap_mib_backup = HIDDEN_AP;
HIDDEN_AP = 0;
}
break;
}
if (int_val == 5) { // restore hidden AP
if (priv->pbeacon_ssid && !HIDDEN_AP && priv->hidden_ap_mib_backup) {
memset(priv->pbeacon_ssid+2, '\0', SSID_LEN);
HIDDEN_AP = priv->hidden_ap_mib_backup;
}
break;
}
#ifdef CLIENT_MODE
if ((priv->pmib->wscEntry.wsc_enable == 1) && (int_val == 0)) {
/*handle for WPS client mode fail or timeout*/
if (priv->recover_join_req) {
priv->recover_join_req = 0;
priv->pmib->wscEntry.wsc_enable = 0;
memcpy(&priv->pmib->dot11Bss, &priv->dot11Bss_original, sizeof(struct bss_desc));
SSID_LEN = priv->orig_SSID_LEN ;
memset(SSID,'\0',sizeof(SSID));
memcpy(SSID , priv->orig_SSID , SSID_LEN);
SSID2SCAN_LEN = priv->orig_SSID_LEN;
memset(SSID2SCAN,'\0',sizeof(SSID2SCAN));
memcpy(SSID2SCAN ,priv->orig_SSID , SSID2SCAN_LEN);
//memset(BSSID, 0, MACADDRLEN);
if (netif_running(priv->dev))
{
SMP_UNLOCK(flags);
rtl8192cd_close(priv->dev);
rtl8192cd_open(priv->dev);
SMP_LOCK(flags);
}
break;
}
}
else if ((priv->pmib->wscEntry.wsc_enable == 6) && (int_val == 0)) {
/*handle for WPS client mode success;(don't do wlan driver close open)*/
priv->pmib->wscEntry.wsc_enable = 0;
}
else if ((priv->pmib->wscEntry.wsc_enable == 0) && (int_val == 1)){
/*before start of client WPS backup some info for later restroe*/
memcpy(&priv->dot11Bss_original, &priv->pmib->dot11Bss, sizeof(struct bss_desc));
memset(priv->orig_SSID,'\0',sizeof(priv->orig_SSID));
memcpy(priv->orig_SSID , SSID , SSID_LEN);
priv->orig_SSID_LEN = SSID_LEN;
/*fixed for IOT issue */
if((OPMODE&(WIFI_STATION_STATE | WIFI_AUTH_SUCCESS | WIFI_ASOC_STATE))
==(WIFI_STATION_STATE | WIFI_AUTH_SUCCESS | WIFI_ASOC_STATE))
{
/*if client mode is associated set recover_join_req;
then when wsc immediately be cancelled client will recover orig assoc*/
priv->recover_join_req = 1;
issue_disassoc(priv, BSSID, _RSON_DEAUTH_STA_LEAVING_);
OPMODE_VAL(OPMODE & ~(WIFI_AUTH_SUCCESS | WIFI_ASOC_STATE));
}
}
#endif
}
#endif
memcpy(((unsigned char *)priv->pmib)+entry->offset, (unsigned char *)&int_val, sizeof(int));
#ifdef CONFIG_POWER_SAVE
if (strcmp(entry->name, "ps_level") == 0)
{
if (int_val < 0 || int_val > 2) {
DEBUG_ERR("invalid INT_T mib index [%s, %d] !\n", entry->name, int_val);
return -1;
}
if (IS_ROOT_INTERFACE(priv)) {
if (int_val == 0)
ap_offload_deactivate(priv, OFFLOAD_PROHIBIT_USER);
else if (int_val == 2)
ap_offload_activate(priv, OFFLOAD_PROHIBIT_USER);
}
}
else if (!strcmp(entry->name, "ps_sleep_time"))
{
if (int_val < 0 || int_val > 100) {
DEBUG_ERR("invalid INT_T mib index [%s, %d] !\n", entry->name, int_val);
return -1;
}
if (IS_ROOT_INTERFACE(priv) && IS_DRV_OPEN(priv)) {
if ((RTW_STS_SUSPEND == priv->pshare->pwr_state)
|| (priv->pshare->offload_function_ctrl > RTW_PM_PREPROCESS)
)
{
ap_offload_exit(GET_ROOT(priv));
rtw_lock_suspend_timeout(priv, 2000);
}
}
}
#endif
break;
case SSID_STRING_T:
if (strlen(arg_val) > entry->len)
arg_val[entry->len] = '\0';
memset(priv->pmib->dot11StationConfigEntry.dot11DesiredSSID, 0, sizeof(priv->pmib->dot11StationConfigEntry.dot11DesiredSSID));
memcpy(priv->pmib->dot11StationConfigEntry.dot11DesiredSSID, arg_val, strlen(arg_val));
priv->pmib->dot11StationConfigEntry.dot11DesiredSSIDLen = strlen(arg_val);
if ((SSID_LEN == 3) &&
((SSID[0] == 'A') || (SSID[0] == 'a')) &&
((SSID[1] == 'N') || (SSID[1] == 'n')) &&
((SSID[2] == 'Y') || (SSID[2] == 'y'))) {
SSID2SCAN_LEN = 0;
memset(SSID2SCAN, 0, 32);
}
else {
SSID2SCAN_LEN = SSID_LEN;
memcpy(SSID2SCAN, SSID, SSID_LEN);
}
break;
case BYTE_ARRAY_T:
len = strlen(arg_val);
if (len/2 > entry->len) {
DEBUG_ERR("invalid len of BYTE_ARRAY_T mib [%s] !\n", entry->name);
return -1;
}
if (len%2) {
DEBUG_ERR("invalid len of BYTE_ARRAY_T mib [%s] !\n", entry->name);
return -1;
}
get_array_val(((unsigned char *)priv->pmib)+entry->offset, arg_val, strlen(arg_val));
break;
case ACL_T:
case ACL_INT_T:
arg_val = get_arg(arg_val, tmpbuf);
if (arg_val == NULL) {
DEBUG_ERR("invalid ACL_T addr [%s] !\n", entry->name);
return -1;
}
if (entry->type == ACL_T && strlen(tmpbuf)!=12) {
DEBUG_ERR("invalid len of ACL_T mib [%s] !\n", entry->name);
return -1;
}
int_ptr = (int *)(((unsigned char *)priv->pmib)+entry->offset+entry->len);
int_idx = *int_ptr;
if (entry->type == ACL_T) {
if (int_idx < (entry->len/6))
get_array_val(((unsigned char *)priv->pmib)+entry->offset+int_idx*6, tmpbuf, 12);
else {
DEBUG_ERR("reach the max capacity of ACL_T mib [%s] !\n", entry->name);
return -1;
}
} else {
if (int_idx < (entry->len/10)) {
get_array_val(((unsigned char *)priv->pmib)+entry->offset+int_idx*(6+4), tmpbuf, 12);
if (strlen(arg_val) > 0) {
int_val = _atoi(arg_val, 10);
memcpy(((unsigned char *)priv->pmib)+entry->offset+int_idx*(6+4)+6, &int_val, 4);
}
} else {
DEBUG_ERR("reach the max capacity of ACL_INT_T mib [%s] !\n", entry->name);
return -1;
}
}
*int_ptr = *int_ptr + 1;
break;
case IDX_BYTE_ARRAY_T:
arg_val = get_arg(arg_val, tmpbuf);
if (arg_val == NULL) {
DEBUG_ERR("invalid BYTE_ARRAY mib [%s] !\n", entry->name);
return -1;
}
int_idx = _atoi(tmpbuf, 10);
if (int_idx+1 > entry->len) {
DEBUG_ERR("invalid BYTE_ARRAY mib index [%s, %d] !\n", entry->name, int_idx);
return -1;
}
arg_val = get_arg(arg_val, tmpbuf);
if (arg_val == NULL) {
DEBUG_ERR("invalid BYTE_ARRAY mib [%s] !\n", entry->name);
return -1;
}
byte_val = (unsigned char)_atoi(tmpbuf, 10);
memcpy(((unsigned char *)priv->pmib)+entry->offset+int_idx, (unsigned char *)&byte_val, sizeof(byte_val));
break;
case MULTI_BYTE_T:
int_idx=0;
while (1) {
arg_val = get_arg(arg_val, tmpbuf);
if (arg_val == NULL)
break;
if (int_idx+1 > entry->len) {
DEBUG_ERR("invalid MULTI_BYTE_T mib index [%s, %d] !\n", entry->name, int_idx);
return -1;
}
byte_val = (unsigned char)_atoi(tmpbuf, 16);
memcpy(((unsigned char *)priv->pmib)+entry->offset+int_idx++, (unsigned char *)&byte_val, sizeof(byte_val));
}
// copy length to next parameter
memcpy( ((unsigned char *)priv->pmib)+entry->offset+entry->len, (unsigned char *)&int_idx, sizeof(int));
break;
#ifdef _DEBUG_RTL8192CD_
case DEBUG_T:
int_val = _atoi(arg_val, 16);
if (entry->offset==1)
rtl8192cd_debug_err = int_val;
else if (entry->offset==2)
rtl8192cd_debug_info = int_val;
else if (entry->offset==3)
rtl8192cd_debug_trace = int_val;
else if (entry->offset==4)
rtl8192cd_debug_warn = int_val;
else {
DEBUG_ERR("invalid debug index\n");
}
break;
#endif // _DEBUG_RTL8192CD_
case DEF_SSID_STRING_T:
if (strlen(arg_val) > entry->len)
arg_val[entry->len] = '\0';
memset(priv->pmib->dot11StationConfigEntry.dot11DefaultSSID, 0, sizeof(priv->pmib->dot11StationConfigEntry.dot11DefaultSSID));
memcpy(priv->pmib->dot11StationConfigEntry.dot11DefaultSSID, arg_val, strlen(arg_val));
priv->pmib->dot11StationConfigEntry.dot11DefaultSSIDLen = strlen(arg_val);
break;
#ifdef CONFIG_RTL_COMAPI_CFGFILE
case SSID2SCAN_STRING_T:
if (strlen(arg_val) > entry->len)
arg_val[entry->len] = '\0';
memset(priv->pmib->dot11StationConfigEntry.dot11SSIDtoScan, 0, sizeof(priv->pmib->dot11StationConfigEntry.dot11SSIDtoScan));
memcpy(priv->pmib->dot11StationConfigEntry.dot11SSIDtoScan, arg_val, strlen(arg_val));
priv->pmib->dot11StationConfigEntry.dot11SSIDtoScanLen = strlen(arg_val);
break;
#endif
case STRING_T:
if (strlen(arg_val) >= entry->len)
arg_val[entry->len-1] = '\0';
strcpy((char *)(((unsigned char *)priv->pmib)+entry->offset), arg_val);
break;
case RFFT_T:
if (entry->len == 1) {
byte_val = _atoi(arg_val, 10);
memcpy(((unsigned char *)&priv->pshare->rf_ft_var)+entry->offset, (unsigned char *)&byte_val, entry->len);
#ifdef DFS
if ((strcmp(entry->name, "dfsdbgmode") == 0) && (byte_val)) {
if (priv->pmib->dot11StationConfigEntry.dot11RegDomain == DOMAIN_ETSI) {
if (GET_CHIP_VER(priv) == VERSION_8192D) {
PHY_SetBBReg(priv, 0x90c, bMaskDWord, 0x83321333);
PHY_SetBBReg(priv, 0xe10, bMaskDWord, 0x30303030);
PHY_SetBBReg(priv, 0x83c, bMaskDWord, 0x30303030);
}
else if ((GET_CHIP_VER(priv) == VERSION_8812E) || (GET_CHIP_VER(priv) == VERSION_8881A))
PHY_SetBBReg(priv, 0x80c, BIT(28), 1);
}
if (GET_CHIP_VER(priv) == VERSION_8192D) {
PHY_SetBBReg(priv, 0xc7c, BIT(28), 0); // ynlin dbg
PHY_SetBBReg(priv, 0xcdc, BIT(8)|BIT(9), 1);
}
}
else if ((strcmp(entry->name, "det_reset") == 0) && (byte_val)) {
priv->pmib->dot11DFSEntry.DFS_detected = 0;
priv->FA_count_pre = 0;
priv->VHT_CRC_ok_cnt_pre = 0;
priv->HT_CRC_ok_cnt_pre = 0;
priv->LEG_CRC_ok_cnt_pre = 0;
priv->mask_idx = 0;
priv->mask_hist_checked = 0;
memset(priv->radar_det_mask_hist, 0, sizeof(priv->radar_det_mask_hist));
memset(priv->pulse_flag_hist, 0, sizeof(priv->pulse_flag_hist));
}
#endif
} else if (entry->len == 4) {
int_val = _atoi(arg_val, 10);
memcpy(((unsigned char *)&priv->pshare->rf_ft_var)+entry->offset, (unsigned char *)&int_val, entry->len);
}
#ifdef RTK_NL80211//mark_priv
else
{
if (strlen(arg_val) > entry->len)
arg_val[entry->len] = '\0';
strcpy(((char *)&priv->pshare->rf_ft_var)+entry->offset ,arg_val);
}
#endif
break;
case RFFT_ACL_T:
arg_val = get_arg(arg_val, tmpbuf);
if (arg_val == NULL) {
DEBUG_ERR("invalid RFFT_ACL_T addr [%s] !\n", entry->name);
return -1;
}
if (strlen(tmpbuf)!=12) {
DEBUG_ERR("invalid len of RFFT_ACL_T mib [%s] !\n", entry->name);
return -1;
}
int_ptr = (int *)(((unsigned char *)&priv->pshare->rf_ft_var)+entry->offset+entry->len);
int_idx = *int_ptr;
get_array_val(((unsigned char *)&priv->pshare->rf_ft_var)+entry->offset+int_idx*6, tmpbuf, 12);
*int_ptr = *int_ptr + 1;
break;
case VARLEN_BYTE_T:
len = strlen(arg_val);
if (len/2 > entry->len) {
DEBUG_ERR("invalid len of VARLEN_BYTE_T mib [%s] !\n", entry->name);
return -1;
}
if (len%2) {
DEBUG_ERR("invalid len of VARLEN_BYTE_T mib [%s] !\n", entry->name);
return -1;
}
memset(((unsigned char *)priv->pmib)+entry->offset, 0, entry->len);
len = get_array_val(((unsigned char *)priv->pmib)+entry->offset, arg_val, strlen(arg_val));
*(unsigned int *)(((unsigned char *)priv->pmib)+entry->offset+entry->len) = len;
break;
#ifdef WIFI_SIMPLE_CONFIG
case PIN_IND_T:
if (strlen(arg_val) > entry->len) {
#ifdef INCLUDE_WPS
//include-wps case
//upnp will direct function call to wps_pin(arg_val);
//printk("set_mib:PIN=%s\n",arg_val);
wps_pin(arg_val);
#else
DOT11_WSC_PIN_IND wsc_ind;
wsc_ind.EventId = DOT11_EVENT_WSC_PIN_IND;
wsc_ind.IsMoreEvent = 0;
strcpy((char *)wsc_ind.code, arg_val);
DOT11_EnQueue((unsigned long)priv, priv->pevent_queue, (unsigned char*)&wsc_ind, sizeof(DOT11_WSC_PIN_IND));
event_indicate(priv, NULL, -1);
#endif
}
break;
/* WPS2DOTX */
/* support Assigned MAC Addr,Assigned SSID,dymanic change STA's PIN code, 2011-0505 */
case WSC_SELF_PIN_IND_T:
if (strlen(arg_val) > entry->len) {
DOT11_WSC_PIN_IND wsc_ind;
wsc_ind.EventId = DOT11_EVENT_WSC_SET_MY_PIN;
wsc_ind.IsMoreEvent = 0;
strcpy((char *)wsc_ind.code, arg_val);
DOT11_EnQueue((unsigned long)priv, priv->pevent_queue, (unsigned char*)&wsc_ind, sizeof(DOT11_WSC_PIN_IND));
event_indicate(priv, NULL, -1);
}
break;
case WSC_SEPC_SSID_CONN_IND_T:
if (strlen(arg_val) > entry->len) {
DOT11_WSC_PIN_IND wsc_ind;
wsc_ind.EventId = DOT11_EVENT_WSC_SPEC_SSID;
wsc_ind.IsMoreEvent = 0;
strcpy((char *)wsc_ind.code, arg_val);
DOT11_EnQueue((unsigned long)priv, priv->pevent_queue, (unsigned char*)&wsc_ind, sizeof(DOT11_WSC_PIN_IND));
event_indicate(priv, NULL, -1);
}
break;
case WSC_SEPC_MAC_CONN_IND_T:
if (strlen(arg_val) > entry->len) {
DOT11_WSC_PIN_IND wsc_ind;
wsc_ind.EventId = DOT11_EVENT_WSC_SPEC_MAC_IND;
wsc_ind.IsMoreEvent = 0;
strcpy((char *)wsc_ind.code, arg_val);
DOT11_EnQueue((unsigned long)priv, priv->pevent_queue, (unsigned char*)&wsc_ind, sizeof(DOT11_WSC_PIN_IND));
event_indicate(priv, NULL, -1);
}
break;
/* support Assigned MAC Addr,Assigned SSID,dymanic change STA's PIN code, 2011-0505 */
/* WPS2DOTX */
#ifdef INCLUDE_WPS
#ifndef CONFIG_MSC
case WSC_IND_T:
/*event notify user space upnp ,call by wps "*/
if (strcmp(entry->name, "wps_get_config") == 0) {
printk("sme rx wps_get_config cmd\n");
DOT11_WSC_PIN_IND wsc_ind;
wsc_ind.EventId = DOT11_EVENT_WSC_GETCONF_IND;
wsc_ind.IsMoreEvent = 0;
strcpy(wsc_ind.code,arg_val);
DOT11_EnQueue((unsigned long)priv, priv->pevent_queue, (unsigned char*)&wsc_ind, sizeof(DOT11_WSC_PIN_IND));
event_indicate(priv, NULL, -1);
}
else if (strcmp(entry->name, "wsc_soap_action") == 0) {
DOT11_WSC_SOAP soap;
struct iw_point wrq;
wrq.pointer = (caddr_t)&soap;
wrq.length = sizeof(DOT11_WSC_SOAP);
soap.EventId = DOT11_EVENT_WSC_SOAP;
soap.IsMoreEvent = FALSE;
strcpy(soap.action, arg_val);
printk("ioctl soap name:%s\n",arg_val);
//rtl8192cd_ioctl_priv_daemonreq(priv->dev, &wrq);
}
else if (strcmp(entry->name, "wsc_event_callback") == 0) {
DOT11_WSC_PIN_IND wsc_ind;
wsc_ind.EventId = DOT11_EVENT_WSC_GETCONF_IND;
wsc_ind.IsMoreEvent = 0;
DOT11_EnQueue((unsigned long)priv, priv->pevent_queue, (unsigned char*)&wsc_ind, sizeof(DOT11_WSC_PIN_IND));
event_indicate(priv, NULL, -1);
}
else if (strcmp(entry->name, "wps_led_control") == 0) { /*event to upnp*/
DOT11_WPS_LEDCRTL wsc_ind;
short flag = 0;
wsc_ind.EventId = DOT11_EVENT_WSC_LEDCONTROL_IND;
if(strcmp("WSC_START",arg_val) == 0)
flag = -1;
else if(strcmp("WSC_END",arg_val) == 0)
flag = -2;
else if(strcmp("PBC_OVERLAPPED",arg_val) == 0)
flag = -3;
else if(strcmp("WSC_ERROR",arg_val) == 0)
flag = -4;
else if(strcmp("WSC_SUCCESS",arg_val) == 0)
flag = -5;
else if(strcmp("WSC_NOP",arg_val) == 0)
flag = -6;
else
flag = -7;
wsc_ind.flag = flag;
DOT11_EnQueue((unsigned long)priv, priv->pevent_queue, (unsigned char*)&wsc_ind, sizeof(DOT11_WPS_LEDCRTL));
event_indicate(priv, NULL, -1);
}
else if (strcmp(entry->name, "wps_debug") == 0) { /*event to wps*/
priv->pshare->WSC_CONT_S.debug = _atoi(arg_val,10);
}
else if (strcmp(entry->name, "wps_reinit") == 0) { /*event to wps*/
printk("WPS module reinit from set_mib\n");
priv->pshare->WSC_CONT_S.wait_reinit = 1 ;
wps_init(priv);
}
break;
// from wps call event to user space upnp
case FLASH_RESTORE_T:
if (strlen(arg_val) > entry->len) {
DOT11_WSC_RESTORE2FLASH_IND restore2flash;
memset(&restore2flash , 0 ,sizeof(struct _DOT11_WSC_RESTORE2FLASH_IND));
restore2flash.EventId = DOT11_EVENT_WSC_PUTCONF_IND;
strcpy(restore2flash.flashcmd[0], arg_val);
DOT11_EnQueue((unsigned long)priv, priv->pevent_queue, (unsigned char*)&restore2flash,
sizeof(DOT11_WSC_RESTORE2FLASH_IND));
event_indicate(priv, NULL, -1);
}
break;
#endif // end of CONFIG_MSC
#endif // end of INCLUDE_WPS
#ifdef CONFIG_RTL_COMAPI_CFGFILE
case WSC_START_IND_T:
if( strlen(arg_val) > 0 ) {
DOT11_WSC_IND wsc_ind;
wsc_ind.EventId = DOT11_EVENT_WSC_START_IND;
wsc_ind.IsMoreEvent = 0;
//wsc_ind.value = arg_val;
DOT11_EnQueue((unsigned long)priv, priv->pevent_queue, (unsigned char*)&wsc_ind, sizeof(DOT11_WSC_IND));
event_indicate(priv, NULL, -1);
}
break;
//EV_MODE, EV_STATUS, EV_MEHOD, EV_STEP, EV_OOB
case WSC_MODE_IND_T:
if( strlen(arg_val) > 0 ) {
DOT11_WSC_IND wsc_ind;
wsc_ind.EventId = DOT11_EVENT_WSC_MODE_IND;
wsc_ind.IsMoreEvent = 0;
wsc_ind.value = _atoi(arg_val,10);
DOT11_EnQueue((unsigned long)priv, priv->pevent_queue, (unsigned char*)&wsc_ind, sizeof(DOT11_WSC_IND));
event_indicate(priv, NULL, -1);
}
break;
case WSC_STATUS_IND_T:
if( strlen(arg_val) > 0 ) {
DOT11_WSC_IND wsc_ind;
wsc_ind.EventId = DOT11_EVENT_WSC_STATUS_IND;
wsc_ind.IsMoreEvent = 0;
wsc_ind.value = _atoi(arg_val,10);
DOT11_EnQueue((unsigned long)priv, priv->pevent_queue, (unsigned char*)&wsc_ind, sizeof(DOT11_WSC_IND));
event_indicate(priv, NULL, -1);
}
break;
case WSC_METHOD_IND_T:
if( strlen(arg_val) > 0 ) {
DOT11_WSC_IND wsc_ind;
wsc_ind.EventId = DOT11_EVENT_WSC_METHOD_IND;
wsc_ind.IsMoreEvent = 0;
wsc_ind.value = _atoi(arg_val,10);
if( wsc_ind.value > 3 || wsc_ind.value ==0 )
wsc_ind.value = 1; //default set to pin method
printk("iwpriv set method = %d\n",wsc_ind.value);
DOT11_EnQueue((unsigned long)priv, priv->pevent_queue, (unsigned char*)&wsc_ind, sizeof(DOT11_WSC_IND));
event_indicate(priv, NULL, -1);
}
break;
case WSC_STEP_IND_T:
if( strlen(arg_val) > 0 ) {
DOT11_WSC_IND wsc_ind;
wsc_ind.EventId = DOT11_EVENT_WSC_STEP_IND;
wsc_ind.IsMoreEvent = 0;
//wsc_ind.value = arg_val;
DOT11_EnQueue((unsigned long)priv, priv->pevent_queue, (unsigned char*)&wsc_ind, sizeof(DOT11_WSC_IND));
event_indicate(priv, NULL, -1);
}
break;
case WSC_OOB_IND_T:
if( strlen(arg_val) > 0 ) {
DOT11_WSC_IND wsc_ind;
wsc_ind.EventId = DOT11_EVENT_WSC_OOB_IND;
wsc_ind.IsMoreEvent = 0;
//wsc_ind.value = arg_val;
DOT11_EnQueue((unsigned long)priv, priv->pevent_queue, (unsigned char*)&wsc_ind, sizeof(DOT11_WSC_IND));
event_indicate(priv, NULL, -1);
}
break;
#endif //ifdef CONFIG_RTL_COMAPI_CFGFILE
#endif
#ifdef CONFIG_RTL_WAPI_SUPPORT
case INT_ARRAY_T:
int_idx=0;
while (1) {
arg_val = get_arg(arg_val, tmpbuf);
if (arg_val == NULL)
break;
if (int_idx+1 > (entry->len)/sizeof(int)) {
DEBUG_ERR("invalid MULTI_BYTE_T mib index [%s, %d] !\n", entry->name, int_idx);
return -1;
}
int_val = _atoi(tmpbuf, 16);
memcpy(((unsigned char *)priv->pmib)+entry->offset+int_idx++, (void *)&int_val, sizeof(int_val));
}
break;
case WAPI_KEY_T:
{
char tmppasswd[100]={0};
wapiMibPSK *wapipsk=NULL;
int_idx=0;
/*Get Password*/
arg_val = get_arg(arg_val, tmpbuf);
if (arg_val == NULL)
break;
memcpy(tmppasswd, tmpbuf, strlen(tmpbuf));
/*Get Password length*/
arg_val=get_arg(arg_val, tmpbuf);
int_val = _atoi(tmpbuf, 16);
wapipsk=(wapiMibPSK *)((unsigned char *)(priv->pmib)+entry->offset);
/*Hex or passthru*/
if((0==(strlen(tmppasswd) % 2)) && (int_val < strlen(tmppasswd)) &&
(int_val == (strlen(tmppasswd)/2)))
{
/*Hex mode*/
rtl_string_to_hex(tmppasswd,wapipsk->octet,strlen(tmppasswd));
}
else
{
strncpy(wapipsk->octet,tmppasswd,strlen(tmppasswd));
}
wapipsk->len = int_val;
break;
}
#endif
#ifdef SUPPORT_MULTI_PROFILE
case AP_PROFILE_T:
add_ap_profile(priv, arg_val);
break;
#endif
#if defined(SWITCH_CHAN) && defined(UNIVERSAL_REPEATER)
case SWITCH_CHAN_T:
switch_chan(priv, arg_val);
break;
#endif
#ifdef USE_OUT_SRC
case ODM_DM_1UT:
byte_val = _atoi(arg_val, 16);
memcpy(((unsigned char *)&priv->pshare->_dmODM)+entry->offset, (unsigned char *)&byte_val, entry->len);
ODEBUG("set odm,val=0x%x\n",byte_val);
break;
case ODM_DM_2UT:
short_val = _atoi(arg_val, 16);
memcpy(((unsigned char *)&priv->pshare->_dmODM)+entry->offset, (unsigned char *)&short_val, entry->len);
ODEBUG("set odm,val=0x%02x\n",short_val);
break;
case ODM_DM_4UT:
int_val = _atoi(arg_val, 16);
memcpy(((unsigned char *)&priv->pshare->_dmODM)+entry->offset, (unsigned char *)&int_val, entry->len);
ODEBUG("set odm,val=0x%04x\n",int_val);
break;
case ODM_DM_8UT:
longlong_val = _atoi_u8(arg_val, 16);
memcpy(((unsigned char *)&priv->pshare->_dmODM)+entry->offset, (unsigned char *)&longlong_val, entry->len);
ODEBUG("set odm, val=0x%llx\n",longlong_val);
break;
#endif
default:
DEBUG_ERR("invalid mib type!\n");
break;
}
return 0;
}
#ifndef INCLUDE_WPS
static
#endif
int get_mib(struct rtl8192cd_priv *priv, unsigned char *data)
{
struct iwpriv_arg *entry;
int i, len, *int_ptr, copy_len;
char tmpbuf[40];
DEBUG_TRACE;
DEBUG_INFO("get_mib %s\n", data);
entry = get_tbl_entry((char *)data);
if (entry == NULL) {
DEBUG_ERR("invalid mib name [%s] !\n", data);
return -1;
}
copy_len = entry->len;
switch (entry->type) {
case BYTE_T:
memcpy(data, ((unsigned char *)priv->pmib)+entry->offset, 1);
PRINT_INFO("byte data: %d\n", *data);
break;
#ifdef CONFIG_RTK_MESH
case WORD_T:
memcpy(data, ((unsigned char *)priv->pmib)+entry->offset, 2);
PRINT_INFO("word data: %d\n", *data);
break;
#endif
case INT_T:
memcpy(data, ((unsigned char *)priv->pmib)+entry->offset, sizeof(int));
PRINT_INFO("int data: %d\n", *((int *)data));
break;
case SSID_STRING_T:
memcpy(tmpbuf, priv->pmib->dot11StationConfigEntry.dot11DesiredSSID, priv->pmib->dot11StationConfigEntry.dot11DesiredSSIDLen);
tmpbuf[priv->pmib->dot11StationConfigEntry.dot11DesiredSSIDLen] = '\0';
strcpy((char *)data, tmpbuf);
PRINT_INFO("ssid: %s\n", tmpbuf);
break;
case BYTE_ARRAY_T:
memcpy(data, ((unsigned char *)priv->pmib)+entry->offset, entry->len);
PRINT_INFO("data (hex): ");
for (i=0; i<entry->len; i++)
PRINT_INFO("%02x", *((unsigned char *)((unsigned char *)priv->pmib)+entry->offset+i));
PRINT_INFO("\n");
break;
case ACL_T:
int_ptr = (int *)(((unsigned char *)priv->pmib)+entry->offset+entry->len);
PRINT_INFO("ACL table (%d):\n", *int_ptr);
copy_len = 0;
for (i=0; i<*int_ptr; i++) {
memcpy(data, ((unsigned char *)priv->pmib)+entry->offset+i*6, 6);
PRINT_INFO("mac-addr: %02x-%02x-%02x-%02x-%02x-%02x\n",
data[0],data[1],data[2],data[3],data[4],data[5]);
data += 6;
copy_len += 6;
}
DEBUG_INFO("\n");
break;
case IDX_BYTE_ARRAY_T:
memcpy(data, ((unsigned char *)priv->pmib)+entry->offset, entry->len);
PRINT_INFO("data (dec): ");
for (i=0; i<entry->len; i++)
PRINT_INFO("%d ", *((unsigned char *)((unsigned char *)priv->pmib)+entry->offset+i));
PRINT_INFO("\n");
break;
case MULTI_BYTE_T:
memcpy(&len, ((unsigned char *)priv->pmib)+entry->offset+entry->len, sizeof(int));
memcpy(data, ((unsigned char *)priv->pmib)+entry->offset, len);
PRINT_INFO("data (hex): ");
for (i=0; i<len; i++)
PRINT_INFO("%02x ", *((unsigned char *)((unsigned char *)priv->pmib)+entry->offset+i));
PRINT_INFO("\n");
break;
#ifdef _DEBUG_RTL8192CD_
case DEBUG_T:
if (entry->offset==1)
memcpy(data, (unsigned char *)&rtl8192cd_debug_err, sizeof(rtl8192cd_debug_err));
else if (entry->offset==2)
memcpy(data, (unsigned char *)&rtl8192cd_debug_info, sizeof(rtl8192cd_debug_info));
else if (entry->offset==3)
memcpy(data, (unsigned char *)&rtl8192cd_debug_trace, sizeof(rtl8192cd_debug_trace));
else if (entry->offset==4)
memcpy(data, (unsigned char *)&rtl8192cd_debug_warn, sizeof(rtl8192cd_debug_warn));
else {
DEBUG_ERR("invalid debug index\n");
}
PRINT_INFO("debug flag(hex): %08lx\n", *((unsigned long *)data));
break;
#endif // _DEBUG_RTL8192CD_
case DEF_SSID_STRING_T:
memcpy(tmpbuf, priv->pmib->dot11StationConfigEntry.dot11DefaultSSID, priv->pmib->dot11StationConfigEntry.dot11DefaultSSIDLen);
tmpbuf[priv->pmib->dot11StationConfigEntry.dot11DefaultSSIDLen] = '\0';
strcpy((char *)data, tmpbuf);
PRINT_INFO("defssid: %s\n", tmpbuf);
break;
case STRING_T:
strcpy((char *)data, (char *)(((unsigned char *)priv->pmib)+entry->offset));
PRINT_INFO("string data: %s\n", data);
break;
case RFFT_T:
memcpy(data, ((unsigned char *)&priv->pshare->rf_ft_var)+entry->offset, sizeof(int));
PRINT_INFO("int data: %d\n", *((int *)data));
break;
case RFFT_ACL_T:
int_ptr = (int *)(((unsigned char *)&priv->pshare->rf_ft_var)+entry->offset+entry->len);
copy_len = 0;
for (i=0; i<*int_ptr; i++)
{
memcpy(data, ((unsigned char *)&priv->pshare->rf_ft_var)+entry->offset+i*6, 6);
PRINT_INFO("mac-addr: %02x-%02x-%02x-%02x-%02x-%02x\n",
data[0],data[1],data[2],data[3],data[4],data[5]);
data += 6;
copy_len += 6;
}
DEBUG_INFO("\n");
break;
case VARLEN_BYTE_T:
copy_len = *(unsigned int *)(((unsigned char *)priv->pmib)+entry->offset+entry->len);
memcpy(data, ((unsigned char *)priv->pmib)+entry->offset, copy_len);
PRINT_INFO("data (hex): ");
for (i=0; i<copy_len; i++)
PRINT_INFO("%02x", *((unsigned char *)((unsigned char *)priv->pmib)+entry->offset+i));
PRINT_INFO("\n");
break;
#ifdef USE_OUT_SRC
case ODM_DM_1UT:
memcpy(data, ((unsigned char *)&priv->pshare->_dmODM)+entry->offset, sizeof(unsigned char));
ODEBUG("odm byte val=0x:%x\n", *((unsigned char *)data));
break;
case ODM_DM_2UT:
memcpy(data, ((unsigned char *)&priv->pshare->_dmODM)+entry->offset, sizeof(unsigned short));
ODEBUG("odm short val=0x:%02x\n", *((unsigned short *)data));
break;
case ODM_DM_4UT:
memcpy(data, ((unsigned char *)&priv->pshare->_dmODM)+entry->offset, sizeof(unsigned int));
ODEBUG("odm long val=0x:%04x\n", *((int *)data));
break;
case ODM_DM_8UT:
memcpy(data, ((unsigned char *)&priv->pshare->_dmODM)+entry->offset, sizeof(unsigned long long));
ODEBUG("odm long long val=0x:%llx\n", *((unsigned long long *)data));
break;
#endif
default:
DEBUG_ERR("invalid mib type!\n");
return 0;
}
return copy_len;
}
#ifdef _IOCTL_DEBUG_CMD_
/*
* Write register, command: "iwpriv wlanX write_reg,type,offset,value"
* where: type may be: "b" - byte, "w" - word, "dw" - "dw" (based on wlan register offset)
* "_b" - byte, "_w" - word, "_dw" - "dw" (based on register offset 0)
* offset and value should be input in hex
*/
static int write_reg(struct rtl8192cd_priv *priv, unsigned char *data)
{
volatile char name[100];
int i=0, op=0, offset;
unsigned long ioaddr, val;
#ifdef CONFIG_SDIO_HCI
int type = 0;
#endif
DEBUG_TRACE;
// get access type
while (*data && *data != ',')
name[i++] = *data++;
name[i] = '\0';
#ifdef CONFIG_SDIO_HCI
if (!strcmp((char *)name, "sdio")) {
data++;
i = 0;
while (*data && *data != ',')
name[i++] = *data++;
name[i] = '\0';
type= 1;
}
#endif
if (!strcmp((char *)name, "b"))
op = 1;
else if (!strcmp((char *)name, "w"))
op = 2;
else if (!strcmp((char *)name, "dw"))
op = 3;
else if (!strcmp((char *)name, "_b"))
op = 0x81;
else if (!strcmp((char *)name, "_w"))
op = 0x82;
else if (!strcmp((char *)name, "_dw"))
op = 0x83;
if (op == 0 || !*data++) {
DEBUG_ERR("invalid type!\n");
return -1;
}
if ( !(op&0x80)) // wlan register
ioaddr = priv->pshare->ioaddr;
else
ioaddr = 0;
// get offset and value
i=0;
while (*data && *data != ',')
name[i++] = *data++;
name[i] = '\0';
if (!*data++) {
DEBUG_ERR("invalid offset!\n");
return -1;
}
offset = _atoi((char *)name, 16);
val = (unsigned long)_atoi((char *)data, 16);
DEBUG_INFO("write reg in %s: addr=%08x, val=0x%x\n",
(op == 1 ? "byte" : (op == 2 ? "word" : "dword")),
offset, (int)val);
switch (op&0x7f) {
case 1:
#ifdef CONFIG_SDIO_HCI
if (type) {
unsigned char b_val = (unsigned char)val;
sdio_local_write(priv, offset, 1, &b_val);
} else
#endif
RTL_W8(offset, ((unsigned char)val));
break;
case 2:
#ifdef CONFIG_SDIO_HCI
if (type) {
unsigned short w_val = (unsigned short)val;
w_val = cpu_to_le16(w_val);
sdio_local_write(priv, offset, 2, (u8*)&w_val);
} else
#endif
RTL_W16(offset, ((unsigned short)val));
break;
case 3:
#ifdef CONFIG_SDIO_HCI
if (type) {
val = cpu_to_le32(val);
sdio_local_write(priv, offset, 4, (u8*)&val);
} else
#endif
RTL_W32(offset, ((unsigned long)val));
break;
}
return 0;
}
/*
* Read register, command: "iwpriv wlanX read_reg,type,offset"
* where: type may be: "b" - byte, "w" - word, "dw" - "dw" (based on wlan register offset)
* "_b" - byte, "_w" - word, "_dw" - "dw" (based on register offset 0)
* offset should be input in hex
*/
static int read_reg(struct rtl8192cd_priv *priv, unsigned char *data)
{
volatile char name[100];
int i=0, op=0, offset, len=0;
unsigned long ioaddr, dw_val;
unsigned char *org_ptr=data, b_val;
unsigned short w_val;
#ifdef CONFIG_SDIO_HCI
int type = 0;
#endif
DEBUG_TRACE;
// get access type
while (*data && *data != ',')
name[i++] = *data++;
name[i] = '\0';
#ifdef CONFIG_SDIO_HCI
if (!strcmp((char *)name, "sdio")) {
data++;
i = 0;
while (*data && *data != ',')
name[i++] = *data++;
name[i] = '\0';
type= 1;
}
#endif
if (!strcmp((char *)name, "b"))
op = 1;
else if (!strcmp((char *)name, "w"))
op = 2;
else if (!strcmp((char *)name, "dw"))
op = 3;
else if (!strcmp((char *)name, "_b"))
op = 0x81;
else if (!strcmp((char *)name, "_w"))
op = 0x82;
else if (!strcmp((char *)name, "_dw"))
op = 0x83;
if (op == 0 || !*data++) {
DEBUG_ERR("invalid type!\n");
return -1;
}
if ( !(op&0x80)) // wlan register
ioaddr = priv->pshare->ioaddr;
else
ioaddr = 0;
// get offset
offset = _atoi((char *)data, 16);
switch (op&0x7f) {
case 1:
#ifdef CONFIG_SDIO_HCI
if (type) {
sdio_local_read(priv, offset, 1, &b_val);
}
else
#endif
{
b_val = (unsigned char)RTL_R8(offset);
}
panic_printk("\nread byte reg %x=0x%02x\n", offset, b_val);
len = 1;
memcpy(org_ptr, &b_val, len);
break;
case 2:
#ifdef CONFIG_SDIO_HCI
if (type) {
sdio_local_read(priv, offset, 2, (u8 *)&w_val);
w_val = le16_to_cpu(w_val);
}
else
#endif
{
w_val = (unsigned short)RTL_R16(offset);
}
panic_printk("\nread word reg %x=0x%04x\n", offset, w_val);
len = 2;
#ifdef _LITTLE_ENDIAN_
// To fit PSD tool endian requirement
w_val = ___constant_swab16(w_val);
#endif
memcpy(org_ptr, (char *)&w_val, len);
break;
case 3:
#ifdef CONFIG_SDIO_HCI
if (type) {
sdio_local_read(priv, offset, 4, (u8 *)&dw_val);
dw_val = le32_to_cpu(dw_val);
}
else
#endif
{
dw_val = (unsigned long)RTL_R32(offset);
}
panic_printk("\nread dword reg %x=0x%08lx\n", offset, dw_val);
len = 4;
#ifdef _LITTLE_ENDIAN_
// To fit PSD tool endian requirement
dw_val = ___constant_swab32(dw_val);
#endif
memcpy(org_ptr, (char *)&dw_val, len);
break;
}
return len;
}
/*
* Write memory, command: "iwpriv wlanX write_mem,type,start,len,value"
* where: type may be: "b" - byte, "w" - word, "dw" - "dw"
* start, len and value should be input in hex
*/
static int write_mem(struct rtl8192cd_priv *priv, unsigned char *data)
{
volatile char tmpbuf[100];
int i=0, size=0, len;
unsigned long val, start;
DEBUG_TRACE;
// get access type
while (*data && *data != ',')
tmpbuf[i++] = *data++;
tmpbuf[i] = '\0';
if (!strcmp((char *)tmpbuf, "b"))
size = 1;
else if (!strcmp((char *)tmpbuf, "w"))
size = 2;
else if (!strcmp((char *)tmpbuf, "dw"))
size = 4;
if (size == 0 || !*data++) {
DEBUG_ERR("invalid command!\n");
return -1;
}
// get start, len, and value
i=0;
while (*data && *data != ',')
tmpbuf[i++] = *data++;
tmpbuf[i] = '\0';
if (i==0 || !*data++) {
DEBUG_ERR("invalid start!\n");
return -1;
}
start = (unsigned long)_atoi((char *)tmpbuf, 16);
i=0;
while (*data && *data != ',')
tmpbuf[i++] = *data++;
tmpbuf[i] = '\0';
if (i==0 || !*data++) {
DEBUG_ERR("invalid len!\n");
return -1;
}
len = _atoi((char *)tmpbuf, 16);
val = (unsigned long)_atoi((char *)data, 16);
DEBUG_INFO("write memory: start=%08lx, len=%x, data=0x%x (%s)\n",
start, len, (int)val,
(size == 1 ? "byte" : (size == 2 ? "word" : "dword")));
for (i=0; i<len; i++) {
memcpy((char *)start, (char *)&val, size);
start += size;
}
return 0;
}
/*
* Read memory, command: "iwpriv wlanX read_mem,type,start,len"
* where: type may be: "b" - byte, "w" - word, "dw" - "dw"
* start, and len should be input in hex
*/
static int read_mem(struct rtl8192cd_priv *priv, unsigned char *data)
{
volatile char tmpbuf[100];
//#ifndef CONFIG_RTL8186_TR //brad add for tr 11n
#if !(defined(CONFIG_RTL865X_AC) || defined(CONFIG_RTL865X_KLD) || defined(CONFIG_RTL8196B_KLD) || defined(CONFIG_RTL865X_SC) || defined(CONFIG_RTL8196C_KLD))
//#if !defined(__LINUX_2_6__) || defined(CONFIG_PANIC_PRINTK)
//#ifdef _DEBUG_RTL8192CD_
char *tmp1;
//#endif
#endif// !define CONFIG_RTL8186_TR
int i=0, size=0, len, copy_len;
unsigned long start, dw_val;
unsigned short w_val;
unsigned char b_val, *pVal=NULL, *org_ptr=data;
DEBUG_TRACE;
tmp1 = (char *)kmalloc(2048, GFP_ATOMIC);
if (tmp1 == NULL) {
panic_printk("Not enough memory\n");
return -1;
}
// get access type
while (*data && *data != ',')
tmpbuf[i++] = *data++;
tmpbuf[i] = '\0';
if (!strcmp((char *)tmpbuf, "b")) {
size = 1;
pVal = &b_val;
}
else if (!strcmp((char *)tmpbuf, "w")) {
size = 2;
pVal = (unsigned char *)&w_val;
}
else if (!strcmp((char *)tmpbuf, "dw")) {
size = 4;
pVal = (unsigned char *)&dw_val;
}
if (size == 0 || !*data++) {
DEBUG_ERR("invalid type!\n");
kfree(tmp1);
return -1;
}
// get start and len
i=0;
while (*data && *data != ',')
tmpbuf[i++] = *data++;
tmpbuf[i] = '\0';
if (i==0 || !*data++) {
DEBUG_ERR("invalid start!\n");
kfree(tmp1);
return -1;
}
start = (unsigned long)_atoi((char *)tmpbuf, 16);
len = _atoi((char *)data, 16);
#if !(defined(CONFIG_RTL865X_AC) || defined(CONFIG_RTL865X_KLD) || defined(CONFIG_RTL8196B_KLD) || defined(CONFIG_RTL865X_SC) || defined(CONFIG_RTL8196C_KLD))
//#if !defined(__LINUX_2_6__) || defined(CONFIG_PANIC_PRINTK)
//#ifdef _DEBUG_RTL8192CD_
sprintf(tmp1, "read memory: from=%lx, len=0x%x (%s)\n",
start, len, (size == 1 ? "byte" : (size == 2 ? "word" : "dword")));
for (i=0; i<len; i++) {
char tmp2[10];
memcpy(pVal, (char *)start+i*size, size);
if (size == 1) {
sprintf(tmp2, "%02x ", b_val);
if ((i>0) && ((i%16)==0))
strcat(tmp1, "\n");
}
else if (size == 2) {
sprintf(tmp2, "%04x ", w_val);
if ((i>0) && ((i%8)==0))
strcat(tmp1, "\n");
}
else if (size == 4) {
sprintf(tmp2, "%08lx ", dw_val);
if ((i>0) && ((i%8)==0))
strcat(tmp1, "\n");
}
strcat(tmp1, tmp2);
}
strcat(tmp1, "\n");
panic_printk("\n%s", tmp1);
//#endif // _DEBUG_RTL8192CD_
#endif // !define CONFIG_RTL8186_TR
if (size*len > 128)
copy_len = 128;
else
copy_len = size*len;
memcpy(org_ptr, (char *)start, copy_len);
kfree(tmp1);
return copy_len;
}
static int write_bb_reg(struct rtl8192cd_priv *priv, unsigned char *data)
{
return 0;
}
static int read_bb_reg(struct rtl8192cd_priv *priv, unsigned char *data)
{
return 0;
}
static int write_rf_reg(struct rtl8192cd_priv *priv, unsigned char *data)
{
volatile char tmpbuf[32];
unsigned int path, offset, val, val_read;
int i;
DEBUG_TRACE;
if (strlen((char *)data) != 0) {
i = 0;
while (*data && *data != ',')
tmpbuf[i++] = *data++;
tmpbuf[i] = '\0';
if (i==0 || !*data++) {
DEBUG_ERR("invalid path!\n");
return -1;
}
path = _atoi((char *)tmpbuf, 16);
i = 0;
while (*data && *data != ',')
tmpbuf[i++] = *data++;
tmpbuf[i] = '\0';
if (i==0 || !*data++) {
DEBUG_ERR("invalid offset!\n");
return -1;
}
offset = _atoi((char *)tmpbuf, 16);
val = (unsigned long)_atoi((char *)data, 16);
PHY_SetRFReg(priv, path, offset, bMask20Bits, val);
val_read = PHY_QueryRFReg(priv, path, offset, bMask20Bits, 1);
printk("write RF %d offset 0x%02x val [0x%05x], read back [0x%05x]\n",
path, offset, val&0xfffff, val_read&0xfffff);
}
return 0;
}
static int read_rf_reg(struct rtl8192cd_priv *priv, unsigned char *data)
{
volatile char tmpbuf[32];
unsigned char *arg = data;
unsigned int path, offset, val;
int i;
DEBUG_TRACE;
if (strlen((char *)arg) != 0) {
i = 0;
while (*arg && *arg != ',')
tmpbuf[i++] = *arg++;
tmpbuf[i] = '\0';
if (i==0 || !*arg++) {
DEBUG_ERR("invalid path!\n");
return -1;
}
path = _atoi((char *)tmpbuf, 16);
offset = (unsigned char)_atoi((char *)arg, 16);
val = PHY_QueryRFReg(priv, path, offset, bMask20Bits, 1);
panic_printk("\nread RF %d reg %02x=0x%08x\n", path, offset, val);
#ifdef _LITTLE_ENDIAN_
// To fit PSD tool endian requirement
val = ___constant_swab32(val);
#endif
memcpy(data, (char *)&val, 4);
return 4;
}
return 1;
}
#ifdef CONFIG_RTL8186_KB
int get_guestmac(struct rtl8192cd_priv *priv, GUESTMAC_T *macdata)
{
int i=0;
for (i=0; i<MAX_GUEST_NUM; i++)
{
if (priv->guestMac[i].valid)
{
memcpy(macdata->macaddr, priv->guestMac[i].macaddr, 6);
macdata->valid = priv->guestMac[i].valid;
}
else
break;
macdata++;
}
return sizeof(GUESTMAC_T)*i;
}
int set_guestmacvalid(struct rtl8192cd_priv *priv, char *buf)
{
int i=0;
for (i=0; i<MAX_GUEST_NUM; i++)
{
if (priv->guestMac[i].valid)
{
continue;
}
memcpy(priv->guestMac[i].macaddr, buf, 6);
priv->guestMac[i].valid = 1;
return 0;
}
/*No slot avaible*/
return -1;
}
int set_guestmacinvalid(struct rtl8192cd_priv *priv, char *buf)
{
int i=0;
for (i=0; i<MAX_GUEST_NUM; i++)
{
if (priv->guestMac[i].valid && !memcmp(priv->guestMac[i].macaddr, buf, 6))
{
priv->guestMac[i].valid = 0;
return 0;
}
}
/*No such slot*/
return -1;
}
#endif // CONFIG_RTL8186_KB
#ifdef MULTI_MAC_CLONE
int get_mclone_addr(struct rtl8192cd_priv *priv, char *buf)
{
int idx=0;
unsigned char *mac;
unsigned char tmpbuf[10]={0};
get_arg(buf, tmpbuf);
idx = _atoi(tmpbuf, 10);
if (idx > MAX_MAC_CLONE_NUM || idx < 0)
return -1;
mac = (unsigned char *)&priv->pshare->mclone_sta_fixed_addr[idx];
sprintf(buf, "%02x:%02x:%02x:%02x:%02x:%02x", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
return (strlen(buf)+1);
}
int set_mclone_addr(struct rtl8192cd_priv *priv, char *buf)
{
int idx=0, i;
char *mac;
unsigned char tmpbuf[10]={0};
unsigned long *mac4;
mac = get_arg(buf, tmpbuf);
idx = _atoi(tmpbuf, 10);
if (idx >= MAX_MAC_CLONE_NUM || idx < 0)
return -1;
if (idx==0) {
get_array_val(tmpbuf, mac, 12);
for (i=0; i<MAX_MAC_CLONE_NUM; i++) {
memcpy((priv->pshare->mclone_sta_fixed_addr[i].clone_addr), tmpbuf, 6);
mac4 = (unsigned long *)&priv->pshare->mclone_sta_fixed_addr[i].clone_addr[2];
#ifdef __ECOS
*mac4 = (*mac4)+i; //temporary modified for ecos compile error.
#else
*mac4 = be32_to_cpu(cpu_to_be32(*mac4)+i);
#endif
}
}
else {
get_array_val((priv->pshare->mclone_sta_fixed_addr[idx].clone_addr), mac, 12);
}
return 0;
}
int __del_mclone_addr(struct rtl8192cd_priv *priv, unsigned char *tmpAddr)
{
#ifndef SMP_SYNC
unsigned long flags;
#endif
int idx=-1;
int tmpActive = ACTIVE_ID;
struct stat_info *pstat=NULL;
struct rtl8192cd_priv *tmpPriv;
idx = mclone_find_address(priv, tmpAddr, NULL, MAC_CLONE_SA_FIND);
ACTIVE_ID = idx;
if (idx > 0){
tmpPriv = priv->pshare->mclone_sta[idx-1].priv;
SAVE_INT_AND_CLI(flags);
pstat = get_stainfo(tmpPriv, (GET_MIB(tmpPriv))->dot11StationConfigEntry.dot11Bssid);
if (pstat) {
printk("Remove mclone[%d]: %02x%02x%02x%02x%02x%02x\n", idx-1, tmpAddr[0], tmpAddr[1], tmpAddr[2], tmpAddr[3], tmpAddr[4], tmpAddr[5]);
if (tmpPriv->pshare->mclone_sta[idx-1].opmode & WIFI_ASOC_STATE)
issue_deauth(tmpPriv, (GET_MIB(tmpPriv))->dot11StationConfigEntry.dot11Bssid, _RSON_DEAUTH_STA_LEAVING_);
#ifdef CONFIG_WLAN_HAL
if (IS_HAL_CHIP(tmpPriv))
GET_HAL_INTERFACE(tmpPriv)->McloneStopMBSSIDHandler(tmpPriv, (idx-1));
else if (CONFIG_WLAN_NOT_HAL_EXIST)
#endif
mclone_stop_mbssid(tmpPriv, (idx-1));//mclone_stop_mbssid need to modify
clear_Multi_Mac_Clone(tmpPriv, idx-1);
if (pstat->expire_to > 0)
{
cnt_assoc_num(tmpPriv, pstat, DECREASE, (char *)__FUNCTION__);
check_sta_characteristic(tmpPriv, pstat, DECREASE);
}
free_stainfo(tmpPriv, pstat);
}
RESTORE_INT(flags);
}
else if (idx == 0) {
SAVE_INT_AND_CLI(flags);
pstat = get_stainfo(priv, (GET_MIB(priv))->dot11StationConfigEntry.dot11Bssid);
if (pstat) {
if (pstat->expire_to > 0)
{
cnt_assoc_num(priv, pstat, DECREASE, (char *)__FUNCTION__);
check_sta_characteristic(priv, pstat, DECREASE);
}
free_stainfo(priv, pstat);
}
RESTORE_INT(flags);
}
else {
//printk("Could not find the MAC %02x%02x%02x%02x%02x%02x\n", tmpAddr[0], tmpAddr[1], tmpAddr[2], tmpAddr[3], tmpAddr[4], tmpAddr[5]);
}
ACTIVE_ID = tmpActive;
return idx;
}
int del_mclone_addr(struct rtl8192cd_priv *priv, char *buf)
{
unsigned char tmpAddr[6];
printk("buf:%s\n", (buf ? buf : "none"));
get_array_val(tmpAddr, buf, 12);
__del_mclone_addr(priv, tmpAddr);
return 0;
}
#endif // MULTI_MAC_CLONE
#ifdef _DEBUG_RTL8192CD_
//_TXPWR_REDEFINE
#define POWER_MIN_CHECK(a,b) (((a) > (b)) ? (b) : (a))
#ifndef POWER_RANGE_CHECK
#define POWER_RANGE_CHECK(val) (((val) > 0x3f)? 0x3f : ((val < 0) ? 0 : val))
#endif
#define COUNT_SIGN_OFFSET(val, oft) (((oft & 0x08) == 0x08)? (val - (0x10 - oft)) : (val + oft))
#define ASSIGN_TX_POWER_OFFSET(offset, setting) { \
if (setting != 0x7f) \
offset = setting; \
}
#ifndef TXPWR_LMT
static int ch2idx(int ch)
{
int val=-1;
// |1~14|36, 38, 40, ..., 64|100, 102, ..., 140|149, 151, ..., 165|
if (ch<=14)
val = ch-1;
else if (ch<=64)
val = ((ch-36)>>1)+14;
else if (ch<=140)
val = ((ch-100)>>1)+29;
else if (ch<=165)
val = ((ch-149)>>1)+50;
return val;
}
#endif
#ifdef ADD_TX_POWER_BY_CMD
static void check_txpwr_by_cmd(struct rtl8192cd_priv *priv,
char *MCSTxAgcOffset_A, char *MCSTxAgcOffset_B,
char *OFDMTxAgcOffset_A, char *OFDMTxAgcOffset_B,
char *CCKTxAgc_A, char *CCKTxAgc_B)
{
// char is_by_cmd = 0;
if( (priv->pshare->rf_ft_var.txPowerPlus_cck_11 != 0x7f)
|| (priv->pshare->rf_ft_var.txPowerPlus_cck_5 != 0x7f)
|| (priv->pshare->rf_ft_var.txPowerPlus_cck_2 != 0x7f)
|| (priv->pshare->rf_ft_var.txPowerPlus_cck_1 != 0x7f))
{
ASSIGN_TX_POWER_OFFSET(CCKTxAgc_A[0], priv->pshare->rf_ft_var.txPowerPlus_cck_11);
ASSIGN_TX_POWER_OFFSET(CCKTxAgc_A[1], priv->pshare->rf_ft_var.txPowerPlus_cck_5);
ASSIGN_TX_POWER_OFFSET(CCKTxAgc_A[2], priv->pshare->rf_ft_var.txPowerPlus_cck_2);
ASSIGN_TX_POWER_OFFSET(CCKTxAgc_A[3], priv->pshare->rf_ft_var.txPowerPlus_cck_1);
ASSIGN_TX_POWER_OFFSET(CCKTxAgc_B[0], priv->pshare->rf_ft_var.txPowerPlus_cck_11);
ASSIGN_TX_POWER_OFFSET(CCKTxAgc_B[1], priv->pshare->rf_ft_var.txPowerPlus_cck_5);
ASSIGN_TX_POWER_OFFSET(CCKTxAgc_B[2], priv->pshare->rf_ft_var.txPowerPlus_cck_2);
ASSIGN_TX_POWER_OFFSET(CCKTxAgc_B[3], priv->pshare->rf_ft_var.txPowerPlus_cck_1);
printk("TXPWR_BY_CMD: CCK = %02x %02x %02x %02x \n",
priv->pshare->rf_ft_var.txPowerPlus_cck_11,
priv->pshare->rf_ft_var.txPowerPlus_cck_5,
priv->pshare->rf_ft_var.txPowerPlus_cck_2,
priv->pshare->rf_ft_var.txPowerPlus_cck_1);
}
if( (priv->pshare->rf_ft_var.txPowerPlus_ofdm_18 != 0x7f)
|| (priv->pshare->rf_ft_var.txPowerPlus_ofdm_12!= 0x7f)
|| (priv->pshare->rf_ft_var.txPowerPlus_ofdm_9 != 0x7f)
|| (priv->pshare->rf_ft_var.txPowerPlus_ofdm_6 != 0x7f)
|| (priv->pshare->rf_ft_var.txPowerPlus_ofdm_54 != 0x7f)
|| (priv->pshare->rf_ft_var.txPowerPlus_ofdm_48 != 0x7f)
|| (priv->pshare->rf_ft_var.txPowerPlus_ofdm_36 != 0x7f)
|| (priv->pshare->rf_ft_var.txPowerPlus_ofdm_24 != 0x7f))
{
ASSIGN_TX_POWER_OFFSET(OFDMTxAgcOffset_A[0], priv->pshare->rf_ft_var.txPowerPlus_ofdm_18);
ASSIGN_TX_POWER_OFFSET(OFDMTxAgcOffset_A[1], priv->pshare->rf_ft_var.txPowerPlus_ofdm_12);
ASSIGN_TX_POWER_OFFSET(OFDMTxAgcOffset_A[2], priv->pshare->rf_ft_var.txPowerPlus_ofdm_9);
ASSIGN_TX_POWER_OFFSET(OFDMTxAgcOffset_A[3], priv->pshare->rf_ft_var.txPowerPlus_ofdm_6);
ASSIGN_TX_POWER_OFFSET(OFDMTxAgcOffset_B[0], priv->pshare->rf_ft_var.txPowerPlus_ofdm_18);
ASSIGN_TX_POWER_OFFSET(OFDMTxAgcOffset_B[1], priv->pshare->rf_ft_var.txPowerPlus_ofdm_12);
ASSIGN_TX_POWER_OFFSET(OFDMTxAgcOffset_B[2], priv->pshare->rf_ft_var.txPowerPlus_ofdm_9);
ASSIGN_TX_POWER_OFFSET(OFDMTxAgcOffset_B[3], priv->pshare->rf_ft_var.txPowerPlus_ofdm_6);
ASSIGN_TX_POWER_OFFSET(OFDMTxAgcOffset_A[4], priv->pshare->rf_ft_var.txPowerPlus_ofdm_54);
ASSIGN_TX_POWER_OFFSET(OFDMTxAgcOffset_A[5], priv->pshare->rf_ft_var.txPowerPlus_ofdm_48);
ASSIGN_TX_POWER_OFFSET(OFDMTxAgcOffset_A[6], priv->pshare->rf_ft_var.txPowerPlus_ofdm_36);
ASSIGN_TX_POWER_OFFSET(OFDMTxAgcOffset_A[7], priv->pshare->rf_ft_var.txPowerPlus_ofdm_24);
ASSIGN_TX_POWER_OFFSET(OFDMTxAgcOffset_B[4], priv->pshare->rf_ft_var.txPowerPlus_ofdm_54);
ASSIGN_TX_POWER_OFFSET(OFDMTxAgcOffset_B[5], priv->pshare->rf_ft_var.txPowerPlus_ofdm_48);
ASSIGN_TX_POWER_OFFSET(OFDMTxAgcOffset_B[6], priv->pshare->rf_ft_var.txPowerPlus_ofdm_36);
ASSIGN_TX_POWER_OFFSET(OFDMTxAgcOffset_B[7], priv->pshare->rf_ft_var.txPowerPlus_ofdm_24);
printk("TXPWR_BY_CMD: OFDM = %02x %02x %02x %02x %02x %02x %02x %02x \n",
priv->pshare->rf_ft_var.txPowerPlus_ofdm_18,
priv->pshare->rf_ft_var.txPowerPlus_ofdm_12,
priv->pshare->rf_ft_var.txPowerPlus_ofdm_9,
priv->pshare->rf_ft_var.txPowerPlus_ofdm_6,
priv->pshare->rf_ft_var.txPowerPlus_ofdm_54,
priv->pshare->rf_ft_var.txPowerPlus_ofdm_48,
priv->pshare->rf_ft_var.txPowerPlus_ofdm_36,
priv->pshare->rf_ft_var.txPowerPlus_ofdm_24);
}
if( (priv->pshare->rf_ft_var.txPowerPlus_mcs_3 != 0x7f)
|| (priv->pshare->rf_ft_var.txPowerPlus_mcs_2 != 0x7f)
|| (priv->pshare->rf_ft_var.txPowerPlus_mcs_1 != 0x7f)
|| (priv->pshare->rf_ft_var.txPowerPlus_mcs_0 != 0x7f)
|| (priv->pshare->rf_ft_var.txPowerPlus_mcs_7 != 0x7f)
|| (priv->pshare->rf_ft_var.txPowerPlus_mcs_6 != 0x7f)
|| (priv->pshare->rf_ft_var.txPowerPlus_mcs_5 != 0x7f)
|| (priv->pshare->rf_ft_var.txPowerPlus_mcs_4 != 0x7f)
|| (priv->pshare->rf_ft_var.txPowerPlus_mcs_11 != 0x7f)
|| (priv->pshare->rf_ft_var.txPowerPlus_mcs_10 != 0x7f)
|| (priv->pshare->rf_ft_var.txPowerPlus_mcs_9 != 0x7f)
|| (priv->pshare->rf_ft_var.txPowerPlus_mcs_8 != 0x7f)
|| (priv->pshare->rf_ft_var.txPowerPlus_mcs_15 != 0x7f)
|| (priv->pshare->rf_ft_var.txPowerPlus_mcs_14 != 0x7f)
|| (priv->pshare->rf_ft_var.txPowerPlus_mcs_13 != 0x7f)
|| (priv->pshare->rf_ft_var.txPowerPlus_mcs_12 != 0x7f))
{
ASSIGN_TX_POWER_OFFSET(MCSTxAgcOffset_A[0], priv->pshare->rf_ft_var.txPowerPlus_mcs_3);
ASSIGN_TX_POWER_OFFSET(MCSTxAgcOffset_A[1], priv->pshare->rf_ft_var.txPowerPlus_mcs_2);
ASSIGN_TX_POWER_OFFSET(MCSTxAgcOffset_A[2], priv->pshare->rf_ft_var.txPowerPlus_mcs_1);
ASSIGN_TX_POWER_OFFSET(MCSTxAgcOffset_A[3], priv->pshare->rf_ft_var.txPowerPlus_mcs_0);
ASSIGN_TX_POWER_OFFSET(MCSTxAgcOffset_B[0], priv->pshare->rf_ft_var.txPowerPlus_mcs_3);
ASSIGN_TX_POWER_OFFSET(MCSTxAgcOffset_B[1], priv->pshare->rf_ft_var.txPowerPlus_mcs_2);
ASSIGN_TX_POWER_OFFSET(MCSTxAgcOffset_B[2], priv->pshare->rf_ft_var.txPowerPlus_mcs_1);
ASSIGN_TX_POWER_OFFSET(MCSTxAgcOffset_B[3], priv->pshare->rf_ft_var.txPowerPlus_mcs_0);
ASSIGN_TX_POWER_OFFSET(MCSTxAgcOffset_A[4], priv->pshare->rf_ft_var.txPowerPlus_mcs_7);
ASSIGN_TX_POWER_OFFSET(MCSTxAgcOffset_A[5], priv->pshare->rf_ft_var.txPowerPlus_mcs_6);
ASSIGN_TX_POWER_OFFSET(MCSTxAgcOffset_A[6], priv->pshare->rf_ft_var.txPowerPlus_mcs_5);
ASSIGN_TX_POWER_OFFSET(MCSTxAgcOffset_A[7], priv->pshare->rf_ft_var.txPowerPlus_mcs_4);
ASSIGN_TX_POWER_OFFSET(MCSTxAgcOffset_B[4], priv->pshare->rf_ft_var.txPowerPlus_mcs_7);
ASSIGN_TX_POWER_OFFSET(MCSTxAgcOffset_B[5], priv->pshare->rf_ft_var.txPowerPlus_mcs_6);
ASSIGN_TX_POWER_OFFSET(MCSTxAgcOffset_B[6], priv->pshare->rf_ft_var.txPowerPlus_mcs_5);
ASSIGN_TX_POWER_OFFSET(MCSTxAgcOffset_B[7], priv->pshare->rf_ft_var.txPowerPlus_mcs_4);
ASSIGN_TX_POWER_OFFSET(MCSTxAgcOffset_A[8], priv->pshare->rf_ft_var.txPowerPlus_mcs_11);
ASSIGN_TX_POWER_OFFSET(MCSTxAgcOffset_A[9], priv->pshare->rf_ft_var.txPowerPlus_mcs_10);
ASSIGN_TX_POWER_OFFSET(MCSTxAgcOffset_A[10], priv->pshare->rf_ft_var.txPowerPlus_mcs_9);
ASSIGN_TX_POWER_OFFSET(MCSTxAgcOffset_A[11], priv->pshare->rf_ft_var.txPowerPlus_mcs_8);
ASSIGN_TX_POWER_OFFSET(MCSTxAgcOffset_B[8], priv->pshare->rf_ft_var.txPowerPlus_mcs_11);
ASSIGN_TX_POWER_OFFSET(MCSTxAgcOffset_B[9], priv->pshare->rf_ft_var.txPowerPlus_mcs_10);
ASSIGN_TX_POWER_OFFSET(MCSTxAgcOffset_B[10], priv->pshare->rf_ft_var.txPowerPlus_mcs_9);
ASSIGN_TX_POWER_OFFSET(MCSTxAgcOffset_B[11], priv->pshare->rf_ft_var.txPowerPlus_mcs_8);
ASSIGN_TX_POWER_OFFSET(MCSTxAgcOffset_A[12], priv->pshare->rf_ft_var.txPowerPlus_mcs_15);
ASSIGN_TX_POWER_OFFSET(MCSTxAgcOffset_A[13], priv->pshare->rf_ft_var.txPowerPlus_mcs_14);
ASSIGN_TX_POWER_OFFSET(MCSTxAgcOffset_A[14], priv->pshare->rf_ft_var.txPowerPlus_mcs_13);
ASSIGN_TX_POWER_OFFSET(MCSTxAgcOffset_A[15], priv->pshare->rf_ft_var.txPowerPlus_mcs_12);
ASSIGN_TX_POWER_OFFSET(MCSTxAgcOffset_B[12], priv->pshare->rf_ft_var.txPowerPlus_mcs_15);
ASSIGN_TX_POWER_OFFSET(MCSTxAgcOffset_B[13], priv->pshare->rf_ft_var.txPowerPlus_mcs_14);
ASSIGN_TX_POWER_OFFSET(MCSTxAgcOffset_B[14], priv->pshare->rf_ft_var.txPowerPlus_mcs_13);
ASSIGN_TX_POWER_OFFSET(MCSTxAgcOffset_B[15], priv->pshare->rf_ft_var.txPowerPlus_mcs_12);
printk("TXPWR_BY_CMD: OFDM = %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x \n",
priv->pshare->rf_ft_var.txPowerPlus_mcs_3,
priv->pshare->rf_ft_var.txPowerPlus_mcs_2,
priv->pshare->rf_ft_var.txPowerPlus_mcs_1,
priv->pshare->rf_ft_var.txPowerPlus_mcs_0,
priv->pshare->rf_ft_var.txPowerPlus_mcs_7,
priv->pshare->rf_ft_var.txPowerPlus_mcs_6,
priv->pshare->rf_ft_var.txPowerPlus_mcs_5,
priv->pshare->rf_ft_var.txPowerPlus_mcs_4,
priv->pshare->rf_ft_var.txPowerPlus_mcs_11,
priv->pshare->rf_ft_var.txPowerPlus_mcs_10,
priv->pshare->rf_ft_var.txPowerPlus_mcs_9,
priv->pshare->rf_ft_var.txPowerPlus_mcs_8,
priv->pshare->rf_ft_var.txPowerPlus_mcs_15,
priv->pshare->rf_ft_var.txPowerPlus_mcs_14,
priv->pshare->rf_ft_var.txPowerPlus_mcs_13,
priv->pshare->rf_ft_var.txPowerPlus_mcs_12);
}
}
#endif
static void dump_cck(struct rtl8192cd_priv *priv,
unsigned char pwrlevelCCK_A, unsigned char pwrlevelCCK_B,
char *CCKTxAgc_A, char *CCKTxAgc_B
)
{
char byte, byte1, byte2, byte3;
if (priv->pshare->rf_ft_var.cck_pwr_max)
{
printk("Use cck_pwr_max = %d\n", priv->pshare->rf_ft_var.cck_pwr_max);
byte = POWER_RANGE_CHECK(priv->pshare->rf_ft_var.cck_pwr_max);
printk("A_CCK1_Mcs32(0xe08): 0x----%02x--\n", byte);
printk("B_CCK5_1_Mcs32(0x838): 0x%02x%02x%02x--\n", byte, byte, byte);
printk("A_CCK11_2_B_CCK11(0x86c): 0x%02x%02x%02x%02x\n", byte, byte, byte, byte);
return;
}
if (pwrlevelCCK_A == 0) { // use default value
#ifdef HIGH_POWER_EXT_PA
if (priv->pshare->rf_ft_var.use_ext_pa)
byte = HP_CCK_POWER_DEFAULT;
else
#endif
byte = 0x24;
printk("Use default cck value = %d\n", byte);
pwrlevelCCK_A = pwrlevelCCK_B = byte;
byte = 0;
ASSIGN_TX_POWER_OFFSET(byte, priv->pshare->rf_ft_var.txPowerPlus_cck_1);
byte = POWER_RANGE_CHECK(pwrlevelCCK_A + byte);
printk("A_CCK1_Mcs32(0xe08): 0x----%02x--\n", byte);
byte = byte1 = byte2 = 0;
ASSIGN_TX_POWER_OFFSET(byte, priv->pshare->rf_ft_var.txPowerPlus_cck_1);
ASSIGN_TX_POWER_OFFSET(byte1, priv->pshare->rf_ft_var.txPowerPlus_cck_2);
ASSIGN_TX_POWER_OFFSET(byte2, priv->pshare->rf_ft_var.txPowerPlus_cck_5);
byte = POWER_RANGE_CHECK(pwrlevelCCK_B + byte);
byte1 = POWER_RANGE_CHECK(pwrlevelCCK_B + byte1);
byte2 = POWER_RANGE_CHECK(pwrlevelCCK_B + byte2);
printk("B_CCK5_1_Mcs32(0x838): 0x%02x%02x%02x--\n", byte2, byte1, byte);
byte = byte1 = byte2 = 0;
ASSIGN_TX_POWER_OFFSET(byte, priv->pshare->rf_ft_var.txPowerPlus_cck_2);
ASSIGN_TX_POWER_OFFSET(byte1, priv->pshare->rf_ft_var.txPowerPlus_cck_5);
ASSIGN_TX_POWER_OFFSET(byte2, priv->pshare->rf_ft_var.txPowerPlus_cck_11);
byte = POWER_RANGE_CHECK(pwrlevelCCK_A + byte);
byte1 = POWER_RANGE_CHECK(pwrlevelCCK_A + byte1);
byte2 = POWER_RANGE_CHECK(pwrlevelCCK_A + byte2);
printk("A_CCK11_2_B_CCK11(0x86c): 0x%02x%02x%02x%02x\n", byte2, byte1, byte, byte2);
return; // use default
}
byte = POWER_RANGE_CHECK(pwrlevelCCK_A + CCKTxAgc_A[3]);
printk("A_CCK1_Mcs32(0xe08): 0x----%02x--\n", byte);
byte = POWER_RANGE_CHECK(pwrlevelCCK_B + CCKTxAgc_B[1]);
byte1 = POWER_RANGE_CHECK(pwrlevelCCK_B + CCKTxAgc_B[2]);
byte2 = POWER_RANGE_CHECK(pwrlevelCCK_B + CCKTxAgc_B[3]);
printk("B_CCK5_1_Mcs32(0x838): 0x%02x%02x%02x--\n", byte, byte1, byte2);
byte = POWER_RANGE_CHECK(pwrlevelCCK_A + CCKTxAgc_A[0]);
byte1 = POWER_RANGE_CHECK(pwrlevelCCK_A + CCKTxAgc_A[1]);
byte2 = POWER_RANGE_CHECK(pwrlevelCCK_A + CCKTxAgc_A[2]);
byte3 = POWER_RANGE_CHECK(pwrlevelCCK_B + CCKTxAgc_B[0]);
printk("A_CCK11_2_B_CCK11(0x86c): 0x%02x%02x%02x%02x\n", byte, byte1, byte2, byte3);
return;
}
static void dump_ofdm_mcs0(struct rtl8192cd_priv *priv, int defValue,
unsigned char pwrlevelHT40_1S_A, unsigned char pwrlevelHT40_1S_B,
unsigned char pwrdiffHT40_2S, unsigned char pwrdiffHT20, unsigned char pwrdiffOFDM,
unsigned char pwrlevelHT40_1S_A_6dB, unsigned char pwrlevelHT40_1S_B_6dB,
unsigned char pwrdiffHT40_2S_6dB, unsigned char pwrdiffHT20_6dB,
char *MCSTxAgcOffset_A, char *MCSTxAgcOffset_B, char *OFDMTxAgcOffset_A, char *OFDMTxAgcOffset_B,
int phyBandSelect
)
{
s1Byte base, byte0, byte1, byte2, byte3;
unsigned char offset;
#ifdef USB_POWER_SUPPORT
s1Byte base_6dBm;
unsigned char offset_6dBm;
#endif
if (pwrlevelHT40_1S_A == 0)
{
#ifdef HIGH_POWER_EXT_PA
if (priv->pshare->rf_ft_var.use_ext_pa)
defValue = HP_OFDM_POWER_DEFAULT ;
#endif
printk("pwrlevelHT40_1S_A = 0, Use Default Value = %d\n", defValue);
base = defValue;
byte0 = byte1 = byte2 = byte3 = 0;
ASSIGN_TX_POWER_OFFSET(byte0, priv->pshare->rf_ft_var.txPowerPlus_ofdm_18);
ASSIGN_TX_POWER_OFFSET(byte1, priv->pshare->rf_ft_var.txPowerPlus_ofdm_12);
ASSIGN_TX_POWER_OFFSET(byte2, priv->pshare->rf_ft_var.txPowerPlus_ofdm_9);
ASSIGN_TX_POWER_OFFSET(byte3, priv->pshare->rf_ft_var.txPowerPlus_ofdm_6);
byte0 = POWER_RANGE_CHECK(base + byte0);
byte1 = POWER_RANGE_CHECK(base + byte1);
byte2 = POWER_RANGE_CHECK(base + byte2);
byte3 = POWER_RANGE_CHECK(base + byte3);
printk("A_Rate18_06(0xe00): 0x%02x%02x%02x%02x\n", byte0, byte1, byte2, byte3);
printk("B_Rate18_06(0x830): 0x%02x%02x%02x%02x\n", byte0, byte1, byte2, byte3);
byte0 = byte1 = byte2 = byte3 = 0;
ASSIGN_TX_POWER_OFFSET(byte0, priv->pshare->rf_ft_var.txPowerPlus_ofdm_54);
ASSIGN_TX_POWER_OFFSET(byte1, priv->pshare->rf_ft_var.txPowerPlus_ofdm_48);
ASSIGN_TX_POWER_OFFSET(byte2, priv->pshare->rf_ft_var.txPowerPlus_ofdm_36);
ASSIGN_TX_POWER_OFFSET(byte3, priv->pshare->rf_ft_var.txPowerPlus_ofdm_24);
byte0 = POWER_RANGE_CHECK(base + byte0);
byte1 = POWER_RANGE_CHECK(base + byte1);
byte2 = POWER_RANGE_CHECK(base + byte2);
byte3 = POWER_RANGE_CHECK(base + byte3);
printk("A_Rate54_24(0xe04): 0x%02x%02x%02x%02x\n", byte0, byte1, byte2, byte3);
printk("B_Rate54_24(0x834): 0x%02x%02x%02x%02x\n", byte0, byte1, byte2, byte3);
byte0 = byte1 = byte2 = byte3 = 0;
ASSIGN_TX_POWER_OFFSET(byte0, priv->pshare->rf_ft_var.txPowerPlus_mcs_3);
ASSIGN_TX_POWER_OFFSET(byte1, priv->pshare->rf_ft_var.txPowerPlus_mcs_2);
ASSIGN_TX_POWER_OFFSET(byte2, priv->pshare->rf_ft_var.txPowerPlus_mcs_1);
ASSIGN_TX_POWER_OFFSET(byte3, priv->pshare->rf_ft_var.txPowerPlus_mcs_0);
byte0 = POWER_RANGE_CHECK(base + byte0);
byte1 = POWER_RANGE_CHECK(base + byte1);
byte2 = POWER_RANGE_CHECK(base + byte2);
byte3 = POWER_RANGE_CHECK(base + byte3);
printk("A_Mcs03_Mcs00(0xe10): 0x%02x%02x%02x%02x\n", byte0, byte1, byte2, byte3);
printk("B_Mcs03_Mcs00(0x83c): 0x%02x%02x%02x%02x\n", byte0, byte1, byte2, byte3);
byte0 = byte1 = byte2 = byte3 = 0;
ASSIGN_TX_POWER_OFFSET(byte0, priv->pshare->rf_ft_var.txPowerPlus_mcs_7);
ASSIGN_TX_POWER_OFFSET(byte1, priv->pshare->rf_ft_var.txPowerPlus_mcs_6);
ASSIGN_TX_POWER_OFFSET(byte2, priv->pshare->rf_ft_var.txPowerPlus_mcs_5);
ASSIGN_TX_POWER_OFFSET(byte3, priv->pshare->rf_ft_var.txPowerPlus_mcs_4);
byte0 = POWER_RANGE_CHECK(base + byte0);
byte1 = POWER_RANGE_CHECK(base + byte1);
byte2 = POWER_RANGE_CHECK(base + byte2);
byte3 = POWER_RANGE_CHECK(base + byte3);
printk("A_Mcs07_Mcs04(0xe14): 0x%02x%02x%02x%02x\n", byte0, byte1, byte2, byte3);
printk("B_Mcs07_Mcs04(0x848): 0x%02x%02x%02x%02x\n", byte0, byte1, byte2, byte3);
//_TXPWR_REDEFINE
#ifdef USB_POWER_SUPPORT
byte0 = byte1 = byte2 = byte3 = -USB_HT_2S_DIFF;
#else
byte0 = byte1 = byte2 = byte3 = 0;
ASSIGN_TX_POWER_OFFSET(byte0, priv->pshare->rf_ft_var.txPowerPlus_mcs_11);
ASSIGN_TX_POWER_OFFSET(byte1, priv->pshare->rf_ft_var.txPowerPlus_mcs_10);
ASSIGN_TX_POWER_OFFSET(byte2, priv->pshare->rf_ft_var.txPowerPlus_mcs_9);
ASSIGN_TX_POWER_OFFSET(byte3, priv->pshare->rf_ft_var.txPowerPlus_mcs_8);
#endif
byte0 = POWER_RANGE_CHECK(base + byte0);
byte1 = POWER_RANGE_CHECK(base + byte1);
byte2 = POWER_RANGE_CHECK(base + byte2);
byte3 = POWER_RANGE_CHECK(base + byte3);
printk("A_Mcs11_Mcs08(0xe18): 0x%02x%02x%02x%02x\n",byte0, byte1, byte2, byte3);
printk("B_Mcs11_Mcs08(0x84c): 0x%02x%02x%02x%02x\n",byte0, byte1, byte2, byte3);
//_TXPWR_REDEFINE
#ifdef USB_POWER_SUPPORT
byte0 = byte1 = byte2 = byte3 = -USB_HT_2S_DIFF;
#else
byte0 = byte1 = byte2 = byte3 = 0;
ASSIGN_TX_POWER_OFFSET(byte0, priv->pshare->rf_ft_var.txPowerPlus_mcs_15);
ASSIGN_TX_POWER_OFFSET(byte1, priv->pshare->rf_ft_var.txPowerPlus_mcs_14);
ASSIGN_TX_POWER_OFFSET(byte2, priv->pshare->rf_ft_var.txPowerPlus_mcs_13);
ASSIGN_TX_POWER_OFFSET(byte3, priv->pshare->rf_ft_var.txPowerPlus_mcs_12);
#endif
byte0 = POWER_RANGE_CHECK(base + byte0);
byte1 = POWER_RANGE_CHECK(base + byte1);
byte2 = POWER_RANGE_CHECK(base + byte2);
byte3 = POWER_RANGE_CHECK(base + byte3);
printk("A_Mcs15_Mcs12(0xe1c): 0x%02x%02x%02x%02x\n",byte0, byte1, byte2, byte3);
printk("B_Mcs15_Mcs12(0x868): 0x%02x%02x%02x%02x\n",byte0, byte1, byte2, byte3);
return; // use default
}
else
{
//===PATH A===
//OFDM
base = pwrlevelHT40_1S_A;
offset = (pwrdiffOFDM & 0x0f);
#if defined(CONFIG_RTL_92D_SUPPORT)&& defined(CONFIG_RTL_92D_DMDP)
//_TXPWR_REDEFINE??
if (priv->pmib->dot11RFEntry.macPhyMode==DUALMAC_DUALPHY && priv->pshare->wlandev_idx == 1) {
offset = ((pwrdiffOFDM & 0xf0) >> 4);
}
#endif
base = COUNT_SIGN_OFFSET(base, offset);
byte0 = POWER_RANGE_CHECK(base + OFDMTxAgcOffset_A[0]);
byte1 = POWER_RANGE_CHECK(base + OFDMTxAgcOffset_A[1]);
byte2 = POWER_RANGE_CHECK(base + OFDMTxAgcOffset_A[2]);
byte3 = POWER_RANGE_CHECK(base + OFDMTxAgcOffset_A[3]);
printk("A_Rate18_06(0xe00): 0x%02x%02x%02x%02x\n", byte0, byte1, byte2, byte3);
byte0 = POWER_RANGE_CHECK(base + OFDMTxAgcOffset_A[4]);
byte1 = POWER_RANGE_CHECK(base + OFDMTxAgcOffset_A[5]);
byte2 = POWER_RANGE_CHECK(base + OFDMTxAgcOffset_A[6]);
byte3 = POWER_RANGE_CHECK(base + OFDMTxAgcOffset_A[7]);
printk("A_Rate54_24(0xe04): 0x%02x%02x%02x%02x\n", byte0, byte1, byte2, byte3);
//MCS 0 - 7
base = pwrlevelHT40_1S_A;
if (priv->pshare->CurrentChannelBW == HT_CHANNEL_WIDTH_20) {
offset = (pwrdiffHT20 & 0x0f);
#if defined(CONFIG_RTL_92D_SUPPORT)&& defined(CONFIG_RTL_92D_DMDP)
//_TXPWR_REDEFINE??
if (priv->pmib->dot11RFEntry.macPhyMode==DUALMAC_DUALPHY && priv->pshare->wlandev_idx == 1) {
offset = ((pwrdiffHT20 & 0xf0) >> 4);
}
#endif
base = COUNT_SIGN_OFFSET(base, offset);
}
byte0 = POWER_RANGE_CHECK(base + MCSTxAgcOffset_A[0]);
byte1 = POWER_RANGE_CHECK(base + MCSTxAgcOffset_A[1]);
byte2 = POWER_RANGE_CHECK(base + MCSTxAgcOffset_A[2]);
byte3 = POWER_RANGE_CHECK(base + MCSTxAgcOffset_A[3]);
printk("A_Mcs03_Mcs00(0xe10): 0x%02x%02x%02x%02x\n", byte0, byte1, byte2, byte3);
byte0 = POWER_RANGE_CHECK(base + MCSTxAgcOffset_A[4]);
byte1 = POWER_RANGE_CHECK(base + MCSTxAgcOffset_A[5]);
byte2 = POWER_RANGE_CHECK(base + MCSTxAgcOffset_A[6]);
byte3 = POWER_RANGE_CHECK(base + MCSTxAgcOffset_A[7]);
printk("A_Mcs07_Mcs04(0xe14): 0x%02x%02x%02x%02x\n", byte0, byte1, byte2, byte3);
offset = (pwrdiffHT40_2S & 0x0f);
#if defined(CONFIG_RTL_92D_SUPPORT)&& defined(CONFIG_RTL_92D_DMDP)
//_TXPWR_REDEFINE??
if (priv->pmib->dot11RFEntry.macPhyMode==DUALMAC_DUALPHY && priv->pshare->wlandev_idx == 1) {
offset = ((pwrdiffHT40_2S & 0xf0) >> 4);
}
#endif
base = COUNT_SIGN_OFFSET(base, offset);
//MCS 8 -12
#ifdef USB_POWER_SUPPORT
base_6dBm = pwrlevelHT40_1S_A_6dB;
if (priv->pshare->CurrentChannelBW == HT_CHANNEL_WIDTH_20)
{
offset_6dBm = (pwrdiffHT20_6dB & 0x0f);
#if defined(CONFIG_RTL_92D_SUPPORT)&& defined(CONFIG_RTL_92D_DMDP)
if (priv->pmib->dot11RFEntry.macPhyMode==DUALMAC_DUALPHY && priv->pshare->wlandev_idx == 1) {
offset_6dBm = ((pwrdiffHT20_6dB & 0xf0) >> 4);
}
#endif
base_6dBm = COUNT_SIGN_OFFSET(base_6dBm, offset_6dBm);
}
offset_6dBm = (pwrdiffHT40_2S_6dB & 0x0f);
#if defined(CONFIG_RTL_92D_SUPPORT)&& defined(CONFIG_RTL_92D_DMDP)
if (priv->pmib->dot11RFEntry.macPhyMode==DUALMAC_DUALPHY && priv->pshare->wlandev_idx == 1) {
offset_6dBm = ((pwrdiffHT40_2S_6dB & 0xf0) >> 4);
}
#endif
base_6dBm = COUNT_SIGN_OFFSET(base_6dBm, offset_6dBm);
if ((pwrlevelHT40_1S_A_6dB!= 0) && (pwrlevelHT40_1S_A_6dB!= pwrlevelHT40_1S_A))
byte0 = byte1 = byte2 = byte3 = base_6dBm;
else if((base - USB_HT_2S_DIFF) > 0)
byte0 = byte1 = byte2 = byte3 = POWER_RANGE_CHECK(base - USB_HT_2S_DIFF);
else
byte0 = byte1 = byte2 = byte3 = POWER_RANGE_CHECK(defValue - USB_HT_2S_DIFF);
printk("A_Mcs11_Mcs08(0xe18): 0x%02x%02x%02x%02x\n", byte0, byte1, byte2, byte3);
if ((pwrlevelHT40_1S_A_6dB != 0) && (pwrlevelHT40_1S_A_6dB != pwrlevelHT40_1S_A))
byte0 = byte1 = byte2 = byte3 = base_6dBm;
else if((base - USB_HT_2S_DIFF) > 0)
byte0 = byte1 = byte2 = byte3 = POWER_RANGE_CHECK(base - USB_HT_2S_DIFF);
else
byte0 = byte1 = byte2 = byte3 = POWER_RANGE_CHECK(defValue - USB_HT_2S_DIFF);
printk("A_Mcs15_Mcs12(0xe1c): 0x%02x%02x%02x%02x\n", byte0, byte1, byte2, byte3);
#else
byte0 = POWER_RANGE_CHECK(base + priv->pshare->phw->MCSTxAgcOffset_A[8]);
byte1 = POWER_RANGE_CHECK(base + priv->pshare->phw->MCSTxAgcOffset_A[9]);
byte2 = POWER_RANGE_CHECK(base + priv->pshare->phw->MCSTxAgcOffset_A[10]);
byte3 = POWER_RANGE_CHECK(base + priv->pshare->phw->MCSTxAgcOffset_A[11]);
printk("A_Mcs11_Mcs08(0xe18): 0x%02x%02x%02x%02x\n",byte0, byte1, byte2, byte3);
byte0 = POWER_RANGE_CHECK(base + priv->pshare->phw->MCSTxAgcOffset_A[12]);
byte1 = POWER_RANGE_CHECK(base + priv->pshare->phw->MCSTxAgcOffset_A[13]);
byte2 = POWER_RANGE_CHECK(base + priv->pshare->phw->MCSTxAgcOffset_A[14]);
byte3 = POWER_RANGE_CHECK(base + priv->pshare->phw->MCSTxAgcOffset_A[15]);
printk("A_Mcs15_Mcs12(0xe1c): 0x%02x%02x%02x%02x\n",byte0, byte1, byte2, byte3);
#endif
//===PATH B===
if (pwrlevelHT40_1S_B == 0)
pwrlevelHT40_1S_B = defValue;
//OFDM
base = pwrlevelHT40_1S_B;
offset = ((pwrdiffOFDM & 0xf0) >> 4);
base = COUNT_SIGN_OFFSET(base, offset);
byte0 = POWER_RANGE_CHECK(base + OFDMTxAgcOffset_B[0]);
byte1 = POWER_RANGE_CHECK(base + OFDMTxAgcOffset_B[1]);
byte2 = POWER_RANGE_CHECK(base + OFDMTxAgcOffset_B[2]);
byte3 = POWER_RANGE_CHECK(base + OFDMTxAgcOffset_B[3]);
printk("B_Rate18_06(0x830): 0x%02x%02x%02x%02x\n", byte0, byte1, byte2, byte3);
byte0 = POWER_RANGE_CHECK(base + OFDMTxAgcOffset_B[4]);
byte1 = POWER_RANGE_CHECK(base + OFDMTxAgcOffset_B[5]);
byte2 = POWER_RANGE_CHECK(base + OFDMTxAgcOffset_B[6]);
byte3 = POWER_RANGE_CHECK(base + OFDMTxAgcOffset_B[7]);
printk("B_Rate54_24(0x834): 0x%02x%02x%02x%02x\n", byte0, byte1, byte2, byte3);
//MCS 0 - 7
base = pwrlevelHT40_1S_B;
if (priv->pshare->CurrentChannelBW == HT_CHANNEL_WIDTH_20) {
offset = ((pwrdiffHT20 & 0xf0) >> 4);
base = COUNT_SIGN_OFFSET(base, offset);
}
byte0 = POWER_RANGE_CHECK(base + MCSTxAgcOffset_B[0]);
byte1 = POWER_RANGE_CHECK(base + MCSTxAgcOffset_B[1]);
byte2 = POWER_RANGE_CHECK(base + MCSTxAgcOffset_B[2]);
byte3 = POWER_RANGE_CHECK(base + MCSTxAgcOffset_B[3]);
printk("B_Mcs03_Mcs00(0x83c): 0x%02x%02x%02x%02x\n", byte0, byte1, byte2, byte3);
byte0 = POWER_RANGE_CHECK(base + MCSTxAgcOffset_B[4]);
byte1 = POWER_RANGE_CHECK(base + MCSTxAgcOffset_B[5]);
byte2 = POWER_RANGE_CHECK(base + MCSTxAgcOffset_B[6]);
byte3 = POWER_RANGE_CHECK(base + MCSTxAgcOffset_B[7]);
printk("B_Mcs07_Mcs04(0x848): 0x%02x%02x%02x%02x\n", byte0, byte1, byte2, byte3);
offset = ((pwrdiffHT40_2S & 0xf0) >> 4);
base = COUNT_SIGN_OFFSET(base, offset);
//MCS 8 -12
#ifdef USB_POWER_SUPPORT
base_6dBm = pwrlevelHT40_1S_B_6dB;
if (priv->pshare->CurrentChannelBW == HT_CHANNEL_WIDTH_20) {
offset_6dBm = ((pwrdiffHT20_6dB & 0xf0) >> 4);
base_6dBm = COUNT_SIGN_OFFSET(base_6dBm, offset_6dBm);
}
offset_6dBm = ((pwrdiffHT40_2S_6dB& 0xf0) >> 4);
base_6dBm = COUNT_SIGN_OFFSET(base_6dBm, offset_6dBm);
if ((pwrlevelHT40_1S_B_6dB!= 0) && (pwrlevelHT40_1S_B_6dB!= pwrlevelHT40_1S_B))
byte0 = byte1 = byte2 = byte3 = base_6dBm;
else if((base - USB_HT_2S_DIFF) > 0)
byte0 = byte1 = byte2 = byte3 = POWER_RANGE_CHECK(base - USB_HT_2S_DIFF);
else
byte0 = byte1 = byte2 = byte3 = POWER_RANGE_CHECK(defValue - USB_HT_2S_DIFF);
printk("B_Mcs11_Mcs08(0x84c): 0x%02x%02x%02x%02x\n",byte0, byte1, byte2, byte3);
if ((pwrlevelHT40_1S_B_6dB != 0) && (pwrlevelHT40_1S_B_6dB != pwrlevelHT40_1S_B))
byte0 = byte1 = byte2 = byte3 = base_6dBm;
else if((base - USB_HT_2S_DIFF) > 0)
byte0 = byte1 = byte2 = byte3 = POWER_RANGE_CHECK(base - USB_HT_2S_DIFF);
else
byte0 = byte1 = byte2 = byte3 = POWER_RANGE_CHECK(defValue - USB_HT_2S_DIFF);
printk("B_Mcs15_Mcs12(0x868): 0x%02x%02x%02x%02x\n",byte0, byte1, byte2, byte3);
#else
byte0 = POWER_RANGE_CHECK(base + priv->pshare->phw->MCSTxAgcOffset_B[8]);
byte1 = POWER_RANGE_CHECK(base + priv->pshare->phw->MCSTxAgcOffset_B[9]);
byte2 = POWER_RANGE_CHECK(base + priv->pshare->phw->MCSTxAgcOffset_B[10]);
byte3 = POWER_RANGE_CHECK(base + priv->pshare->phw->MCSTxAgcOffset_B[11]);
printk("B_Mcs11_Mcs08(0x84c): 0x%02x%02x%02x%02x\n",byte0, byte1, byte2, byte3);
byte0 = POWER_RANGE_CHECK(base + priv->pshare->phw->MCSTxAgcOffset_B[12]);
byte1 = POWER_RANGE_CHECK(base + priv->pshare->phw->MCSTxAgcOffset_B[13]);
byte2 = POWER_RANGE_CHECK(base + priv->pshare->phw->MCSTxAgcOffset_B[14]);
byte3 = POWER_RANGE_CHECK(base + priv->pshare->phw->MCSTxAgcOffset_B[15]);
printk("B_Mcs15_Mcs12(0x868): 0x%02x%02x%02x%02x\n",byte0, byte1, byte2, byte3);
return;
#endif
}
}
static void txpwr_dump(struct rtl8192cd_priv *priv, int start, int end)
{
int channel = 0;
int tmp = 0;
int defValue = 0x28;
unsigned int phyBandSelect;
char pwrlevelCCK_A = 0;
char pwrlevelCCK_B = 0;
unsigned char pwrlevelHT40_1S_A = 0;
unsigned char pwrlevelHT40_1S_B = 0;
unsigned char pwrdiffHT40_2S = 0;
unsigned char pwrdiffHT20 = 0;
unsigned char pwrdiffOFDM = 0;
#if 1 // USB_POWER_SUPPORT
unsigned char pwrlevelHT40_1S_A_6dB = 0;
unsigned char pwrlevelHT40_1S_B_6dB = 0;
unsigned char pwrdiffHT40_2S_6dB = 0;
unsigned char pwrdiffHT20_6dB = 0;
#endif
int pg_tbl_idx = 0;
int PHYREG_PG = 4;
char MCSTxAgcOffset_A[16];
char MCSTxAgcOffset_B[16];
char OFDMTxAgcOffset_A[8];
char OFDMTxAgcOffset_B[8];
//_TXPWR_REDEFINE ?? int or char ??
char CCKTxAgc_A[4];
char CCKTxAgc_B[4];
#ifdef TXPWR_LMT
unsigned int tgpwr_CCK = 0;
unsigned int tgpwr_OFDM = 0;
unsigned int txpwr_lmt_CCK = 0;
unsigned int txpwr_lmt_OFDM = 0;
unsigned int tgpwr_HT1S = 0;
unsigned int tgpwr_HT2S = 0;
unsigned int txpwr_lmt_HT1S = 0;
unsigned int txpwr_lmt_HT2S = 0;
int i;
int max_idx;
#endif
if(end <= 14)
phyBandSelect = PHY_BAND_2G;
else
phyBandSelect = PHY_BAND_5G;
#ifdef CONFIG_RTL_92D_SUPPORT
if (GET_CHIP_VER(priv)==VERSION_8192D) {
#if defined(CONFIG_RTL_8198) || defined(CONFIG_RTL_819XD) || defined(CONFIG_RTL_8196E)
if (phyBandSelect & PHY_BAND_5G)
defValue=0x28;
else
defValue=0x2d;
#else
if (phyBandSelect & PHY_BAND_5G)
defValue=0x26;
else
defValue=0x30;
#endif
}
#endif
if(start > end)
{
printk("Error! start = %d < end = %d\n", start, end);
}
else if (end <= 14)
{
for(channel = start; channel <= end; channel++ ) //_TXPWR_REDEFINE ?? DO NOT PRINT TOO MUCH
{
printk("\n[CHANNEL%03d]", channel);
printk("\n");
//===GET FROM FLASH===
pwrlevelCCK_A = priv->pmib->dot11RFEntry.pwrlevelCCK_A[channel-1];
pwrlevelCCK_B = priv->pmib->dot11RFEntry.pwrlevelCCK_B[channel-1];
pwrlevelHT40_1S_A = priv->pmib->dot11RFEntry.pwrlevelHT40_1S_A[channel-1];
pwrlevelHT40_1S_B = priv->pmib->dot11RFEntry.pwrlevelHT40_1S_B[channel-1];
pwrdiffHT40_2S = priv->pmib->dot11RFEntry.pwrdiffHT40_2S[channel-1];
pwrdiffHT20 = priv->pmib->dot11RFEntry.pwrdiffHT20[channel-1];
pwrdiffOFDM = priv->pmib->dot11RFEntry.pwrdiffOFDM[channel-1];
#ifdef USB_POWER_SUPPORT
printk(">>FLASH - 13dBm<<\n");
#endif
printk("pwrlevelCCK_A = %d, pwrlevelCCK_B = %d\n", pwrlevelCCK_A, pwrlevelCCK_B);
printk("pwrlevelHT40_1S_A = %d, pwrlevelHT40_1S_B = %d\n", pwrlevelHT40_1S_A, pwrlevelHT40_1S_B);
printk("pwrdiffHT40_2S = %d(0x%02x), pwrdiffHT20 = %d(0x%02x), pwrdiffOFDM = %d(0x%02x)\n",
pwrdiffHT40_2S, pwrdiffHT40_2S,
pwrdiffHT20, pwrdiffHT20,
pwrdiffOFDM, pwrdiffOFDM);
#ifdef USB_POWER_SUPPORT
printk(">>FLASH - 6dBm<<\n");
pwrlevelHT40_1S_A_6dB = priv->pmib->dot11RFEntry.pwrlevel5GHT40_1S_A[channel-1];
pwrlevelHT40_1S_B_6dB = priv->pmib->dot11RFEntry.pwrlevel5GHT40_1S_B[channel-1];
pwrdiffHT40_2S_6dB = priv->pmib->dot11RFEntry.pwrdiff5GHT40_2S[channel-1];
pwrdiffHT20_6dB = priv->pmib->dot11RFEntry.pwrdiff5GHT20[channel-1];
printk("pwrlevelHT40_1S_A = %d, pwrlevelHT40_1S_B = %d\n", pwrlevelHT40_1S_A_6dB, pwrlevelHT40_1S_B_6dB);
printk("pwrdiffHT40_2S = %d(0x%02x), pwrdiffHT20 = %d(0x%02x)\n",
pwrdiffHT40_2S_6dB, pwrdiffHT40_2S_6dB,
pwrdiffHT20_6dB, pwrdiffHT20_6dB);
#endif
#if defined(CONFIG_RTL_92D_SUPPORT) && defined(CONFIG_RTL_92D_DMDP)
if (GET_CHIP_VER(priv)==VERSION_8192D) {
if (priv->pmib->dot11RFEntry.macPhyMode==DUALMAC_DUALPHY && priv->pshare->wlandev_idx == 1) {
printk("92D-DMDP WLAN1 , Set pwrlevelCCK_A = pwrlevelCCK_B\n");
if (phyBandSelect & PHY_BAND_2G)
pwrlevelCCK_A = priv->pmib->dot11RFEntry.pwrlevelCCK_B[channel-1];
}
}
#endif
#ifdef CONFIG_RTL_92D_DMDP//_Eric ?? Get chip ??
if (priv->pmib->dot11RFEntry.macPhyMode==DUALMAC_DUALPHY && priv->pshare->wlandev_idx == 1)
{
printk("92D-DMDP WLAN1, Set pwrlevelHT40_1S_A = pwrlevelHT40_1S_B\n");
if (phyBandSelect & PHY_BAND_5G)
{
pwrlevelHT40_1S_A = priv->pmib->dot11RFEntry.pwrlevel5GHT40_1S_B[channel-1];
}
else
{
pwrlevelHT40_1S_A = priv->pmib->dot11RFEntry.pwrlevelHT40_1S_B[channel-1];
}
#ifdef USB_POWER_SUPPORT
if (phyBandSelect & PHY_BAND_5G)
{
pwrlevelHT40_1S_A_6dB= priv->pmib->dot11RFEntry.pwrlevel5GHT40_1S_B[channel];
}
else
{
pwrlevelHT40_1S_A_6dB= priv->pmib->dot11RFEntry.pwrlevel5GHT40_1S_B[channel-1];
}
#endif
}
#endif
//===POWER BY RATE===
printk(">>Power By Rate Table<<\n");
pg_tbl_idx = 0;
#ifdef CONFIG_RTL_92D_SUPPORT
if (GET_CHIP_VER(priv) == VERSION_8192D) {
if (priv->pshare->is_40m_bw == 0) {
if (channel<=3)
pg_tbl_idx = BGN_20_CH1_3;
else if (channel<=9)
pg_tbl_idx = BGN_20_CH4_9;
else
pg_tbl_idx = BGN_20_CH10_14;
} else {
if (channel<=3)
pg_tbl_idx = BGN_40_CH1_3;
else if (channel<=9)
pg_tbl_idx = BGN_40_CH4_9;
else
pg_tbl_idx = BGN_40_CH10_14;
}
}
#ifdef MP_TEST
//In Noraml Driver mode, and if mib 'pwr_by_rate' = 0 >> Use default power by rate table
if( (priv->pshare->rf_ft_var.mp_specific == 0) && (priv->pshare->rf_ft_var.pwr_by_rate == 0) )
pg_tbl_idx = BGN_2040_ALL;
#endif
#endif
printk("pg_tbl_idx = %d\n", pg_tbl_idx);
Read_PG_File(priv, PHYREG_PG, pg_tbl_idx,
MCSTxAgcOffset_A, MCSTxAgcOffset_B,
OFDMTxAgcOffset_A, OFDMTxAgcOffset_B,
CCKTxAgc_A, CCKTxAgc_B);
printk("MCSTxAgcOffset_A - ");
for(tmp = 0; tmp <16; tmp ++)
printk("%02x ", MCSTxAgcOffset_A[tmp]);
printk("\n");
printk("MCSTxAgcOffset_B - ");
for(tmp = 0; tmp <16; tmp ++)
printk("%02x ", MCSTxAgcOffset_B[tmp]);
printk("\n");
printk("OFDMTxAgcOffset_A - ");
for(tmp = 0; tmp <8; tmp ++)
printk("%02x ", OFDMTxAgcOffset_A[tmp]);
printk("\n");
printk("OFDMTxAgcOffset_B - ");
for(tmp = 0; tmp <8; tmp ++)
printk("%02x ", OFDMTxAgcOffset_B[tmp]);
printk("\n");
printk("CCKTxAgc_A - ");
for(tmp = 0; tmp <4; tmp ++)
printk("%02x ", CCKTxAgc_A[tmp]);
printk("\n");
printk("CCKTxAgc_B - ");
for(tmp = 0; tmp <4; tmp ++)
printk("%02x ", CCKTxAgc_B[tmp]);
printk("\n");
#ifdef ADD_TX_POWER_BY_CMD
check_txpwr_by_cmd(priv, MCSTxAgcOffset_A, MCSTxAgcOffset_B,
OFDMTxAgcOffset_A, OFDMTxAgcOffset_B, CCKTxAgc_A, CCKTxAgc_B);
#endif
//===Count FLASH + POWER BY RATE===
printk(">>Tx Power - Power By Rate<<\n");
dump_cck(priv, pwrlevelCCK_A, pwrlevelCCK_B, CCKTxAgc_A, CCKTxAgc_B);
dump_ofdm_mcs0(priv, defValue, pwrlevelHT40_1S_A, pwrlevelHT40_1S_B,
pwrdiffHT40_2S, pwrdiffHT20, pwrdiffOFDM,
pwrlevelHT40_1S_A_6dB, pwrlevelHT40_1S_B_6dB,
pwrdiffHT40_2S_6dB, pwrdiffHT20_6dB,
MCSTxAgcOffset_A, MCSTxAgcOffset_B, OFDMTxAgcOffset_A, OFDMTxAgcOffset_B,phyBandSelect);
#ifdef TXPWR_LMT
//===BAND EDGE LIMIT===
if (priv->pshare->rf_ft_var.disable_txpwrlmt)
continue;
printk(">>Band Edge Limit Table<<\n");
tmp = ch2idx(channel);
txpwr_lmt_CCK = priv->pshare->ch_pwr_lmtCCK[tmp];
txpwr_lmt_OFDM = priv->pshare->ch_pwr_lmtOFDM[tmp];
tgpwr_CCK = priv->pshare->ch_tgpwr_CCK[tmp];
tgpwr_OFDM = priv->pshare->ch_tgpwr_OFDM[tmp];
printk("txpwr_lmt_CCK = %d tgpwr_CCK = %d\n", txpwr_lmt_CCK, tgpwr_CCK);
printk("txpwr_lmt_OFDM = %d tgpwr_OFDM = %d\n", txpwr_lmt_OFDM, tgpwr_OFDM);
if (priv->pshare->is_40m_bw == 0)
{
txpwr_lmt_HT1S = priv->pshare->ch_pwr_lmtHT20_1S[tmp];
txpwr_lmt_HT2S = priv->pshare->ch_pwr_lmtHT20_2S[tmp];
tgpwr_HT1S = priv->pshare->ch_tgpwr_HT20_1S[tmp];
tgpwr_HT2S = priv->pshare->ch_tgpwr_HT20_2S[tmp];
printk("txpwr_lmt_HT1S_20M = %d tgpwr_HT1S_20M = %d\n", txpwr_lmt_HT1S, tgpwr_HT1S);
printk("txpwr_lmt_HT2S_20M = %d tgpwr_HT2S_20M = %d\n", txpwr_lmt_HT2S, tgpwr_HT2S);
}
else
{
txpwr_lmt_HT1S = priv->pshare->ch_pwr_lmtHT40_1S[tmp];
txpwr_lmt_HT2S = priv->pshare->ch_pwr_lmtHT40_2S[tmp];
tgpwr_HT1S = priv->pshare->ch_tgpwr_HT40_1S[tmp];
tgpwr_HT2S = priv->pshare->ch_tgpwr_HT40_2S[tmp];
printk("txpwr_lmt_HT1S_40M = %d tgpwr_HT1S_40M = %d\n", txpwr_lmt_HT1S, tgpwr_HT1S);
printk("txpwr_lmt_HT2S_40M = %d tgpwr_HT2S_40M = %d\n", txpwr_lmt_HT2S, tgpwr_HT2S);
}
//===Count FLASH + min{POWER BY RATE, LIMIT}===
if((txpwr_lmt_CCK == 0) && (txpwr_lmt_OFDM == 0)
&& (txpwr_lmt_HT1S == 0) && (txpwr_lmt_HT1S == 0))
{
printk("No Band Edge Limit for this channel=%d\n", channel);
continue;
}
if (txpwr_lmt_CCK || tgpwr_CCK){
max_idx=255;
}else{
max_idx = (txpwr_lmt_CCK - tgpwr_CCK);
}
for (i=0; i<=3; i++) {
CCKTxAgc_A[i] = POWER_MIN_CHECK(CCKTxAgc_A[i], max_idx);
CCKTxAgc_B[i] = POWER_MIN_CHECK(CCKTxAgc_B[i], max_idx);
}
dump_cck(priv, pwrlevelCCK_A, pwrlevelCCK_B, CCKTxAgc_A, CCKTxAgc_B);
if (!txpwr_lmt_OFDM || !tgpwr_OFDM){
max_idx=255;
}else{
max_idx = (txpwr_lmt_OFDM - tgpwr_OFDM);
}
for (i=0; i<=7; i++) {
OFDMTxAgcOffset_A[i] = POWER_MIN_CHECK(OFDMTxAgcOffset_A[i], max_idx);
OFDMTxAgcOffset_B[i] = POWER_MIN_CHECK(OFDMTxAgcOffset_B[i], max_idx);
}
if (!txpwr_lmt_HT1S || !tgpwr_HT1S){
max_idx = 255;
}else{
max_idx = (txpwr_lmt_HT1S - tgpwr_HT1S);
}
for (i=0; i<=7; i++) {
MCSTxAgcOffset_A[i] = POWER_MIN_CHECK(MCSTxAgcOffset_A[i], max_idx);
MCSTxAgcOffset_B[i] = POWER_MIN_CHECK(MCSTxAgcOffset_B[i], max_idx);
}
if (!txpwr_lmt_HT2S || !tgpwr_HT2S){
max_idx = 255;
}else{
max_idx = (txpwr_lmt_HT2S - tgpwr_HT2S);
}
for (i=8; i<=15; i++) {
MCSTxAgcOffset_A[i] = POWER_MIN_CHECK(MCSTxAgcOffset_A[i], max_idx);
MCSTxAgcOffset_B[i] = POWER_MIN_CHECK(MCSTxAgcOffset_B[i], max_idx);
}
dump_ofdm_mcs0(priv, defValue, pwrlevelHT40_1S_A, pwrlevelHT40_1S_B,
pwrdiffHT40_2S, pwrdiffHT20, pwrdiffOFDM,
pwrlevelHT40_1S_A_6dB, pwrlevelHT40_1S_B_6dB,
pwrdiffHT40_2S_6dB, pwrdiffHT20_6dB,
MCSTxAgcOffset_A, MCSTxAgcOffset_B, OFDMTxAgcOffset_A, OFDMTxAgcOffset_B,phyBandSelect);
#endif
}
}
else if (end <= 199)
{
for(channel = start; channel <= end; channel+=2 )
{
int ori_channel = channel;
printk("\n[CHANNEL%03d]", channel);
printk("\n");
//TXPWR_REDEFINE
//FLASH GROUP [36-99] [100-148] [149-165]
//Special Cases: [34-2, 34, 34+2, 36-2, 165+2]:No DATA , [149-2]:FLASH DATA OF Channel-146-6dBm
//Use Flash data of channel 36 & 140 & 165 for these special cases.
if((channel > 30) && (channel < 36))
channel = 36;
else if (channel == (149-2))
channel = 140;
else if(channel > 165)
channel = 165;
//===GET FROM FLASH===
#ifdef RTK_5G_SUPPORT
pwrlevelHT40_1S_A = priv->pmib->dot11RFEntry.pwrlevel5GHT40_1S_A[channel-1];
pwrlevelHT40_1S_B = priv->pmib->dot11RFEntry.pwrlevel5GHT40_1S_B[channel-1];
pwrdiffHT40_2S = priv->pmib->dot11RFEntry.pwrdiff5GHT40_2S[channel-1];
pwrdiffHT20 = priv->pmib->dot11RFEntry.pwrdiff5GHT20[channel-1];
pwrdiffOFDM = priv->pmib->dot11RFEntry.pwrdiff5GOFDM[channel-1];
#endif
#ifdef USB_POWER_SUPPORT
printk(">>Flash - 13dBm<<\n");
#endif
printk("pwrlevelHT40_1S_A = %d, pwrlevelHT40_1S_B = %d\n", pwrlevelHT40_1S_A, pwrlevelHT40_1S_B);
printk("pwrdiffHT40_2S = %d(0x%02x), pwrdiffHT20 = %d(0x%02x), pwrdiffOFDM = %d(0x%02x)\n",
pwrdiffHT40_2S, pwrdiffHT40_2S,
pwrdiffHT20, pwrdiffHT20,
pwrdiffOFDM, pwrdiffOFDM);
#ifdef USB_POWER_SUPPORT
printk(">>Flash - 6dBm<<\n");
pwrlevelHT40_1S_A_6dB = priv->pmib->dot11RFEntry.pwrlevel5GHT40_1S_A[channel];
pwrlevelHT40_1S_B_6dB = priv->pmib->dot11RFEntry.pwrlevel5GHT40_1S_B[channel];
pwrdiffHT40_2S_6dB = priv->pmib->dot11RFEntry.pwrdiff5GHT40_2S[channel];
pwrdiffHT20_6dB = priv->pmib->dot11RFEntry.pwrdiff5GHT20[channel];
printk("pwrlevelHT40_1S_A = %d, pwrlevelHT40_1S_B = %d\n", pwrlevelHT40_1S_A_6dB, pwrlevelHT40_1S_B_6dB);
printk("pwrdiffHT40_2S = %d(0x%02x), pwrdiffHT20 = %d(0x%02x)\n",
pwrdiffHT40_2S_6dB, pwrdiffHT40_2S_6dB,
pwrdiffHT20_6dB, pwrdiffHT20_6dB);
#endif
#ifdef CONFIG_RTL_92D_DMDP
if (priv->pmib->dot11RFEntry.macPhyMode==DUALMAC_DUALPHY && priv->pshare->wlandev_idx == 1)
{
printk("92D-DMDP WLAN1, Set pwrlevelHT40_1S_A = pwrlevelHT40_1S_B\n");
if (phyBandSelect & PHY_BAND_5G)
{
pwrlevelHT40_1S_A = priv->pmib->dot11RFEntry.pwrlevel5GHT40_1S_B[channel-1];
}
else
{
pwrlevelHT40_1S_A = priv->pmib->dot11RFEntry.pwrlevelHT40_1S_B[channel-1];
}
#ifdef USB_POWER_SUPPORT
if (phyBandSelect & PHY_BAND_5G)
{
pwrlevelHT40_1S_A_6dB= priv->pmib->dot11RFEntry.pwrlevel5GHT40_1S_B[channel];
}
else
{
pwrlevelHT40_1S_A_6dB= priv->pmib->dot11RFEntry.pwrlevel5GHT40_1S_B[channel-1];
}
#endif
}
#endif
channel = ori_channel;
//===POWER BY RATE===
printk(">>Power By Rate Table<<\n");
pg_tbl_idx = 0;
#ifdef CONFIG_RTL_92D_SUPPORT
if (GET_CHIP_VER(priv) == VERSION_8192D) {
if (priv->pshare->is_40m_bw == 0) {
if (channel<=99)
pg_tbl_idx = AN_20_CH_36_64;
else if (channel<=148)
pg_tbl_idx = AN_20_CH_100_140;
else
pg_tbl_idx = AN_20_CH_149_165;
} else {
if (channel<=99)
pg_tbl_idx = AN_40_CH_36_64;
else if (channel<=148)
pg_tbl_idx = AN_40_CH_100_140;
else
pg_tbl_idx = AN_40_CH_149_165;
}
}
#ifdef MP_TEST
//In Noraml Driver mode, and if mib 'pwr_by_rate' = 0 >> Use default power by rate table
if( (priv->pshare->rf_ft_var.mp_specific == 0) && (priv->pshare->rf_ft_var.pwr_by_rate == 0) )
pg_tbl_idx = BGN_2040_ALL;
#endif
#endif
printk("pg_tbl_idx = %d\n", pg_tbl_idx);
Read_PG_File(priv, PHYREG_PG, pg_tbl_idx,
MCSTxAgcOffset_A, MCSTxAgcOffset_B,
OFDMTxAgcOffset_A, OFDMTxAgcOffset_B,
CCKTxAgc_A, CCKTxAgc_B);
printk("MCSTxAgcOffset_A - ");
for(tmp = 0; tmp <16; tmp ++)
printk("%02x ", MCSTxAgcOffset_A[tmp]);
printk("\n");
printk("MCSTxAgcOffset_B - ");
for(tmp = 0; tmp <16; tmp ++)
printk("%02x ", MCSTxAgcOffset_B[tmp]);
printk("\n");
printk("OFDMTxAgcOffset_A - ");
for(tmp = 0; tmp <8; tmp ++)
printk("%02x ", OFDMTxAgcOffset_A[tmp]);
printk("\n");
printk("OFDMTxAgcOffset_B - ");
for(tmp = 0; tmp <8; tmp ++)
printk("%02x ", OFDMTxAgcOffset_B[tmp]);
printk("\n");
printk("CCKTxAgc_A - ");
for(tmp = 0; tmp <4; tmp ++)
printk("%02x ", CCKTxAgc_A[tmp]);
printk("\n");
printk("CCKTxAgc_B - ");
for(tmp = 0; tmp <4; tmp ++)
printk("%02x ", CCKTxAgc_B[tmp]);
printk("\n");
#ifdef ADD_TX_POWER_BY_CMD
check_txpwr_by_cmd(priv, MCSTxAgcOffset_A, MCSTxAgcOffset_B,
OFDMTxAgcOffset_A, OFDMTxAgcOffset_B, CCKTxAgc_A, CCKTxAgc_B);
#endif
//===Count FLASH + POWER BY RATE===
printk(">>Tx Power - Power By Rate<<\n");
dump_ofdm_mcs0(priv, defValue, pwrlevelHT40_1S_A, pwrlevelHT40_1S_B,
pwrdiffHT40_2S, pwrdiffHT20, pwrdiffOFDM,
pwrlevelHT40_1S_A_6dB, pwrlevelHT40_1S_B_6dB,
pwrdiffHT40_2S_6dB, pwrdiffHT20_6dB,
MCSTxAgcOffset_A, MCSTxAgcOffset_B, OFDMTxAgcOffset_A, OFDMTxAgcOffset_B, phyBandSelect);
#ifdef TXPWR_LMT
//===BAND EDGE LIMIT===
if (priv->pshare->rf_ft_var.disable_txpwrlmt)
continue;
printk(">>Band Edge Limit Table<<\n");
tmp = ch2idx(channel);
txpwr_lmt_CCK = priv->pshare->ch_pwr_lmtCCK[tmp];
txpwr_lmt_OFDM = priv->pshare->ch_pwr_lmtOFDM[tmp];
tgpwr_CCK = priv->pshare->ch_tgpwr_CCK[tmp];
tgpwr_OFDM = priv->pshare->ch_tgpwr_OFDM[tmp];
printk("txpwr_lmt_CCK = %d tgpwr_CCK = %d\n", txpwr_lmt_CCK, tgpwr_CCK);
printk("txpwr_lmt_OFDM = %d tgpwr_OFDM = %d\n", txpwr_lmt_OFDM, tgpwr_OFDM);
if (priv->pshare->is_40m_bw == 0)
{
txpwr_lmt_HT1S = priv->pshare->ch_pwr_lmtHT20_1S[tmp];
txpwr_lmt_HT2S = priv->pshare->ch_pwr_lmtHT20_2S[tmp];
tgpwr_HT1S = priv->pshare->ch_tgpwr_HT20_1S[tmp];
tgpwr_HT2S = priv->pshare->ch_tgpwr_HT20_2S[tmp];
printk("txpwr_lmt_HT1S_20M = %d tgpwr_HT1S_20M = %d\n", txpwr_lmt_HT1S, tgpwr_HT1S);
printk("txpwr_lmt_HT2S_20M = %d tgpwr_HT2S_20M = %d\n", txpwr_lmt_HT2S, tgpwr_HT2S);
}
else
{
txpwr_lmt_HT1S = priv->pshare->ch_pwr_lmtHT40_1S[tmp];
txpwr_lmt_HT2S = priv->pshare->ch_pwr_lmtHT40_2S[tmp];
tgpwr_HT1S = priv->pshare->ch_tgpwr_HT40_1S[tmp];
tgpwr_HT2S = priv->pshare->ch_tgpwr_HT40_2S[tmp];
printk("txpwr_lmt_HT1S_40M = %d tgpwr_HT1S_40M = %d\n", txpwr_lmt_HT1S, tgpwr_HT1S);
printk("txpwr_lmt_HT2S_40M = %d tgpwr_HT2S_40M = %d\n", txpwr_lmt_HT2S, tgpwr_HT2S);
}
//===Count FLASH + min{POWER BY RATE, LIMIT}===
if((txpwr_lmt_OFDM == 0) && (txpwr_lmt_HT1S == 0) && (txpwr_lmt_HT1S == 0))
{
printk("No Band Edge Limit for this channel=%d\n", channel);
continue;
}
if (!txpwr_lmt_OFDM || !tgpwr_OFDM){
max_idx=255;
}else{
max_idx = (txpwr_lmt_OFDM - tgpwr_OFDM);
}
for (i=0; i<=7; i++) {
OFDMTxAgcOffset_A[i] = POWER_MIN_CHECK(OFDMTxAgcOffset_A[i], max_idx);
OFDMTxAgcOffset_B[i] = POWER_MIN_CHECK(OFDMTxAgcOffset_B[i], max_idx);
}
if (!txpwr_lmt_HT1S || !tgpwr_HT1S){
max_idx = 255;
}else{
max_idx = (txpwr_lmt_HT1S - tgpwr_HT1S);
}
for (i=0; i<=7; i++) {
MCSTxAgcOffset_A[i] = POWER_MIN_CHECK(MCSTxAgcOffset_A[i], max_idx);
MCSTxAgcOffset_B[i] = POWER_MIN_CHECK(MCSTxAgcOffset_B[i], max_idx);
}
if (!txpwr_lmt_HT2S || !tgpwr_HT2S){
max_idx = 255;
}else{
max_idx = (txpwr_lmt_HT2S - tgpwr_HT2S);
}
for (i=8; i<=15; i++) {
MCSTxAgcOffset_A[i] = POWER_MIN_CHECK(MCSTxAgcOffset_A[i], max_idx);
MCSTxAgcOffset_B[i] = POWER_MIN_CHECK(MCSTxAgcOffset_B[i], max_idx);
}
dump_ofdm_mcs0(priv, defValue, pwrlevelHT40_1S_A, pwrlevelHT40_1S_B,
pwrdiffHT40_2S, pwrdiffHT20, pwrdiffOFDM,
pwrlevelHT40_1S_A_6dB, pwrlevelHT40_1S_B_6dB,
pwrdiffHT40_2S_6dB, pwrdiffHT20_6dB,
MCSTxAgcOffset_A, MCSTxAgcOffset_B, OFDMTxAgcOffset_A, OFDMTxAgcOffset_B, phyBandSelect);
#endif
}
}
}
#endif
#if defined(CONFIG_RTL_8812_SUPPORT) || defined(CONFIG_WLAN_HAL_8881A)
void reg_dump_8812(struct rtl8192cd_priv *priv)
{
panic_printk("Initial Gain, Sensitivity:\n");
panic_printk(" 0xC50: 0x%02x\n", RTL_R8(0xc50));
panic_printk(" 0xE50: 0x%02x\n", RTL_R8(0xe50));
panic_printk(" 0xC30: 0x%02x\n", RTL_R8(0xc30));
panic_printk(" 0xC87: 0x%02x\n", RTL_R8(0xc87));
panic_printk(" 0xA0A: 0x%02x\n", RTL_R8(0xa0a));
panic_printk("EDCA para:\n");
panic_printk(" VO(0x%03x): 0x%08x\n", EDCA_VO_PARA, RTL_R32(EDCA_VO_PARA));
panic_printk(" VI(0x%03x): 0x%08x\n", EDCA_VI_PARA, RTL_R32(EDCA_VI_PARA));
panic_printk(" BE(0x%03x): 0x%08x\n", EDCA_BE_PARA, RTL_R32(EDCA_BE_PARA));
panic_printk(" BK(0x%03x): 0x%08x\n", EDCA_BK_PARA, RTL_R32(EDCA_BK_PARA));
panic_printk("Tx power:\n");
panic_printk(" A_CCK11_CCK1(0x%03x): 0x%08x\n", rTxAGC_A_CCK11_CCK1_JAguar, RTL_R32(rTxAGC_A_CCK11_CCK1_JAguar));
panic_printk(" A_Rate18_06(0x%03x): 0x%08x\n", rTxAGC_A_Ofdm18_Ofdm6_JAguar, RTL_R32(rTxAGC_A_Ofdm18_Ofdm6_JAguar));
panic_printk(" A_Rate54_24(0x%03x): 0x%08x\n", rTxAGC_A_Ofdm54_Ofdm24_JAguar, RTL_R32(rTxAGC_A_Ofdm54_Ofdm24_JAguar));
panic_printk(" A_Mcs03_Mcs00(0x%03x): 0x%08x\n", rTxAGC_A_MCS3_MCS0_JAguar, RTL_R32(rTxAGC_A_MCS3_MCS0_JAguar));
panic_printk(" A_Mcs07_Mcs04(0x%03x): 0x%08x\n", rTxAGC_A_MCS7_MCS4_JAguar, RTL_R32(rTxAGC_A_MCS7_MCS4_JAguar));
panic_printk(" A_Mcs11_Mcs08(0x%03x): 0x%08x\n", rTxAGC_A_MCS11_MCS8_JAguar, RTL_R32(rTxAGC_A_MCS11_MCS8_JAguar));
panic_printk(" A_Mcs15_Mcs12(0x%03x): 0x%08x\n", rTxAGC_A_MCS15_MCS12_JAguar, RTL_R32(rTxAGC_A_MCS15_MCS12_JAguar));
panic_printk(" A_Nss13_Nss10(0x%03x): 0x%08x\n", rTxAGC_A_Nss1Index3_Nss1Index0_JAguar, RTL_R32(rTxAGC_A_Nss1Index3_Nss1Index0_JAguar));
panic_printk(" A_Nss17_Nss14(0x%03x): 0x%08x\n", rTxAGC_A_Nss1Index7_Nss1Index4_JAguar, RTL_R32(rTxAGC_A_Nss1Index7_Nss1Index4_JAguar));
panic_printk(" A_Nss21_Nss18(0x%03x): 0x%08x\n", rTxAGC_A_Nss2Index1_Nss1Index8_JAguar, RTL_R32(rTxAGC_A_Nss2Index1_Nss1Index8_JAguar));
panic_printk(" A_Nss25_Nss22(0x%03x): 0x%08x\n", rTxAGC_A_Nss2Index5_Nss2Index2_JAguar, RTL_R32(rTxAGC_A_Nss2Index5_Nss2Index2_JAguar));
panic_printk(" A_Nss29_Nss26(0x%03x): 0x%08x\n", rTxAGC_A_Nss2Index9_Nss2Index6_JAguar, RTL_R32(rTxAGC_A_Nss2Index9_Nss2Index6_JAguar));
panic_printk(" B_CCK11_CCK1(0x%03x): 0x%08x\n", rTxAGC_B_CCK11_CCK1_JAguar, RTL_R32(rTxAGC_B_CCK11_CCK1_JAguar));
panic_printk(" B_Rate18_06(0x%03x): 0x%08x\n", rTxAGC_B_Ofdm18_Ofdm6_JAguar, RTL_R32(rTxAGC_B_Ofdm18_Ofdm6_JAguar));
panic_printk(" B_Rate54_24(0x%03x): 0x%08x\n", rTxAGC_B_Ofdm54_Ofdm24_JAguar, RTL_R32(rTxAGC_B_Ofdm54_Ofdm24_JAguar));
panic_printk(" B_Mcs03_Mcs00(0x%03x): 0x%08x\n", rTxAGC_B_MCS3_MCS0_JAguar, RTL_R32(rTxAGC_B_MCS3_MCS0_JAguar));
panic_printk(" B_Mcs07_Mcs04(0x%03x): 0x%08x\n", rTxAGC_B_MCS7_MCS4_JAguar, RTL_R32(rTxAGC_B_MCS7_MCS4_JAguar));
panic_printk(" B_Mcs11_Mcs08(0x%03x): 0x%08x\n", rTxAGC_B_MCS11_MCS8_JAguar, RTL_R32(rTxAGC_B_MCS11_MCS8_JAguar));
panic_printk(" B_Mcs15_Mcs12(0x%03x): 0x%08x\n", rTxAGC_B_MCS15_MCS12_JAguar, RTL_R32(rTxAGC_B_MCS15_MCS12_JAguar));
panic_printk(" B_Nss13_Nss10(0x%03x): 0x%08x\n", rTxAGC_B_Nss1Index3_Nss1Index0_JAguar, RTL_R32(rTxAGC_B_Nss1Index3_Nss1Index0_JAguar));
panic_printk(" B_Nss17_Nss14(0x%03x): 0x%08x\n", rTxAGC_B_Nss1Index7_Nss1Index4_JAguar, RTL_R32(rTxAGC_B_Nss1Index7_Nss1Index4_JAguar));
panic_printk(" B_Nss21_Nss18(0x%03x): 0x%08x\n", rTxAGC_B_Nss2Index1_Nss1Index8_JAguar, RTL_R32(rTxAGC_B_Nss2Index1_Nss1Index8_JAguar));
panic_printk(" B_Nss25_Nss22(0x%03x): 0x%08x\n", rTxAGC_B_Nss2Index5_Nss2Index2_JAguar, RTL_R32(rTxAGC_B_Nss2Index5_Nss2Index2_JAguar));
panic_printk(" B_Nss29_Nss26(0x%03x): 0x%08x\n", rTxAGC_B_Nss2Index9_Nss2Index6_JAguar, RTL_R32(rTxAGC_B_Nss2Index9_Nss2Index6_JAguar));
return;
}
#endif
static void reg_dump(struct rtl8192cd_priv *priv, char *str)
{
int i, j, len;
unsigned char tmpbuf[100];
#ifdef CONFIG_SDIO_HCI
if (strcmp(str, "sdio_local") == 0) {
dump_sdio_local_reg(priv);
return;
}
if (strcmp(str, "sdio_cccr") == 0) {
dump_sdio_cccr(priv);
return;
}
#endif
//_TXPWR_REDEFINE
//_TXPWR_REDEFINE ?? Dump Too much will cause hang up ??
panic_printk("[Channel-%03d]", priv->pmib->dot11RFEntry.dot11channel);
if (priv->pshare->CurrentChannelBW == 0)
{
panic_printk(" - 20M BW");
}
else
{
if (priv->pshare->CurrentChannelBW == 1)
panic_printk(" - 40M BW ");
else
panic_printk(" - 80M BW ");
if (priv->pshare->offset_2nd_chan == 1)
panic_printk("BELOW");
else if (priv->pshare->offset_2nd_chan == 2)
panic_printk("ABOVE");
else if (priv->pshare->offset_2nd_chan == 0)
panic_printk("DONT CARE");
}
panic_printk("\n");
#ifdef _DEBUG_RTL8192CD_
if (strcmp(str, "tx") == 0)
{
printk("\n==2G L 1-3==\n");
txpwr_dump(priv, 1, 1);
printk("\n==2G M 4-9==\n");
txpwr_dump(priv, 4, 4);
printk("\n==2G H 10-14==\n");
txpwr_dump(priv, 10, 10);
#ifdef CONFIG_RTL_92D_SUPPORT
if (GET_CHIP_VER(priv)==VERSION_8192D) {
printk("\n==5G G1_L 36-45==\n");
txpwr_dump(priv, 36, 36);
printk("\n==5G G1_M 46-55==\n");
txpwr_dump(priv, 46, 46);
printk("\n==5G G1_H 56-99==\n");
txpwr_dump(priv, 56, 56);
printk("\n==5G G2_L 100-113==\n");
txpwr_dump(priv, 100, 100);
printk("\n==5G G2_M 114-127==\n");
txpwr_dump(priv, 114, 114);
printk("\n==5G G2_H 128-148==\n");
txpwr_dump(priv, 128, 128);
printk("\n==5G G3_L 149-154==\n");
txpwr_dump(priv, 149, 149);
printk("\n==5G G3_M 155-160==\n");
txpwr_dump(priv, 155, 155);
printk("\n==5G G3_H 161-165==\n");
txpwr_dump(priv, 161, 161);
}
#endif
return;
}
if (strcmp(str, "tx-2g") == 0)
{
printk("\n==2G L LIST==\n");
txpwr_dump(priv, 1, 3);
printk("\n==2G M LIST==\n");
txpwr_dump(priv, 4, 9);
printk("\n==2G H LIST==\n");
txpwr_dump(priv, 10, 14);
return;
}
if (strcmp(str, "tx-5gl") == 0)
{
#ifdef CONFIG_RTL_92D_SUPPORT
if (GET_CHIP_VER(priv)==VERSION_8192D) {
printk("\n==5G G1_L LIST==\n");
txpwr_dump(priv, 36, 45);
printk("\n==5G G1_M LIST==\n");
txpwr_dump(priv, 46, 55);
printk("\n==5G G1_H LIST==\n");
txpwr_dump(priv, 56, 66); //99 > 66, Because dump too much will cause reboot
} else
#endif
{
printk("NOT 92D, NOT support 5G\n");
}
return;
}
if (strcmp(str, "tx-5gm") == 0)
{
#ifdef CONFIG_RTL_92D_SUPPORT
if (GET_CHIP_VER(priv)==VERSION_8192D) {
printk("\n==5G G2_L LIST==\n");
txpwr_dump(priv, 100, 113);
printk("\n==5G G2_M LIST==\n");
txpwr_dump(priv, 114, 127);
printk("\n==5G G2_H LIST==\n");
txpwr_dump(priv, 128, 148);
} else
#endif
{
printk("NOT 92D, NOT support 5G\n");
}
return;
}
if (strcmp(str, "tx-5gh") == 0)
{
#ifdef CONFIG_RTL_92D_SUPPORT
if (GET_CHIP_VER(priv)==VERSION_8192D) {
printk("\n==5G G3_L LIST==\n");
txpwr_dump(priv, 149, 154);
printk("\n==5G G3_M LIST==\n");
txpwr_dump(priv, 155, 160);
printk("\n==5G G3_H LIST==\n");
txpwr_dump(priv, 161, 165);
} else
#endif
{
printk("NOT 92D, NOT support 5G\n");
}
return;
}
#endif
#if defined(CONFIG_RTL_8812_SUPPORT) || defined(CONFIG_WLAN_HAL_8881A)
if (strcmp(str, "check") == 0)
{
return;
}
#endif
if (strcmp(str, "all") != 0) {
#if defined(CONFIG_RTL_8812_SUPPORT) || defined(CONFIG_WLAN_HAL_8881A)
if ((GET_CHIP_VER(priv) == VERSION_8812E) || (GET_CHIP_VER(priv) == VERSION_8881A)) {
reg_dump_8812(priv);
return;
}
#endif
panic_printk("Initial Gain, Sensitivity:\n");
panic_printk(" 0xC50: 0x%02x\n", RTL_R8(0xc50));
#if defined(CONFIG_RTL_92C_SUPPORT) || defined(CONFIG_RTL_92D_SUPPORT)
if (
#ifdef CONFIG_RTL_92C_SUPPORT
(GET_CHIP_VER(priv)==VERSION_8192C) || (GET_CHIP_VER(priv)==VERSION_8188C)
#endif
#ifdef CONFIG_RTL_92D_SUPPORT
#ifdef CONFIG_RTL_92C_SUPPORT
||
#endif
(GET_CHIP_VER(priv)==VERSION_8192D)
#endif
)
panic_printk(" 0xC58: 0x%02x\n", RTL_R8(0xc58));
#endif
panic_printk(" 0xC30: 0x%02x\n", RTL_R8(0xc30));
panic_printk(" 0xC87: 0x%02x\n", RTL_R8(0xc87));
panic_printk(" 0xA0A: 0x%02x\n", RTL_R8(0xa0a));
panic_printk("EDCA para:\n");
panic_printk(" VO(0x%03x): 0x%08x\n", EDCA_VO_PARA, RTL_R32(EDCA_VO_PARA));
panic_printk(" VI(0x%03x): 0x%08x\n", EDCA_VI_PARA, RTL_R32(EDCA_VI_PARA));
panic_printk(" BE(0x%03x): 0x%08x\n", EDCA_BE_PARA, RTL_R32(EDCA_BE_PARA));
panic_printk(" BK(0x%03x): 0x%08x\n", EDCA_BK_PARA, RTL_R32(EDCA_BK_PARA));
panic_printk("Tx power:\n");
panic_printk(" A_CCK1_Mcs32(0x%03x): 0x%08x\n", rTxAGC_A_CCK1_Mcs32, RTL_R32(rTxAGC_A_CCK1_Mcs32));
panic_printk(" B_CCK5_1_Mcs32(0x%03x): 0x%08x\n", rTxAGC_B_CCK5_1_Mcs32, RTL_R32(rTxAGC_B_CCK5_1_Mcs32));
panic_printk(" A_CCK11_2_B_CCK11(0x%03x): 0x%08x\n", rTxAGC_A_CCK11_2_B_CCK11, RTL_R32(rTxAGC_A_CCK11_2_B_CCK11));
panic_printk(" A_Rate18_06(0x%03x): 0x%08x\n", rTxAGC_A_Rate18_06, RTL_R32(rTxAGC_A_Rate18_06));
panic_printk(" A_Rate54_24(0x%03x): 0x%08x\n", rTxAGC_A_Rate54_24, RTL_R32(rTxAGC_A_Rate54_24));
panic_printk(" A_Mcs03_Mcs00(0x%03x): 0x%08x\n", rTxAGC_A_Mcs03_Mcs00, RTL_R32(rTxAGC_A_Mcs03_Mcs00));
panic_printk(" A_Mcs07_Mcs04(0x%03x): 0x%08x\n", rTxAGC_A_Mcs07_Mcs04, RTL_R32(rTxAGC_A_Mcs07_Mcs04));
panic_printk(" A_Mcs11_Mcs08(0x%03x): 0x%08x\n", rTxAGC_A_Mcs11_Mcs08, RTL_R32(rTxAGC_A_Mcs11_Mcs08));
panic_printk(" A_Mcs15_Mcs12(0x%03x): 0x%08x\n", rTxAGC_A_Mcs15_Mcs12, RTL_R32(rTxAGC_A_Mcs15_Mcs12));
panic_printk(" B_Rate18_06(0x%03x): 0x%08x\n", rTxAGC_B_Rate18_06, RTL_R32(rTxAGC_B_Rate18_06));
panic_printk(" B_Rate54_24(0x%03x): 0x%08x\n", rTxAGC_B_Rate54_24, RTL_R32(rTxAGC_B_Rate54_24));
panic_printk(" B_Mcs03_Mcs00(0x%03x): 0x%08x\n", rTxAGC_B_Mcs03_Mcs00, RTL_R32(rTxAGC_B_Mcs03_Mcs00));
panic_printk(" B_Mcs07_Mcs04(0x%03x): 0x%08x\n", rTxAGC_B_Mcs07_Mcs04, RTL_R32(rTxAGC_B_Mcs07_Mcs04));
panic_printk(" B_Mcs11_Mcs08(0x%03x): 0x%08x\n", rTxAGC_B_Mcs11_Mcs08, RTL_R32(rTxAGC_B_Mcs11_Mcs08));
panic_printk(" B_Mcs15_Mcs12(0x%03x): 0x%08x\n", rTxAGC_B_Mcs15_Mcs12, RTL_R32(rTxAGC_B_Mcs15_Mcs12));
return;
}
panic_printk("\nMAC Registers:\n");
for (i=0; i<0x1000; i+=0x10) {
len = sprintf((char *)tmpbuf, "%03X\t", i);
for (j=i; j<i+0x10; j+=4)
len += sprintf((char *)(tmpbuf+len), "%08X ", (unsigned int)RTL_R32(j));
panic_printk("%s\n", (char *)tmpbuf);
}
panic_printk("\n");
panic_printk("\nRF Registers:\n");
len = 0;
{
unsigned int rf_reg_offset = 0x34; /* RTL8192C/RTL8188R */
#ifdef CONFIG_RTL_92D_SUPPORT
if (GET_CHIP_VER(priv) == VERSION_8192D)
rf_reg_offset = 0x50;
#endif
#ifdef CONFIG_RTL_88E_SUPPORT
if (GET_CHIP_VER(priv) == VERSION_8188E)
rf_reg_offset = 0xff;
#endif
#ifdef CONFIG_RTL_8812_SUPPORT
if (GET_CHIP_VER(priv) == VERSION_8812E)
rf_reg_offset = 0xff;
#endif
#ifdef CONFIG_WLAN_HAL
if (IS_HAL_CHIP(priv)) {
rf_reg_offset = 0xff;
}
#endif //CONFIG_WLAN_HAL
for (i = RF92CD_PATH_A; i < priv->pshare->phw->NumTotalRFPath; i++) {
for (j = 0; j <= rf_reg_offset; j++) {
len += sprintf((char *)(tmpbuf+len), "%d%02x %05x",
i, j, PHY_QueryRFReg(priv, i, j, bMask20Bits, 1));
if (j && !((j+1)%4)) {
panic_printk("%s\n", (char *)tmpbuf);
len = 0;
} else
len += sprintf((char *)(tmpbuf+len), " ");
}
panic_printk("%s\n", (len) ? (char *)tmpbuf : "");
}
}
}
#endif // _IOCTL_DEBUG_CMD_
/*
* data: byte 0 ~ byte 11 is mac addr
* if byte 12 & 13 is "no", will NOT send disasoc request
* else will send disasoc request
*/
int del_sta(struct rtl8192cd_priv *priv, unsigned char *data)
{
struct stat_info *pstat;
unsigned char macaddr[MACADDRLEN], tmpbuf[3];
#ifndef SMP_SYNC
unsigned long flags;
#endif
DOT11_DISASSOCIATION_IND Disassociation_Ind;
int i, send_disasoc=1;
if (!netif_running(priv->dev))
return 0;
for(i=0; i<MACADDRLEN; i++)
{
tmpbuf[0] = data[2*i];
tmpbuf[1] = data[2*i+1];
tmpbuf[2] = 0;
macaddr[i] = (unsigned char)_atoi((char *)tmpbuf, 16);
}
if ((data[12] == 'n') && (data[13] == 'o'))
send_disasoc = 0;
DEBUG_INFO("del_sta %02X%02X%02X%02X%02X%02X\n",
macaddr[0], macaddr[1], macaddr[2], macaddr[3], macaddr[4], macaddr[5]);
pstat = get_stainfo(priv, macaddr);
if (pstat == NULL)
return 0;
#if defined(WDS)
if(pstat->state & WIFI_WDS) {
DEBUG_INFO("%02X%02X%02X%02X%02X%02X is an WDS peer, dismissed\n",
macaddr[0], macaddr[1], macaddr[2], macaddr[3], macaddr[4], macaddr[5]);
return 0;
}
#endif
return del_station(priv, pstat, send_disasoc);
}
static int write_eeprom(struct rtl8192cd_priv *priv, unsigned char *data)
{
return -1;
}
static int read_eeprom(struct rtl8192cd_priv *priv, unsigned char *data)
{
return -1;
}
static void get_sta_info(struct rtl8192cd_priv *priv, sta_info_2_web *pInfo, int size
#ifdef RTK_WOW
,unsigned int wakeup_on_wlan
#endif
)
{
struct list_head *phead, *plist;
struct stat_info *pstat;
struct net_device *dev = priv->dev;
int i;
memset((char *)pInfo, '\0', sizeof(sta_info_2_web)*size);
phead = &priv->asoc_list;
if (!netif_running(dev) || list_empty(phead))
return;
plist = phead;
while (((plist = asoc_list_get_next(priv, plist)) != phead) && (size > 0))
{
pstat = list_entry(plist, struct stat_info, asoc_list);
if ((pstat->state & WIFI_ASOC_STATE) &&
((pstat->expire_to > 0)
#ifdef RTK_WOW
|| wakeup_on_wlan
#endif
)
#ifdef CONFIG_RTK_MESH
&& (!(GET_MIB(priv)->dot1180211sInfo.mesh_enable) || isSTA(pstat)) // STA ONLY
#endif
#ifdef RTK_WOW
&& (!wakeup_on_wlan || pstat->is_rtk_wow_sta)
#endif
#ifdef WDS
&& !(pstat->state & WIFI_WDS)
#endif
) {
pInfo->aid = pstat->aid;
memcpy(pInfo->addr, pstat->hwaddr, 6);
pInfo->tx_packets = pstat->tx_pkts;
pInfo->rx_packets = pstat->rx_pkts;
pInfo->expired_time = pstat->expire_to * 100; /*1s to 10ms unit*/
pInfo->flags = STA_INFO_FLAG_ASOC;
if (!list_empty(&pstat->sleep_list))
pInfo->flags |= STA_INFO_FLAG_ASLEEP;
pInfo->TxOperaRate = pstat->current_tx_rate;
pInfo->RxOperaRate = pstat->rx_rate;
#ifdef TLN_STATS
pInfo->enc_type = pstat->dot11KeyMapping.dot11Privacy;
if (priv->pmib->dot1180211AuthEntry.dot11EnablePSK) {
if (pstat->wpa_sta_info->RSNEnabled & PSK_WPA2)
pInfo->auth_type = STATS_PSK_WPA2;
else
pInfo->auth_type = STATS_PSK_WPA;
} else if (IEEE8021X_FUN && ((pstat->dot11KeyMapping.dot11Privacy != _WEP_40_PRIVACY_) &&
(pstat->dot11KeyMapping.dot11Privacy != _WEP_104_PRIVACY_))) {
if (pstat->enterpise_wpa_info == STATS_ETP_WPA2)
pInfo->auth_type = STATS_ETP_WPA2;
else
pInfo->auth_type = STATS_ETP_WPA;
} else {
if (pstat->AuthAlgrthm)
pInfo->auth_type = STATS_AUTH_SHARE;
else
pInfo->auth_type = STATS_AUTH_OPEN;
}
#endif
pInfo->rssi = pstat->rssi;
pInfo->link_time = pstat->link_time;
pInfo->tx_fail = pstat->tx_fail;
pInfo->tx_bytes = pstat->tx_bytes;
pInfo->rx_bytes = pstat->rx_bytes;
if (priv->pmib->dot11BssType.net_work_type & WIRELESS_11A)
pInfo->network = WIRELESS_11A;
else if (priv->pmib->dot11BssType.net_work_type & WIRELESS_11G) {
if (!isErpSta(pstat))
pInfo->network = WIRELESS_11B;
else {
pInfo->network = WIRELESS_11G;
for (i=0; i<STAT_OPRATE_LEN; i++) {
if (is_CCK_rate(STAT_OPRATE[i])) {
pInfo->network |= WIRELESS_11B;
break;
}
}
}
}
else // 11B only
pInfo->network = WIRELESS_11B;
if (priv->pmib->dot11BssType.net_work_type & WIRELESS_11N) {
if (pstat->ht_cap_len) {
pInfo->network |= WIRELESS_11N;
if (pstat->ht_current_tx_info & TX_USE_40M_MODE)
pInfo->ht_info |= TX_USE_40M_MODE;
if (pstat->ht_current_tx_info & TX_USE_SHORT_GI)
pInfo->ht_info |= TX_USE_SHORT_GI;
}
}
if (priv->pmib->dot11BssType.net_work_type & WIRELESS_11AC)
{
#ifdef CONFIG_RTL_8812_SUPPORT
if(pstat ->vht_cap_len) {
if(pstat->tx_bw == HT_CHANNEL_WIDTH_80)
pInfo->ht_info |= TX_USE_80M_MODE;
if (pstat->ht_current_tx_info & TX_USE_40M_MODE)
pInfo->ht_info |= TX_USE_40M_MODE;
if (pstat->ht_current_tx_info & TX_USE_SHORT_GI)
pInfo->ht_info |= TX_USE_SHORT_GI;
pInfo->acTxOperaRate = query_vht_rate(pstat);
pInfo->network |= WIRELESS_11AC;
}
#endif
}
pInfo++;
size--;
}
}
}
#ifdef _SINUX_
/*
* return 1: if mac is wlan client MAC, 0: if not.
*/
int rtl8192cd_check_wlan_mac(char *wlan_ifname, unsigned char *mac)
{
struct net_device *net_dev;
struct rtl8192cd_priv *priv;
struct list_head *phead, *plist;
struct stat_info *pstat;
int ret = 0;
#ifdef SMP_SYNC
unsigned long flags = 0;
#endif
if (mac == NULL)
return 0;
net_dev = dev_get_by_name(wlan_ifname);
if (net_dev == NULL)
{
printk("rtl8192cd_check_wlan_mac(): can not get dev %s\n", wlan_ifname);
return 0;
}
priv = (struct rtl8192cd_priv *)net_dev -> priv;
phead = &priv->asoc_list;
if (!netif_running(net_dev) || list_empty(phead)){
dev_put(net_dev);
return 0;
}
SMP_LOCK_ASOC_LIST(flags);
plist = phead->next;
while (plist != phead)
{
pstat = list_entry(plist, struct stat_info, asoc_list);
plist = plist->next;
if ((pstat->state & WIFI_ASOC_STATE) && (pstat->expire_to > 0)
#ifdef WDS
&& !(pstat->state & WIFI_WDS)
#endif
) {
if (memcmp(mac, pstat->hwaddr,6) == 0) {
ret = 1;
break;
}
}
}
SMP_UNLOCK_ASOC_LIST(flags);
dev_put(net_dev);
return ret;
}
typedef struct tag_ASSOCIATE_TABLE{
char mac[6];
/* err: 0: no error 1: error */
char err;
}ASSOCIATE_TABLE, *PASSOCIATE_TABLE;
int rtl8192cd_getMacTable(char *wlan_ifname, ASSOCIATE_TABLE *mac_table, int table_num)
{
struct net_device *net_dev;
struct rtl8192cd_priv *priv;
struct list_head *phead, *plist;
struct stat_info *pstat;
int ret = 0;
#ifdef SMP_SYNC
unsigned long flags = 0;
#endif
net_dev = dev_get_by_name(wlan_ifname);
if (net_dev == NULL)
{
printk("rtl8192cd_check_wlan_mac(): can not get dev %s\n", wlan_ifname);
return -1;
}
priv = (struct rtl8192cd_priv *)net_dev -> priv;
phead = &priv->asoc_list;
if (!netif_running(net_dev) || list_empty(phead))
{
dev_put(net_dev);
return -1;
}
SMP_LOCK_ASOC_LIST(flags);
plist = phead->next;
while (plist != phead && table_num > 0 )
{
pstat = list_entry(plist, struct stat_info, asoc_list);
plist = plist->next;
if ((pstat->state & WIFI_ASOC_STATE) && (pstat->expire_to > 0)
#ifdef WDS
&& !(pstat->state & WIFI_WDS)
#endif
) {
memcpy(mac_table->mac, pstat->hwaddr, 6);
mac_table ++;
table_num --;
ret ++;
}
}
SMP_UNLOCK_ASOC_LIST(flags);
dev_put(net_dev);
return ret;
}
#endif
static void get_bss_info(struct rtl8192cd_priv *priv, bss_info_2_web *pBss)
{
struct net_device *dev = priv->dev;
#ifdef CLIENT_MODE
struct stat_info *pstat;
#endif
memset(pBss, '\0', sizeof(bss_info_2_web));
if (!netif_running(dev)) {
pBss->state = STATE_DISABLED;
return;
}
if (priv->pmib->miscEntry.func_off) {
pBss->state = STATE_DISABLED;
return;
}
if (OPMODE & WIFI_AP_STATE)
pBss->state = STATE_STARTED;
#ifdef CLIENT_MODE
else {
switch (JOIN_RES) {
case STATE_Sta_No_Bss:
pBss->state = STATE_SCANNING;
break;
case STATE_Sta_Bss:
if (IEEE8021X_FUN) {
pstat = get_stainfo(priv, BSSID);
if (pstat == NULL)
return;
if (pstat->ieee8021x_ctrlport)
pBss->state = STATE_CONNECTED;
else
pBss->state = STATE_WAITFORKEY;
}
else
pBss->state = STATE_CONNECTED;
break;
case STATE_Sta_Ibss_Active:
pBss->state = STATE_CONNECTED;
break;
case STATE_Sta_Ibss_Idle:
pBss->state = STATE_STARTED;
break;
default:
pBss->state = STATE_SCANNING;
break;
}
}
#endif
if (priv->pmib->dot11StationConfigEntry.autoRate)
pBss->txRate = find_rate(priv, NULL, 1, 0);
else
pBss->txRate = get_rate_from_bit_value(priv->pmib->dot11StationConfigEntry.fixedTxRate);
memcpy(pBss->ssid, SSID, SSID_LEN);
pBss->ssid[SSID_LEN] = '\0';
if (OPMODE & WIFI_SITE_MONITOR)
pBss->channel = priv->site_survey->ss_channel;
else
pBss->channel = priv->pmib->dot11RFEntry.dot11channel;
if (pBss->state == STATE_STARTED || pBss->state == STATE_CONNECTED) {
#ifdef UNIVERSAL_REPEATER
if (IS_VXD_INTERFACE(priv) && (OPMODE & WIFI_AP_STATE))
if (IS_DRV_OPEN(priv))
memcpy(pBss->bssid, priv->pmib->dot11Bss.bssid, MACADDRLEN);
else
memset(pBss->bssid, '\0', MACADDRLEN);
else
#endif
memcpy(pBss->bssid, BSSID, MACADDRLEN);
#ifdef CLIENT_MODE
if (JOIN_RES == STATE_Sta_Bss) {
pstat = get_stainfo(priv, BSSID);
if (pstat) {
pBss->rssi = pstat->rssi;
pBss->sq = pstat->sq;
}
}
#endif
}
else {
memset(pBss->bssid, '\0', MACADDRLEN);
if (pBss->state == STATE_DISABLED)
pBss->channel = 0;
}
}
#ifdef WDS
static int get_wds_info(struct rtl8192cd_priv *priv, web_wds_info *pWds)
{
int i, j=0;
struct stat_info *pstat;
memset(pWds, '\0', NUM_WDS*sizeof(web_wds_info));
for (j=0, i=0; i<NUM_WDS && i<priv->pmib->dot11WdsInfo.wdsNum; i++) {
if (!netif_running(priv->wds_dev[i]))
continue;
memcpy(pWds[j].addr, priv->pmib->dot11WdsInfo.entry[i].macAddr, 6);
pstat = get_stainfo(priv, pWds[j].addr);
if(NULL == pstat)
continue;
pWds[j].state = STATE_WDS_ACTIVE;
pWds[j].tx_packets = pstat->tx_pkts;
pWds[j].rx_packets = pstat->rx_pkts;
pWds[j].tx_errors = pstat->tx_fail;
pWds[j].TxOperaRate = pstat->current_tx_rate;
j++;
}
return (sizeof(web_wds_info)*j);
}
#endif // WDS
static int set_sta_txrate(struct rtl8192cd_priv *priv, struct _wlan_sta_rateset *rate_set)
{
struct stat_info *pstat;
if (!netif_running(priv->dev))
return 0;
pstat = get_stainfo(priv, rate_set->mac);
if (pstat == NULL)
return 0;
if (!(pstat->state & WIFI_ASOC_STATE))
return 0;
if (priv->pmib->dot11StationConfigEntry.autoRate) {
DEBUG_INFO("Auto rate turned on. Can't set rate\n");
return 0;
}
pstat->current_tx_rate = rate_set->txrate;
return 1;
}
#ifdef MICERR_TEST
static int issue_mic_err_pkt(struct rtl8192cd_priv *priv, unsigned char *cli_mac)
{
struct sk_buff *skb;
struct wlan_ethhdr_t *pethhdr;
skb = dev_alloc_skb(64);
if (skb != NULL) {
skb->dev = priv->dev;
pethhdr = (struct wlan_ethhdr_t *)(skb->data);
if (!(OPMODE & WIFI_STATION_STATE)) {
unsigned char null_mac[]={0,0,0,0,0,0};
if (!memcmp(cli_mac, null_mac, MACADDRLEN)) {
printk("Usage: iwpriv wlanx mic_error [cli_mac_addr]\n");
return 0;
}
printk("%s() Send MIC error packet to %02X:%02X:%02X:%02X:%02X:%02X\n",__func__,cli_mac[0],cli_mac[1],cli_mac[2],cli_mac[3],cli_mac[4],cli_mac[5]);
memcpy(pethhdr->daddr, cli_mac, MACADDRLEN);
} else {
printk("Send MIC error packet to AP...\n");
memcpy(pethhdr->daddr, BSSID, MACADDRLEN);
}
memcpy(pethhdr->saddr, GET_MY_HWADDR, MACADDRLEN);
pethhdr->type = 0x888e;
memset(skb->data+WLAN_ETHHDR_LEN, 0xa5, 32);
skb_put(skb, WLAN_ETHHDR_LEN+32);
priv->micerr_flag = 1;
if (rtl8192cd_start_xmit(skb, priv->dev))
rtl_kfree_skb(priv, skb, _SKB_TX_);
} else {
printk("Can't allocate sk_buff\n");
}
return 0;
}
static int issue_mic_rpt_pkt(struct rtl8192cd_priv *priv, unsigned char *data)
{
struct sk_buff *skb;
struct wlan_ethhdr_t *pethhdr;
int format;
unsigned char pattern[] = {0x01, 0x03, 0x00, 0x5f, 0xfe, 0x0d, 0x00, 0x00};
if (!(OPMODE & WIFI_STATION_STATE)) {
printk("Fail: not in client mode\n");
return 0;
}
if (!strcmp(data, "xp"))
format = 1;
else if (!strcmp(data, "funk"))
format = 2;
else {
printk("Usage: iwpriv wlanx mic_report {xp | funk}\n");
return 0;
}
printk("Send MIC report (%s format) to AP...\n", (format==1)? "XP":"Funk");
skb = dev_alloc_skb(64);
if (skb != NULL)
{
skb->dev = priv->dev;
pethhdr = (struct wlan_ethhdr_t *)(skb->data);
memcpy(pethhdr->daddr, BSSID, MACADDRLEN);
memcpy(pethhdr->saddr, GET_MY_HWADDR, MACADDRLEN);
pethhdr->type = 0x888e;
if (format == 2)
pattern[5] = 0x0f;
memcpy(skb->data+WLAN_ETHHDR_LEN, pattern, sizeof(pattern));
skb_put(skb, WLAN_ETHHDR_LEN+sizeof(pattern));
if (rtl8192cd_start_xmit(skb, priv->dev))
rtl_kfree_skb(priv, skb, _SKB_TX_);
}
else
{
printk("Can't allocate sk_buff\n");
}
return 0;
}
#endif // MICERR_TEST
#if defined(D_ACL) || defined(MICERR_TEST) //mesh related
static int iwpriv_atoi(struct rtl8192cd_priv *priv, unsigned char *data, unsigned char *buf, int len)
{
unsigned char tmpbuf[20] = {'\0'};
unsigned char ascii_addr[12] = {'\0'};
unsigned char hex_addr[6] = {'\0'};
int i=0;
if( (len - 1) == MACADDRLEN ){ //user send 6 byte mac address
if(ioctl_copy_from_user(buf, (void *)data, len))
return -1;
return 0;
}
else if( (len - 1) == MACADDRLEN*2 ){ //user send 12 byte mac string
if(ioctl_copy_from_user(tmpbuf, (void *)data, len))
return -1;
strcpy(ascii_addr, tmpbuf);
strcpy(buf+MACADDRLEN,tmpbuf);
for(i = 0; i < MACADDRLEN*2; i++){
if( '0' <= ascii_addr[i] && ascii_addr[i] <= '9')
ascii_addr[i] -= 48;
else if( 'A' <= ascii_addr[i] && ascii_addr[i] <= 'F' )
ascii_addr[i] -= 55;
else if( 'a' <= ascii_addr[i] && ascii_addr[i] <= 'f' )
ascii_addr[i] -= 87;
printk("%d", ascii_addr[i]);
}
for(i = 0; i < MACADDRLEN*2; i+=2)
hex_addr[i>>1] = (ascii_addr[i] << 4) | (ascii_addr[i+1]);
memcpy(buf,hex_addr,MACADDRLEN);
_DEBUG_INFO("in iwpriv_atoi function\n");
return 0;
}
else{
_DEBUG_ERR("Wrong input format\n");
return -1;
}
}
#endif
static int acl_add_cmd(struct rtl8192cd_priv *priv, unsigned char *data, int len)
{
struct list_head *phead, *plist, *pnewlist;
struct wlan_acl_node *paclnode;
unsigned char macaddr[6];
int ret = 0;
#ifdef SMP_SYNC
unsigned long flags = 0;
#endif
#ifdef D_ACL //tsananiu (mesh related)
unsigned char tmpbuf[20] = {'\0'};
unsigned char tmp_add[12] = {'\0'};
int i;
if(ioctl_copy_from_user(tmpbuf, (void *)data, len))
return -1;
if( (len - 1) == 6 ){ //user send 6 byte mac address
for(i = 0; i < 6; i++)
macaddr[i] = tmpbuf[i];
}
else if( (len - 1) == 12 ){ //user send 12 byte mac string
strcpy(tmp_add, tmpbuf);
for(i = 0; i < 12; i++){
if( '0' <= tmp_add[i] && tmp_add[i] <= '9')
tmp_add[i] -= 48;
else if( 'A' <= tmp_add[i] && tmp_add[i] <= 'F' )
tmp_add[i] -= 55;
else if( 'a' <= tmp_add[i] && tmp_add[i] <= 'f' )
tmp_add[i] -= 87;
printk("%d", tmp_add[i]);
}
for(i = 0; i < 12; i+=2){
macaddr[i>>1] = (tmp_add[i] << 4) | (tmp_add[i+1]);
}
}
else{
printk("Wrong input format\n");
}
DEBUG_INFO("in add function\n");
len = 6;
#else
if (ioctl_copy_from_user((void *)macaddr, (void *)data, 6))
return -1;
#endif//tsananiu//
// first of all, check if this address has been in acl_list;
phead = &priv->wlan_acl_list;
if (phead->next == NULL) {
panic_printk("[WARN] Interface not initialized yet!\n");
return -1;
}
DEBUG_INFO("Adding %02X:%02X:%02X:%02X:%02X:%02X to acl_table\n",
macaddr[0],macaddr[1],macaddr[2],
macaddr[3],macaddr[4],macaddr[5]);
SMP_LOCK_ACL(flags);
plist = phead->next;
while(plist != phead)
{
paclnode = list_entry(plist, struct wlan_acl_node, list);
plist = plist->next;
if (!(memcmp((void *)macaddr, paclnode->addr, 6)))
{
DEBUG_INFO("mac-addr %02X%02X%02X%02X%02X%02X has been in acl_list\n",
macaddr[0], macaddr[1], macaddr[2],
macaddr[3], macaddr[4], macaddr[5]);
ret = 0;
goto exit;
}
}
if (list_empty(&priv->wlan_aclpolllist))
{
DEBUG_INFO("acl_poll is full!\n");
ret = -1;
goto exit;
}
pnewlist = (priv->wlan_aclpolllist.next);
list_del_init(pnewlist);
paclnode = list_entry(pnewlist, struct wlan_acl_node, list);
memcpy((void *)paclnode->addr, macaddr, 6);
if (len == 6)
paclnode->mode = (unsigned char)priv->pmib->dot11StationConfigEntry.dot11AclMode;
else
paclnode->mode = data[6];
list_add_tail(pnewlist, phead);
exit:
SMP_UNLOCK_ACL(flags);
return ret;
}
static int acl_remove_cmd(struct rtl8192cd_priv *priv, unsigned char *data, int len)
{
struct list_head *phead, *plist;
struct wlan_acl_node *paclnode;
unsigned char macaddr[6];
#ifdef SMP_SYNC
unsigned long flags = 0;
#endif
if (data) {
#ifdef D_ACL //tsananiu (mesh related)
int i;
unsigned char tmpbuf[20] = {'\0'};
unsigned char tmp_add[12] = {'\0'};
if(ioctl_copy_from_user(tmpbuf, (void *)data, len))
return -1;
if( (len - 1) == 6 ){ //user send 6 byte mac address
for(i = 0; i < 6; i++)
macaddr[i] = tmpbuf[i];
}
else if( (len - 1) == 12 ){ //user send 12 byte mac string
strcpy(tmp_add, tmpbuf);
for(i = 0; i < 12; i++){
if( '0' <= tmp_add[i] && tmp_add[i] <= '9')
tmp_add[i] -= 48;
else if( 'A' <= tmp_add[i] && tmp_add[i] <= 'F' )
tmp_add[i] -= 55;
else if( 'a' <= tmp_add[i] && tmp_add[i] <= 'f' )
tmp_add[i] -= 87;
DEBUG_INFO("%d", tmp_add[i]);
}
for(i = 0; i < 12; i+=2){
macaddr[i>>1] = (tmp_add[i] << 4) | (tmp_add[i+1]);
}
}
else{
DEBUG_ERR("Wrong input format\n");
return -1;
}
DEBUG_INFO("in remove function\n");
DEBUG_INFO("%02X:%02X:%02X:%02X:%02X:%02X\n",
macaddr[0],macaddr[1],macaddr[2],
macaddr[3],macaddr[4],macaddr[5]);
//len = 6;
#else
if (ioctl_copy_from_user((void *)macaddr, (void *)data, 6))
return -1;
DEBUG_INFO("Delete %X:%X:%X:%X:%X:%X to acl_table\n",
macaddr[0],macaddr[1],macaddr[2],
macaddr[3],macaddr[4],macaddr[5]);
#endif//tsananiu//
}
phead = &priv->wlan_acl_list;
if (phead->next == NULL) {
panic_printk("[WARN] Interface not initialized yet!\n");
return -1;
}
if (list_empty(phead)) // nothing to remove
return 0;
SMP_LOCK_ACL(flags);
plist = phead->next;
while(plist != phead)
{
paclnode = list_entry(plist, struct wlan_acl_node, list);
plist = plist->next;
if (!(memcmp((void *)macaddr, paclnode->addr, 6)))
{
list_del_init(&paclnode->list);
list_add_tail(&paclnode->list, &priv->wlan_aclpolllist);
goto exit;
}
}
if (data) {
DEBUG_INFO("Delete %02X:%02X:%02X:%02X:%02X:%02X is not in acl_table\n",
macaddr[0],macaddr[1],macaddr[2],
macaddr[3],macaddr[4],macaddr[5]);
}
exit:
SMP_UNLOCK_ACL(flags);
return 0;
}
static int acl_query_cmd(struct rtl8192cd_priv *priv, unsigned char *data, u16 length)
{
struct list_head *phead, *plist;
struct wlan_acl_node *paclnode;
unsigned char *tmp_buf;
int len = 0;
#ifdef SMP_SYNC
unsigned long flags = 0;
#endif
phead = &priv->wlan_acl_list;
if (list_empty(phead) || !IS_DRV_OPEN(priv)) // nothing to remove
return 0;
tmp_buf = (unsigned char *)kmalloc(length, GFP_KERNEL);
if (NULL == tmp_buf)
return -1;
SMP_LOCK_ACL(flags);
plist = phead->next;
while (plist != phead) {
paclnode = list_entry(plist, struct wlan_acl_node, list);
plist = plist->next;
if ((len + MACADDRLEN) > length)
break;
memcpy(&tmp_buf[len], paclnode->addr, MACADDRLEN);
len += MACADDRLEN;
}
SMP_UNLOCK_ACL(flags);
if (len) {
if (ioctl_copy_to_user((void *)data, tmp_buf, len)) {
len = -1;
}
}
kfree(tmp_buf);
return len;
}
static int acl_clear_cmd(struct rtl8192cd_priv *priv)
{
struct list_head *phead, *plist;
struct wlan_acl_node *paclnode;
#ifdef SMP_SYNC
unsigned long flags = 0;
#endif
phead = &priv->wlan_acl_list;
if (phead->next == NULL) {
panic_printk("[WARN] Interface not initialized yet!\n");
return -1;
}
if (list_empty(phead)) // nothing to remove
return 0;
SMP_LOCK_ACL(flags);
plist = phead->next;
while(plist != phead)
{
paclnode = list_entry(plist, struct wlan_acl_node, list);
plist = plist->next;
list_del_init(&paclnode->list);
list_add_tail(&paclnode->list, &priv->wlan_aclpolllist);
}
SMP_UNLOCK_ACL(flags);
return 0;
}
#if defined(CONFIG_RTK_MESH) && defined(_MESH_ACL_ENABLE_)
// Copy from acl_add_cmd
static int mesh_acl_add_cmd(struct rtl8192cd_priv *priv, unsigned char *data, int len)
{
struct list_head *phead, *plist, *pnewlist;
struct wlan_acl_node *paclnode;
unsigned char macaddr[MACADDRLEN];
#ifdef SMP_SYNC
unsigned long flags = 0;
#endif
if (ioctl_copy_from_user((void *)macaddr, (void *)data, MACADDRLEN))
return -1;
// first of all, check if this address has been in acl_list;
phead = &priv->mesh_acl_list;
DEBUG_INFO("Adding %X:%X:%X:%X:%X:%X to mesh_acl_table\n",
macaddr[0],macaddr[1],macaddr[2],
macaddr[3],macaddr[4],macaddr[5]);
SMP_LOCK_MESH_ACL(flags);
plist = phead->next;
while(plist != phead)
{
paclnode = list_entry(plist, struct wlan_acl_node, list);
plist = plist->next;
if (!(memcmp((void *)macaddr, paclnode->addr, MACADDRLEN)))
{
DEBUG_INFO("mac-addr %02X%02X%02X%02X%02X%02X has been in mesh_acl_list\n",
macaddr[0], macaddr[1], macaddr[2],
macaddr[3], macaddr[4], macaddr[5]);
goto exit;
}
}
if (list_empty(&priv->mesh_aclpolllist))
{
DEBUG_INFO("mesh_acl_poll is full!\n");
goto exit;
}
pnewlist = (priv->mesh_aclpolllist.next);
list_del_init(pnewlist);
paclnode = list_entry(pnewlist, struct wlan_acl_node, list);
memcpy((void *)paclnode->addr, macaddr, MACADDRLEN);
if (len == 6)
paclnode->mode = (unsigned char)priv->pmib->dot1180211sInfo.mesh_acl_mode;
else
paclnode->mode = data[6];
list_add_tail(pnewlist, phead);
exit:
SMP_UNLOCK_MESH_ACL(flags);
return 0;
}
// Copy from acl_remove_cmd
static int mesh_acl_remove_cmd(struct rtl8192cd_priv *priv, unsigned char *data, int len)
{
struct list_head *phead, *plist;
struct wlan_acl_node *paclnode;
unsigned char macaddr[MACADDRLEN];
#ifdef SMP_SYNC
unsigned long flags = 0;
#endif
if (data) {
if (ioctl_copy_from_user((void *)macaddr, (void *)data, 6))
return -1;
DEBUG_INFO("Delete %X:%X:%X:%X:%X:%X to mesh_acl_table\n",
macaddr[0],macaddr[1],macaddr[2],
macaddr[3],macaddr[4],macaddr[5]);
}
phead = &priv->mesh_acl_list;
if (list_empty(phead)) // nothing to remove
return 0;
SMP_LOCK_MESH_ACL(flags);
plist = phead->next;
while(plist != phead)
{
paclnode = list_entry(plist, struct wlan_acl_node, list);
plist = plist->next;
if (!(memcmp((void *)macaddr, paclnode->addr, MACADDRLEN)))
{
list_del_init(&paclnode->list);
list_add_tail(&paclnode->list, &priv->mesh_aclpolllist);
goto exit;
}
}
if (data) {
DEBUG_INFO("Delete %X:%X:%X:%X:%X:%X is not in mesh_acl_table\n",
macaddr[0],macaddr[1],macaddr[2],
macaddr[3],macaddr[4],macaddr[5]);
}
exit:
SMP_UNLOCK_MESH_ACL(flags);
return 0;
}
// Copy from acl_query_cmd
static int mesh_acl_query_cmd(struct rtl8192cd_priv *priv, unsigned char *data, u16 length)
{
struct list_head *phead, *plist;
struct wlan_acl_node *paclnode;
unsigned char *tmp_buf;
int len = 0;
#ifdef SMP_SYNC
unsigned long flags = 0;
#endif
phead = &priv->mesh_acl_list;
if (list_empty(phead)) // nothing to remove
return 0;
tmp_buf = (unsigned char *)kmalloc(length, GFP_KERNEL);
if (NULL == tmp_buf)
return -1;
SMP_LOCK_MESH_ACL(flags);
plist = phead->next;
while (plist != phead) {
paclnode = list_entry(plist, struct wlan_acl_node, list);
plist = plist->next;
if ((len + MACADDRLEN) > length)
break;
memcpy(&tmp_buf[len], paclnode->addr, MACADDRLEN);
len += MACADDRLEN;
}
SMP_UNLOCK_MESH_ACL(flags);
if (len) {
if (ioctl_copy_to_user((void *)data, tmp_buf, len)) {
len = -1;
}
}
kfree(tmp_buf);
return len;
}
#endif // CONFIG_RTK_MESH && _MESH_ACL_ENABLE_
static void get_misc_data(struct rtl8192cd_priv *priv, struct _misc_data_ *pdata)
{
memset(pdata, '\0', sizeof(struct _misc_data_));
pdata->mimo_tr_hw_support = GET_HW(priv)->MIMO_TR_hw_support;
// get number of tx path
if (get_rf_mimo_mode(priv) == MIMO_1T2R)
pdata->mimo_tr_used = 1;
else if (get_rf_mimo_mode(priv) == MIMO_1T1R)
pdata->mimo_tr_used = 1;
else if (get_rf_mimo_mode(priv) == MIMO_2T2R)
pdata->mimo_tr_used = 2;
else if (get_rf_mimo_mode(priv) == MIMO_3T3R)
pdata->mimo_tr_used = 3;
else if (get_rf_mimo_mode(priv) == MIMO_4T4R)
pdata->mimo_tr_used = 4;
else // MIMO_2T4R
pdata->mimo_tr_used = 2;
return;
}
#ifdef AUTO_TEST_SUPPORT
static void rtl8192cd_SSReq_AutoTest(struct rtl8192cd_priv *priv)
{
INT8 ret = 0;
//int i1;
//static int timerbeinit = 0;
#if defined(MBSSID) && (defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI))
if (IS_VAP_INTERFACE(priv))
return;
#endif
#ifdef CONFIG_RTK_MESH
if((priv->auto_channel &0x30) && timer_pending(&priv->ss_timer))
ret = -2;
else
#endif
if (!netif_running(priv->dev) || priv->ss_req_ongoing)
ret = -1;
else
ret = 0;
if (!ret) // now, let's start site survey
{
priv->ss_ssidlen = 0;
DEBUG_INFO("start_clnt_ss, trigger by %s, ss_ssidlen=0\n", (char *)__FUNCTION__);
priv->ss_req_ongoing = 1;
start_clnt_ss(priv);
}else{
return ;
}
}
#ifdef CLIENT_MODE
#if defined(WIFI_WPAS) || defined(RTK_NL80211)
int check_bss_encrypt(struct rtl8192cd_priv *priv)
#else
static int check_bss_encrypt(struct rtl8192cd_priv *priv)
#endif
{
#if defined(CONFIG_RTL_WAPI_SUPPORT)
// WAPI
if (priv->pmib->wapiInfo.wapiType!=wapiDisable
|| priv->pmib->dot1180211AuthEntry.dot11PrivacyAlgrthm==_WAPI_SMS4_)
{
if ((priv->pmib->dot11Bss.capability & BIT(4)) == 0)
return FAIL;
else if (priv->pmib->dot11Bss.t_stamp[0] != SECURITY_INFO_WAPI)
return FAIL;
else
return SUCCESS;
} else
#endif
// no encryption
if (priv->pmib->dot1180211AuthEntry.dot11PrivacyAlgrthm == 0)
{
if (priv->pmib->dot11Bss.capability & BIT(4))
return FAIL;
else
return SUCCESS;
}
// legacy encryption
else if (!IEEE8021X_FUN &&
((priv->pmib->dot1180211AuthEntry.dot11PrivacyAlgrthm == _WEP_104_PRIVACY_) ||
(priv->pmib->dot1180211AuthEntry.dot11PrivacyAlgrthm == _WEP_40_PRIVACY_)))
{
if ((priv->pmib->dot11Bss.capability & BIT(4)) == 0)
return FAIL;
else if (priv->pmib->dot11Bss.t_stamp[0] != 0)
return FAIL;
else
return SUCCESS;
}
// WPA/WPA2
else
{
if ((priv->pmib->dot11Bss.capability & BIT(4)) == 0)
return FAIL;
else if (priv->pmib->dot11Bss.t_stamp[0] == 0)
return FAIL;
else if ((priv->pmib->dot11RsnIE.rsnie[0] == _RSN_IE_1_) &&
((priv->pmib->dot11Bss.t_stamp[0] & 0x0000ffff) == 0))
return FAIL;
else if ((priv->pmib->dot11RsnIE.rsnie[0] == _RSN_IE_2_) &&
((priv->pmib->dot11Bss.t_stamp[0] & 0xffff0000) == 0))
return FAIL;
else
return SUCCESS;
}
}
static int rtl8192cd_join_AutoTest(struct rtl8192cd_priv *priv, unsigned char *data)
{
INT8 ret = 0;
char tmpbuf[33];
char SSID123[34];
int ix = 0;
int found = 0 ;
if (!netif_running(priv->dev))
ret = 2;
else if (priv->ss_req_ongoing)
ret = 1;
else
ret = 0;
if (ioctl_copy_from_user((void *)SSID123, (void *)data, 33) ){
panic_printk("copy SSID fail!!\n");
return -1;
}
for(ix = 0 ; ix < priv->site_survey->count_backup ; ix++){
if(!strcmp(priv->site_survey->bss_backup[ix].ssid , SSID123 )){
found = 1;
break;
}
}
if(found == 0){
ret = 3;
panic_printk("SSID not found!!\n");
}else{
memcpy((void *)&(priv->pmib->dot11Bss) ,
(void *)&priv->site_survey->bss_backup[ix] , sizeof(struct bss_desc));
}
if (!ret) // now, let's start site survey and join
{
#ifdef WIFI_SIMPLE_CONFIG
if (priv->pmib->wscEntry.wsc_enable && (priv->pmib->dot11Bss.bsstype&WIFI_WPS)) {
priv->pmib->dot11Bss.bsstype &= ~WIFI_WPS;
priv->wps_issue_join_req = 1;
}
else
#endif
{
if (check_bss_encrypt(priv) == FAIL) {
DEBUG_INFO("Encryption mismatch!\n");
ret = 2;
if (ioctl_copy_to_user((void *)data, (void *)&ret, 1))
return -1;
else
return 0;
}
}
if ((priv->pmib->dot11Bss.ssidlen == 0) || (priv->pmib->dot11Bss.ssid[0] == '\0')) {
DEBUG_INFO("Join to a hidden AP!\n");
ret = 2;
if (ioctl_copy_to_user((void *)data, (void *)&ret, 1))
return -1;
else
return 0;
}
#ifdef UNIVERSAL_REPEATER
disable_vxd_ap(GET_VXD_PRIV(priv));
#endif
memcpy(tmpbuf, priv->pmib->dot11Bss.ssid, priv->pmib->dot11Bss.ssidlen);
tmpbuf[priv->pmib->dot11Bss.ssidlen] = '\0';
DEBUG_INFO("going to join bss: %s\n", tmpbuf);
panic_printk("going to join bss: %s\n", tmpbuf);
memcpy(SSID2SCAN, priv->pmib->dot11Bss.ssid, priv->pmib->dot11Bss.ssidlen);
SSID2SCAN_LEN = priv->pmib->dot11Bss.ssidlen;
SSID_LEN = SSID2SCAN_LEN;
memcpy(SSID, SSID2SCAN, SSID_LEN);
memset(BSSID, 0, MACADDRLEN);
// button 2009.05.21
// derive PSK with slelected SSID
#ifdef INCLUDE_WPA_PSK
if (priv->pmib->dot1180211AuthEntry.dot11EnablePSK)
derivePSK(priv);
#endif
JOIN_REQ_ONGOING_VAL(1);
AUTH_MODE_RETRY_VAL(0);
start_clnt_join(priv);
}
return 0;
}
#endif
#endif
#ifdef CONFIG_8814_AP_MAC_VERI
typedef enum _AP_MAC_VERI_8814_
{
RetryLimitForEachMACID = 0x0,
LowestRetryRateInTXDESC,
ReleaseOnePKtbyMACIDeep,
AppendMACHeaderForRXpacket,
HWAutoAppendMACID,
HWSupportPowerStatedetect,
}AP_MAC_VERI_8814,*PAP_MAC_VERI_8814;
EXTERN void rtl88XX_tx_dsr(unsigned long task_priv);
#ifdef CONFIG_8814_AP_MAC_VERI
void RX_MAC_Verify_8814(struct rtl8192cd_priv *priv,unsigned char * pframe,struct rx_frinfo *pfrinfo)
{
PRX_DESC_88XX prx_desc;
int i;
unsigned char macid;
unsigned char pattern[5] = {0x55,0x55,0x55,0x55,0x55};
unsigned char pwrBit;
unsigned char payLoadMACid;
prx_desc = (PRX_DESC_88XX)(pframe-sizeof(RX_DESC_88XX));
if(!memcmp((pframe+pfrinfo->hdr_len),&pattern,5))
{
// printk("pfrinfo->macid = %x \n",pfrinfo->macid);
// Verify MACID
payLoadMACid = *(pframe+pfrinfo->hdr_len+6);
#ifdef HW_FILL_MACID
if(pfrinfo->macid == payLoadMACid)
{
printk("macID %x match \n",pfrinfo->macid);
}
else
{
printk("macID mismatch HW = %x SW = %x \n",pfrinfo->macid,payLoadMACid);
for(i=0 ; i<pfrinfo->hdr_len ;i++ )
{
printk("%02X ",*(pframe+i));
if((i%16)==15)
{
printk("\n");
}
}
printk("\n\n");
}
#endif //HW_FILL_MACID
#ifdef HW_DETEC_POWER_STATE
// Verify PowerBit
pwrBit = GetPwrMgt(pframe);
static u4Byte seq = 0;
static u4Byte carrier = 0;
if(pfrinfo->macid != 0x7F) {
//if(priv->testResult == true)
{
if(priv->pwrState[pfrinfo->macid]!= pwrBit) {
priv->pwrStateCnt[pfrinfo->macid]++;
RTL_W16(0x1a2,RTL_R16(0x1a2)+1);
RTL_W16(0x1a6,priv->pwrStateCnt[pfrinfo->macid]);
RTL_W8(0x1a5,pwrBit);
if(GetSequence(pframe)== 0xfff)
{
priv->sw_Carrier++;
carrier++;
}
printk("[%s][%d]power state change at MACID:%x, Seq:%x, Cur Pwr:%x Cnt = %x HW pwr =%x HW seq=%x carrier =%x \n"
,__FUNCTION__,__LINE__,pfrinfo->macid,GetSequence(pframe),pwrBit,priv->pwrStateCnt[pfrinfo->macid],RTL_R8(0x1140),priv->hw_seq[0],carrier);
// comapre HW&SW pwrBit,seq,Cnt
if(pwrBit!= priv->pshare->HWPwroldState[pfrinfo->macid])
{
printk("MACID%x PwrStatus error SW=%x HW=%x \n",pfrinfo->macid,pwrBit,priv->pshare->HWPwroldState[pfrinfo->macid]);
priv->testResult = false;
}
if(priv->pwrStateCnt[pfrinfo->macid]!= priv->pwrStateHWCnt[pfrinfo->macid])
{
printk("MACID%x PwrStatus CNT error SW=%x HW=%x \n",
pfrinfo->macid,priv->pwrStateCnt[pfrinfo->macid],priv->pwrStateHWCnt[pfrinfo->macid]);
priv->testResult = false;
}
if(GetSequence(pframe)!= priv->hw_seq[pfrinfo->macid])
{
printk("MACID%x Sequence error SW=%x HW=%x sw_Carrier =%x hw_Carrier =%x \n",
pfrinfo->macid,GetSequence(pframe),priv->hw_seq[0],priv->sw_Carrier,priv->hw_Carrier);
priv->testResult = false;
}
if(priv->test_seq_MACID == pfrinfo->macid)
{
// if(GetSequence(pframe) < priv->hw_seq[pfrinfo->macid])
if(GetSequence(pframe)!= priv->hw_seq[pfrinfo->macid])
{
printk("MACID%x Sequence error SW=%x HW=%x \n",
pfrinfo->macid,GetSequence(pframe),priv->hw_seq[pfrinfo->macid]);
priv->testResult = false;
}
else
{
printk("MACID%x Sequence pass \n",pfrinfo->macid);
}
}
priv->test_seq_MACID = pfrinfo->macid+1;
if(priv->test_seq_MACID == 127)
priv->test_seq_MACID = 0;
RTL_W8(0x1150,priv->test_seq_MACID);
printk("MACID%x PASS CNT = %x \n",pfrinfo->macid,priv->pwrStateCnt[pfrinfo->macid]);
}
else
{
printk("MACID%x No change \n",pfrinfo->macid);
}
}
priv->pwrState[pfrinfo->macid] = pwrBit;
// compare seq number
}else {
printk("[%x][%d]MacId can't Read \n",__FUNCTION__,__LINE__);
}
#endif // #ifdef HW_DETEC_POWER_STATE
}
}
#endif // #ifdef CONFIG_8814_AP_MAC_VERI
static void issue_Test_NullData(struct rtl8192cd_priv *priv,unsigned char macID,unsigned char type)
{
struct wifi_mib *pmib;
// unsigned char hwaddr[6] = {0x22,0x22,0x33,0x44,0x55,0x66};
unsigned char hwaddr[6] = {0x00,0x11,0x11,0x11,0x11,0x11};
unsigned char pattern[5] = {0x55,0x55,0x55,0x55,0x55};
unsigned char *pbuf;
unsigned char i;
unsigned char pattern_len = 10;
DECLARE_TXINSN(txinsn);
pmib = GET_MIB(priv);
txinsn.retry = pmib->dot11OperationEntry.dot11ShortRetryLimit;
//hwaddr = pmib->dot11OperationEntry.hwaddr;
//printk("issue_Test_NullData type = %x \n",type);
txinsn.q_num = type;
// if txinsn.q_num = MGNT_QUEUE, test data retry
// else test RTS retry
txinsn.fr_type = _PRE_ALLOCMEM_;
txinsn.tx_rate = find_rate(priv, NULL, 0, 1);
txinsn.fixed_rate = 1;
txinsn.phdr = get_wlanhdr_from_poll(priv);
if (txinsn.phdr == NULL)
{
printk("txinsn.phdr NULL \n");
goto send_fail;
}
pbuf = txinsn.pframe = get_mgtbuf_from_poll(priv);
if (txinsn.pframe == NULL)
{
printk("txinsn.pframe NULL \n");
goto send_fail;
}
memset((void *)(txinsn.phdr), 0, sizeof (struct wlan_hdr));
SetFrameSubType(txinsn.phdr, WIFI_DATA);
SetToDs(txinsn.phdr);
//SetMData(txinsn.phdr);
memcpy((void *)GetAddr1Ptr((txinsn.phdr)), hwaddr, MACADDRLEN);
memcpy((void *)GetAddr2Ptr((txinsn.phdr)), BSSID, MACADDRLEN);
memcpy((void *)GetAddr3Ptr((txinsn.phdr)), BSSID, MACADDRLEN);
txinsn.hdr_len = 0; // hdr_len add in check_desc
memcpy(pbuf,pattern,5);
for(i=5 ;i < pattern_len ;i++)
{
pbuf[i] = macID;
}
txinsn.fr_len = pattern_len;
priv->macID_temp = macID;
if ((rtl8192cd_firetx(priv, &txinsn)) == SUCCESS)
{
printk("MACID = %x tx ok \n",macID);
return;
}
else
{
printk("MACID = %x tx fail \n",macID);
}
send_fail:
if (txinsn.phdr)
release_wlanhdr_to_poll(priv, txinsn.phdr);
if (txinsn.pframe)
release_mgtbuf_to_poll(priv, txinsn.pframe);
}
int APmacTestFunction_8814(struct rtl8192cd_priv *priv, unsigned char *data)
{
unsigned char *val[10];
int i=0, op=0, offset;
char *delim = ",";
unsigned char input;
if (strlen(data) == 0) {
printk("RetryLimitForEachMACID 0x1 downlaod Rsvd page\n");
printk("LowestRetryRateInTXDESC 0x2: AP offload enable \n");
return 0;
}
for(i=0;i<10;i++)
{
val[i] = kmalloc(10,GFP_ATOMIC);
}
if(val[0] = strtok(data,delim))
{
i= 1;
while(val[i]= strtok(NULL,delim))
{
i++;
}
}
int mode = 0;
unsigned char RetryLimitNum = 0;
unsigned char lowestRetry = 0;
unsigned char Enable = 0;
unsigned char macIDNum = 0;
unsigned char lowestRate =0;
unsigned char macID;
unsigned char type;
unsigned char tempEn;
// mode2
unsigned char option;
unsigned int reg_addr;
unsigned char releaseBit;
RTL_W32(0x80, RTL_R32(0x80)|BIT15);
mode = _atoi(val[0],16);
switch(mode)
{
case RetryLimitForEachMACID:
//RetryLimitTestCmd iwpriv wlan0 apTest 0,enableBit,RetryLimitNum,macIDNum,type
// example iwpriv wlan0 apTest 1,32
// Test For 128 MACID
if((!val[1])||(!val[2])||(!val[3])||(!val[4])) {
printk("%s %d CMD : iwpriv wlan0 apTest 0,enableBit,RetryLimitNum,macIDNum,type\n",__FUNCTION__,__LINE__);
return;
}
// enable=0, in TXDESC
// enable=1, in SRAM
// enable=2, TXESC and SRAM all disable
Enable = _atoi(val[1],10);
RetryLimitNum = _atoi(val[2],10);
macIDNum = _atoi(val[3],10);
type = _atoi(val[4],10);
// set Rpt buffer
for(macID = 0; macID < macIDNum; macID++) {
if(Enable==1) {
// set RTY_LMT_EN in SRAM
GET_HAL_INTERFACE(priv)->SetTxRPTHandler(priv, macID, TXRPT_VAR_RTY_LMT_EN, &Enable);
priv->lowestRate_TXDESCen = 0;
}
else if(Enable ==0){
// default retry = 10 in TXDESC
priv->lowestRate_TXDESCen = 1;
GET_HAL_INTERFACE(priv)->SetTxRPTHandler(priv, macID, TXRPT_VAR_RTY_LOW_RATE_EN, &Enable);
GET_HAL_INTERFACE(priv)->SetTxRPTHandler(priv, macID, TXRPT_VAR_RTY_LMT_EN, &Enable);
}
else if(Enable ==2) {
// retry limit by register
tempEn = 0;
priv->lowestRate_TXDESCen = 0;
GET_HAL_INTERFACE(priv)->SetTxRPTHandler(priv, macID, TXRPT_VAR_RTY_LMT_EN, &tempEn);
}
// set RetryLimitNum in SRAM
GET_HAL_INTERFACE(priv)->SetTxRPTHandler(priv, macID, TXRPT_VAR_DATA_RT_LMT, &RetryLimitNum);
// TX pkt
issue_Test_NullData(priv,macID,type);
rtl8192cd_tx_dsr((unsigned long)priv);
delay_ms(1*RetryLimitNum);
}
break;
case LowestRetryRateInTXDESC:
//LowestRetryRateInTXDESC iwpriv wlan0 apTest 1,TXDESC/RPTBuffer,LowestRTYRate,macIDNum,type
// example iwpriv wlan0 apTest 1,0,4,128 (apTest LowestRetryRateInTXDESC/TXDESC/OFDM 12M/ 128 macIDs)
// Test For 128 MACID
if((!val[1])||(!val[2])||(!val[3])||(!val[4])) {
printk("%s %d CMD : iwpriv wlan0 apTest 1,TXDESC/RPTBuffer,LowestRTYRate,macIDNum,type\n",__FUNCTION__,__LINE__);
return;
}
Enable = _atoi(val[1],10);
lowestRate = _atoi(val[2],10);
macIDNum = _atoi(val[3],10);
type = _atoi(val[4],10);
// set Rpt buffer
for(macID = 0; macID < macIDNum; macID++) {
if(Enable==1) {
priv->lowestRate_TXDESCen = 0;
// set lowest rate in SRAM
GET_HAL_INTERFACE(priv)->SetTxRPTHandler(priv, macID, TXRPT_VAR_RTY_LOW_RATE_EN, &Enable);
GET_HAL_INTERFACE(priv)->SetTxRPTHandler(priv, macID, TXRPT_VAR_RTY_LMT_EN, &Enable);
RetryLimitNum = 15;
GET_HAL_INTERFACE(priv)->SetTxRPTHandler(priv, macID, TXRPT_VAR_DATA_RT_LMT, &RetryLimitNum);
}else if(Enable==0) {
priv->lowestRate_TXDESCen = 1;
priv->lowestRate = lowestRate;
GET_HAL_INTERFACE(priv)->SetTxRPTHandler(priv, macID, TXRPT_VAR_RTY_LMT_EN, &Enable);
GET_HAL_INTERFACE(priv)->SetTxRPTHandler(priv, macID, TXRPT_VAR_RTY_LOW_RATE_EN, &Enable);
// set lowest rate in TXDESC
}else if(Enable ==2) {
// retry limit by register
tempEn = 0;
priv->lowestRate_TXDESCen = 0;
GET_HAL_INTERFACE(priv)->SetTxRPTHandler(priv, macID, TXRPT_VAR_RTY_LMT_EN, &tempEn);
GET_HAL_INTERFACE(priv)->SetTxRPTHandler(priv, macID, TXRPT_VAR_RTY_LOW_RATE_EN, &tempEn);
}
GET_HAL_INTERFACE(priv)->SetTxRPTHandler(priv, macID, TXRPT_VAR_RTS_RTY_LOW_RATE, &lowestRate);
GET_HAL_INTERFACE(priv)->SetTxRPTHandler(priv, macID, TXRPT_VAR_DATA_RTY_LOW_RATE, &lowestRate);
// TX pkt
issue_Test_NullData(priv,macID,type);
rtl8192cd_tx_dsr((unsigned long)priv);
delay_ms(1*RetryLimitNum);
}
break;
case ReleaseOnePKtbyMACIDeep:
//ReleaseOnePKtbyMACIDeep iwpriv wlan0 apTest 2,Option,MPDU/AMPDU,macIDNum
// example iwpriv wlan0 apTest 2,0,4,128 (apTest LowestRetryRateInTXDESC/TXDESC/OFDM 12M/ 128 macIDs)
// Test For 128 MACID
if((!val[1])||(!val[2])||(!val[3])) {
printk("%s %d CMD : iwpriv wlan0 apTest 2,Option,MPDU/AMPDU,macIDNum\n",__FUNCTION__,__LINE__);
return;
}
option = _atoi(val[1],10);
macID = _atoi(val[2],10);
type = _atoi(val[3],10);
reg_addr = 0x1434 + (macID >>5)*4;
releaseBit = macID%32;
switch(option)
{
case 1:
// 1.) MACID Sleep disable,
// 2.) MACID release bit set1, do nothing
for(macID = 0;macID < 128; macID++)
{
reg_addr = 0x1434 + (macID >>5)*4;
releaseBit = macID%32;
RTL_W32(reg_addr, RTL_R32(reg_addr) | BIT(releaseBit));
delay_us(1000);
if(RTL_R32(reg_addr)&BIT(releaseBit))
{
printk("Test1 fail at MACID:%x\n",macID);
}
}
printk("Test1 finish \n");
break;
case 2:
for(macID = 0;macID < 128; macID++)
{
// 1.) MACID sleep enable (pause)
GET_HAL_INTERFACE(priv)->SetMACIDSleepHandler(priv,1,macID);
// 2.) TX one packet (download)
issue_Test_NullData(priv,macID,0);
// 3.) MACID release one (release)
reg_addr = 0x1434 + (macID >>5)*4;
releaseBit = macID%32;
RTL_W32(reg_addr, RTL_R32(reg_addr) | BIT(releaseBit));
// polling 0 (TX done), or fail
delay_ms(100);
if(RTL_R32(reg_addr)&BIT(releaseBit))
{
printk("First TX done fail at MACID:%x\n",macID);
}
rtl8192cd_tx_dsr((unsigned long)priv);
}
break;
case 3:
for(macID = 0;macID < 128; macID++)
{
// 1.) MACID sleep enable (pause)
GET_HAL_INTERFACE(priv)->SetMACIDSleepHandler(priv,1,macID);
reg_addr = 0x1434 + (macID >>5)*4;
releaseBit = macID%32;
// 2.) MACID release one (release)
RTL_W32(reg_addr, RTL_R32(reg_addr) | BIT(releaseBit));
// polling 1 (TX done), or fail
delay_ms(100);
if(!(RTL_R32(reg_addr)&BIT(releaseBit)))
{
printk("TX queue fail at MACID:%x\n",macID);
}
// 5.) TX one packet (download)
issue_Test_NullData(priv,macID,0);
delay_ms(50);
// polling 0 (TX done), or fail
if(RTL_R32(reg_addr)&BIT(releaseBit))
{
printk("Last TX done fail at MACID:%x\n",macID);
}
rtl8192cd_tx_dsr((unsigned long)priv);
}
break;
case 4:
// TXDESC set 1
for(macID = 0;macID < 128; macID++)
{
reg_addr = 0x1434 + (macID >>5)*4;
releaseBit = macID%32;
priv->lowestRate_TXDESCen = 1; // TXDESC moredata = 1;
GET_HAL_INTERFACE(priv)->SetMACIDSleepHandler(priv,1,macID);
issue_Test_NullData(priv,macID,2);
RTL_W32(reg_addr, RTL_R32(reg_addr) | BIT(releaseBit)); // moreData = 1
while(RTL_R32(reg_addr)&BIT(releaseBit))
{
delay_ms(5);
}
issue_Test_NullData(priv,macID,1);
RTL_W32(reg_addr, RTL_R32(reg_addr) | BIT(releaseBit)); // moreData = 1
while(RTL_R32(reg_addr)&BIT(releaseBit))
{
delay_ms(5);
}
issue_Test_NullData(priv,macID,2);
RTL_W32(reg_addr, RTL_R32(reg_addr) | BIT(releaseBit)); // moreData = 1
while(RTL_R32(reg_addr)&BIT(releaseBit))
{
delay_ms(5);
}
rtl8192cd_tx_dsr((unsigned long)priv);
delay_ms(50);
}
break;
case 5:
// No TXDESC,
// 2.) MACID release one (release)
for(macID = 0;macID < 128; macID++)
{
reg_addr = 0x1434 + (macID >>5)*4;
releaseBit = macID%32;
priv->lowestRate_TXDESCen = 0; // TXDESC moredata = 0;
GET_HAL_INTERFACE(priv)->SetMACIDSleepHandler(priv,1,macID);
issue_Test_NullData(priv,macID,1);
issue_Test_NullData(priv,macID,2);
issue_Test_NullData(priv,macID,3);
RTL_W32(reg_addr, RTL_R32(reg_addr) | BIT(releaseBit)); // moreData = 1
while(RTL_R32(reg_addr)&BIT(releaseBit)){delay_ms(5); }
RTL_W32(reg_addr, RTL_R32(reg_addr) | BIT(releaseBit)); // moreData = 1
while(RTL_R32(reg_addr)&BIT(releaseBit)){delay_ms(5); }
RTL_W32(reg_addr, RTL_R32(reg_addr) | BIT(releaseBit)); // moreData = 0
while(RTL_R32(reg_addr)&BIT(releaseBit)){delay_ms(5); }
issue_Test_NullData(priv,macID,2);
issue_Test_NullData(priv,macID,2);
RTL_W32(reg_addr, RTL_R32(reg_addr) | BIT(releaseBit)); // moreData = 1
while(RTL_R32(reg_addr)&BIT(releaseBit)){delay_ms(5); }
issue_Test_NullData(priv,macID,2);
RTL_W32(reg_addr, RTL_R32(reg_addr) | BIT(releaseBit)); // moreData = 1
while(RTL_R32(reg_addr)&BIT(releaseBit)){delay_ms(5); }
RTL_W32(reg_addr, RTL_R32(reg_addr) | BIT(releaseBit)); // moreData = 0
while(RTL_R32(reg_addr)&BIT(releaseBit)){delay_ms(5); }
RTL_W32(reg_addr, RTL_R32(reg_addr) | BIT(releaseBit));
rtl8192cd_tx_dsr((unsigned long)priv);
issue_Test_NullData(priv,macID,2); // moreData = 0
rtl8192cd_tx_dsr((unsigned long)priv);
delay_ms(50);
}
break;
case 6:
// disable HW_auto_fill_moreData
RTL_W8(0x454,RTL_R8(0x454)&~(BIT2));
for(macID = 0;macID < 128; macID++)
{
reg_addr = 0x1434 + (macID >>5)*4;
releaseBit = macID%32;
priv->lowestRate_TXDESCen = 0; // TXDESC moredata = 0;
GET_HAL_INTERFACE(priv)->SetMACIDSleepHandler(priv,1,macID);
issue_Test_NullData(priv,macID,1);
issue_Test_NullData(priv,macID,2);
issue_Test_NullData(priv,macID,3);
RTL_W32(reg_addr, RTL_R32(reg_addr) | BIT(releaseBit)); // moreData = 0
while(RTL_R32(reg_addr)&BIT(releaseBit)){delay_ms(5); }
RTL_W32(reg_addr, RTL_R32(reg_addr) | BIT(releaseBit)); // moreData = 0
while(RTL_R32(reg_addr)&BIT(releaseBit)){delay_ms(5); }
RTL_W32(reg_addr, RTL_R32(reg_addr) | BIT(releaseBit)); // moreData = 0
while(RTL_R32(reg_addr)&BIT(releaseBit)){delay_ms(5); }
issue_Test_NullData(priv,macID,2);
issue_Test_NullData(priv,macID,2);
RTL_W32(reg_addr, RTL_R32(reg_addr) | BIT(releaseBit)); // moreData = 0
while(RTL_R32(reg_addr)&BIT(releaseBit)){delay_ms(5); }
issue_Test_NullData(priv,macID,2);
RTL_W32(reg_addr, RTL_R32(reg_addr) | BIT(releaseBit)); // moreData = 0
while(RTL_R32(reg_addr)&BIT(releaseBit)){delay_ms(5); }
RTL_W32(reg_addr, RTL_R32(reg_addr) | BIT(releaseBit)); // moreData = 0
while(RTL_R32(reg_addr)&BIT(releaseBit)){delay_ms(5); }
RTL_W32(reg_addr, RTL_R32(reg_addr) | BIT(releaseBit));
rtl8192cd_tx_dsr((unsigned long)priv);
issue_Test_NullData(priv,macID,2); // moreData = 0
rtl8192cd_tx_dsr((unsigned long)priv);
delay_ms(50);
}
break;
case 7:
// pause
GET_HAL_INTERFACE(priv)->SetMACIDSleepHandler(priv,1,macID);
break;
case 8:
// download packet
// 5.) TX one packet (download)
issue_Test_NullData(priv,macID,type);
break;
case 9:
// release packet
// 2.) MACID release one (release)
RTL_W32(reg_addr, RTL_R32(reg_addr) | BIT(releaseBit));
break;
case 10:
// Set AMPDU
tempEn = 1;
GET_HAL_INTERFACE(priv)->SetTxRPTHandler(priv, macID, TXRPT_VAR_PKT_TX_ONE_SEL, &tempEn);
break;
default:
printk("%s %d Unkonw option =%x\n",__FUNCTION__,__LINE__,option);
break;
}
printk("%s %d ReleaseOnePKtbyMACIDeep Test\n",__FUNCTION__,__LINE__);
break;
case AppendMACHeaderForRXpacket:
printk("%s %d AppendMACHeaderForRXpacket Test \n",__FUNCTION__,__LINE__);
break;
case HWAutoAppendMACID:
//HWAutoAppendMACID iwpriv wlan0 apTest 4,macID,
// example iwpriv wlan0 apTest 4,1
// Test For 128 MACID
if((!val[1])) {
printk("%s %d CMD : iwpriv wlan0 apTest 1,TXDESC/RPTBuffer,LowestRTYRate,macIDNum,type\n",__FUNCTION__,__LINE__);
return;
}
macIDNum = _atoi(val[1],10);
RTL_W32(0x6bc, 0x03000000); // set CRC5 buffer addr
// fill mac address
unsigned char hwaddr[6] = {0x00,0x11,0x11,0x11,0x11,0x11};
unsigned int test;
for(macID = 0;macID < macIDNum;macID++)
{
hwaddr[5]= 0x11 + macID;
GET_HAL_INTERFACE(priv)->SetTxRPTHandler(priv, macID, TXRPT_VAR_MAC_ADDRESS, &hwaddr);
GET_HAL_INTERFACE(priv)->SetCRC5ToRPTBufferHandler(priv,CRC5(hwaddr,6), macID,1);
}
priv->testResult = false;
priv->RXMACIDTestEn = true;
printk("%s %d HWAutoAppendMACID Test \n",__FUNCTION__,__LINE__);
break;
case HWSupportPowerStatedetect:
if((!val[1])) {
printk("%s %d CMD : iwpriv wlan0 apTest 5,macID\n",__FUNCTION__,__LINE__);
return;
}
RTL_W32(0x6bc, 0x03000000); // set CRC5 buffer addr
RTL_W32(0x7D4, RTL_R32(0x7D4)|BIT17); // set ps detect enable
priv->test_seq_MACID = 0;
RTL_W32(0x1150,0x0); // set ps seq debug port
priv->testResult = true;
// macIDNum = _atoi(val[1],10);
// RTL_W8(0x1150,macIDNum);
// priv->test_seq_MACID = macIDNum;
printk("%s %d HWSupportPowerStatedetect Test \n",__FUNCTION__,__LINE__);
break;
case 0xdd: // for verify FAST EDCA
{
/*
* iwpriv wlan0 apTest dd,macID,type,cnt
* iwpriv wlan0 apTest dd,1,2,3
BK_QUEUE = 1,
BE_QUEUE = 2,
VI_QUEUE = 3,
VO_QUEUE = 4,
*/
unsigned char macID;
unsigned int type;
unsigned int cnt;
unsigned int i;
if((!val[1])||(!val[2])||(!val[3])) {
printk("%s(%d): CMD: iwpriv wlan0 apTest dd,macID,type,cnt \n", __FUNCTION__, __LINE__);
return;
}
macID = _atoi(val[1], 10);
type = _atoi(val[2], 10);
cnt = _atoi(val[3], 10);
for (i = 0; i < cnt; i++) {
issue_Test_NullData(priv, macID, type);
if (i != 0 && i%8 == 0) {
rtl8192cd_tx_dsr((unsigned long)priv);
}
}
rtl8192cd_tx_dsr((unsigned long)priv);
}
break;
case 0xde:
{
/* tx pkt buf 0x18780000 + 0x1b000 = 0x1879B000 */
/* (0x400[10:0] * 0x80 + 0x18780000)[23:12] */
/* iwpriv wlan0 apTest de,400,32 */
/* check 0x41A first */
unsigned int reg1 = 0;
unsigned int base_reg = 0x8000;
unsigned int value32 = 0, valueA = 0, valueB = 0;
unsigned int num = 0;
unsigned int cur_reg;
if((!val[1])||(!val[2])) {
printk("%s(%d): CMD: iwpriv wlan0 apTest de,REG_QX_INFO,cnt \n", __FUNCTION__, __LINE__);
return;
}
reg1 = _atoi(val[1], 16); // ex: 400
num = _atoi(val[2], 16);
value32 = RTL_R32(reg1) & 0x7FF; // [10:0]
value32 = value32 * 0x80;
value32 = value32 + 0x18780000;
valueA = (value32 >> 12) & 0xFFF;
valueB = value32 & 0xFFF;
base_reg = base_reg + valueB;
printk("0x140: 0x%X\n", valueA);
RTL_W8(0x106, 0x69);
RTL_W32(0x140, valueA);
printk("print reg:0x%X, num(dw):0x%x \n", base_reg, num);
for (i = 0; i < num; i++) {
cur_reg = base_reg + 0x4 * i;
value32 = RTL_R32(cur_reg);
#if 0
printk("%s(%d): cur_reg:%04X, value32:%08X \n", __FUNCTION__, __LINE__, cur_reg, value32);
#else
printk("%08X ", value32);
if (i % 4 == 3) {
printk("\n");
}
#endif
}
printk("\n");
}
break;
case 0xEE:
RTL_W8(0x106,0x69);
RTL_W32(0x140,0x780);
// clear MACID
for(i=0;i<0xFFF;i++) {
RTL_W8(0x8000+i,0);
}
printk("Reset TXPKTBuffer !!! \n");
return;
case 0xFF:
GET_HAL_INTERFACE(priv)->SetTxRPTHandler(priv, macID, TXRPT_VAR_ALL, NULL);
for(i=0;i<128;i++) {
priv->pwrState[i] = 0;
priv->pwrHWState[i] = 0;
priv->pwroldHWState[i] = 0;
priv->pwrStateCnt[i] = 0;
priv->pwrStateHWCnt[i] = 0;
priv->hw_seq[i] = 0;
}
priv->testResult = true;
RTL_W32(0x1140,0x0);
RTL_W32(0x1144,0x0);
RTL_W32(0x1148,0x0);
printk("Reset RPTBuffer !!! \n");
return;
break;
default:
printk("%s %d Unkonw operation ! mode=%x\n",__FUNCTION__,__LINE__,mode);
break;
}
}
#endif //#ifdef CONFIG_8814_AP_MAC_VERI
#ifndef CONFIG_RTL_COMAPI_WLTOOLS
static
#endif
int rtl8192cd_ss_req(struct rtl8192cd_priv *priv, unsigned char *data, int len)
{
INT8 ret = 0;
#ifdef CONFIG_RTK_MESH
// by GANTOE for manual site survey 2008/12/25
// inserted by Joule for simple channel unification protocol 2009/01/06
if((priv->auto_channel &0x30) && timer_pending(&priv->ss_timer))
ret = -2;
else
#endif
if (!netif_running(priv->dev) || priv->ss_req_ongoing)
ret = -1;
#if defined( WIFI_SIMPLE_CONFIG ) && defined(UNIVERSAL_REPEATER)
else if(priv->wsc_ss_delay > 0){
STADEBUG("reject by wsc_ss_delay\n");
ret = -3;
}
#endif
#ifdef SMART_REPEATER_MODE
else if (IS_DRV_OPEN(GET_VXD_PRIV(priv)) && GET_VXD_PRIV(priv)->ss_req_ongoing) {
STADEBUG("VXD is scanning. Don't site-survey\n");
ret = -4;
}
#endif
#ifdef CONFIG_RTL_SIMPLE_CONFIG_USE_WPS_BUTTON
else if((priv->simple_config_status>=2) && (priv->pmib->wscEntry.wsc_enable))
{
STADEBUG("it is get simple profile now, don't switch channel from ioctl\n");
ret = -5;
}
#endif
else{
ret = 0;
}
if (!ret) // now, let's start site survey
{
priv->ss_ssidlen = 0;
DEBUG_INFO("start_clnt_ss, trigger by %s, ss_ssidlen=0\n", (char *)__FUNCTION__);
if (len == 2){
STADEBUG("Req from WSC\n");
priv->ss_req_ongoing = SSFROM_WSC; // WiFi-Simple-Config scan-req
#if defined( WIFI_SIMPLE_CONFIG ) && defined(UNIVERSAL_REPEATER)
if(IS_VXD_INTERFACE(priv)){
if(get_ss_level(priv)==0){ //exist some STA connected to root or VAP
priv->wsc_ss_delay = 5; // SCAN interval , unit is second
}
}
#endif
}else
{
STADEBUG("req_from_Web\n");
priv->ss_req_ongoing = 1; //SS req by Web
}
start_clnt_ss(priv);
}
if (ioctl_copy_to_user((void *)data, (void *)&ret, 1))
return -1;
return 0;
}
static int rtl8192cd_autochannel_sel(struct rtl8192cd_priv *priv)
{
INT8 ret = 0;
if (!netif_running(priv->dev) || priv->ss_req_ongoing)
ret = -1;
else
ret = 0;
/* get available channels before ACS */
get_available_channel(priv);
if (!ret) // now, let's start site survey
{
priv->ss_ssidlen = 0;
DEBUG_INFO("start_clnt_ss, trigger by %s, ss_ssidlen=0\n", (char *)__FUNCTION__);
priv->ss_req_ongoing = 1;
priv->auto_channel = 1;
start_clnt_ss(priv);
}
return ret;
}
static void rtl8192cd_del_all_sta(struct rtl8192cd_priv *priv)
{
if (OPMODE & WIFI_AP_STATE) {
int i;
for(i = 0; i < NUM_STAT; i++)
{
if (priv->pshare->aidarray[i] && (priv->pshare->aidarray[i]->used == TRUE)
#ifdef WDS
&& !(priv->pshare->aidarray[i]->station.state & WIFI_WDS)
#endif
) {
#if defined(UNIVERSAL_REPEATER) || defined(MBSSID)
if (priv != priv->pshare->aidarray[i]->priv)
continue;
#endif
issue_deauth(priv, priv->pshare->aidarray[i]->station.hwaddr, _RSON_DEAUTH_STA_LEAVING_);
}
}
delay_ms(10);
}
}
static int rtl8192cd_get_ss_status(struct rtl8192cd_priv *priv, unsigned char *data)
{
UINT8 flags;
INT8 ret = 0;
if (ioctl_copy_from_user((void *)&flags, (void *)(data), 1))
return -1;
if (!netif_running(priv->dev) || priv->ss_req_ongoing)
{
ret = -1;
if (ioctl_copy_to_user((void *)(data), (void *)&ret, 1))
return -1;
}
else if (flags == 1)
{
ret = priv->site_survey->count_backup;
if (ioctl_copy_to_user((void *)(data), (void *)&ret, 1))
return -1;
}
else if (flags == 0)
{
ret = priv->site_survey->count_backup;
if (ioctl_copy_to_user((void *)data, (void *)&ret, 1))
return -1;
// now we should report data base.
if (ioctl_copy_to_user((void *)(data+4), priv->site_survey->bss_backup,
sizeof(struct bss_desc)*priv->site_survey->count_backup))
return -1;
}
#ifdef WIFI_SIMPLE_CONFIG
else if (flags == 2) { // get simple-config scan result, append WSC IE
ret = priv->site_survey->count_backup;
if (ioctl_copy_to_user((void *)data, (void *)&ret, 1))
return -1;
// now we should report data base.
if (ioctl_copy_to_user((void *)(data+4), priv->site_survey->wscie_backup,
sizeof(struct wps_ie_info2)*priv->site_survey->count_backup))
return -1;
}
#endif
return 0;
}
#ifdef P2P_SUPPORT
int p2p_get_p2pconnect_state(struct rtl8192cd_priv *priv, unsigned char *data)
{
struct p2p_state_event p2p_state_event_t;
memset(&p2p_state_event_t , 0 ,sizeof(struct p2p_state_event));
if(priv->p2pPtr==NULL)
return -1;
p2p_state_event_t.p2p_status = P2P_STATE;
if(P2P_STATE == P2P_S_CLIENT_CONNECTED_DHCPC){
P2P_DEBUG("Wlan driver report client is connected\n");
P2P_DEBUG("Indicate web server to start udhcpc \n\n");
P2P_STATE = P2P_S_CLIENT_CONNECTED_DHCPC_done ; // after web rdy get this state ; change it
}else if(P2P_STATE == P2P_S_preGO2GO_DHCPD){
P2P_DEBUG("now is GO mode\n");
P2P_DEBUG("Indicate web server to start udhcpd ...\n\n");
P2P_STATE = P2P_S_preGO2GO_DHCPD_done ; // after web rdy get this state ; change it
}else if(P2P_STATE == P2P_S_back2dev){
// indicate web server to reset to p2p device mode
P2P_DEBUG("reinit by web server\n");
P2P_STATE = P2P_S_IDLE;
}
if (ioctl_copy_to_user((void *)(data), (void *)&p2p_state_event_t, sizeof(struct p2p_state_event)))
return -1;
return 0;
}
int p2p_get_event_state(struct rtl8192cd_priv *priv, unsigned char *data)
{
int MethodCase=0;
struct p2p_state_event p2p_state_event_t;
memset(&p2p_state_event_t , 0 ,sizeof(struct p2p_state_event));
if(priv->p2pPtr==NULL)
return -1;
if(P2P_STATE>=P2P_S_PROVI_TX_REQ && P2P_STATE<=P2P_S_NEGO_WAIT_CONF )
p2p_state_event_t.p2p_status = 4;
else if(P2P_STATE ==P2P_S_CLIENT_CONNECTED_DHCPC || P2P_STATE ==P2P_S_CLIENT_CONNECTED_DHCPC_done)
p2p_state_event_t.p2p_status = 5;
else if(P2P_STATE == P2P_S_preGO2GO_DHCPD || P2P_STATE ==P2P_S_preGO2GO_DHCPD_done)
p2p_state_event_t.p2p_status = 6;
else if(P2P_STATE == P2P_S_back2dev )
p2p_state_event_t.p2p_status = 7;
else
p2p_state_event_t.p2p_status = P2P_STATE;
p2p_state_event_t.p2p_role = P2PMODE;
if(P2P_EVENT_INDICATE){
p2p_state_event_t.p2p_event = P2P_EVENT_INDICATE;
if(P2P_EVENT_INDICATE == P2P_EVENT_RX_PROVI_REQ)
{
MethodCase = priv->p2pPtr->wsc_method_from_target_dev;
switch(MethodCase){
case CONFIG_METHOD_PIN:
case CONFIG_METHOD_DISPLAY:
p2p_state_event_t.p2p_wsc_method = CONFIG_METHOD_DISPLAY;
break;
case CONFIG_METHOD_PBC:
p2p_state_event_t.p2p_wsc_method = CONFIG_METHOD_PBC;
break;
case CONFIG_METHOD_KEYPAD:
p2p_state_event_t.p2p_wsc_method = CONFIG_METHOD_KEYPAD;
break;
}
}
P2P_EVENT_INDICATE = 0 ;
}
if (ioctl_copy_to_user((void *)(data), (void *)&p2p_state_event_t, sizeof(struct p2p_state_event)))
return -1;
return 0;
}
int p2p_wps_indicate_state(struct rtl8192cd_priv *priv, unsigned char *data)
{
unsigned char flags;
printk("(%s %d)\n\n\n",__FUNCTION__,__LINE__);
if (ioctl_copy_from_user((void *)&flags, (void *)(data), 1)){
return -1;
}
P2P_DEBUG("Report from wscd , WPS is %s\n\n\n", (flags==1?"success":"fail"));
if(flags == GO_WPS_SUCCESS){
if(P2PMODE == P2P_PRE_GO)
{
P2P_DEBUG("pre-GO mdoe ;rx Report from wscd ; WPS is done \n\n");
// mode change
P2PMODE = P2P_TMP_GO ;
// state change
P2P_STATE = P2P_S_preGO2GO_DHCPD;
/*build beacon P2P IE ;
when from (Pre go) switch to GO only need change beacon P2P IE*/
if(P2PMODE == P2P_TMP_GO || P2PMODE == P2P_PRE_GO )
priv->p2pPtr->p2p_beacon_ie_len =
p2p_build_beacon_ie(priv,priv->p2pPtr->p2p_beacon_ie);
}else if(P2PMODE == P2P_PRE_CLIENT){
P2P_DEBUG("Pre-Client mdoe ;Report from wscd ; WPS is done \n\n");
P2PMODE = P2P_CLIENT ;
}
}
return 0;
}
int rtl8192cd_p2p_ss_req(struct rtl8192cd_priv *priv, unsigned char *data, int len)
{
INT8 ret = 0;
if (!netif_running(priv->dev) || P2P_DISCOVERY )
ret = -1;
else
ret = 0;
if (!ret) // now, let's start site survey
{
printk("\n\n trigger P2P_discovery from UI\n");
P2P_DISCOVERY = 1;
priv->site_survey->count = 0;
P2P_scan(priv,NULL);
}
if (ioctl_copy_to_user((void *)data, (void *)&ret, 1))
return -1;
return 0;
}
static int rtl8192cd_p2p_get_ss_status(struct rtl8192cd_priv *priv, unsigned char *data)
{
UINT8 flags;
INT8 ret = 0;
//int idx ;
if (ioctl_copy_from_user((void *)&flags, (void *)(data), 1))
return -1;
if (!netif_running(priv->dev) || P2P_DISCOVERY)
{
ret = -1;
if (ioctl_copy_to_user((void *)(data), (void *)&ret, 1))
return -1;
}
else if (flags == 1)
{
ret = priv->site_survey->count_backup;
if (ioctl_copy_to_user((void *)(data), (void *)&ret, 1))
return -1;
}
else if (flags == 0)
{
ret = priv->site_survey->count_backup;
if (ioctl_copy_to_user((void *)data, (void *)&ret, 1))
return -1;
// now we should report data base.
if (ioctl_copy_to_user((void *)(data+4), priv->site_survey->bss_backup,
sizeof(struct bss_desc)*priv->site_survey->count_backup))
return -1;
}
return 0;
}
#endif
#ifdef CLIENT_MODE
static int rtl8192cd_join(struct rtl8192cd_priv *priv, unsigned char *data)
{
INT8 ret = 0;
char tmpbuf[33];
if (!netif_running(priv->dev))
ret = 2;
else if (priv->ss_req_ongoing)
ret = 1;
else
ret = 0;
if (!ret) // now, let's start site survey and join
{
if (ioctl_copy_from_user((void *)&(priv->pmib->dot11Bss), (void *)data, sizeof(struct bss_desc)))
return -1;
#ifdef WIFI_SIMPLE_CONFIG
if (priv->pmib->wscEntry.wsc_enable && (priv->pmib->dot11Bss.bsstype&WIFI_WPS)) {
priv->pmib->dot11Bss.bsstype &= ~WIFI_WPS;
priv->wps_issue_join_req = 1;
}
else
#endif
{
if (check_bss_encrypt(priv) == FAIL) {
DEBUG_INFO("Encryption mismatch!\n");
ret = 2;
if (ioctl_copy_to_user((void *)data, (void *)&ret, 1))
return -1;
else
return 0;
}
}
if ((priv->pmib->dot11Bss.ssidlen == 0) || (priv->pmib->dot11Bss.ssid[0] == '\0')) {
DEBUG_INFO("Join to a hidden AP!\n");
ret = 2;
if (ioctl_copy_to_user((void *)data, (void *)&ret, 1))
return -1;
else
return 0;
}
#ifdef UNIVERSAL_REPEATER
disable_vxd_ap(GET_VXD_PRIV(priv));
#endif
memcpy(tmpbuf, priv->pmib->dot11Bss.ssid, priv->pmib->dot11Bss.ssidlen);
tmpbuf[priv->pmib->dot11Bss.ssidlen] = '\0';
DEBUG_INFO("going to join bss: %s\n", tmpbuf);
memcpy(SSID2SCAN, priv->pmib->dot11Bss.ssid, priv->pmib->dot11Bss.ssidlen);
SSID2SCAN_LEN = priv->pmib->dot11Bss.ssidlen;
SSID_LEN = SSID2SCAN_LEN;
memcpy(SSID, SSID2SCAN, SSID_LEN);
memset(BSSID, 0, MACADDRLEN);
// button 2009.05.21
// derive PSK with slelected SSID
#ifdef INCLUDE_WPA_PSK
if (priv->pmib->dot1180211AuthEntry.dot11EnablePSK)
derivePSK(priv);
#endif
syncMulticastCipher(priv, &priv->pmib->dot11Bss);
JOIN_REQ_ONGOING_VAL(1);
AUTH_MODE_RETRY_VAL(0);
start_clnt_join(priv);
}
if (ioctl_copy_to_user((void *)data, (void *)&ret, 1))
return -1;
return 0;
}
#ifdef CONFIG_RTK_MESH
// ==== inserted by GANTOE for site survey 2008/12/25 ====
// This function might be modifed when the mesh peerlink precedure has been completed
static int rtl8192cd_join_mesh (struct rtl8192cd_priv *priv, unsigned char* meshid, int meshid_len, int channel, int offset, int reset)
{
int i, ret = -1;
#ifndef SMP_SYNC
unsigned long flags;
#endif
SAVE_INT_AND_CLI(flags);
if(reset == 0) {
for(i = 0; i < priv->site_survey->count; i++)
{
if(!memcmp(meshid, priv->site_survey->bss[i].meshid, meshid_len) && priv->site_survey->bss[i].channel == channel)
break;
}
}
if(reset || i < priv->site_survey->count) {
priv->pshare->offset_2nd_chan = reset? priv->pmib->dot11nConfigEntry.dot11n2ndChOffset : offset;
priv->pmib->dot11RFEntry.dot11channel = channel;
SwChnl(priv, channel, priv->pshare->offset_2nd_chan); // in this version, automatically establishing link
SwBWMode(priv, priv->pshare->CurrentChannelBW, priv->pshare->offset_2nd_chan);
memcpy(GET_MIB(priv)->dot1180211sInfo.mesh_id, meshid, meshid_len);
GET_MIB(priv)->dot1180211sInfo.mesh_id[meshid_len]=0;
update_beacon(priv);
ret = 0;
}
RESTORE_INT(flags);
return ret;
}
// This function might be removed when the mesh peerlink precedure has been completed
static int rtl8192cd_check_mesh_link (struct rtl8192cd_priv *priv, unsigned char* macaddr)
{
int ret = -1;
unsigned long flags;
struct stat_info *pstat;
struct list_head *phead, *plist, *pprevlist;
SAVE_INT_AND_CLI(flags);
SMP_LOCK_MESH_MP_HDR(flags);
phead= &priv->mesh_mp_hdr;
plist = phead->next;
pprevlist = phead;
while(plist != phead)
{
pstat = list_entry(plist, struct stat_info, mesh_mp_ptr);
if(!memcmp(pstat->hwaddr, macaddr, 6))
{
ret = 0;
break;
}
plist = plist->next;
pprevlist = plist->prev;
}
SMP_UNLOCK_MESH_MP_HDR(flags);
RESTORE_INT(flags);
return ret;
}
#endif
static int rtl8192cd_join_status(struct rtl8192cd_priv *priv, unsigned char *data)
{
INT8 ret = 0;
if (!netif_running(priv->dev) || JOIN_REQ_ONGOING)
ret = -1; // pending
else
ret = JOIN_RES;
if (ioctl_copy_to_user((void *)data, (void *)&ret, 1))
return -1;
return 0;
}
#endif // CLIENT_MODE
#ifdef SUPPORT_TX_MCAST2UNI
#ifndef CONFIG_MSC
static
#endif
void AddDelMCASTGroup2STA(struct rtl8192cd_priv *priv, unsigned char *mac2addr, int add)
{
int i, free=-1, found=0;
struct stat_info *pstat;
struct list_head *phead, *plist;
#ifdef CONFIG_RTK_MESH
struct proxy_table_entry* pProxyEntry;
struct path_sel_entry *pEntry;
#endif
#ifdef SMP_SYNC
unsigned long flags = 0;
#endif
phead = &priv->asoc_list;
if (NULL == phead->next)
return;
SMP_LOCK_ASOC_LIST(flags);
plist = phead->next;
while (plist != phead) {
pstat = list_entry(plist, struct stat_info, asoc_list);
plist = plist->next;
// Search from SA stat list. If found check if mc entry is existed in table
if (((OPMODE & WIFI_AP_STATE) && !memcmp(pstat->hwaddr, mac2addr+6 , 6))
#ifdef CLIENT_MODE
|| !(OPMODE & WIFI_AP_STATE)
#endif
) {
#ifdef WDS
if ((OPMODE & WIFI_AP_STATE) && (pstat->state & WIFI_WDS))
continue; // Do not need to mc2uni coNversion in WDS
#endif
found = 1;
break;
}
}
#ifdef CONFIG_RTK_MESH
/*if we can not find the sta in asoc_list, search mesh proxy table to see if it is proxied by remote mesh node*/
if(found == 0 && priv->pmib->dot1180211sInfo.mesh_enable && priv->pmib->dot1180211sInfo.mesh_igmp_enable) {
pProxyEntry = (struct proxy_table_entry*) HASH_SEARCH(priv->proxy_table, mac2addr+6);
if(pProxyEntry) {
pEntry = (struct path_sel_entry *)HASH_SEARCH( priv->pathsel_table, pProxyEntry->owner);
if(pEntry) {
pstat = get_stainfo(pEntry->priv, pEntry->nexthopMAC);
if(pstat)
found = 1;
}
}
}
#endif
if(found) {
found = 0;
for (i=0; i<MAX_IP_MC_ENTRY; i++) {
if (pstat->ipmc[i].used && !memcmp(pstat->ipmc[i].mcmac, mac2addr, 6)) {
found = 1;
break;
}
if (free == -1 && !pstat->ipmc[i].used)
free = i;
}
if (found) {
if (!add) { // delete entry
pstat->ipmc[i].used = 0;
pstat->ipmc_num--;
}
}
else { // not found
if (!add) {
if (priv->dev)
printk("%s: Delete MC entry not found!\n", priv->dev->name);
}
else { // add entry
if (free == -1) { // no free entry
if (priv->dev)
printk("%s: MC entry full!\n", priv->dev->name);
}
else {
memcpy(pstat->ipmc[free].mcmac, mac2addr, 6);
pstat->ipmc[free].used = 1;
pstat->ipmc_num++;
}
}
}
}
SMP_UNLOCK_ASOC_LIST(flags);
}
int ioctl_AddDelMCASTGroup2STA(struct net_device *dev, struct ifreq *ifr, int cmd)
{
struct rtl8192cd_priv *priv = GET_DEV_PRIV(dev);
struct wifi_mib *pmib = priv->pmib;
int ret, i;
if (!priv->pshare->rf_ft_var.mc2u_disable) {
#if defined(UNIVERSAL_REPEATER) || defined(MBSSID)
struct net_device *dev_vap;
struct rtl8192cd_priv *priv_vap;
if (IS_ROOT_INTERFACE(priv))
#endif
{
#ifdef MBSSID
if (priv->pmib->miscEntry.vap_enable)
{
for (i=0; i<RTL8192CD_NUM_VWLAN; i++) {
if (IS_DRV_OPEN(priv->pvap_priv[i])) {
// rtl8192cd_ioctl(priv->pvap_priv[i]->dev, ifr, cmd);
dev_vap = priv->pvap_priv[i]->dev;
priv_vap = priv->pvap_priv[i];
if (netif_running(dev_vap)) {
if ((((GET_MIB(priv_vap))->dot11OperationEntry.opmode) & WIFI_AP_STATE)
#ifdef CLIENT_MODE
|| ((((GET_MIB(priv_vap))->dot11OperationEntry.opmode) & (WIFI_STATION_STATE|WIFI_ASOC_STATE))==(WIFI_STATION_STATE|WIFI_ASOC_STATE))
#endif
)
AddDelMCASTGroup2STA(priv_vap,(unsigned char *)ifr, (cmd == SIOCGIMCAST_ADD) ? 1 : 0);
}
}
}
}
#endif
#ifdef UNIVERSAL_REPEATER
if (IS_DRV_OPEN(GET_VXD_PRIV(priv))) {
dev_vap = (GET_VXD_PRIV(priv))->dev;
priv_vap = GET_DEV_PRIV(dev_vap);
// rtl8192cd_ioctl((GET_VXD_PRIV(priv))->dev, ifr, cmd);
if (netif_running(dev_vap)) {
if ((((GET_MIB(priv_vap))->dot11OperationEntry.opmode) & WIFI_AP_STATE)
#ifdef CLIENT_MODE
|| ((((GET_MIB(priv_vap))->dot11OperationEntry.opmode) & (WIFI_STATION_STATE|WIFI_ASOC_STATE))==(WIFI_STATION_STATE|WIFI_ASOC_STATE))
#endif
)
AddDelMCASTGroup2STA(priv_vap,(unsigned char *)ifr, (cmd == SIOCGIMCAST_ADD) ? 1 : 0);
}
}
#endif
}
if (netif_running(priv->dev)) {
DEBUG_INFO("%s: %s MCAST Group mac %02x%02x%02x%02x%02x%02x\n", priv->dev->name,
((cmd == SIOCGIMCAST_ADD) ? "Add" : "Del"),
((unsigned char *)ifr)[0],((unsigned char *)ifr)[1],
((unsigned char *)ifr)[2],((unsigned char *)ifr)[3],((unsigned char *)ifr)[4],((unsigned char *)ifr)[5]);
DEBUG_INFO("STA mac %02x%02x%02x%02x%02x%02x\n", ((unsigned char *)ifr)[6],((unsigned char *)ifr)[7],
((unsigned char *)ifr)[8],((unsigned char *)ifr)[9],((unsigned char *)ifr)[10],((unsigned char *)ifr)[11]);
if ((OPMODE & WIFI_AP_STATE)
#ifdef CLIENT_MODE
|| ((OPMODE & (WIFI_STATION_STATE|WIFI_ASOC_STATE))==(WIFI_STATION_STATE|WIFI_ASOC_STATE))
#endif
)
AddDelMCASTGroup2STA(priv,(unsigned char *)ifr, (cmd == SIOCGIMCAST_ADD) ? 1 : 0);
}
}
ret = 0;
return ret;
}
#endif // SUPPORT_TX_MCAST2UNI
#ifdef DRVMAC_LB
void drvmac_loopback(struct rtl8192cd_priv *priv)
{
struct stat_info *pstat;
unsigned char *da = priv->pmib->miscEntry.lb_da;
// prepare station info
if (memcmp(da, "\x0\x0\x0\x0\x0\x0", 6) && !IS_MCAST(da))
{
pstat = get_stainfo(priv, da);
if (pstat == NULL)
{
pstat = alloc_stainfo(priv, da, -1);
pstat->state = WIFI_AUTH_SUCCESS | WIFI_ASOC_STATE;
memcpy(pstat->bssrateset, AP_BSSRATE, AP_BSSRATE_LEN);
pstat->bssratelen = AP_BSSRATE_LEN;
pstat->expire_to = 30000;
asoc_list_add(priv, pstat);
cnt_assoc_num(priv, pstat, INCREASE, (char *)__FUNCTION__);
if (QOS_ENABLE)
pstat->QosEnabled = 1;
if (priv->pmib->dot11BssType.net_work_type & WIRELESS_11N) {
pstat->ht_cap_len = priv->ht_cap_len;
memcpy(&pstat->ht_cap_buf, &priv->ht_cap_buf, priv->ht_cap_len);
}
pstat->current_tx_rate = find_rate(priv, pstat, 1, 0);
update_fwtbl_asoclst(priv, pstat);
// add_update_RATid(priv, pstat);
}
}
#ifdef CONFIG_WLAN_HAL
if (IS_HAL_CHIP(priv)) {
GET_HAL_INTERFACE(priv)->SetHwRegHandler(priv, HW_VAR_MAC_LOOPBACK_ENABLE, NULL);
} else if (CONFIG_WLAN_NOT_HAL_EXIST)
#endif
{
// accept all packets
// RTL_W32(_RCR_, RTL_R32(_RCR_) | _AAP_);
RTL_W32(RCR, RTL_R32(RCR) | RCR_AAP);
// enable MAC loopback
// RTL_W32(_CPURST_, RTL_R32(_CPURST_) | BIT(16) | BIT(17));
RTL_W32(CR, RTL_R32(CR) | (LB_MAC_DLY&LBMODE_Mask)<<LBMODE_SHIFT);
}
}
#endif // DRVMAC_LB
int dynamic_RF_pwr_adj(struct rtl8192cd_priv *priv, unsigned char *data)
{
unsigned char *ptr = data;
int index, minus_sign, adj_value;
unsigned int writeVal, readVal;
unsigned char byte0, byte1, byte2, byte3;
unsigned char RF6052_MAX_TX_PWR = 0x3F;
if (*ptr == '-') {
minus_sign = 1;
ptr++;
}
else if (*ptr == '+') {
minus_sign = 0;
ptr++;
}
else {
sprintf((char *)data, "[FAIL] No sign to know to add or subtract\n");
return strlen((char *)data)+1;
}
adj_value = _atoi((char *)ptr, 10);
if (adj_value >= 64) {
sprintf((char *)data, "[FAIL] Adjust value too large\n");
return strlen((char *)data)+1;
}
for (index=0; index<8; index++)
{
if ((index == 2) || (index == 3))
continue;
readVal = PHY_QueryBBReg(priv, rTxAGC_A_Rate18_06+index*4, 0x7f7f7f7f);
byte0 = (readVal & 0xff000000) >> 24;
byte1 = (readVal & 0x00ff0000) >> 16;
byte2 = (readVal & 0x0000ff00) >> 8;
byte3 = (readVal & 0x000000ff);
if (minus_sign) {
if (byte0 >= adj_value)
byte0 -= adj_value;
else
byte0 = 0;
if (byte1 >= adj_value)
byte1 -= adj_value;
else
byte1 = 0;
if (byte2 >= adj_value)
byte2 -= adj_value;
else
byte2 = 0;
if (byte3 >= adj_value)
byte3 -= adj_value;
else
byte3 = 0;
}
else {
byte0 += adj_value;
byte1 += adj_value;
byte2 += adj_value;
byte3 += adj_value;
}
// Max power index = 0x3F Range = 0-0x3F
if (byte0 > RF6052_MAX_TX_PWR)
byte0 = RF6052_MAX_TX_PWR;
if (byte1 > RF6052_MAX_TX_PWR)
byte1 = RF6052_MAX_TX_PWR;
if (byte2 > RF6052_MAX_TX_PWR)
byte2 = RF6052_MAX_TX_PWR;
if (byte3 > RF6052_MAX_TX_PWR)
byte3 = RF6052_MAX_TX_PWR;
writeVal = (byte0<<24) | (byte1<<16) |(byte2<<8) | byte3;
PHY_SetBBReg(priv, rTxAGC_A_Rate18_06+index*4, 0x7f7f7f7f, writeVal);
}
byte0 = PHY_QueryBBReg(priv, rTxAGC_A_CCK1_Mcs32, bTxAGCRateCCK);
if (minus_sign)
byte0 -= adj_value;
else
byte0 += adj_value;
if (byte0 > RF6052_MAX_TX_PWR)
byte0 = RF6052_MAX_TX_PWR;
PHY_SetBBReg(priv, rTxAGC_A_CCK1_Mcs32, bTxAGCRateCCK, byte0);
sprintf((char *)data, "[SUCCESS] %s %d level RF power\n", minus_sign?"Subtract":"Add", adj_value);
return strlen((char *)data)+1;
}
#ifdef DFS
void reset_nop_channel(struct rtl8192cd_priv *priv)
{
if (timer_pending(&priv->ch52_timer)) {
del_timer_sync(&priv->ch52_timer);
rtl8192cd_ch52_timer(priv);
}
if (timer_pending(&priv->ch56_timer)) {
del_timer_sync(&priv->ch56_timer);
rtl8192cd_ch56_timer(priv);
}
if (timer_pending(&priv->ch60_timer)) {
del_timer_sync(&priv->ch60_timer);
rtl8192cd_ch60_timer(priv);
}
if (timer_pending(&priv->ch64_timer)) {
del_timer_sync(&priv->ch64_timer);
rtl8192cd_ch64_timer(priv);
}
if (timer_pending(&priv->ch100_timer)) {
del_timer_sync(&priv->ch100_timer);
rtl8192cd_ch100_timer(priv);
}
if (timer_pending(&priv->ch104_timer)) {
del_timer_sync(&priv->ch104_timer);
rtl8192cd_ch104_timer(priv);
}
if (timer_pending(&priv->ch108_timer)) {
del_timer_sync(&priv->ch108_timer);
rtl8192cd_ch108_timer(priv);
}
if (timer_pending(&priv->ch112_timer)) {
del_timer_sync(&priv->ch112_timer);
rtl8192cd_ch112_timer(priv);
}
if (timer_pending(&priv->ch116_timer)) {
del_timer_sync(&priv->ch116_timer);
rtl8192cd_ch116_timer(priv);
}
if (timer_pending(&priv->ch120_timer)) {
del_timer_sync(&priv->ch120_timer);
rtl8192cd_ch120_timer(priv);
}
if (timer_pending(&priv->ch124_timer)) {
del_timer_sync(&priv->ch124_timer);
rtl8192cd_ch124_timer(priv);
}
if (timer_pending(&priv->ch128_timer)) {
del_timer_sync(&priv->ch128_timer);
rtl8192cd_ch128_timer(priv);
}
if (timer_pending(&priv->ch132_timer)) {
del_timer_sync(&priv->ch132_timer);
rtl8192cd_ch132_timer(priv);
}
if (timer_pending(&priv->ch136_timer)) {
del_timer_sync(&priv->ch136_timer);
rtl8192cd_ch136_timer(priv);
}
if (timer_pending(&priv->ch140_timer)) {
del_timer_sync(&priv->ch140_timer);
rtl8192cd_ch140_timer(priv);
}
if (timer_pending(&priv->ch144_timer)) {
del_timer_sync(&priv->ch144_timer);
rtl8192cd_ch144_timer(priv);
}
}
#endif
extern void clear_shortcut_cache(void);
#ifdef WIFI_HAPD
int rtl8192cd_net80211_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
{
struct rtl8192cd_priv *priv = GET_DEV_PRIV(dev);
struct wifi_mib *pmib = priv->pmib;
unsigned long flags;
struct iwreq *wrq = (struct iwreq *) ifr;
unsigned char *tmpbuf, *tmp1;
UINT16 sta_num;
int i = 0, ret = 0, sizeof_tmpbuf;
static unsigned char tmpbuf1[1024];
DEBUG_TRACE;
sizeof_tmpbuf = sizeof(tmpbuf1);
tmpbuf = tmpbuf1;
memset(tmpbuf, '\0', sizeof_tmpbuf);
SAVE_INT_AND_CLI(flags);
SMP_LOCK(flags);
//printk("rtl8192cd_net80211_ioctl, name = %s, cmd =0x%x\n", wrq->ifr_name, cmd);
switch ( cmd )
{
case IEEE80211_IOCTL_SETPARAM:
ret = rtl_net80211_setparam(dev, NULL, &wrq->u, NULL);
break;
case IEEE80211_IOCTL_GETPARAM:
break;
case IEEE80211_IOCTL_SETMODE:
break;
case IEEE80211_IOCTL_GETMODE:
break;
case IEEE80211_IOCTL_SETWMMPARAMS:
break;
case IEEE80211_IOCTL_GETWMMPARAMS:
break;
case IEEE80211_IOCTL_SETCHANLIST:
break;
case IEEE80211_IOCTL_GETCHANLIST:
break;
case IEEE80211_IOCTL_CHANSWITCH:
break;
case IEEE80211_IOCTL_GET_APPIEBUF:
ret = rtl_net80211_getwpaie(dev, NULL, &wrq->u, NULL);
break;
case IEEE80211_IOCTL_SET_APPIEBUF:
ret = rtl_net80211_setappiebuf(dev, NULL, &wrq->u, NULL);
break;
case IEEE80211_IOCTL_FILTERFRAME:
break;
case IEEE80211_IOCTL_GETCHANINFO:
break;
case IEEE80211_IOCTL_SETOPTIE:
#ifdef WIFI_WPAS
ret = rtl_net80211_setoptie(dev, NULL, &wrq->u, NULL);
#endif
break;
case IEEE80211_IOCTL_GETOPTIE:
break;
case IEEE80211_IOCTL_SETMLME:
ret = rtl_net80211_setmlme(dev, NULL, &wrq->u, NULL);
break;
case IEEE80211_IOCTL_SETKEY:
ret = rtl_net80211_setkey(dev, NULL, &wrq->u, NULL);
break;
case IEEE80211_IOCTL_DELKEY:
ret = rtl_net80211_delkey(dev, NULL, &wrq->u, NULL);
break;
case IEEE80211_IOCTL_ADDMAC:
break;
case IEEE80211_IOCTL_DELMAC:
break;
#if ((defined(WIFI_HAPD) || defined(RTK_NL80211)) && defined(WDS)) && !defined(HAPD_DRV_PSK_WPS)
case IEEE80211_IOCTL_WDSADDMAC:
ret = rtl_net80211_wdsaddmac(dev, NULL, &wrq->u, NULL);
break;
case IEEE80211_IOCTL_WDSDELMAC:
ret = rtl_net80211_wdsdelmac(dev, NULL, &wrq->u, NULL);
break;
#endif
case IEEE80211_IOCTL_KICKMAC:
break;
#ifdef WIFI_WPAS
case WPAS_IOCTL_CUSTOM: //_Eric ?? No need to define ??
{
unsigned char *is_hapd = (unsigned char *)(wrq->u.data.pointer);
if(*is_hapd == 0)
ret = rtl_wpas_custom(dev, NULL, &wrq->u, NULL);
else
ret = rtl_hapd_config(dev, NULL, &wrq->u, NULL);
}
break;
#else
case HAPD_IOCTL_SETCONFIG:
ret = rtl_hapd_config(dev, NULL, &wrq->u, NULL);
break;
#endif
default:
break;
}
RESTORE_INT(flags);
SMP_UNLOCK(flags);
return ret;
}
#endif
#if defined(RTK_AC_SUPPORT) || defined(HS2_SUPPORT) || defined(CONFIG_IEEE80211W)//for 11ac logo
void reset_default_sigma(struct rtl8192cd_priv *priv)
{
#ifdef RTK_AC_SUPPORT
if (priv->pmib->dot11RFEntry.phyBandSelect == PHY_BAND_5G)
printk("reset_default_sigma for VHT5G (11AC, 80M) +++\n");
else
{
printk("2.4G, No need to reset_default_sigma\n");
return;
}
//No Need to reset ssid, channel, band, rts , frag, security, edcu
//priv->pmib->dot11RFEntry.dot11channel
//priv->pmib->dot11StationConfigEntry.dot11DesiredSSID
//priv->pmib->dot11OperationEntry.dot11FragmentationThreshold
priv->pmib->dot11StationConfigEntry.dot11BeaconPeriod = 100;
priv->pmib->dot11nConfigEntry.dot11nUse40M = 2;
//priv->pmib->dot11OperationEntry.dot11RTSThreshold
//priv->pmib->dot11nConfigEntry.dot11n2ndChOffset = 1;
//priv->pmib->dot11OperationEntry.opmode
priv->pmib->dot11nConfigEntry.dot11nShortGIfor20M = 1;
priv->pmib->dot11nConfigEntry.dot11nShortGIfor40M = 1;
priv->pmib->dot11nConfigEntry.dot11nShortGIfor80M = 1;
priv->pmib->dot11nConfigEntry.dot11nAMPDU = 1;
priv->pmib->dot11nConfigEntry.dot11nAMSDU = 1;
priv->pmib->dot11nConfigEntry.dot11nAddBAreject = 0;
//priv->pmib->dot11RFEntry.phyBandSelect
priv->pmib->dot11BssType.net_work_type = (WIRELESS_11A |WIRELESS_11N |WIRELESS_11AC);
priv->pmib->dot11StationConfigEntry.legacySTADeny = 0;
//priv->pmib->dot1180211AuthEntry.dot11PrivacyAlgrthm
//priv->pmib->dot1180211AuthEntry.dot11PassPhraseGuest
priv->pmib->dot11QosEntry.dot11QosEnable = 1;
priv->pmib->dot11RFEntry.MIMO_TR_mode = MIMO_2T2R;
priv->pmib->dot11acConfigEntry.dot11SupportedVHT = 0xfffa;
priv->pmib->dot11acConfigEntry.dot11VHT_TxMap = 0xfffff;
priv->pshare->rf_ft_var.cca_rts = 0;
priv->pmib->dot11StationConfigEntry.autoRate = 1;
priv->pmib->dot11StationConfigEntry.fixedTxRate = 0;
priv->pshare->rf_ft_var.txforce = 0xff;
priv->pshare->rf_ft_var.sgiforce = 2;
priv->pmib->dot11nConfigEntry.dot11nTxNoAck = 0;
#ifdef RTL_MANUAL_EDCA
priv->pmib->dot11QosEntry.ManualEDCA = 0;
#endif
priv->pmib->dot11nConfigEntry.dot11nLgyEncRstrct=15;
priv->pshare->rf_ft_var.opmtest = 0;
priv->pmib->dot11RFEntry.txbf = 1;
priv->pmib->dot11nConfigEntry.dot11nLDPC = 1;
priv->pmib->dot11nConfigEntry.dot11nSTBC = 1;
//priv->pmib->dot11RFEntry.txldpc =0;
//priv->pmib->dot11RFEntry.rxldpc =0;
priv->pshare->rf_ft_var.lgirate = 0xffff;
priv->pshare->rf_ft_var.lpwrc = 20;
priv->pshare->rf_ft_var.no_rtscts = 0;
priv->pmib->dot11StationConfigEntry.dot11RegDomain = DOMAIN_TEST;
priv->pshare->rf_ft_var.sigma_mode = AC_SIGMA_APUT;
#ifdef BEAMFORMING_SUPPORT
priv->pshare->rf_ft_var.ndparate = 0x2c;
#endif
#endif
#ifdef HS2_SUPPORT
/* Hotsport 2.0 Release 1 */
priv->pmib->dot11OperationEntry.block_relay = 0;
priv->pmib->dot11RFEntry.phyBandSelect == PHY_BAND_2G;
priv->pmib->dot11RFEntry.dot11channel = 6;
#endif
}
#endif
#if defined(RTK_AC_SUPPORT)
void reset_default_sigma_testbed(struct rtl8192cd_priv *priv)
{
if (priv->pmib->dot11RFEntry.phyBandSelect == PHY_BAND_5G)
printk("reset_default_sigma_testbed for VHT5G (11AC, 80M) +++\n");
else
{
printk("2.4G, No need to reset_default_sigma_testbed\n");
return;
}
priv->pmib->dot11nConfigEntry.dot11nShortGIfor20M = 0;
priv->pmib->dot11nConfigEntry.dot11nShortGIfor40M = 0;
priv->pmib->dot11nConfigEntry.dot11nShortGIfor80M = 0;
priv->pmib->dot11acConfigEntry.dot11SupportedVHT = 0xfff0;
priv->pmib->dot11acConfigEntry.dot11VHT_TxMap = 0x3fcff;
priv->pmib->dot11RFEntry.txbf = 0;
priv->pmib->dot11nConfigEntry.dot11nSTBC = 0;
//priv->pmib->dot11nConfigEntry.dot11nAMSDU = 0;
priv->pmib->dot11nConfigEntry.dot11nLDPC = 0;
priv->pshare->rf_ft_var.sigma_mode = AC_SIGMA_APTB;
}
#endif
#if defined(SMP_SYNC) && defined(__KERNEL__) && defined(CONFIG_PCI_HCI)
unsigned long _ioctl_copy_from_user (struct rtl8192cd_priv *priv, void * to, const void * from, unsigned long n)
{
unsigned long ret;
SMP_UNLOCK(priv->pshare->irq_save);
RESTORE_INT(priv->pshare->irq_save);
ret = copy_from_user(to, from, n);
SAVE_INT_AND_CLI(priv->pshare->irq_save);
SMP_LOCK(priv->pshare->irq_save);
return ret;
}
unsigned long _ioctl_copy_to_user (struct rtl8192cd_priv *priv, void * to, const void * from, unsigned long n)
{
unsigned long ret;
SMP_UNLOCK(priv->pshare->irq_save);
RESTORE_INT(priv->pshare->irq_save);
ret = copy_to_user(to, from, n);
SAVE_INT_AND_CLI(priv->pshare->irq_save);
SMP_LOCK(priv->pshare->irq_save);
return ret;
}
#endif
int rtl8192cd_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
{
struct rtl8192cd_priv *priv = GET_DEV_PRIV(dev);
struct wifi_mib *pmib = priv->pmib;
unsigned long flags;
struct iwreq *wrq = (struct iwreq *) ifr;
unsigned char *tmpbuf, *tmp1;
UINT16 sta_num;
int i = 0, ret = -1, sizeof_tmpbuf;
#ifdef CONFIG_RTL8672
// MBSSID Port Mapping
int ifgrp_member_tmp;
#endif
static unsigned char tmpbuf1[1024];
#ifdef RTK_WOW
unsigned int wakeup_on_wlan = 0;
#endif
#ifdef D_ACL
struct stat_info *pstat;
#endif
#ifdef CONFIG_RTK_MESH
unsigned char strPID[10];
int len;
static UINT8 QueueData[MAXDATALEN2];
int QueueDataLen;
// UINT8 val8;
// int j;
#define DATAQUEUE_EMPTY "Queue is empty"
#endif
DEBUG_TRACE;
#ifdef WIFI_HAPD
if((IEEE80211_IOCTL_SETPARAM <= cmd) && (cmd <= IEEE80211_IOCTL_KICKMAC))
return rtl8192cd_net80211_ioctl(dev, ifr, cmd);
if(cmd == HAPD_IOCTL_SETCONFIG)
return rtl8192cd_net80211_ioctl(dev, ifr, cmd);
#endif
sizeof_tmpbuf = sizeof(tmpbuf1);
tmpbuf = tmpbuf1;
memset(tmpbuf, '\0', sizeof_tmpbuf);
#ifdef SMP_SYNC
SAVE_INT_AND_CLI(priv->pshare->irq_save);
SMP_LOCK(priv->pshare->irq_save);
#else
SAVE_INT_AND_CLI(flags);
#endif
#ifdef MULTI_MAC_CLONE
ACTIVE_ID = 0;
#endif
switch ( cmd )
{
case SIOCGIWNAME:
strcpy(wrq->u.name, "IEEE 802.11-DS");
ret = 0;
break;
#ifdef CONFIG_RTL_COMAPI_WLTOOLS
case SIOCGIFHWADDR:
#ifdef WIFI_HAPD //_Eric ??
memcpy(ifr->ifr_hwaddr.sa_data, pmib->dot11OperationEntry.hwaddr, MACADDRLEN);
#endif
memcpy(wrq->u.name, pmib->dot11OperationEntry.hwaddr, MACADDRLEN);
ret = 0;
break;
case SIOCSIWFREQ: //set channel/frequency (Hz)
{
ret = rtl_siwfreq(dev, NULL, &wrq->u, NULL);
break;
}
case SIOCGIWFREQ: // get channel/frequency (Hz)
{
ret = rtl_giwfreq(dev, NULL, &wrq->u, NULL);
break;
}
#ifdef WIFI_WPAS
case SIOCSIWMODE: //set operation mode
{
ret = rtl_siwmode(dev, NULL, &wrq->u, NULL);
break;
}
#endif
case SIOCGIWMODE: //get operation mode
{
ret = rtl_giwmode(dev, NULL, &wrq->u, NULL);
break;
}
case SIOCSIWAP: //set access point MAC addresses
{
struct sockaddr *ap_addr=&wrq->u.ap_addr;
ret = rtl_siwap(dev, NULL, &wrq->u, ap_addr->sa_data);
break;
}
case SIOCGIWAP: //get access point MAC addresses
{
struct sockaddr *ap_addr=&wrq->u.ap_addr;
ret = rtl_giwap(dev, NULL, &wrq->u, ap_addr->sa_data);
break;
}
case SIOCGIWESSID: //Get ESSID
{
struct iw_point *essid=&wrq->u.essid;
ret = rtl_giwessid(dev, NULL, &wrq->u, essid->pointer);
break;
}
case SIOCSIWESSID: //Set ESSID
{
struct iw_point *essid=&wrq->u.essid;
ret = rtl_siwessid(dev, NULL, &wrq->u, essid->pointer);
break;
}
case SIOCGIWRATE: //get default bit rate (bps)
ret = rtl_giwrate(dev, NULL, &wrq->u, NULL);
break;
case SIOCSIWRATE: //set default bit rate (bps)
ret = rtl_siwrate(dev, NULL, &wrq->u, NULL);
break;
case SIOCGIWRANGE: //Range of Parameters
{
ret = rtl_giwrange(dev, NULL, &wrq->u, NULL);
break;
}
case SIOCSIWSCAN:
{
ret = rtl_siwscan(dev, NULL, &wrq->u, NULL);
break;
}
case SIOCGIWSCAN:
{
ret = rtl_giwscan(dev, NULL, &wrq->u, NULL);
break;
}
case SIOCGIWRTS: // get RTS/CTS threshold (bytes)
{
ret = rtl_giwrts(dev, NULL, &wrq->u, NULL);
break;
}
case SIOCSIWRTS: //set RTS/CTS threshold (bytes)
{
ret = rtl_siwrts(dev, NULL, &wrq->u, NULL);
break;
}
case SIOCGIWFRAG: //get fragmentation thr (bytes)
{
ret = rtl_giwfrag(dev, NULL, &wrq->u, NULL);
break;
}
case SIOCSIWFRAG: //set fragmentation thr (bytes)
{
ret = rtl_siwfrag(dev, NULL, &wrq->u, NULL);
break;
}
case SIOCSIWRETRY: //set retry limit
{
ret = rtl_siwretry(dev, NULL, &wrq->u, NULL);
break;
}
case SIOCGIWRETRY: //get retry limit
{
ret = rtl_giwretry(dev, NULL, &wrq->u, NULL);
break;
}
case SIOCSIWENCODE: //get encoding token & mode
{
struct iw_point *erq=&wrq->u.encoding;
if(erq)
ret = rtl_siwencode(dev, NULL, &wrq->u, erq->pointer);
break;
}
case SIOCGIWENCODE: //get encoding token & mode
{
struct iw_point *erq=&wrq->u.encoding;
if(erq)
ret = rtl_giwencode(dev, NULL, &wrq->u, erq->pointer);
break;
}
case SIOCGIWPOWER:
{
ret = rtl_giwpower(dev, NULL, &wrq->u, NULL);
break;
}
#endif
case SIOCMIBINIT: //-- copy kernel data to user data --//
if (wrq->u.data.length != sizeof(struct wifi_mib)) {
panic_printk("IOCTL: mib size mismatch!\n");
ret = -1;
break;
}
if (ioctl_copy_to_user((void *)wrq->u.data.pointer, (void *)pmib, wrq->u.data.length) == 0)
ret = 0;
break;
case SIOCMIBSYNC: //-- sync user data to kernel data --//
if (wrq->u.data.length != sizeof(struct wifi_mib)) {
panic_printk("IOCTL: mib size mismatch!\n");
ret = -1;
break;
}
if (ioctl_copy_from_user((void *)pmib, (void *)wrq->u.data.pointer, wrq->u.data.length) == 0)
ret = 0;
break;
case SIOCGIWPRIV: //-- get private ioctls for iwpriv --//
if (wrq->u.data.pointer) {
#ifdef __KERNEL__
#ifdef __LINUX_2_6__
ret = access_ok(VERIFY_WRITE, (const void *)wrq->u.data.pointer, sizeof(privtab));
if (!ret) {
ret = -EFAULT;
DEBUG_ERR("user space valid check error!\n");
break;
}
#else
ret = verify_area(VERIFY_WRITE, (const void *)wrq->u.data.pointer, sizeof(privtab));
if (ret) {
DEBUG_ERR("verify_area() error!\n");
break;
}
#endif
#else
ret = 0;
#endif
#ifdef CONFIG_RTL8672
wrq->u.data.length = sizeof(privtab) / sizeof(privtab[0]);
if (ioctl_copy_to_user((void *)wrq->u.data.pointer, privtab, sizeof(privtab)))
ret = -EFAULT;
#else
if ((sizeof(privtab) / sizeof(privtab[0])) <= wrq->u.data.length)
{
wrq->u.data.length = sizeof(privtab) / sizeof(privtab[0]);
if (ioctl_copy_to_user((void *)wrq->u.data.pointer, privtab, sizeof(privtab)))
ret = -EFAULT;
}else{
ret = -E2BIG;
}
#endif
}
break;
#ifdef D_ACL //tsananiu ; mesh related
case RTL8192CD_IOCTL_ADD_ACL_TABLE:
if ((ret = iwpriv_atoi(priv,(unsigned char *)(wrq->u.data.pointer),tmpbuf,wrq->u.data.length)) )
{
DEBUG_ERR("Trasnslate MAC address from user space error\n");
break;
}
ret = acl_add_cmd(priv, (unsigned char *)(wrq->u.data.pointer), wrq->u.data.length);
if (ret >= 0) {
pstat = get_stainfo(priv, tmpbuf);
if (priv->pmib->dot11StationConfigEntry.dot11AclMode == ACL_deny) {
if (NULL != pstat) {
#ifdef CONFIG_RTK_MESH
if (!isSTA(pstat)) {
DEBUG_INFO("I am a mesh node\n");
issue_disassoc_MP(priv, pstat, 0, 0);
} else
#endif
{ //if station
del_sta(priv, (unsigned char *)(wrq->u.data.pointer));
}
}
}
}
break;
case RTL8192CD_IOCTL_REMOVE_ACL_TABLE:
if ((ret = iwpriv_atoi(priv,(unsigned char *)(wrq->u.data.pointer),tmpbuf,wrq->u.data.length)) )
{
DEBUG_ERR("Trasnslate MAC address from user space error\n");
break;
}
ret = acl_remove_cmd(priv, (unsigned char *)(wrq->u.data.pointer), wrq->u.data.length);
if (ret >= 0) {
pstat = get_stainfo(priv, tmpbuf);
if (priv->pmib->dot11StationConfigEntry.dot11AclMode == ACL_allow) {
if (NULL != pstat) {
#ifdef CONFIG_RTK_MESH
if (!isSTA(pstat)) {
DEBUG_INFO("I am a mesh node\n");
issue_disassoc_MP(priv, pstat, 0, 0);
} else
#endif
{ //if station
del_sta(priv, (unsigned char *)(wrq->u.data.pointer));
}
}
}
}
break;
case RTL8192CD_IOCTL_GET_ACL_TABLE:
ret = acl_query_cmd(priv, (unsigned char *)(wrq->u.data.pointer), wrq->u.data.length);
if (ret >= 0) {
wrq->u.data.length = ret;
ret = 0;
}
break;
case RTL8192CD_IOCTL_CLEAR_ACL_TABLE:
ret = acl_clear_cmd(priv);
break;
#endif//tsananiu//
case RTL8192CD_IOCTL_SET_MIB:
if ((wrq->u.data.length > sizeof_tmpbuf) ||
ioctl_copy_from_user(tmpbuf, (void *)wrq->u.data.pointer, wrq->u.data.length))
break;
ret = set_mib(priv, tmpbuf);
break;
case RTL8192CD_IOCTL_GET_MIB:
if ((wrq->u.data.length > sizeof_tmpbuf) ||
ioctl_copy_from_user(tmpbuf, (void *)wrq->u.data.pointer, wrq->u.data.length))
break;
i = get_mib(priv, tmpbuf);
if (i >= 0) {
if ((i > 0) && ioctl_copy_to_user((void *)wrq->u.data.pointer, tmpbuf, i))
break;
wrq->u.data.length = i;
ret = 0;
}
break;
#ifdef _IOCTL_DEBUG_CMD_
case RTL8192CD_IOCTL_WRITE_REG:
if ((wrq->u.data.length > sizeof_tmpbuf) ||
ioctl_copy_from_user(tmpbuf, (void *)wrq->u.data.pointer, wrq->u.data.length))
break;
ret = write_reg(priv, tmpbuf);
break;
case RTL8192CD_IOCTL_READ_REG:
if ((wrq->u.data.length > sizeof_tmpbuf) ||
ioctl_copy_from_user(tmpbuf, (void *)wrq->u.data.pointer, wrq->u.data.length))
break;
i = read_reg(priv, tmpbuf);
if (i >= 0) {
if ((i > 0) && ioctl_copy_to_user((void *)wrq->u.data.pointer, tmpbuf, i))
break;
wrq->u.data.length = i;
ret = 0;
}
break;
case RTL8192CD_IOCTL_WRITE_MEM:
if ((wrq->u.data.length > sizeof_tmpbuf) ||
ioctl_copy_from_user(tmpbuf, (void *)wrq->u.data.pointer, wrq->u.data.length))
break;
ret = write_mem(priv, tmpbuf);
break;
case RTL8192CD_IOCTL_READ_MEM:
if ((wrq->u.data.length > sizeof_tmpbuf) ||
ioctl_copy_from_user(tmpbuf, (void *)wrq->u.data.pointer, wrq->u.data.length))
break;
i = read_mem(priv, tmpbuf);
if (i >= 0) {
if ((i > 0) && ioctl_copy_to_user((void *)wrq->u.data.pointer, tmpbuf, i))
break;
wrq->u.data.length = i;
ret = 0;
}
break;
case RTL8192CD_IOCTL_WRITE_BB_REG:
if ((wrq->u.data.length > sizeof_tmpbuf) ||
ioctl_copy_from_user(tmpbuf, (void *)wrq->u.data.pointer, wrq->u.data.length))
break;
ret = write_bb_reg(priv, tmpbuf);
break;
case RTL8192CD_IOCTL_READ_BB_REG:
if ((wrq->u.data.length > sizeof_tmpbuf) ||
ioctl_copy_from_user(tmpbuf, (void *)wrq->u.data.pointer, wrq->u.data.length))
break;
i = read_bb_reg(priv, tmpbuf);
if (i >= 0) {
if ((i > 0) && ioctl_copy_to_user((void *)wrq->u.data.pointer, tmpbuf, i))
break;
wrq->u.data.length = i;
ret = 0;
}
break;
case RTL8192CD_IOCTL_WRITE_RF_REG:
if ((wrq->u.data.length > sizeof_tmpbuf) ||
ioctl_copy_from_user(tmpbuf, (void *)wrq->u.data.pointer, wrq->u.data.length))
break;
ret = write_rf_reg(priv, tmpbuf);
break;
case RTL8192CD_IOCTL_READ_RF_REG:
if ((wrq->u.data.length > sizeof_tmpbuf) ||
ioctl_copy_from_user(tmpbuf, (void *)wrq->u.data.pointer, wrq->u.data.length))
break;
i = read_rf_reg(priv, tmpbuf);
if (i >= 0) {
if ((i > 0) && ioctl_copy_to_user((void *)wrq->u.data.pointer, tmpbuf, i))
break;
wrq->u.data.length = i;
ret = 0;
}
break;
#endif // _IOCTL_DEBUG_CMD_
case RTL8192CD_IOCTL_DEL_STA:
if ((wrq->u.data.length > sizeof_tmpbuf) ||
ioctl_copy_from_user(tmpbuf, (void *)wrq->u.data.pointer, wrq->u.data.length))
break;
ret = del_sta(priv, tmpbuf);
break;
case RTL8192CD_IOCTL_WRITE_EEPROM:
if ((wrq->u.data.length > sizeof_tmpbuf) ||
ioctl_copy_from_user(tmpbuf, (void *)wrq->u.data.pointer, wrq->u.data.length))
break;
ret = write_eeprom(priv, tmpbuf);
break;
case RTL8192CD_IOCTL_READ_EEPROM:
if ((wrq->u.data.length > sizeof_tmpbuf) ||
ioctl_copy_from_user(tmpbuf, (void *)wrq->u.data.pointer, wrq->u.data.length))
break;
i = read_eeprom(priv, tmpbuf);
if (i >= 0) {
if ((i > 0) && ioctl_copy_to_user((void *)wrq->u.data.pointer, tmpbuf, i))
break;
wrq->u.data.length = i;
ret = 0;
}
break;
#ifdef RTK_WOW
case SIOCGRTKWOWSTAINFO: //-- get station info for Realtek proprietary wake up on wlan mode--//
wakeup_on_wlan = 1;
#endif
case SIOCGIWRTLSTAINFO: //-- get station table information --//
sizeof_tmpbuf = sizeof(sta_info_2_web) * (NUM_STAT + 1); // for the max of all sta info
#ifdef __ECOS
tmp1 = (unsigned char *)sta_info;
#else
tmp1 = (unsigned char *)kmalloc(sizeof_tmpbuf, GFP_KERNEL);
if (!tmp1) {
printk("Unable to allocate temp buffer for ioctl (SIOCGIWRTLSTAINFO)!\n");
return -1;
}
memset(tmp1, '\0', sizeof(sta_info_2_web));
#endif
if (ioctl_copy_from_user(tmpbuf, (void *)wrq->u.data.pointer, 1))
break;
if ((tmpbuf[0] == 0) || (tmpbuf[0] > NUM_STAT))
sta_num = NUM_STAT;
else
sta_num = tmpbuf[0];
#ifdef RTK_WOW
get_sta_info(priv, (sta_info_2_web *)(tmp1 + sizeof(sta_info_2_web)), sta_num, wakeup_on_wlan);
#else
get_sta_info(priv, (sta_info_2_web *)(tmp1 + sizeof(sta_info_2_web)), sta_num);
#endif
if (ioctl_copy_to_user((void *)wrq->u.data.pointer, tmp1, sizeof(sta_info_2_web)*(sta_num+1)))
break;
wrq->u.data.length = sizeof(sta_info_2_web)*(sta_num+1);
ret = 0;
#ifndef __ECOS
kfree(tmp1);
#endif
break;
case SIOCGIWRTLSTANUM: //-- get the number of stations in table --//
#ifdef UNIVERSAL_REPEATER
if (IS_VXD_INTERFACE(priv) && (OPMODE & WIFI_AP_STATE) &&
!IS_DRV_OPEN(priv))
sta_num = 0;
else
#endif
//sta_num = get_assoc_sta_num(priv); // this will count expired sta
sta_num = priv->assoc_num;
if (ioctl_copy_to_user((void *)wrq->u.data.pointer, &sta_num, sizeof(sta_num)))
break;
wrq->u.data.length = sizeof(sta_num);
ret = 0;
break;
case SIOCGIWRTLDRVVERSION:
tmpbuf[0] = DRV_VERSION_H;
tmpbuf[1] = DRV_VERSION_L;
if (ioctl_copy_to_user((void *)wrq->u.data.pointer, tmpbuf, 2))
break;
wrq->u.data.length = 2;
ret = 0;
break;
case SIOCGIWRTLGETBSSINFO: //-- get BSS info --//
get_bss_info(priv, (bss_info_2_web *)tmpbuf);
if (ioctl_copy_to_user((void *)wrq->u.data.pointer, tmpbuf, sizeof(bss_info_2_web)))
break;
wrq->u.data.length = sizeof(bss_info_2_web);
ret = 0;
break;
#if defined(CONFIG_RTL8186_KB_N)//To get auth result
case SIOCGIWRTLAUTH:
if (ioctl_copy_to_user((void *)wrq->u.data.pointer, &authRes, sizeof(authRes)))
break;
wrq->u.data.length = sizeof(authRes);
ret = 0;
authRes = 0;//To init authRes
break;
#endif
#ifdef WDS
case SIOCGIWRTLGETWDSINFO: //-- get WDS table information --//
ret = get_wds_info(priv, (web_wds_info *)tmpbuf);
if ((ret > 0) && ioctl_copy_to_user((void *)wrq->u.data.pointer, tmpbuf, ret))
break;
wrq->u.data.length = ret;
#ifdef __ECOS
ret = 0;
#endif
break;
#endif
case SIOCSIWRTLSTATXRATE: //-- set station tx rate --//
if (wrq->u.data.length != sizeof(struct _wlan_sta_rateset) ||
ioctl_copy_from_user(tmpbuf, (void *)wrq->u.data.pointer, sizeof(struct _wlan_sta_rateset)))
break;
ret = set_sta_txrate(priv, (struct _wlan_sta_rateset *)tmpbuf);
break;
#ifdef MICERR_TEST
case SIOCSIWRTLMICERROR:
ret = iwpriv_atoi(priv,(unsigned char *)(wrq->u.data.pointer),tmpbuf,wrq->u.data.length);
ret = issue_mic_err_pkt(priv, tmpbuf);
break;
#ifdef CLIENT_MODE
case SIOCSIWRTLMICREPORT:
{
struct sta_info *pstat;
if ((pstat = get_stainfo(priv, BSSID)) != NULL)
ClientSendEAPOL(priv, pstat, 0);
}
ret = 0;
break;
#endif
#endif
case SIOCSACLADD:
ret = acl_add_cmd(priv, (unsigned char *)(wrq->u.data.pointer), wrq->u.data.length);
break;
case SIOCSACLDEL:
ret = acl_remove_cmd(priv, (unsigned char *)(wrq->u.data.pointer), wrq->u.data.length);
break;
case SIOCSACLQUERY:
ret = acl_query_cmd(priv, (unsigned char *)(wrq->u.data.pointer), wrq->u.data.length);
if (ret >= 0) {
wrq->u.data.length = ret;
ret = 0;
}
break;
#if defined(CONFIG_RTK_MESH) && defined(_MESH_ACL_ENABLE_)
case SIOCSMESHACLADD:
ret = mesh_acl_add_cmd(priv, (unsigned char *)(wrq->u.data.pointer), wrq->u.data.length);
break;
case SIOCSMESHACLDEL:
ret = mesh_acl_remove_cmd(priv, (unsigned char *)(wrq->u.data.pointer), wrq->u.data.length);
break;
case SIOCSMESHACLQUERY:
ret = mesh_acl_query_cmd(priv, (unsigned char *)(wrq->u.data.pointer), wrq->u.data.length);
if (ret >= 0) {
wrq->u.data.length = ret;
ret = 0;
}
break;
#endif
case SIOCGMISCDATA:
get_misc_data(priv, (struct _misc_data_ *)tmpbuf);
if (ioctl_copy_to_user((void *)wrq->u.data.pointer, tmpbuf, sizeof(struct _misc_data_)))
break;
wrq->u.data.length = sizeof(struct _misc_data_);
ret = 0;
break;
case RTL8192CD_IOCTL_USER_DAEMON_REQUEST:
#ifdef PCIE_POWER_SAVING
PCIeWakeUp(priv, POWER_DOWN_T0);
#endif
#ifdef SMP_SYNC
SMP_UNLOCK(priv->pshare->irq_save);
#endif
ret = rtl8192cd_ioctl_priv_daemonreq(dev, &wrq->u.data);
#ifdef SMP_SYNC
SMP_LOCK(priv->pshare->irq_save);
#endif
break;
#ifdef USE_PID_NOTIFY
case SIOCSIWRTLSETPID:
priv->pshare->wlanapp_pid = -1;
if (wrq->u.data.length != sizeof(pid_t) ||
ioctl_copy_from_user(&priv->pshare->wlanapp_pid, (void *)wrq->u.data.pointer, sizeof(pid_t))) {
//break;
} else {
ret = 0;
}
#if defined(LINUX_2_6_27_)
if (priv->pshare->wlanapp_pid != -1)
{
rcu_read_lock();
_wlanapp_pid = get_pid(find_vpid(priv->pshare->wlanapp_pid));
rcu_read_unlock();
}
#endif
break;
#endif
#ifdef CONFIG_RTL_WAPI_SUPPORT
case SIOCSIWRTLSETWAPIPID:
priv->pshare->wlanwapi_pid= -1;
if (wrq->u.data.length != sizeof(pid_t) ||
ioctl_copy_from_user(&priv->pshare->wlanwapi_pid, (void *)wrq->u.data.pointer, sizeof(pid_t))) {
//break;
} else {
ret = 0;
}
#if defined(LINUX_2_6_27_)
if (priv->pshare->wlanwapi_pid != -1)
{
rcu_read_lock();
_wlanwapi_pid = get_pid(find_vpid(priv->pshare->wlanwapi_pid));
rcu_read_unlock();
}
#endif
break;
#endif
case RTL8192CD_IOCTL_SHOWSC:
{
#if defined(RTL_CACHED_BR_STA) && defined(BR_SHORTCUT)
extern struct brsc_cache_t brsc_cache_arr[MAX_BRSC_NUM];
int idx2;
unsigned char* cached_br_sta_mac;
int index = priv->dev->name[4] - '0';
panic_printk("Bridge shortcut info.:\n");
for(idx2=0;idx2<MAX_BRSC_NUM;idx2++){
if(brsc_cache_arr[idx2].occupy) {
cached_br_sta_mac=brsc_cache_arr[idx2].cached_br_sta_mac;
panic_printk(" Source[%d]:%02x-%02x-%02x-%02x-%02x-%02x\n",idx2,
cached_br_sta_mac[0],cached_br_sta_mac[1],cached_br_sta_mac[2],
cached_br_sta_mac[3],cached_br_sta_mac[4],cached_br_sta_mac[5]);
panic_printk(" Interface\t:%s\n",brsc_cache_arr[idx2].cached_br_sta_dev->name);
} else {
panic_printk("cached_br_sta_dev is not valid entry\n");
}
}
#endif
#if defined(RTL_MESH_TXCACHE)
extern unsigned char cached_mesh_mac[2][MACADDRLEN];
extern struct net_device *cached_mesh_dev[2];
if(cached_mesh_dev[index]) {
panic_printk(" Source\t:%02x-%02x-%02x-%02x-%02x-%02x\n",
cached_mesh_mac[index][0],cached_mesh_mac[index][1],cached_mesh_mac[index][2],
cached_mesh_mac[index][3],cached_mesh_mac[index][4],cached_mesh_mac[index][5]);
panic_printk(" Interface\t:%s\n",cached_mesh_dev[index]->name);
} else {
panic_printk("cached_mesh_dev[%d] is not valid entry\n",index);
}
panic_printk("Mesh TX shortcut info:\n");
panic_printk(" Dirty : %d\n",priv->mesh_txcache.dirty);
panic_printk(" Destination\t:%02x-%02x-%02x-%02x-%02x-%02x\n",
priv->mesh_txcache.ether_da[0],priv->mesh_txcache.ether_da[1],priv->mesh_txcache.ether_da[2],
priv->mesh_txcache.ether_da[3],priv->mesh_txcache.ether_da[4],priv->mesh_txcache.ether_da[5]);
panic_printk(" Source\t:%02x-%02x-%02x-%02x-%02x-%02x\n",
priv->mesh_txcache.ether_sa[0],priv->mesh_txcache.ether_sa[1],priv->mesh_txcache.ether_sa[2],
priv->mesh_txcache.ether_sa[3],priv->mesh_txcache.ether_sa[4],priv->mesh_txcache.ether_sa[5]);
panic_printk(" Mesh Next-hop\t:%02x-%02x-%02x-%02x-%02x-%02x\n",
priv->mesh_txcache.txcfg.nhop_11s[0],priv->mesh_txcache.txcfg.nhop_11s[1],priv->mesh_txcache.txcfg.nhop_11s[2],
priv->mesh_txcache.txcfg.nhop_11s[3],priv->mesh_txcache.txcfg.nhop_11s[4],priv->mesh_txcache.txcfg.nhop_11s[5]);
#endif
ret = 0;
}
break;
#ifdef CONFIG_RTK_MESH
case RTL8192CD_IOCTL_STATIC_ROUTE:
if ((wrq->u.data.length > sizeof_tmpbuf) ||
ioctl_copy_from_user(tmpbuf, (void *)wrq->u.data.pointer, wrq->u.data.length))
break;
if( memcmp(tmpbuf, "del", 3)==0 )
{
mac12_to_6(tmpbuf+4, tmpbuf+0x100);
ret = remove_path_entry(priv, tmpbuf+0x100);
}
else if((memcmp(tmpbuf, "add", 3)==0) && (wrq->u.data.length>28) )
{
struct path_sel_entry Entry;
memset((void*)&Entry, 0, sizeof(struct path_sel_entry));
mac12_to_6(tmpbuf+4, Entry.destMAC);
mac12_to_6(tmpbuf+4+13, Entry.nexthopMAC);
Entry.flag=1;
ret = pathsel_table_entry_insert_tail( priv, &Entry);
}else
ret =0;
break;
#if defined(RTK_MESH_MANUALMETRIC)
case RTL8192CD_IOCTL_MANUAL_METRIC:
if ((wrq->u.data.length > sizeof_tmpbuf) ||
ioctl_copy_from_user(tmpbuf, (void *)wrq->u.data.pointer, wrq->u.data.length))
break;
ret = set_metric_manually(priv,tmpbuf);
break;
#endif
case SIOCJOINMESH:
{
struct
{
unsigned char *meshid;
int meshid_len, channel, offset, reset;
}mesh_identifier;
if(wrq->u.data.length > 0)
{
memcpy(&mesh_identifier, wrq->u.data.pointer, wrq->u.data.length);
ret = rtl8192cd_join_mesh(priv, mesh_identifier.meshid, mesh_identifier.meshid_len, mesh_identifier.channel, mesh_identifier.offset, mesh_identifier.reset);
}
else
ret = -1;
}
break;
case SIOCCHECKMESHLINK: // This case might be removed when the mesh peerlink precedure has been completed
{
if(wrq->u.data.length == 6)
ret = rtl8192cd_check_mesh_link(priv, wrq->u.data.pointer);
else
ret = -1;
}
break;
// ==== GANTOE ====
#endif
case SIOCGIWRTLSCANREQ: //-- Issue SS request --//
#if defined(CONFIG_RTL_SIMPLE_CONFIG_USE_WPS_BUTTON)
if(priv->simple_config_status >= 2)
{
break;
}
#endif
#ifdef UNIVERSAL_REPEATER
if (IS_VXD_INTERFACE(priv) && !priv->pmib->wscEntry.wsc_enable) {
DEBUG_ERR("can't do site-survey for vxd!\n");
break;
}
#endif
#ifdef MBSSID
if (
GET_ROOT(priv)->pmib->miscEntry.vap_enable &&
IS_VAP_INTERFACE(priv) && !priv->pmib->wscEntry.wsc_enable) {
DEBUG_ERR("can't do site-survey for vap!\n");
break;
}
#endif
#ifdef PCIE_POWER_SAVING
PCIeWakeUp(priv, POWER_DOWN_T0);
#endif
ret = rtl8192cd_ss_req(priv, (unsigned char *)(wrq->u.data.pointer), wrq->u.data.length);
break;
case SIOCGIWRTLGETBSSDB: //-- Get SS Status --//
#if defined(CONFIG_RTL_SIMPLE_CONFIG_USE_WPS_BUTTON)
if(priv->simple_config_status >= 2)
{
break;
}
#endif
#ifdef UNIVERSAL_REPEATER
if (IS_VXD_INTERFACE(priv) && !priv->pmib->wscEntry.wsc_enable) {
DEBUG_ERR("can't get site-survey status for vxd!\n");
break;
}
#endif
#ifdef MBSSID
if (
GET_ROOT(priv)->pmib->miscEntry.vap_enable &&
IS_VAP_INTERFACE(priv) && !priv->pmib->wscEntry.wsc_enable) {
DEBUG_ERR("can't get site-survey status for vap!\n");
break;
}
#endif
ret = rtl8192cd_get_ss_status(priv, (unsigned char *)(wrq->u.data.pointer));
break;
/*--------------P2P related ioctl----------------------------------start*/
#ifdef P2P_SUPPORT
/*P2P UI request do p2p discovery */
case SIOCP2PSCANREQ:
if(!(OPMODE&WIFI_P2P_SUPPORT))
return -1;
if((P2PMODE != P2P_DEVICE) && (P2PMODE != P2P_CLIENT))
return -1;
#ifdef PCIE_POWER_SAVING
PCIeWakeUp(priv, POWER_DOWN_T0);
#endif
ret = rtl8192cd_p2p_ss_req(priv, (unsigned char *)(wrq->u.data.pointer), wrq->u.data.length);
break;
/*P2P UI get P2P SS Status and Result*/
case SIOCP2PGETRESULT:
if(!(OPMODE&WIFI_P2P_SUPPORT))
return -1;
if((P2PMODE != P2P_DEVICE) && (P2PMODE != P2P_CLIENT))
return -1;
#ifdef UNIVERSAL_REPEATER
if (IS_VXD_INTERFACE(priv)) {
DEBUG_ERR("can't get site-survey status for vxd!\n");
break;
}
#endif
#ifdef MBSSID
if (
GET_ROOT(priv)->pmib->miscEntry.vap_enable &&
IS_VAP_INTERFACE(priv)) {
DEBUG_ERR("can't get site-survey status for vap!\n");
break;
}
#endif
ret = rtl8192cd_p2p_get_ss_status(priv, (unsigned char *)(wrq->u.data.pointer));
break;
//-- issue provision discovery request , need device address from P2P UI --//
case SIOCP2PPROVREQ:
#ifdef PCIE_POWER_SAVING
PCIeWakeUp(priv, POWER_DOWN_T0);
#endif
ret = req_p2p_provision_req(priv, (unsigned char *)(wrq->u.data.pointer));
break;
/*P2P UI confirm wsc method,pincode,Target device to wlan driver,
if we active send provision req before ,then will send nego req here */
case SIOCP2WSCMETHODCONF:
#ifdef PCIE_POWER_SAVING
PCIeWakeUp(priv, POWER_DOWN_T0);
#endif
ret = req_p2p_wsc_confirm(priv, (unsigned char *)(wrq->u.data.pointer));
break;
//-- report event and state to P2P UI--//
case SIOCP2PPGETEVNIND:
ret = p2p_get_event_state(priv, (unsigned char *)(wrq->u.data.pointer));
break;
//-- wscd(GO mode) report WPS success or fail --//
case SIOCP2P_WSC_REPORT_STATE:
ret = p2p_wps_indicate_state(priv, (unsigned char *)(wrq->u.data.pointer));
break;
/*Report 1.p2p client connect state to web server ; for process start udhcpc
2.p2p pre-GO change to GO (WPS is done and success) indicate web server need start udhcpd*/
case SIOCP2P_REPORT_CLIENT_STATE:
ret = p2p_get_p2pconnect_state(priv, (unsigned char *)(wrq->u.data.pointer));
break;
#endif // end of P2P_SUPPORT
/*--------------P2P related ioctl----------------------------------end*/
#ifdef AUTO_TEST_SUPPORT
case SIOCSSREQ:
rtl8192cd_SSReq_AutoTest(priv);
ret = 0;
break;
case SIOCJOINREQ:
#ifdef CLIENT_MODE
ret = rtl8192cd_join_AutoTest(priv , (unsigned char *)(wrq->u.data.pointer));
#endif
break;
#endif
#ifdef CLIENT_MODE
case SIOCGIWRTLJOINREQ: //-- Issue Join Request --//
ret = rtl8192cd_join(priv, (unsigned char *)(wrq->u.data.pointer));
break;
case SIOCGIWRTLJOINREQSTATUS: //-- Get Join Status --//
ret = rtl8192cd_join_status(priv, (unsigned char *)(wrq->u.data.pointer));
break;
#endif
#ifdef RTK_WOW
case SIOCGRTKWOW: //-- issue Realtek proprietary wake up on wlan mode --//
ret = 5;
do {
issue_rtk_wow(priv, (unsigned char *)(wrq->u.data.pointer));
} while(--ret > 0);
break;
#endif
case SIOCSRFPWRADJ:
if(ioctl_copy_from_user(tmpbuf, (void *)wrq->u.data.pointer, wrq->u.data.length))
break;
i = dynamic_RF_pwr_adj(priv, tmpbuf);
if (i > 0) {
if (ioctl_copy_to_user((void *)wrq->u.data.pointer, tmpbuf, i))
break;
}
wrq->u.data.length = i;
ret = 0;
break;
#ifdef MCR_WIRELESS_EXTEND
#ifdef CONFIG_WLAN_HAL_8814AE
case SIORXANTSELECT:
{
if(ioctl_copy_from_user(tmpbuf, (void *)wrq->u.data.pointer, wrq->u.data.length))
break;
if (Switch_Antenna_8814(priv, tmpbuf))
GDEBUG("- Usage : # iwpriv wlan0 set_ant_rx ss=x,path=y\n");
ret = 0;
break;
}
#endif
#endif
#ifdef MP_TEST
case MP_START_TEST:
#ifdef NOT_RTK_BSP
RESTORE_INT(priv->pshare->irq_save);
SMP_UNLOCK(priv->pshare->irq_save);
#else
RESTORE_INT(flags);
SMP_UNLOCK(flags);
#endif
mp_start_test(priv);
#ifdef NOT_RTK_BSP
SAVE_INT_AND_CLI(priv->pshare->irq_save);
SMP_LOCK(priv->pshare->irq_save);
#else
SAVE_INT_AND_CLI(flags);
SMP_LOCK(flags);
#endif
ret = 0;
break;
case MP_STOP_TEST:
#ifdef NOT_RTK_BSP
RESTORE_INT(priv->pshare->irq_save);
SMP_UNLOCK(priv->pshare->irq_save);
#else
RESTORE_INT(flags);
SMP_UNLOCK(flags);
#endif
mp_stop_test(priv);
#ifdef NOT_RTK_BSP
SAVE_INT_AND_CLI(priv->pshare->irq_save);
SMP_LOCK(priv->pshare->irq_save);
#else
SAVE_INT_AND_CLI(flags);
SMP_LOCK(flags);
#endif
ret = 0;
break;
#ifdef SDIO_AP_OFFLOAD
case SIOCSTOPPS:
if(ioctl_copy_from_user(tmpbuf, (void *)wrq->u.data.pointer, wrq->u.data.length))
break;
set_ap_ps_mode(priv, tmpbuf);
// assign_MIMO_TR_Mode(priv, tmpbuf);
wrq->u.data.length = 0;
ret = 0;
break;
#endif
case MP_SET_RATE:
if(ioctl_copy_from_user(tmpbuf, (void *)wrq->u.data.pointer, wrq->u.data.length))
break;
mp_set_datarate(priv, tmpbuf);
ret = 0;
break;
case MP_SET_CHANNEL:
if(ioctl_copy_from_user(tmpbuf, (void *)wrq->u.data.pointer, wrq->u.data.length))
break;
mp_set_channel(priv, tmpbuf);
ret = 0;
break;
case MP_SET_BANDWIDTH:
if(ioctl_copy_from_user(tmpbuf, (void *)wrq->u.data.pointer, wrq->u.data.length))
break;
mp_set_bandwidth(priv, tmpbuf);
ret = 0;
break;
case MP_SET_TXPOWER:
if(ioctl_copy_from_user(tmpbuf, (void *)wrq->u.data.pointer, wrq->u.data.length))
break;
mp_set_tx_power(priv, tmpbuf);
ret = 0;
break;
case MP_CONTIOUS_TX:
if(ioctl_copy_from_user(tmpbuf, (void *)wrq->u.data.pointer, wrq->u.data.length))
break;
#ifdef SMP_SYNC
RESTORE_INT(priv->pshare->irq_save);
SMP_UNLOCK(priv->pshare->irq_save);
#else
RESTORE_INT(flags);
#endif
mp_ctx(priv, tmpbuf);
#ifdef SMP_SYNC
SAVE_INT_AND_CLI(priv->pshare->irq_save);
SMP_LOCK(priv->pshare->irq_save);
#else
SAVE_INT_AND_CLI(flags);
SMP_LOCK(flags);
#endif
ret = 0;
break;
case MP_ARX:
if(ioctl_copy_from_user(tmpbuf, (void *)wrq->u.data.pointer, wrq->u.data.length))
break;
i = mp_arx(priv, tmpbuf);
if (i > 0) {
if (ioctl_copy_to_user((void *)wrq->u.data.pointer, tmpbuf, i))
break;
}
wrq->u.data.length = i;
ret = 0;
break;
case MP_SET_BSSID:
if(ioctl_copy_from_user(tmpbuf, (void *)wrq->u.data.pointer, wrq->u.data.length))
break;
mp_set_bssid(priv, tmpbuf);
ret = 0;
break;
case MP_ANTENNA_TX:
if(ioctl_copy_from_user(tmpbuf, (void *)wrq->u.data.pointer, wrq->u.data.length))
break;
mp_set_ant_tx(priv, tmpbuf);
ret = 0;
break;
case MP_ANTENNA_RX:
if(ioctl_copy_from_user(tmpbuf, (void *)wrq->u.data.pointer, wrq->u.data.length))
break;
mp_set_ant_rx(priv, tmpbuf);
ret = 0;
break;
#if defined(CONFIG_RTL_92D_SUPPORT) || defined(CONFIG_RTL_8812_SUPPORT) || defined(CONFIG_WLAN_HAL_8881A)
case MP_SET_BAND:
if(ioctl_copy_from_user(tmpbuf, (void *)wrq->u.data.pointer, wrq->u.data.length))
break;
mp_set_phyBand(priv, tmpbuf);
ret = 0;
break;
#endif
case MP_RESET_STATS:
mp_reset_stats(priv);
ret = 0;
break;
case MP_SET_PHYPARA:
if(ioctl_copy_from_user(tmpbuf, (void *)wrq->u.data.pointer, wrq->u.data.length))
break;
mp_set_phypara(priv, tmpbuf);
ret = 0;
break;
#ifdef B2B_TEST
case MP_TX_PACKET:
if(ioctl_copy_from_user(tmpbuf, (void *)wrq->u.data.pointer, wrq->u.data.length))
break;
#ifdef SMP_SYNC
RESTORE_INT(priv->pshare->irq_save);
#else
RESTORE_INT(flags);
#endif
i = mp_tx(priv, tmpbuf);
#ifdef SMP_SYNC
SAVE_INT_AND_CLI(priv->pshare->irq_save);
#else
SAVE_INT_AND_CLI(flags);
#endif
if (i > 0) {
if (ioctl_copy_to_user((void *)wrq->u.data.pointer, tmpbuf, i))
break;
}
wrq->u.data.length = i;
ret = 0;
break;
#if 0
case MP_RX_PACKET:
if(ioctl_copy_from_user(tmpbuf, (void *)wrq->u.data.pointer, wrq->u.data.length))
break;
#ifndef __LINUX_2_6__
RESTORE_INT(flags);
#endif
mp_rx(priv, tmpbuf);
#ifndef __LINUX_2_6__
SAVE_INT_AND_CLI(flags);
#endif
ret = 0;
break;
#endif
case MP_BRX_PACKET:
if(ioctl_copy_from_user(tmpbuf, (void *)wrq->u.data.pointer, wrq->u.data.length))
break;
#ifdef SMP_SYNC
RESTORE_INT(priv->pshare->irq_save);
#else
RESTORE_INT(flags);
#endif
i = mp_brx(priv, tmpbuf);
#ifdef SMP_SYNC
SAVE_INT_AND_CLI(priv->pshare->irq_save);
#else
SAVE_INT_AND_CLI(flags);
#endif
if (i > 0) {
if (ioctl_copy_to_user((void *)wrq->u.data.pointer, tmpbuf, i))
break;
}
wrq->u.data.length = i;
ret = 0;
break;
#endif // B2B_TEST
case MP_QUERY_STATS:
if(ioctl_copy_from_user(tmpbuf, (void *)wrq->u.data.pointer, wrq->u.data.length))
break;
i = mp_query_stats(priv, tmpbuf);
if (i > 0) {
if (ioctl_copy_to_user((void *)wrq->u.data.pointer, tmpbuf, i))
break;
}
wrq->u.data.length = i;
ret = 0;
break;
case MP_TXPWR_TRACK:
if(ioctl_copy_from_user(tmpbuf, (void *)wrq->u.data.pointer, wrq->u.data.length))
break;
#ifdef SMP_SYNC
RESTORE_INT(priv->pshare->irq_save);
#else
RESTORE_INT(flags);
#endif
mp_txpower_tracking(priv, tmpbuf);
#ifdef SMP_SYNC
SAVE_INT_AND_CLI(priv->pshare->irq_save);
#else
SAVE_INT_AND_CLI(flags);
#endif
ret = 0;
break;
case MP_QUERY_TSSI:
if(ioctl_copy_from_user(tmpbuf, (void *)wrq->u.data.pointer, wrq->u.data.length))
break;
#ifdef SMP_SYNC
RESTORE_INT(priv->pshare->irq_save);
#else
RESTORE_INT(flags);
#endif
i = mp_query_tssi(priv, tmpbuf);
#ifdef SMP_SYNC
SAVE_INT_AND_CLI(priv->pshare->irq_save);
#else
SAVE_INT_AND_CLI(flags);
#endif
if (i > 0) {
if (ioctl_copy_to_user((void *)wrq->u.data.pointer, tmpbuf, i))
break;
wrq->u.data.length = i;
ret = 0;
}
break;
case MP_QUERY_THER:
if(ioctl_copy_from_user(tmpbuf, (void *)wrq->u.data.pointer, wrq->u.data.length))
break;
#ifdef SMP_SYNC
RESTORE_INT(priv->pshare->irq_save);
#else
RESTORE_INT(flags);
#endif
i = mp_query_ther(priv, tmpbuf);
#ifdef SMP_SYNC
SAVE_INT_AND_CLI(priv->pshare->irq_save);
#else
SAVE_INT_AND_CLI(flags);
#endif
if (i > 0) {
if (ioctl_copy_to_user((void *)wrq->u.data.pointer, tmpbuf, i))
break;
wrq->u.data.length = i;
ret = 0;
}
break;
#ifdef MP_PSD_SUPPORT
case MP_QUERY_PSD:
if (ioctl_copy_from_user(tmpbuf, (void *)wrq->u.data.pointer, wrq->u.data.length))
break;
#ifdef SMP_SYNC
RESTORE_INT(priv->pshare->irq_save);
#else
RESTORE_INT(flags);
#endif
i = mp_query_psd(priv, tmpbuf);
#ifdef SMP_SYNC
SAVE_INT_AND_CLI(priv->pshare->irq_save);
#else
SAVE_INT_AND_CLI(flags);
#endif
if (i > 0 ) {
if (ioctl_copy_to_user((void *)wrq->u.data.pointer, tmpbuf, i ))
break;
wrq->u.data.length = i;
ret = 0;
//printk("The address of DA is 0x%p\n",(void *)wrq->u.data.pointer);
}
break;
#endif
case MP_GET_TXPOWER:
if(ioctl_copy_from_user(tmpbuf, (void *)wrq->u.data.pointer, wrq->u.data.length))
break;
#ifdef SMP_SYNC
RESTORE_INT(priv->pshare->irq_save);
#else
RESTORE_INT(flags);
#endif
i = mp_get_txpwr(priv, tmpbuf);
#ifdef SMP_SYNC
SAVE_INT_AND_CLI(priv->pshare->irq_save);
#else
SAVE_INT_AND_CLI(flags);
#endif
if (i > 0) {
if (ioctl_copy_to_user((void *)wrq->u.data.pointer, tmpbuf, i))
break;
wrq->u.data.length = i;
ret = 0;
}
break;
#if defined(CONFIG_RTL_8812_SUPPORT)
case MP_DIG:
if(ioctl_copy_from_user(tmpbuf, (void *)wrq->u.data.pointer, wrq->u.data.length))
break;
#ifdef SMP_SYNC
RESTORE_INT(priv->pshare->irq_save);
#else
RESTORE_INT(flags);
#endif
mp_dig(priv, tmpbuf);
#ifdef SMP_SYNC
SAVE_INT_AND_CLI(priv->pshare->irq_save);
#else
SAVE_INT_AND_CLI(flags);
#endif
ret = 0;
break;
#endif
#endif // MP_TEST
#if (defined(SW_ANT_SWITCH) || defined(HW_ANT_SWITCH))
case SIOCANTSELECT:
if(ioctl_copy_from_user(tmpbuf, (void *)wrq->u.data.pointer, wrq->u.data.length))
break;
#if (defined(CONFIG_RTL_92C_SUPPORT) || defined(CONFIG_RTL_92D_SUPPORT))
if (GET_CHIP_VER(priv) <= VERSION_8192D) {
diversity_antenna_select(priv, tmpbuf);
} else
#endif
{
#ifdef USE_OUT_SRC
priv->pshare->_dmODM.antdiv_select = _atoi(tmpbuf, 10);
panic_printk("SIOCANTSELECT --> antdiv_select=%d\n", priv->pshare->_dmODM.antdiv_select);
ODM_AntDiv(ODMPTR);
#endif
}
ret = 0;
break;
#endif
case SIOCGIWRTLREGDUMP:
if(ioctl_copy_from_user(tmpbuf, (void *)wrq->u.data.pointer, wrq->u.data.length))
break;
#ifdef SMP_SYNC
RESTORE_INT(priv->pshare->irq_save);
#else
RESTORE_INT(flags);
#endif
reg_dump(priv, (char *)tmpbuf);
#ifdef SMP_SYNC
SAVE_INT_AND_CLI(priv->pshare->irq_save);
#else
SAVE_INT_AND_CLI(flags);
#endif
ret = 0;
break;
#ifdef BR_SHORTCUT
case SIOCLEARBRSC:
clear_shortcut_cache();
ret = 0;
break;
case SIOCLONEEARBRSC:
{
int idx;
unsigned char macaddr[MACADDRLEN];
unsigned char tmpbuf2[4];
if(ioctl_copy_from_user(tmpbuf, (void *)wrq->u.data.pointer, wrq->u.data.length))
break;
for(idx=0; idx<MACADDRLEN; idx++)
{
tmpbuf2[0] = tmpbuf[2*idx];
tmpbuf2[1] = tmpbuf[2*idx+1];
tmpbuf2[2] = 0;
macaddr[idx] = (unsigned char)_atoi((char *)tmpbuf2, 16);
}
DEBUG_INFO("del_br_sc %02X%02X%02X%02X%02X%02X\n",
macaddr[0], macaddr[1], macaddr[2], macaddr[3], macaddr[4], macaddr[5]);
release_brsc_cache(macaddr);
ret = 0;
break;
}
#endif
case SIOCRADIOOFF:
#ifdef PCIE_POWER_SAVING
radio_off(priv);
#endif
ret = 0;
break;
case SIOCACS:
if (ioctl_copy_from_user(tmpbuf, (void *)wrq->u.data.pointer, wrq->u.data.length))
break;
rtl8192cd_del_all_sta(priv);
rtl8192cd_autochannel_sel(priv);
wrq->u.data.length = 0;
ret = 0;
break;
case SIOCANTSTS:
i = sprintf(tmpbuf, "%x:%x", priv->pshare->mp_antenna_tx, priv->pshare->mp_antenna_rx);
if (ioctl_copy_to_user((void *)wrq->u.data.pointer, tmpbuf, i))
break;
wrq->u.data.length = i;
ret = 0;
break;
#if defined(PCIE_POWER_SAVING) || defined(RF_MIMO_SWITCH) || defined(RF_MIMO_PS)
case SIOCEPDN:
#ifdef PCIE_POWER_SAVING
#ifdef PCIE_POWER_SAVING_DEBUG
if(ioctl_copy_from_user(tmpbuf, (void *)wrq->u.data.pointer, wrq->u.data.length))
break;
i = PCIE_PowerDown(priv, tmpbuf);
if (i > 0) {
if (ioctl_copy_to_user((void *)wrq->u.data.pointer, tmpbuf, i))
break;
}
wrq->u.data.length = i;
#else
priv->pshare->rf_ft_var.power_save &=0xf0;
PCIeWakeUp(priv, (POWER_DOWN_T0));
#endif
#else
if(ioctl_copy_from_user(tmpbuf, (void *)wrq->u.data.pointer, wrq->u.data.length))
break;
assign_MIMO_TR_Mode(priv, tmpbuf);
wrq->u.data.length = 0;
#endif
ret = 0;
break;
#endif
#ifdef EN_EFUSE
case SIOCEFUSE_GET:
if(ioctl_copy_from_user(tmpbuf, (void *)wrq->u.data.pointer, wrq->u.data.length))
break;
i = efuse_get(priv, tmpbuf);
if (i > 0) {
if (ioctl_copy_to_user((void *)wrq->u.data.pointer, tmpbuf, i))
break;
}
wrq->u.data.length = i;
ret = 0;
break;
case SIOCEFUSE_SET:
if(ioctl_copy_from_user(tmpbuf, (void *)wrq->u.data.pointer, wrq->u.data.length))
break;
i = efuse_set(priv, tmpbuf);
if (i > 0) {
if (ioctl_copy_to_user((void *)wrq->u.data.pointer, tmpbuf, i))
break;
}
wrq->u.data.length = i;
ret = 0;
break;
case SIOCEFUSE_SYNC:
if(ioctl_copy_from_user(tmpbuf, (void *)wrq->u.data.pointer, wrq->u.data.length))
break;
i = efuse_sync(priv, tmpbuf);
if (i > 0) {
if (ioctl_copy_to_user((void *)wrq->u.data.pointer, tmpbuf, i))
break;
}
wrq->u.data.length = i;
ret = 0;
break;
#endif
#ifdef P2P_SUPPORT
case SIOCP2PCMD:
if(ioctl_copy_from_user(tmpbuf, (void *)wrq->u.data.pointer, wrq->u.data.length))
break;
//printk("ioctl-->process_p2p_cmd\n");
i = process_p2p_cmd(priv, tmpbuf);
if (i > 0) {
if (ioctl_copy_to_user((void *)wrq->u.data.pointer, tmpbuf, i))
break;
}
wrq->u.data.length = i;
ret = 0;
break;
#endif
#if defined(MBSSID) || defined(UNIVERSAL_REPEATER)
case SIOCSICOPYMIB:
{
unsigned char hwaddr[MACADDRLEN];
int func_off = priv->pmib->miscEntry.func_off;
memcpy(hwaddr, GET_MY_HWADDR, MACADDRLEN);
memcpy(priv->pmib, GET_ROOT(priv)->pmib, sizeof(struct wifi_mib));
priv->pmib->miscEntry.func_off = func_off;
memcpy(GET_MY_HWADDR, hwaddr, MACADDRLEN);
#ifdef WIFI_WPAS_CLI
priv->pmib->wscEntry.wsc_enable = 0;
priv->pmib->wscEntry.beacon_ielen = 0;
priv->pmib->wscEntry.probe_rsp_ielen = 0;
priv->pmib->wscEntry.probe_req_ielen = 0;
priv->pmib->wscEntry.assoc_ielen = 0;
#endif
ret = 0;
break;
}
#endif
#ifdef CONFIG_RTL8186_KB
case SIOCGIREADGUESTMAC:
i = get_guestmac(priv, (GUESTMAC_T *)tmpbuf);
if (i >= 0) {
if ((i > 0) && ioctl_copy_to_user((void *)wrq->u.data.pointer, tmpbuf, i))
break;
wrq->u.data.length = i;
ret = 0;
}
break;
case SIOCSIWRTGUESTMAC:
if (ioctl_copy_from_user(tmpbuf, (void *)wrq->u.data.pointer, wrq->u.data.length))
break;
set_guestmacvalid(priv, tmpbuf);
ret = 0;
break;
#endif
#ifdef MULTI_MAC_CLONE
case SIOCGIMCLONE:
if (ioctl_copy_from_user(tmpbuf, (void *)wrq->u.data.pointer, wrq->u.data.length))
break;
i = get_mclone_addr(priv, tmpbuf);
if (i > 0) {
if (ioctl_copy_to_user((void *)wrq->u.data.pointer, tmpbuf, i))
break;
}
wrq->u.data.length = i;
ret = 0;
break;
case SIOCSIMCLONE:
if (ioctl_copy_from_user(tmpbuf, (void *)wrq->u.data.pointer, wrq->u.data.length))
break;
set_mclone_addr(priv, tmpbuf);
ret = 0;
break;
case SIOCSIMCLONE_DEL:
if (ioctl_copy_from_user(tmpbuf, (void *)wrq->u.data.pointer, wrq->u.data.length))
break;
del_mclone_addr(priv, tmpbuf);
ret = 0;
break;
case SIOCSIMCLONE_DEL2:
if( ( ((GET_MIB(priv))->dot11OperationEntry.opmode & (WIFI_STATION_STATE|WIFI_ASOC_STATE))==(WIFI_STATION_STATE|WIFI_ASOC_STATE) )&& MCLONE_NUM ){
__del_mclone_addr(priv, (unsigned char *)ifr);
}
ret = 0;
break;
#endif
#ifdef SUPPORT_SNMP_MIB
case SIOCGSNMPMIB:
if ((wrq->u.data.length > sizeof_tmpbuf) ||
ioctl_copy_from_user(tmpbuf, (void *)wrq->u.data.pointer, wrq->u.data.length))
break;
if (mib_get(priv, tmpbuf, tmpbuf, &i)) {
if ((i > 0) && ioctl_copy_to_user((void *)wrq->u.data.pointer, tmpbuf, i))
break;
wrq->u.data.length = i;
ret = 0;
}
break;
#endif
#ifdef SUPPORT_TX_MCAST2UNI
case SIOCGIMCAST_ADD:
case SIOCGIMCAST_DEL:
ret = ioctl_AddDelMCASTGroup2STA(dev, ifr, cmd);
break;
#endif // SUPPORT_TX_MCAST2UNI
#ifdef CONFIG_RTK_MESH
case SIOCQPATHTABLE:
{
unsigned char destaddr[MACADDRLEN] = {0};
ioctl_copy_from_user(destaddr, (void *)(wrq->u.data.pointer), MACADDRLEN);
//MESH_DEBUG_MSG("kernel destaddr = %s\n",destaddr);
struct path_sel_entry *pEntry = pathsel_query_table( priv, destaddr); // modified by chuangch 2007.09.14
ret = -1;
if(pEntry!= (struct path_sel_entry *)-1)
{
if (ioctl_copy_to_user((void *)wrq->u.data.pointer, (void *)pEntry, (int)&((struct path_sel_entry*)0)->start) == 0)
{
ret = 0;
wrq->u.data.length = sizeof(struct path_sel_entry);
}
}
break;
}
case SIOCUPATHTABLE:
{
struct path_sel_entry Entry;
ioctl_copy_from_user((struct path_sel_entry *)&Entry, (void *)(wrq->u.data.pointer), (int)&((struct path_sel_entry*)0)->start);
ret = pathsel_modify_table_entry(priv, &Entry); // chuangch 2007.09.14
break;
}
case SIOCAPATHTABLE:
{
struct path_sel_entry Entry, *pEntry;
memset((void*)&Entry, 0, sizeof(Entry));
ioctl_copy_from_user((struct path_sel_entry *)&Entry, (void *)(wrq->u.data.pointer), (int)&((struct path_sel_entry*)0)->start);
ret = 0;
pEntry = pathsel_query_table( priv, Entry.destMAC );
if( pEntry == (struct path_sel_entry *)-1 || pEntry->flag==0)
{
/*prevent update path relative to any invalid neighbor*/
if(get_stainfo(priv, Entry.nexthopMAC)) {
Entry.priv = priv;
}
#if !defined(CONFIG_RTL_MESH_CROSSBAND)
else if(priv->mesh_priv_sc && get_stainfo(priv->mesh_priv_sc, Entry.nexthopMAC)) {
Entry.priv = priv->mesh_priv_sc;
}
#endif
else {
return -1;
}
Entry.update_time = xtime; // chuangch 2007.09.19
#ifdef MESH_ROUTE_MAINTENANCE
Entry.routeMaintain = xtime; // chuangch 10.19
#endif
ret = pathsel_table_entry_insert_tail( priv, &Entry); //chuangch 2007.09.14
MESH_DEBUG_MSG("create path to:%02X:%02X:%02X:%02X:%02X:%02X, Nexthop=%02X:%02X:%02X:%02X:%02X:%02X, Hop count=%d\n",
Entry.destMAC[0], Entry.destMAC[1], Entry.destMAC[2], Entry.destMAC[3], Entry.destMAC[4], Entry.destMAC[5],
Entry.nexthopMAC[0], Entry.nexthopMAC[1], Entry.nexthopMAC[2], Entry.nexthopMAC[3], Entry.nexthopMAC[4], Entry.nexthopMAC[5],
Entry.hopcount);
}
break;
}
//modify by Jason 2007.11.26
case REMOVE_PATH_ENTRY:
{
unsigned char invalid_node_addr[MACADDRLEN] = {0};
struct path_sel_entry *pEntry;
if ( ioctl_copy_from_user((void *)invalid_node_addr, (void *)(wrq->u.data.pointer), MACADDRLEN) ) {
ret = -1;
break;
}
MESH_DEBUG_MSG("REMOVE_PATH_ENTRY\n");
MESH_DEBUG_MSG("invalid_node_addr =%2X-%2X-%2X-%2X-%2X-%2X-\n",invalid_node_addr[0],invalid_node_addr[1],invalid_node_addr[2],invalid_node_addr[3],invalid_node_addr[4],invalid_node_addr[5]);
pEntry = pathsel_query_table( priv, invalid_node_addr );
if(pEntry != (struct path_sel_entry *)-1 && pEntry->flag==0)
{
#ifdef __LINUX_2_6__
/*by qjj_qin and hf_shi*/
#else
SAVE_INT_AND_CLI(flags);
#endif
ret = remove_path_entry(priv,invalid_node_addr);
#ifdef __LINUX_2_6__
/*by qjj_qin and hf_shi*/
#else
RESTORE_INT(flags);
#endif
}
break;
}
case GET_STA_LIST:
{
struct stat_info *pstat;
struct proxy_table_entry *pEntry=NULL;
static unsigned char node[MACADDRLEN] = {0};
if ( ioctl_copy_from_user((void *)node, (void *)(wrq->u.data.pointer), MACADDRLEN) ) {
ret = -1;
break;
}
#if 0 //do not use station info
// my station
pstat = get_stainfo(priv, node);
if(pstat != 0)
{
if(isSTA(pstat) && (pstat->state & WIFI_ASOC_STATE)) {
ret = 0;
break;
}
else // a neighbor
goto ret_nothing;
}
#endif
pEntry = HASH_SEARCH(priv->proxy_table,node);
// my proxied entry
if(pEntry && (memcmp(GET_MY_HWADDR, pEntry->owner, MACADDRLEN)==0))
{
ret = 0;
break;
}
ret_nothing:
// if not my station or not my proxied entry, then just fill garbage(0x0b) and return normally
memset(node, 0x0b, sizeof(node));
if (ioctl_copy_to_user((void *)wrq->u.data.pointer, (void *)node, MACADDRLEN) != 0)
{
ret = -1;
break;
}
ret = 0;
break;
}
case SET_PORTAL_POOL:
{
if ( ioctl_copy_from_user( (priv->pann_mpp_tb->pann_mpp_pool), (void *)(wrq->u.data.pointer), sizeof(struct pann_mpp_tb_entry) * MAX_MPP_NUM ) ) {
ret = -1;
break;
}
ret = 0;
break;
}
case SIOC_NOTIFY_PATH_CREATE:
{
unsigned char destaddr[MACADDRLEN] = {0};
if ( ioctl_copy_from_user((void *)destaddr, (void *)(wrq->u.data.pointer), MACADDRLEN) ) {
ret = -1;
break;
}
notify_path_found(destaddr,priv);
// MESH_DEBUG_MSG("destaddr =%2X-%2X-%2X-%2X-%2X-%2X-\n",destaddr[0],destaddr[1],destaddr[2],destaddr[3],destaddr[4],destaddr[5]);
ret = 0;
break;
}
case SIOC_UPDATE_ROOT_INFO:
{
if ( ioctl_copy_from_user((void *)priv->root_mac, (void *)(wrq->u.data.pointer), MACADDRLEN) ) {
ret = -1;
break;
}
ret = 0;
#if 0
LOG_MESH_MSG("Root MAC = %02X:%02X:%02X:%02X:%02X:%02X\n",
priv->root_mac[0],priv->root_mac[1],priv->root_mac[2],priv->root_mac[3],priv->root_mac[4],priv->root_mac[5]);
#endif
break;
}
case SIOC_GET_ROUTING_INFO:
{
unsigned char buffer[128] = {0};
buffer[0] = (unsigned short)(priv->pmib->dot1180211sInfo.mesh_root_enable);
buffer[1] = (unsigned short)(priv->pmib->dot1180211sInfo.mesh_portal_enable);
#ifdef _11s_TEST_MODE_
buffer[2] = (unsigned short)(priv->pmib->dot1180211sInfo.mesh_reserved1);
#endif
if (ioctl_copy_to_user((void *)wrq->u.data.pointer, (void *)buffer, 128) == 0)
ret = 0;
else
ret = -1;
break;
}
case SIOC_SET_ROUTING_INFO:
{
unsigned char buffer[128] = {0};
if ( !wrq->u.data.pointer ){
ret = -1;
break;
}
if (ioctl_copy_from_user((void *)buffer, (void *)wrq->u.data.pointer, 128) == 0)
ret = 0;
else
ret = -1;
priv->pmib->dot1180211sInfo.mesh_root_enable = buffer[0];
priv->pmib->dot1180211sInfo.mesh_portal_enable = buffer[1];
break;
}
#ifdef _11s_TEST_MODE_
case SAVE_RECEIBVER_PID:
{
if ( !wrq->u.data.pointer ){
ret = -1;
break;
}
len = wrq->u.data.length;
memset(strPID, 0, sizeof(strPID));
ioctl_copy_from_user(strPID, (void *)wrq->u.data.pointer, len);
pid_receiver = 0;
for(i = 0; i < len; i++) //char -> int
{
pid_receiver = pid_receiver * 10 + (strPID[i] - 48);
}
ret = 0;
break;
}
case DEQUEUE_RECEIBVER_IOCTL:
{
if((ret = DOT11_DeQueue2((unsigned long)priv, priv->receiver_queue, QueueData, &QueueDataLen)) != 0) {
ioctl_copy_to_user((void *)(wrq->u.data.pointer), DATAQUEUE_EMPTY, sizeof(DATAQUEUE_EMPTY));
wrq->u.data.length = sizeof(DATAQUEUE_EMPTY);
} else {
ioctl_copy_to_user((void *)wrq->u.data.pointer, (void *)QueueData, QueueDataLen);
wrq->u.data.length = QueueDataLen;
}
break;
}
#endif
case SAVEPID_IOCTL:
{
if ( !wrq->u.data.pointer ){
ret = -1;
break;
}
len = wrq->u.data.length;
memset(strPID, 0, sizeof(strPID));
ioctl_copy_from_user(strPID, (void *)wrq->u.data.pointer, len);
priv->pid_pathsel = 0;
for(i = 0; i < len; i++) //char -> int
{
priv->pid_pathsel = priv->pid_pathsel * 10 + (strPID[i] - 48);
}
ret = 0;
break;
}
case DEQUEUEDATA_IOCTL:
{
if((ret = DOT11_DeQueue2((unsigned long)priv, priv->pathsel_queue, QueueData, &QueueDataLen)) != 0) {
ioctl_copy_to_user((void *)(wrq->u.data.pointer), DATAQUEUE_EMPTY, sizeof(DATAQUEUE_EMPTY));
wrq->u.data.length = sizeof(DATAQUEUE_EMPTY);
} else {
ioctl_copy_to_user((void *)wrq->u.data.pointer, (void *)QueueData, QueueDataLen);
wrq->u.data.length = QueueDataLen;
}
break;
}
#endif // CONFIG_RTK_MESH
#ifdef CONFIG_RTL_COMAPI_CFGFILE
case SIOCCOMAPIFILE:
{
ret = CfgFileProc(dev);
break;
}
#endif
case SIOC92DAUTOCH:
{
if (!(OPMODE & WIFI_AP_STATE)){
DEBUG_ERR("can't do auto-channel select for non-AP mode!\n");
break;
}
#ifdef UNIVERSAL_REPEATER
if (IS_VXD_INTERFACE(priv)) {
DEBUG_ERR("can't do auto-channel select for vxd!\n");
break;
}
#endif
#ifdef MBSSID
if (
GET_ROOT(priv)->pmib->miscEntry.vap_enable &&
IS_VAP_INTERFACE(priv)) {
DEBUG_ERR("can't do auto-channel select for vap!\n");
break;
}
#endif
#ifdef PCIE_POWER_SAVING
PCIeWakeUp(priv, POWER_DOWN_T0);
#endif
ret = rtl8192cd_autochannel_sel(priv);
break;
}
#if defined(CONFIG_OFFLOAD_FUNCTION) || defined(SDIO_AP_OFFLOAD)
case SIOOFFLOADTEST:
{
if(ioctl_copy_from_user(tmpbuf, (void *)wrq->u.data.pointer, wrq->u.data.length))
break;
i = offloadTestFunction(priv, tmpbuf);
if (i > 0) {
if (ioctl_copy_to_user((void *)wrq->u.data.pointer, tmpbuf, i))
break;
}
wrq->u.data.length = i;
ret = 0;
break;
}
#endif // CONFIG_OFFLOAD_FUNCTION || SDIO_AP_OFFLOAD
#ifdef CONFIG_8814_AP_MAC_VERI
case SIO_8814_AP_MAC_VERI:
{
if(copy_from_user(tmpbuf, (void *)wrq->u.data.pointer, wrq->u.data.length))
break;
APmacTestFunction_8814(priv, tmpbuf);
ret = 0;
break;
}
#endif //#ifdef CONFIG_8814_AP_MAC_VERI
#ifdef CONFIG_RTL_92D_SUPPORT
case SIOC92DIQK:
{
PHY_IQCalibrate(priv);
ret = 0;
break;
}
#ifdef EN_EFUSE
case SIOC92DSBANDADDR:
{
unsigned int phyband;
u8 efuse_MAC=0;
if (wrq->u.data.pointer) {
if ((wrq->u.data.length > sizeof_tmpbuf) ||
ioctl_copy_from_user(tmpbuf, (void *)wrq->u.data.pointer, wrq->u.data.length))
break;
phyband = _atoi(tmpbuf, 16);
printk("get phyband = %d \n",phyband);
if (phyband==2)
efuse_MAC = EEPROM_MAC0_MACADDRESS;
else
efuse_MAC = EEPROM_MAC1_MACADDRESS;
if (/*priv->AutoloadFailFlag==FALSE &&*/ priv->pmib->efuseEntry.enable_efuse==1) {
#ifdef __KERNEL__
struct sockaddr addr;
#endif
unsigned char *hwinfo = &(priv->EfuseMap[EFUSE_INIT_MAP][0]);
unsigned char *mac = hwinfo + efuse_MAC;
unsigned char zero[] = {0, 0, 0, 0, 0, 0};
/* printk("wlan%d EFUSE MAC [%02x:%02x:%02x:%02x:%02x:%02x]\n", priv->pshare->wlandev_idx,
*mac, *(mac+1), *(mac+2), *(mac+3), *(mac+4), *(mac+5)); */
if(memcmp(mac, zero, MACADDRLEN) && !IS_MCAST(mac)) {
#ifdef __KERNEL__
memcpy(addr.sa_data, mac, MACADDRLEN);
rtl8192cd_set_hwaddr(priv->dev, (void *)&addr);
#else
rtl8192cd_set_hwaddr(priv->dev, (void *)mac);
#endif
}
}
ret = 0;
} else {
ret = -1;
}
break;
}
#endif // EN_EFUSE
#ifdef NON_INTR_ANTDIV
case SIOC92DATNDIV:
{
if (priv->pmib->dot11RFEntry.macPhyMode == DUALMAC_DUALPHY){
extern u32 if_priv[];
unsigned long temp_18[2], temp_28[2], temp_0b[2];
int i, ch[2];
// Backup RF 18, 28, 0B
for (i=0;i<2;i++) {
temp_18[i] = DMDP_PHY_QueryRFReg(i, RF92CD_PATH_A, 0x18, bMask20Bits, 1);
ch[i] = temp_18[i] & 0xff;
temp_28[i] = DMDP_PHY_QueryRFReg(i, RF92CD_PATH_A, 0x28, bMask20Bits, 1);
temp_0b[i] = DMDP_PHY_QueryRFReg(i, RF92CD_PATH_A, 0x0b, bMask20Bits, 1);
printk("RF[%d] 18=0x%05x 28=0x%05x 0B=0x%05x\n",i, temp_18[i], temp_28[i], temp_0b[i]);
}
PHY_SetBBReg(priv, 0xb30, BIT(27), 1);
// Restore RF 18, 28, 0B
for (i=0;i<2;i++) {
DMDP_PHY_SetRFReg(i, RF92CD_PATH_A, 0x18, bMask20Bits, temp_18[i]);
//DMDP_PHY_SetRFReg(i, RF92CD_PATH_A, 0x28, BIT(7)|BIT(6), (temp_28[i]&(BIT(7)|BIT(6)))>>6);
DMDP_PHY_SetRFReg(i, RF92CD_PATH_A, 0x0b, bMask20Bits, temp_0b[i]);
}
for (i=0;i<2;i++)
SetIMR_n((struct rtl8192cd_priv *)if_priv[i], ch[i]);
for (i=0;i<2;i++)
PHY_IQCalibrate((struct rtl8192cd_priv *)if_priv[i]);
printk("Non-interrupt antenna switched!\n");
ret = 0;
}else {
printk("NOT DMDP, cannot support antenna switch\n");
ret = -1;
}
break;
}
#endif // EN_EFUSE
#ifdef DPK_92D
case SIOC92DDPK:
{
if (priv->pmib->dot11RFEntry.phyBandSelect==PHY_BAND_5G){
if (priv->pshare->rf_ft_var.dpk_on){
int ch = PHY_QueryRFReg(priv,RF92CD_PATH_A,0x18,0xff,1);
unsigned int curMaxRFPath, eRFPath;
if (priv->pmib->dot11RFEntry.macPhyMode == DUALMAC_DUALPHY)
curMaxRFPath = RF92CD_PATH_B;
else
curMaxRFPath = RF92CD_PATH_MAX;
for(eRFPath = RF92CD_PATH_A; eRFPath < curMaxRFPath; eRFPath++){
if (eRFPath == RF92CD_PATH_A)
PHY_SetBBReg(priv, 0xb68, bMaskDWord, 0x28080000);
else
PHY_SetBBReg(priv, 0xb6c, bMaskDWord, 0x28080000);
if (ch<=64){
PHY_SetRFReg(priv,eRFPath,0x03,bMask20Bits,0x94a12);
delay_us(10);
PHY_SetRFReg(priv,eRFPath,0x04,bMask20Bits,0x94a12);
PHY_SetRFReg(priv,eRFPath,0x0e,bMask20Bits,0x94a12);
}else if (ch<=140){
PHY_SetRFReg(priv,eRFPath,0x03,bMask20Bits,0x94a52);
delay_us(10);
PHY_SetRFReg(priv,eRFPath,0x04,bMask20Bits,0x94a52);
PHY_SetRFReg(priv,eRFPath,0x0e,bMask20Bits,0x94a52);
}else{
PHY_SetRFReg(priv,eRFPath,0x03,bMask20Bits,0x94a12);
delay_us(10);
PHY_SetRFReg(priv,eRFPath,0x04,bMask20Bits,0x94a12);
PHY_SetRFReg(priv,eRFPath,0x0e,bMask20Bits,0x94a12);
}
PHY_SetRFReg(priv,eRFPath,0x16,bMask20Bits,0xe1874);
PHY_SetRFReg(priv,eRFPath,0x16,bMask20Bits,0xa1874);
PHY_SetRFReg(priv,eRFPath,0x16,bMask20Bits,0x61874);
PHY_SetRFReg(priv,eRFPath,0x16,bMask20Bits,0x21874);
}
priv->pshare->rf_ft_var.dpk_on = 0;
panic_printk("DPK OFF!\n");
}else{
priv->pshare->rf_ft_var.dpk_on = 1;
panic_printk("DPK ON!\n");
PHY_DPCalibrate(priv);
}
ret = 0;
}else {
panic_printk("NO DPK for 2G!\n");
ret = -1;
}
break;
}
#endif
#endif // CONFIG_RTL_92D_SUPPORT
#if defined(RTK_AC_SUPPORT) || defined(HS2_SUPPORT) || defined(CONFIG_IEEE80211W)//for 11ac logo, hs2.0 release 1 logo
case SIOC8812SIGMA:
{
panic_printk("Reset Default for SIGMA!!\n");
reset_default_sigma(priv);
ret=0;
break;
}
#endif
#if defined(RTK_AC_SUPPORT)
case SIOC8812SIGMATB:
{
panic_printk("Reset Default for SIGMA TestBed!!\n");
reset_default_sigma(priv);
reset_default_sigma_testbed(priv);
ret=0;
break;
}
#endif
case SIOCTXPWRAPPLY:
SetTxPowerLevel(priv);
ret = 0;
break;
#ifdef DFS
case SIOCRESETNOPCHANNEL:
reset_nop_channel(priv);
ret = 0;
break;
#endif
}
#ifdef SMP_SYNC
RESTORE_INT(priv->pshare->irq_save);
SMP_UNLOCK(priv->pshare->irq_save);
#else
RESTORE_INT(flags);
#endif
return ret;
}
void delay_us(unsigned int t)
{
#ifdef __LINUX_2_6__
#if defined(CONFIG_RTL8672) || defined(NOT_RTK_BSP)
udelay(t);
#else
__udelay(t);
#endif
#else
__udelay(t, __udelay_val);
#endif
}
#ifdef CONFIG_RTL_ALP
#define STATUS_FILE "/var/run/sitesurvey.xml"
#include <stdio.h>
int rtl8192cd_ss_req_toXML(struct rtl8192cd_priv *priv)
{
INT8 ret = 0;
#ifdef CONFIG_RTK_MESH
// by GANTOE for manual site survey 2008/12/25
// inserted by Joule for simple channel unification protocol 2009/01/06
if((priv->auto_channel &0x30) && timer_pending(&priv->ss_timer))
ret = -2;
else
#endif
{
if (!netif_running(priv->dev) || priv->ss_req_ongoing)
ret = -1;
else
ret = 0;
}
if (!ret) // now, let's start site survey
{
priv->ss_ssidlen = 0;
DEBUG_INFO("start_clnt_ss, trigger by %s, ss_ssidlen=0\n", (char *)__FUNCTION__);
priv->ss_req_ongoing = 1;
start_clnt_ss(priv);
}
return 0;
}
extern int encode_ssid_str(const char *source,char *dest);
typedef enum { BAND_11B=1, BAND_11G=2, BAND_11BG=3, BAND_11A=4, BAND_11N=8, BAND_5G_11AN=12 } BAND_TYPE_T;
int rtl8192cd_get_ss_status_toXML(struct rtl8192cd_priv *priv, int *data)
{
INT8 ret = 0;
FILE *fptr;
int cnt;
struct bss_desc bss;
char tmp1Buf[20], tmp2Buf[20];
char wpa_tkip_aes[20],wpa2_tkip_aes[20];
char decode_ssid[200];
if (!netif_running(priv->dev) || priv->ss_req_ongoing)
{
diag_printf("%s: netif is not running or sitesurvey ongoing\n", __func__);
ret = -1;
}
else
{
fptr=fopen(STATUS_FILE,"w+");
if (fptr==NULL){
diag_printf("%s: Fail to create %s\n", __FUNCTION__, STATUS_FILE);
return -1;
}
fprintf(fptr,"<XML_ROOT><runtime><sitesurvey>");
fprintf(fptr,"<count>%d</count>",priv->site_survey->count_backup);
if (priv->site_survey->count_backup){
for (cnt=0; cnt<priv->site_survey->count_backup; cnt++){
bss = priv->site_survey->bss_backup[cnt];
memset(decode_ssid,0x00,sizeof(decode_ssid));
encode_ssid_str(bss.ssid,decode_ssid);
fprintf(fptr, "<entry><ssid>%s</ssid>", decode_ssid);
fprintf(fptr, "<bssid>%02x:%02x:%02x:%02x:%02x:%02x</bssid>",
bss.bssid[0], bss.bssid[1], bss.bssid[2],
bss.bssid[3],bss.bssid[4], bss.bssid[5]);
memset(wpa_tkip_aes,0x00,sizeof(wpa_tkip_aes));
memset(wpa2_tkip_aes,0x00,sizeof(wpa2_tkip_aes));
if ((bss.capability & 0x10/*cPrivacy*/) == 0) {
/* No Encryption */
sprintf(tmp2Buf, "OPEN");
} else {
if (bss.t_stamp[0] == 0) {
/* WEP */
sprintf(tmp2Buf, "WEP");
} else {
int wpa_exist = 0, idx = 0;
if (bss.t_stamp[0] & 0x0000ffff) {
/* WPA */
idx = sprintf(tmp2Buf, "WPA");
if (((bss.t_stamp[0] & 0x0000f000) >> 12) == 0x4) {
/* WPA-PSK*/
idx += sprintf(tmp2Buf+idx, "-PSK");
}
wpa_exist = 1;
if (((bss.t_stamp[0] & 0x00000f00) >> 8) == 0x5) {
/* Auto Cipher*/
sprintf(wpa_tkip_aes,"%s","aes+tkip");
} else if (((bss.t_stamp[0] & 0x00000f00) >> 8) == 0x4) {
/* AES */
sprintf(wpa_tkip_aes,"%s","aes");
} else if (((bss.t_stamp[0] & 0x00000f00) >> 8) == 0x1) {
/* TKIP */
sprintf(wpa_tkip_aes,"%s","tkip");
}
}
if (bss.t_stamp[0] & 0xffff0000) {
if (wpa_exist)
idx += sprintf(tmp2Buf+idx, "/");
/* WPA2*/
idx += sprintf(tmp2Buf+idx, "WPA2");
if (((bss.t_stamp[0] & 0xf0000000) >> 28) == 0x4){
/*WPA2-PSK*/
idx += sprintf(tmp2Buf+idx, "-PSK");
}
if (((bss.t_stamp[0] & 0x0f000000) >> 24) == 0x5) {
/* Auto Cipher*/
sprintf(wpa2_tkip_aes,"%s","aes+tkip");
} else if (((bss.t_stamp[0] & 0x0f000000) >> 24) == 0x4) {
/* AES */
sprintf(wpa2_tkip_aes,"%s","aes");
} else if (((bss.t_stamp[0] & 0x0f000000) >> 24) == 0x1) {
/* TKIP */
sprintf(wpa2_tkip_aes,"%s","tkip");
}
}
}
}
fprintf(fptr, "<encrypt>%s</encrypt>", tmp2Buf);
if ((strlen(wpa_tkip_aes)!=0)&&(strlen(wpa2_tkip_aes)!=0))
fprintf(fptr, "<cipher>%s/%s</cipher>", wpa_tkip_aes, wpa2_tkip_aes);
else if (strlen(wpa_tkip_aes)!=0)
fprintf(fptr, "<cipher>%s</cipher>", wpa_tkip_aes);
else if (strlen(wpa2_tkip_aes)!=0)
fprintf(fptr, "<cipher>%s</cipher>", wpa2_tkip_aes);
else
fprintf(fptr, "<cipher>%s</cipher>", "");
if (bss.network==BAND_11B)
strcpy(tmp1Buf, " (B)");
else if (bss.network==BAND_11G)
strcpy(tmp1Buf, " (G)");
else if (bss.network==(BAND_11G|BAND_11B))
strcpy(tmp1Buf, " (B+G)");
else if (bss.network==(BAND_11N))
strcpy(tmp1Buf, " (N)");
else if (bss.network==(BAND_11G|BAND_11N))
strcpy(tmp1Buf, " (G+N)");
else if (bss.network==(BAND_11G|BAND_11B | BAND_11N))
strcpy(tmp1Buf, " (B+G+N)");
else if(bss.network== BAND_11A)
strcpy(tmp1Buf, " (A)");
else
strcpy(tmp1Buf, " ---");
fprintf(fptr, "<channel>%d</channel>", bss.channel);
fprintf(fptr, "<wlmode>%s</wlmode>", tmp1Buf);
fprintf(fptr, "<signal>%d</signal></entry>", bss.rssi);
}
};
fprintf(fptr,"</sitesurvey></runtime></XML_ROOT>");
}
return 0;
}
#endif
void delay_ms(unsigned int t)
{
#if defined(CONFIG_USB_HCI) || defined(CONFIG_DIO_HCI)
// use msleep instead of mdelay to improve CPU loading when in process context
if (!in_atomic() && !irqs_disabled() && t >= (MSEC_PER_SEC / HZ))
msleep(t);
else
#endif
mdelay(t);
}
#ifdef _SINUX_
enum iwpriv_type {
IW_NA,
IW_RD,
IW_WR,
IW_DP
};
typedef int cmd_rw_handler(struct rtl8192cd_priv *, unsigned char *);
typedef void cmd_dump_handler(struct rtl8192cd_priv *, unsigned char *);
struct cmd_map_stru {
char *cmd_str;
void *cmd_handler;
int type;
};
static struct cmd_map_stru iwpriv_cmds[] = {
{"set_mib", set_mib, IW_WR},
{"get_mib", get_mib, IW_RD},
{"write_mem", write_mem, IW_WR},
{"read_mem", read_mem, IW_RD},
{"read_reg", read_reg, IW_RD},
{"write_reg", write_reg, IW_WR},
{"read_rf", read_rf_reg, IW_RD},
{"write_rf", write_rf_reg, IW_WR},
{"reg_dump", reg_dump, IW_DP},
{NULL, NULL, IW_NA}
};
int rtl8192cd_iwpriv_cmd_process(unsigned char *ifname, unsigned char *data)
{
static unsigned char buf[1024]={0};
struct cmd_map_stru * p_cmd;
unsigned char *para;
int ret;
struct net_device *net_dev;
struct rtl8192cd_priv *priv;
cmd_rw_handler *cmd_rw;
cmd_dump_handler *cmd_dump;
struct cmd_map_stru * cmds = iwpriv_cmds;
int i = 0 ;
printk("\n");
printk("rtl8192cd_iwpriv_cmd_process: cmd=%s\n", data);
while (cmds[i].cmd_str != NULL ) {
if ( memcmp(data, cmds[i].cmd_str, strlen(cmds[i].cmd_str)) == 0 )
break;
else
i++;
}
if (cmds[i].cmd_str == NULL || cmds[i].cmd_handler == NULL) {
printk(" wireless ioctl command '%s' invalid !\n", data);
return -1;
}
// get priv
net_dev = dev_get_by_name(ifname);
if (net_dev == NULL)
{
printk("rtl8192cd_iwpriv_cmd_process: can not get dev %s\n", data);
return -ENETDOWN;
}
priv = (struct rtl8192cd_priv *)net_dev -> priv;
// put command parameter into buf
para = data + strlen(cmds[i].cmd_str);
para += strspn(para, " \t");
strncpy(buf, para, 1024);
buf[1023] = '\0';
// run command
printk("wireless ioctl: cmd=%s, para=%s\n", cmds[i].cmd_str, buf);
if (cmds[i].type == IW_DP) { // dump command
cmd_dump = (cmd_dump_handler *)cmds[i].cmd_handler;
cmd_dump(priv, buf);
dev_put(net_dev);
return 0;
}
else { // read/write command
cmd_rw = (cmd_rw_handler *)cmds[i].cmd_handler;
ret = cmd_rw(priv, buf);
dev_put(net_dev);
if (ret < 0) {
printk("run fail!\n");
return ret;
}
}
printk("run successful !\n");
if (cmds[i].type == IW_RD) {
buf[ret] = '\0'; // add '\0' end for string
printk(" result length: %d\n", ret);
printk(" result text : %s\n", buf);
for (i=0; i<ret; i++)
printk(" %02X", buf[i]);
printk("\n");
}
return 0;
}
int sos_ioctl_priv_get(char *ifname, char *cmd, char* data)
{
struct net_device *net_dev;
struct rtl8192cd_priv *priv;
int retlen;
net_dev = dev_get_by_name(ifname);
if (net_dev == NULL)
{
printk("sos_ioctl_priv_stat: can not get dev %s\n", data);
return -ENETDOWN;
}
priv = (struct rtl8192cd_priv *)net_dev -> priv;
retlen = get_mib(priv, data);
dev_put(net_dev);
if (retlen > 0)
return retlen;
else
return -1;
}
int sos_ioctl_priv_set(
char *netName,
char *name,
void *value)
{
int ret = 0;
#ifndef SMP_SYNC
unsigned long flags;
#endif
struct net_device *net_dev;
struct rtl8192cd_priv *priv;
int sizeof_tmpbuf;
static unsigned char tmpbuf[1024];
char *this_char = name;
char *this_value = (char *)value;
sizeof_tmpbuf = sizeof(tmpbuf);
memset(tmpbuf, '\0', sizeof_tmpbuf);
net_dev = dev_get_by_name(netName);
if (net_dev == NULL)
{
printk("sos_ioctl_priv_set: %scan not get dev\n", netName);
return -ENETDOWN;
}
priv = (struct rtl8192cd_priv *)net_dev->priv;
SAVE_INT_AND_CLI(flags);
memcpy(tmpbuf, this_char, strlen(this_char));
ret = set_mib(priv, tmpbuf);
dev_put(net_dev);
if (ret == 0)
strcpy(this_value, tmpbuf);
printk("sos_ioctl_priv_set: set_mib return %d\n", ret);
RESTORE_INT(flags);
return ret;
}
struct wifi_mib * get_wlandev_mib(struct net_device *dev)
{
struct rtl8192cd_priv * priv;
if (dev == NULL)
return NULL;
priv = (struct rtl8192cd_priv *) (dev -> priv);
return priv -> pmib;
}
struct spinlock_t * get_wlandev_lock (struct net_device *dev)
{
struct rtl8192cd_priv * priv;
if (dev == NULL)
return NULL;
priv = (struct rtl8192cd_priv *) (dev -> priv);
return & (priv -> pshare -> lock);
}
#if 0
/* rtl8192cd_getMacTable return mac num, if fail return -1 */
int rtl8192cd_get_staInfo(char *wlan_ifname, sta_info_2_web **ppsta_info, int *sta_len)
{
struct net_device *net_dev;
struct rtl8192cd_priv *priv;
int sizeof_tmpbuf;
unsigned char *tmp1;
sta_info_2_web *psta_info;
int i,j=0;
net_dev = dev_get_by_name(wlan_ifname);
if (net_dev == NULL)
{
printk("rtl8192cd_get_staInfo(): can not get dev %s\n", wlan_ifname);
return -1;
}
priv = (struct rtl8192cd_priv *)net_dev -> priv;
dev_put(net_dev);
sizeof_tmpbuf = sizeof(sta_info_2_web) * (NUM_STAT + 1); // for the max of all sta info
tmp1 = (unsigned char *)kmalloc(sizeof_tmpbuf, GFP_ATOMIC);
if (!tmp1) {
printk("Unable to allocate temp buffer for rtl8192cd_get_staInfo()!\n");
return -1;
}
memset(tmp1, '\0', sizeof(sta_info_2_web));
get_sta_info(priv, (sta_info_2_web *)(tmp1 + sizeof(sta_info_2_web)), NUM_STAT);
/*
for (i=0,j=0; i< maxLen; i++) {
psta_info = (sta_info_2_web *)(tmp1 + sizeof(sta_info_2_web)*(i+1));
if (memcmp(psta_info->addr, "\x0\x0\x0\x0\x0\x0", 6)!=0) {
memcpy(macTable+j*6, psta_info->addr, 6);
j++;
}
}
*/
*ppsta_info = tmp1;
*sta_len = NUM_STAT+1;
return 0;
}
void rtl8192cd_put_staInfo(sta_info_2_web *psta_info)
{
if (psta_info != NULL)
kfree(psta_info);
return;
}
#endif
int rtl8192cd_getAutoChannel(char *wlan_ifname, int *channel)
{
struct net_device *net_dev;
struct rtl8192cd_priv *priv;
unsigned int ret;
net_dev = dev_get_by_name(wlan_ifname);
if (net_dev == NULL)
{
printk("sos_ioctl_priv_stat: can not get dev %s\n", wlan_ifname);
return -1;
}
priv = (struct rtl8192cd_priv *)net_dev -> priv;
*channel = priv->pmib->dot11RFEntry.dot11channel;
ret=priv->pmib->dot11nConfigEntry.dot11n2ndChOffset;
dev_put(net_dev);
return ret;
}
int rtl8192cd_get_sta_num(char *wlan_ifname)
{
struct net_device *net_dev=NULL;
struct rtl8192cd_priv *priv=NULL;
int number=0;
net_dev = dev_get_by_name(wlan_ifname);
if (net_dev )
{
priv = (struct rtl8192cd_priv *)net_dev -> priv;
number = priv->assoc_num;
dev_put(net_dev);
}
return number;
}
#ifdef _SINUX_
/* Dynamic adjust RF power
*
* para values is char array, length must be 28.
*
*/
int rtl8192cd_adjust_rf_power(struct net_device *wdev, char *values)
{
struct rtl8192cd_priv *priv = wdev->priv;
struct rf_finetune_var * pvar = &(priv->pshare->rf_ft_var);
pvar->txPowerPlus_cck_1 = values[0];
pvar->txPowerPlus_cck_2 = values[1];
pvar->txPowerPlus_cck_5 = values[2];
pvar->txPowerPlus_cck_11 = values[3];
pvar->txPowerPlus_ofdm_6 = values[4];
pvar->txPowerPlus_ofdm_9 = values[5];
pvar->txPowerPlus_ofdm_12 = values[6];
pvar->txPowerPlus_ofdm_18 = values[7];
pvar->txPowerPlus_ofdm_24 = values[8];
pvar->txPowerPlus_ofdm_36 = values[9];
pvar->txPowerPlus_ofdm_48 = values[10];
pvar->txPowerPlus_ofdm_54 = values[11];
pvar->txPowerPlus_mcs_0 = values[12];
pvar->txPowerPlus_mcs_1 = values[13];
pvar->txPowerPlus_mcs_2 = values[14];
pvar->txPowerPlus_mcs_3 = values[15];
pvar->txPowerPlus_mcs_4 = values[16];
pvar->txPowerPlus_mcs_5 = values[17];
pvar->txPowerPlus_mcs_6 = values[18];
pvar->txPowerPlus_mcs_7 = values[19];
pvar->txPowerPlus_mcs_8 = values[20];
pvar->txPowerPlus_mcs_9 = values[21];
pvar->txPowerPlus_mcs_10 = values[22];
pvar->txPowerPlus_mcs_11 = values[23];
pvar->txPowerPlus_mcs_12 = values[24];
pvar->txPowerPlus_mcs_13 = values[25];
pvar->txPowerPlus_mcs_14 = values[26];
pvar->txPowerPlus_mcs_15 = values[27];
return 0;
}
EXPORT_SYMBOL(rtl8192cd_adjust_rf_power);
#endif
EXPORT_SYMBOL(AddDelMCASTGroup2STA);
EXPORT_SYMBOL(rtl8192cd_get_sta_num);
EXPORT_SYMBOL(get_wlandev_lock);
EXPORT_SYMBOL(get_wlandev_mib);
EXPORT_SYMBOL(sos_ioctl_priv_set);
EXPORT_SYMBOL(sos_ioctl_priv_get);
EXPORT_SYMBOL(rtl8192cd_getMacTable);
EXPORT_SYMBOL(rtl8192cd_check_wlan_mac);
EXPORT_SYMBOL(rtl8192cd_getAutoChannel);
EXPORT_SYMBOL(rtl8192cd_iwpriv_cmd_process);
#endif