summaryrefslogtreecommitdiff
path: root/cleopatre/devkit/mt7601udrv/os/linux
diff options
context:
space:
mode:
authorFisher Cheng2013-05-24 16:54:08 +0800
committerJulien Lacour2013-10-01 12:12:48 +0200
commit8c1eb022607c0aba81d93b961abbfb47a2dcc325 (patch)
tree13b1cd55172e93b3d1e5baa7141ba259fd71b0af /cleopatre/devkit/mt7601udrv/os/linux
parent9e4d9d72dcac9686f1b4720e46e3bb88f6375a1e (diff)
cleo/devkit: add MTK MT7601U drv source code, refs #4011
- Enable Wireless LAN and Wireless extension in linux26.config
Diffstat (limited to 'cleopatre/devkit/mt7601udrv/os/linux')
-rw-r--r--cleopatre/devkit/mt7601udrv/os/linux/Kconfig.ap.soc159
-rw-r--r--cleopatre/devkit/mt7601udrv/os/linux/Kconfig.ap.usb111
-rw-r--r--cleopatre/devkit/mt7601udrv/os/linux/Kconfig.sta.soc89
-rw-r--r--cleopatre/devkit/mt7601udrv/os/linux/Makefile.4291
-rw-r--r--cleopatre/devkit/mt7601udrv/os/linux/Makefile.4.netif103
-rw-r--r--cleopatre/devkit/mt7601udrv/os/linux/Makefile.4.util82
-rw-r--r--cleopatre/devkit/mt7601udrv/os/linux/Makefile.6652
-rw-r--r--cleopatre/devkit/mt7601udrv/os/linux/Makefile.6.netif99
-rw-r--r--cleopatre/devkit/mt7601udrv/os/linux/Makefile.6.util72
-rw-r--r--cleopatre/devkit/mt7601udrv/os/linux/Makefile.ap.soc394
-rw-r--r--cleopatre/devkit/mt7601udrv/os/linux/Makefile.ap.usb334
-rw-r--r--cleopatre/devkit/mt7601udrv/os/linux/Makefile.clean58
-rw-r--r--cleopatre/devkit/mt7601udrv/os/linux/Makefile.libautoprovision.69
-rw-r--r--cleopatre/devkit/mt7601udrv/os/linux/Makefile.libwapi.423
-rw-r--r--cleopatre/devkit/mt7601udrv/os/linux/Makefile.libwapi.611
-rw-r--r--cleopatre/devkit/mt7601udrv/os/linux/Makefile.sta.soc275
-rw-r--r--cleopatre/devkit/mt7601udrv/os/linux/ap_ioctl.c441
-rw-r--r--cleopatre/devkit/mt7601udrv/os/linux/br_ftph.c195
-rw-r--r--cleopatre/devkit/mt7601udrv/os/linux/cfg80211.c1576
-rw-r--r--cleopatre/devkit/mt7601udrv/os/linux/cfg80211drv.c1675
-rw-r--r--cleopatre/devkit/mt7601udrv/os/linux/config.mk1125
-rw-r--r--cleopatre/devkit/mt7601udrv/os/linux/config.mk.bak1637
-rw-r--r--cleopatre/devkit/mt7601udrv/os/linux/inf_ppa.c62
-rw-r--r--cleopatre/devkit/mt7601udrv/os/linux/load6
-rw-r--r--cleopatre/devkit/mt7601udrv/os/linux/rt_linux.c5258
-rw-r--r--cleopatre/devkit/mt7601udrv/os/linux/rt_linux_symb.c287
-rw-r--r--cleopatre/devkit/mt7601udrv/os/linux/rt_main_dev.c840
-rw-r--r--cleopatre/devkit/mt7601udrv/os/linux/rt_proc.c539
-rw-r--r--cleopatre/devkit/mt7601udrv/os/linux/rt_profile.c857
-rw-r--r--cleopatre/devkit/mt7601udrv/os/linux/rt_rbus_pci_drv.c16
-rw-r--r--cleopatre/devkit/mt7601udrv/os/linux/rt_symb.c9
-rw-r--r--cleopatre/devkit/mt7601udrv/os/linux/rt_usb.c1314
-rw-r--r--cleopatre/devkit/mt7601udrv/os/linux/rt_usb_util.c603
-rw-r--r--cleopatre/devkit/mt7601udrv/os/linux/unload2
-rw-r--r--cleopatre/devkit/mt7601udrv/os/linux/usb_main_dev.c846
-rw-r--r--cleopatre/devkit/mt7601udrv/os/linux/vr_bdlt.c63
-rw-r--r--cleopatre/devkit/mt7601udrv/os/linux/vr_ikans.c363
37 files changed, 20476 insertions, 0 deletions
diff --git a/cleopatre/devkit/mt7601udrv/os/linux/Kconfig.ap.soc b/cleopatre/devkit/mt7601udrv/os/linux/Kconfig.ap.soc
new file mode 100644
index 0000000000..7e4a982b2c
--- /dev/null
+++ b/cleopatre/devkit/mt7601udrv/os/linux/Kconfig.ap.soc
@@ -0,0 +1,159 @@
+config RT2860V2_AP
+ tristate "Ralink RT2860 802.11n AP support"
+ depends on NET_RADIO
+
+config RT2860V2_AP_V24_DATA_STRUCTURE
+ bool
+ depends on RT2860V2_AP
+ default y
+
+config RT2860V2_AP_LED
+ bool "LED Support"
+ depends on RT2860V2_AP
+
+config RT2860V2_AP_WSC
+ bool "WSC (WiFi Simple Config)"
+ depends on RT2860V2_AP
+
+config RT2860V2_AP_LLTD
+ bool "LLTD (Link Layer Topology Discovery Protocol)"
+ depends on RT2860V2_AP
+
+config RT2860V2_AP_WDS
+ bool "WDS"
+ depends on RT2860V2_AP
+
+config RT2860V2_AP_NINTENDO
+ bool "Nintendo"
+ depends on RT2860V2_AP
+
+config RT2860V2_AP_WMM_ACM
+ bool "WMM ACM"
+ depends on RT2860V2_AP
+
+config RT2860V2_AP_MBSS
+ bool "MBSSID"
+ depends on RT2860V2_AP
+
+config NEW_MBSSID_MODE
+ bool "New MBSSID MODE"
+ depends on RT2860V2_AP
+ depends on RT2860V2_AP_MBSS
+ depends on RALINK_RT3883 || RALINK_RT3352 || RALINK_RT5350
+ default n
+
+config RT2860V2_AP_APCLI
+ bool "AP-CLient Support"
+ depends on RT2860V2_AP
+
+config RT2860V2_AP_IGMP_SNOOP
+ bool "IGMP snooping"
+ depends on RT2860V2_AP
+
+config RT2860V2_AP_NETIF_BLOCK
+ bool "NETIF Block"
+ depends on RT2860V2_AP
+ help
+ Support Net interface block while Tx-Sw queue full
+
+config RT2860V2_AP_DFS
+ bool "DFS"
+ depends on RT2860V2_AP
+ select RALINK_TIMER_DFS
+
+config RT2860V2_AP_CARRIER
+ bool "Carrier Detect"
+ depends on RT2860V2_AP
+ select RALINK_TIMER_DFS
+
+config RT2860V2_AP_DLS
+ bool "DLS ((Direct-Link Setup) Support"
+ depends on RT2860V2_AP
+
+config RT2860V2_AP_IDS
+ bool "IDS (Intrusion Detection System) Support"
+ depends on RT2860V2_AP
+
+config RT2860V2_AP_MESH
+ bool "MESH Support"
+ depends on RT2860V2_AP
+
+config RT2860V2_HW_ANTENNA_DIVERSITY
+ bool "Antenna Diversity Support"
+ depends on RT2860V2_AP
+ depends on RALINK_RT5350
+
+config RT2860V2_RT3XXX_AP_ANTENNA_DIVERSITY
+ bool "Antenna Diversity Support"
+ depends on RT2860V2_AP
+
+config RT2860V2_AP_WAPI
+ bool "WAPI Support"
+ depends on RT2860V2_AP
+
+config RT2860V2_AP_COC
+ bool "CoC Support"
+ depends on RT2860V2_AP
+
+config RT2860V2_AP_MEMORY_OPTIMIZATION
+ bool "Memory Optimization"
+ depends on RT2860V2_AP
+
+config RT2860V2_AP_VIDEO_TURBINE
+ bool "Video Turbine support"
+ depends on RT2860V2_AP
+
+config RA_CLASSIFIER
+ tristate "Ralink Flow Classifier"
+ depends on RT2860V2_AP_VIDEO_TURBINE
+ default n
+
+config RT2860V2_80211N_DRAFT3
+ bool "802.11n Draft3"
+ depends on RT2860V2_AP
+
+config RT2860V2_AP_INTELLIGENT_RATE_ADAPTION
+ bool "Intelligent Rate Adaption"
+ depends on RT2860V2_AP
+
+config RT2860V2_AP_TXBF
+ bool "Tx Beam Forming"
+ depends on RT2860V2_AP
+ depends on RALINK_RT3883
+
+config RT2860V2_AP_RTMP_INTERNAL_TX_ALC
+ bool "TSSI Compensation"
+ depends on RT2860V2_AP
+ depends on RALINK_RT3350 || RALINK_RT3352 || RALINK_RT5350
+
+#config RT2860V2_EXT_CHANNEL_LIST
+# bool "Extension Channel List"
+# depends on RT2860V2_AP
+
+#config RT2860V2_KTHREAD
+# bool "Kernel Thread"
+# depends on RT2860V2_AP
+
+#config RT2860V2_AUTO_CH_SELECT_ENHANCE
+# bool "Auto Channel Selection Enhancement"
+# depends on RT2860V2_AP
+
+#config RT2860V2_80211R_FT
+# bool "802.11r Fast BSS Transition"
+# depends on RT2860V2_AP
+
+#config RT2860V2_80211R_RR
+# bool "802.11k Radio Resource Management"
+# depends on RT2860V2_AP
+
+#config RT2860V2_SINGLE_SKU
+# bool "Single SKU"
+# depends on RT2860V2_AP
+
+#config RT2860V2_MCAST_RATE_SPECIFIC
+# bool "User specific tx rate of mcast pkt"
+# depends on RT2860V2_AP
+
+#config RT2860V2_SNMP
+# bool "Net-SNMP Support"
+# depends on RT2860V2_AP
diff --git a/cleopatre/devkit/mt7601udrv/os/linux/Kconfig.ap.usb b/cleopatre/devkit/mt7601udrv/os/linux/Kconfig.ap.usb
new file mode 100644
index 0000000000..902fab93d3
--- /dev/null
+++ b/cleopatre/devkit/mt7601udrv/os/linux/Kconfig.ap.usb
@@ -0,0 +1,111 @@
+config RTUSB_AP
+ tristate "Ralink WiFi USB combo driver AP module"
+ depends on m
+ default m
+
+config RTUSB_AP_WSC
+ bool "WPS support including WPS2.0"
+ depends on RTUSB_AP
+ default y
+
+config RTUSB_AP_MBSS
+ bool "MBSS support"
+ depends on RTUSB_AP
+ default y
+
+config RTUSB_AP_NEW_MBSS_MODE
+ bool "New MBSS support"
+ depends on RTUSB_AP_MBSS
+
+config RTUSB_WDS
+ bool "WDS support"
+ depends on RTUSB_AP
+
+config RTUSB_APCLI
+ bool "APClient support"
+ depends on RTUSB_AP
+
+config RTUSB_DFS
+ bool "DFS support"
+ depends on RTUSB_AP
+
+config RTUSB_CS
+ bool "CS support"
+ depends on RTUSB_AP
+
+config RTUSB_IGMP_SNOOP
+ bool "IGMP snoop support"
+ depends on RTUSB_AP
+
+config RTUSB_NETIF_BLOCK
+ bool "NETIF block support"
+ depends on RTUSB_AP
+
+config RTUSB_DLS
+ bool "DLS support"
+ depends on RTUSB_AP
+
+config RTUSB_IDS
+ bool "IDS support"
+ depends on RTUSB_AP
+
+config RTUSB_AP_FLASH_SUPPORT
+ bool "FLASH support"
+ depends on RTUSB_AP
+
+config RTUSB_AP_80211N_DRAFT3
+ bool "802.11n Draft3 support"
+ depends on RTUSB_AP
+ default y
+
+# Chip related
+config RT2870_AP
+ bool "RT2870 support"
+ depends on RTUSB_AP
+
+config RT3572_AP
+ bool "RT3572 support"
+ depends on RTUSB_AP
+
+config RT3573_AP
+ bool "RT3573 support"
+ depends on RTUSB_AP
+
+config RT5572_AP
+ bool "RT5572 support"
+ depends on RTUSB_AP
+ default y
+
+# ATE
+config RTUSB_AP_ATE
+ bool "ATE support"
+ depends on RTUSB_AP
+
+config RT2870_AP_ATE
+ bool "RT2870 ATE support"
+ depends on RTUSB_AP_ATE && RT2870_AP
+
+config RT3572_AP_ATE
+ bool "RT3572 ATE support"
+ depends on RTUSB_AP_ATE && RT3572_AP
+
+config RT5572_AP_ATE
+ bool "RT5572 ATE support"
+ depends on RTUSB_AP_ATE && RT5572_AP
+ default y
+
+# QA
+config RTUSB_AP_QA
+ bool "QA tool support"
+ depends on RTUSB_AP_ATE
+ default y
+
+config RTUSB_AP_WAPI
+ bool "WAPI support"
+ depends on RTUSB_AP
+
+# Platform specific
+config RT5572_AP_WDS
+ bool
+ depends on RTUSB_WDS
+ default y
diff --git a/cleopatre/devkit/mt7601udrv/os/linux/Kconfig.sta.soc b/cleopatre/devkit/mt7601udrv/os/linux/Kconfig.sta.soc
new file mode 100644
index 0000000000..18027ef829
--- /dev/null
+++ b/cleopatre/devkit/mt7601udrv/os/linux/Kconfig.sta.soc
@@ -0,0 +1,89 @@
+config RT2860V2_STA
+ tristate "Ralink RT2860 802.11n STA support"
+ depends on NET_RADIO
+
+config RT2860V2_STA_WPA_SUPPLICANT
+ bool "WPA Supplicant"
+ depends on RT2860V2_STA
+
+config RT2860V2_STA_ETH_CONVERT
+ bool "Ethernet Convert Support"
+ depends on RT2860V2_STA
+
+config RT2860V2_STA_DPB
+ bool
+ depends on RT2860V2_STA_ETH_CONVERT
+ default y
+
+config RT2860V2_STA_WMM_ACM
+ bool "WMM ACM Support"
+ depends on RT2860V2_STA
+
+config RT2860V2_STA_LED
+ bool "LED Support"
+ depends on RT2860V2_STA
+
+config RT2860V2_STA_IDS
+ bool "IDS (Intrusion Detection System) Support"
+ depends on RT2860V2_STA
+
+config RT2860V2_STA_WSC
+ bool "WSC (WiFi Simple Config)"
+ depends on RT2860V2_STA
+
+config RT2860V2_STA_CARRIER
+ bool "Carrier Sense Support"
+ depends on RT2860V2_STA
+ select RALINK_TIMER
+ select RALINK_TIMER_DFS
+
+config RT2860V2_STA_DLS
+ bool "DLS ((Direct-Link Setup) Support"
+ depends on RT2860V2_STA
+
+config RT2860V2_STA_MESH
+ bool "MESH Support"
+ depends on RT2860V2_STA
+
+config RT2860V2_RT3XXX_STA_ANTENNA_DIVERSITY
+ bool "Antenna Diversity Support"
+ depends on RT2860V2_STA
+
+config RT2860V2_HW_STA_ANTENNA_DIVERSITY
+ bool "Antenna Diversity Support"
+ depends on RT2860V2_STA
+ depends on RALINK_RT5350
+
+#config RT2860V2_STA_WAPI
+# bool "WAPI Support"
+# depends on RT2860V2_STA
+
+config RT2860V2_STA_VIDEO_TURBINE
+ bool "Video Turbine support"
+ depends on RT2860V2_STA
+
+config RT2860V2_STA_INTELLIGENT_RATE_ADAPTION
+ bool "Intelligent Rate Adaption"
+ depends on RT2860V2_STA
+
+config RT2860V2_STA_TXBF
+ bool "Tx Bean Forming Support (Only 3883)"
+ depends on RT2860V2_STA
+ depends on RALINK_RT3883
+
+config RT2860V2_STA_RTMP_INTERNAL_TX_ALC
+ bool "TSSI Compensation"
+ depends on RT2860V2_STA
+ depends on RALINK_RT3350 || RALINK_RT3352 || RALINK_RT5350
+
+config RT2860V2_STA_80211N_DRAFT3
+ bool "802.11n Draft3"
+ depends on RT2860V2_STA
+
+#config RT2860V2_EXT_CHANNEL_LIST
+# bool "Extension Channel List"
+# depends on RT2860V2_STA
+
+#config RT2860V2_SNMP
+# bool "Net-SNMP Support"
+# depends on RT2860V2_STA
diff --git a/cleopatre/devkit/mt7601udrv/os/linux/Makefile.4 b/cleopatre/devkit/mt7601udrv/os/linux/Makefile.4
new file mode 100644
index 0000000000..93be7f888d
--- /dev/null
+++ b/cleopatre/devkit/mt7601udrv/os/linux/Makefile.4
@@ -0,0 +1,291 @@
+include $(RT28xx_DIR)/os/linux/config.mk
+
+#ifdef CONFIG_AP_SUPPORT
+ifeq ($(RT28xx_MODE),AP)
+MOD_NAME = rt$(MODULE)ap
+DAT_PATH = /etc/Wireless/RT$(MODULE_DAT)AP
+DAT_FILE_NAME = RT$(MODULE_DAT)AP.dat
+endif
+#endif // CONFIG_AP_SUPPORT //
+
+
+
+#ifdef WAPI_SUPPORT
+ifeq ($(HAS_WAPI_SUPPORT),y)
+OBJ := -DEXPORT_SYMTAB
+endif
+#endif // WAPI_SUPPORT //
+
+OBJ := $(MOD_NAME).o
+
+#ifdef CONFIG_AP_SUPPORT
+RT28XX_AP_OBJ := \
+ $(RT28xx_DIR)/common/crypt_md5.o\
+ $(RT28xx_DIR)/common/crypt_sha2.o\
+ $(RT28xx_DIR)/common/crypt_hmac.o\
+ $(RT28xx_DIR)/common/crypt_aes.o\
+ $(RT28xx_DIR)/common/crypt_arc4.o\
+ $(RT28xx_DIR)/common/mlme.o\
+ $(RT28xx_DIR)/common/cmm_wep.o\
+ $(RT28xx_DIR)/common/action.o\
+ $(RT28xx_DIR)/common/cmm_data.o\
+ $(RT28xx_DIR)/common/rtmp_init.o\
+ $(RT28xx_DIR)/common/rtmp_init_inf.o\
+ $(RT28xx_DIR)/common/cmm_tkip.o\
+ $(RT28xx_DIR)/common/cmm_aes.o\
+ $(RT28xx_DIR)/common/cmm_sync.o\
+ $(RT28xx_DIR)/common/eeprom.o\
+ $(RT28xx_DIR)/common/cmm_sanity.o\
+ $(RT28xx_DIR)/common/cmm_info.o\
+ $(RT28xx_DIR)/common/cmm_cfg.o\
+ $(RT28xx_DIR)/common/cmm_wpa.o\
+ $(RT28xx_DIR)/common/dfs.o\
+ $(RT28xx_DIR)/common/spectrum.o\
+ $(RT28xx_DIR)/common/rtmp_timer.o\
+ $(RT28xx_DIR)/common/rt_channel.o\
+ $(RT28xx_DIR)/common/cmm_profile.o\
+ $(RT28xx_DIR)/common/cmm_asic.o\
+ $(RT28xx_DIR)/common/cmm_cmd.o\
+ $(RT28xx_DIR)/rate_ctrl/ra_ctrl.o\
+ $(RT28xx_DIR)/rate_ctrl/alg_legacy.o\
+ $(RT28xx_DIR)/os/linux/rt_profile.o\
+ $(RT28xx_DIR)/ap/ap_mbss.o\
+ $(RT28xx_DIR)/chips/rtmp_chip.o\
+ $(RT28xx_DIR)/ap/ap.o\
+ $(RT28xx_DIR)/ap/ap_assoc.o\
+ $(RT28xx_DIR)/ap/ap_auth.o\
+ $(RT28xx_DIR)/ap/ap_connect.o\
+ $(RT28xx_DIR)/ap/ap_mlme.o\
+ $(RT28xx_DIR)/ap/ap_sanity.o\
+ $(RT28xx_DIR)/ap/ap_sync.o\
+ $(RT28xx_DIR)/ap/ap_wpa.o\
+ $(RT28xx_DIR)/ap/ap_data.o\
+ $(RT28xx_DIR)/common/uapsd.o\
+ $(RT28xx_DIR)/ap/ap_autoChSel.o\
+ $(RT28xx_DIR)/ap/ap_qload.o\
+ $(RT28xx_DIR)/ap/ap_cfg.o
+
+ifeq ($(OSABL),NO)
+RT28XX_AP_OBJ := \
+ $(RT28xx_DIR)/ap/ap_mbss_inf.o\
+ $(RT28xx_DIR)/common/rt_os_util.o\
+ $(RT28xx_DIR)/os/linux/ap_ioctl.o\
+ $(RT28xx_DIR)/os/linux/rt_linux.o\
+ $(RT28xx_DIR)/os/linux/rt_main_dev.o
+else
+RT28XX_AP_OBJ := \
+ $(RT28xx_DIR)/os/linux/rt_symb.o
+endif
+
+ifeq ($(HAS_NEW_RATE_ADAPT_SUPPORT),y)
+RT28XX_AP_OBJS += $(RT28xx_DIR)/rate_ctrl/alg_grp.o
+endif
+
+#ifdef DOT11_N_SUPPORT
+ifeq ($(HAS_DOT11_N_SUPPORT),y)
+RT28XX_AP_OBJ += \
+ $(RT28xx_DIR)/common/ba_action.o
+
+#ifdef TXBF_SUPPORT
+ifeq ($(HAS_TXBF_SUPPORT),y)
+rt$(MODULE)ap-objs += \
+ $(RT28xx_DIR)/common/cmm_txbf.o\
+ $(RT28xx_DIR)/common/cmm_txbf_cal.o
+endif
+#endif // TXBF_SUPPORT //
+endif
+#endif // DOT11_N_SUPPORT //
+
+#ifdef BG_FT_SUPPORT
+ifeq ($(OSABL),NO)
+ifeq ($(HAS_BGFP_SUPPORT),y)
+RT28XX_AP_OBJ += \
+ $(RT28xx_DIR)/os/linux/br_ftph.o
+endif
+endif
+#endif // BG_FT_SUPPORT //
+
+#ifdef LED_CONTROL_SUPPORT
+ifeq ($(HAS_LED_CONTROL_SUPPORT),y)
+RT28XX_AP_OBJ += \
+ $(RT28xx_DIR)/common/rt_led.o
+endif
+#endif // LED_CONTROL_SUPPORT //
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ifeq ($(HAS_RT2880_RT2860_COEXIST),y)
+RT28XX_AP_OBJ += \
+ $(RT28xx_DIR)/os/linux/rt_pci_rbus.o\
+ $(RT28xx_DIR)/os/linux/rt_rbus_pci_util.o\
+ $(RT28xx_DIR)/os/linux/pci_main_dev.o\
+ $(RT28xx_DIR)/common/dfs.o
+endif
+
+ifeq ($(HAS_ATE),y)
+RT28XX_AP_OBJ += $(RT28xx_DIR)/ate/common/rt_ate.o
+endif
+
+ifeq ($(HAS_QA_SUPPORT),y)
+RT28XX_AP_OBJ += $(RT28xx_DIR)/ate/common/rt_qa.o
+endif
+
+#ifdef WSC_INCLUDED
+ifeq ($(HAS_WSC),y)
+RT28XX_AP_OBJ += \
+ $(RT28xx_DIR)/common/wsc.o\
+ $(RT28xx_DIR)/common/wsc_tlv.o\
+ $(RT28xx_DIR)/common/wsc_ufd.o\
+ $(RT28xx_DIR)/common/crypt_biginteger.o\
+ $(RT28xx_DIR)/common/crypt_dh.o
+endif
+ifeq ($(HAS_WSC_V2),y)
+RT28XX_AP_OBJ += $(RT28xx_DIR)/common/wsc_v2.o
+endif
+#endif // WSC_INCLUDED //
+
+
+
+ifeq ($(HAS_WDS),y)
+RT28XX_AP_OBJ += $(RT28xx_DIR)/ap/ap_wds.o
+
+ifeq ($(OSABL),NO)
+RT28XX_AP_OBJ += \
+ ../../ap/ap_wds_inf.o
+endif
+endif
+
+#ifdef APCLI_SUPPORT
+ifeq ($(HAS_APCLI),y)
+RT28XX_AP_OBJ += \
+ $(RT28xx_DIR)/ap/ap_apcli.o \
+ $(RT28xx_DIR)/ap/apcli_ctrl.o \
+ $(RT28xx_DIR)/ap/apcli_sync.o \
+ $(RT28xx_DIR)/ap/apcli_auth.o \
+ $(RT28xx_DIR)/ap/apcli_assoc.o \
+ $(RT28xx_DIR)/common/cmm_mat.o \
+ $(RT28xx_DIR)/common/cmm_mat_iparp.o \
+ $(RT28xx_DIR)/common/cmm_mat_pppoe.o \
+ $(RT28xx_DIR)/common/cmm_mat_ipv6.o
+
+ifeq ($(OSABL),NO)
+RT28XX_AP_OBJ += \
+ ../../ap/ap_apcli_inf.o
+endif
+endif
+#endif // APCLI_SUPPORT //
+
+ifeq ($(HAS_BLOCK_NET_IF),y)
+RT28XX_AP_OBJ += $(RT28xx_DIR)/common/netif_block.o
+endif
+
+ifeq ($(HAS_IGMP_SNOOP_SUPPORT),y)
+RT28XX_AP_OBJ += $(RT28xx_DIR)/common/igmp_snoop.o
+endif
+
+
+ifeq ($(HAS_QOS_DLS_SUPPORT),y)
+RT28XX_AP_OBJ += $(RT28xx_DIR)/ap/ap_dls.o
+endif
+
+ifeq ($(HAS_IDS_SUPPORT),y)
+RT28XX_AP_OBJ += $(RT28xx_DIR)/ap/ap_ids.o
+endif
+
+ifeq ($(PLATFORM),IKANOS_V160)
+RT28XX_AP_OBJ += $(RT28xx_DIR)/os/linux/vr_ikans.o
+endif
+
+ifeq ($(PLATFORM),IKANOS_V180)
+RT28XX_AP_OBJ += $(RT28xx_DIR)/os/linux/vr_ikans.o
+endif
+
+
+#ifdef WAPI_SUPPORT
+ifeq ($(HAS_WAPI_SUPPORT),y)
+RT28XX_AP_OBJ += \
+ $(RT28xx_DIR)/common/wapi.o
+endif
+#endif // WAPI_SUPPORT //
+
+
+
+
+ifeq ($(HAS_CLIENT_WDS_SUPPORT),y)
+RT28XX_AP_OBJ += \
+ $(RT28xx_DIR)/common/client_wds.o
+endif
+#endif // CONFIG_AP_SUPPORT //
+
+
+
+PHONY := all release clean install uninstall
+
+all:$(OBJ)
+
+rt$(MODULE)sta.o: $(RT28XX_STA_OBJ)
+ $(LD) -r $^ -o $@
+
+rt$(MODULE)ap.o: $(RT28XX_AP_OBJ)
+ $(LD) -r $^ -o $@
+
+rt$(MODULE)apsta.o: $(RT28XX_APSTA_OBJ)
+ $(LD) -r $^ -o $@
+
+release:
+ echo "MAKE Linux Station Code Release"
+
+clean:
+ rm -f $(RT28xx_DIR)/common/*.o
+ rm -f $(RT28xx_DIR)/common/.*.{cmd,flags,d}
+ rm -f $(RT28xx_DIR)/os/linux/*.{o,ko,mod.{o,c}}
+ rm -f $(RT28xx_DIR)/os/linux/.*.{cmd,flags,d}
+ rm -fr $(RT28xx_DIR)/os/linux/.tmp_versions
+ rm -f $(RT28xx_DIR)/chips/*.o
+ rm -f $(RT28xx_DIR)/chips/.*.{cmd,flags,d}
+ifeq ($(RT28xx_MODE),AP)
+ rm -f $(RT28xx_DIR)/ap/*.o
+ rm -f $(RT28xx_DIR)/ap/.*.{cmd,flags,d}
+else
+ifeq ($(RT28xx_MODE),STA)
+ rm -f $(RT28xx_DIR)/sta/*.o
+ rm -f $(RT28xx_DIR)/sta/.*.{cmd,flags,d}
+else
+ifeq ($(RT28xx_MODE),APSTA)
+ rm -f $(RT28xx_DIR)/ap/*.o
+ rm -f $(RT28xx_DIR)/ap/.*.{cmd,flags,d}
+ rm -f $(RT28xx_DIR)/sta/*.o
+ rm -f $(RT28xx_DIR)/sta/.*.{cmd,flags,d}
+endif
+endif
+endif
+
+install:
+ rm -rf $(DAT_PATH)
+ $(shell [ ! -f /etc/Wireless ] && mkdir /etc/Wireless)
+ mkdir $(DAT_PATH)
+ cp $(RT28xx_DIR)/$(DAT_FILE_NAME) $(DAT_PATH)/.
+ install -d $(LINUX_SRC_MODULE)
+ install -m 644 -c $(addsuffix .o,$(MOD_NAME)) $(LINUX_SRC_MODULE)
+ /sbin/depmod -a ${shell uname -r}
+
+uninstall:
+# rm -rf $(DAT_PATH)
+ rm -rf $(addprefix $(LINUX_SRC_MODULE),$(addsuffix .o,$(MOD_NAME)))
+ /sbin/depmod -a ${shell uname -r}
+
+# Declare the contents of the .PHONY variable as phony. We keep that
+# information in a variable so we can use it in if_changed and friends.
+.PHONY: $(PHONY)
+
diff --git a/cleopatre/devkit/mt7601udrv/os/linux/Makefile.4.netif b/cleopatre/devkit/mt7601udrv/os/linux/Makefile.4.netif
new file mode 100644
index 0000000000..dcc5b7f9e0
--- /dev/null
+++ b/cleopatre/devkit/mt7601udrv/os/linux/Makefile.4.netif
@@ -0,0 +1,103 @@
+include $(RT28xx_DIR)/os/linux/config.mk
+
+#ifdef CONFIG_AP_SUPPORT
+ifeq ($(RT28xx_MODE),AP)
+MOD_NAME = rtnet$(MODULE)ap
+endif
+#endif // CONFIG_AP_SUPPORT //
+
+
+
+OBJ := $(MOD_NAME).o
+
+#ifdef CONFIG_AP_SUPPORT
+
+RT28XX_AP_OBJ := \
+ ../../ap/ap_mbss_inf.o\
+ ../../os/linux/ap_ioctl.o\
+ ../../os/linux/rt_main_dev.o
+
+ifeq ($(HAS_WDS),y)
+RT28XX_AP_OBJ += \
+ ../../ap/ap_wds_inf.o
+endif
+
+ifeq ($(HAS_APCLI),y)
+RT28XX_AP_OBJ += \
+ ../../ap/ap_apcli_inf.o
+endif
+
+ifeq ($(HAS_MESH_SUPPORT),y)
+RT28XX_AP_OBJ += \
+ ../../common/mesh_inf.o
+endif
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#endif // CONFIG_AP_SUPPORT //
+
+
+
+PHONY := all clean
+
+all:$(OBJ)
+
+rtnet$(MODULE)sta.o: $(RT28XX_STA_OBJ)
+ $(LD) -r $^ -o $@
+
+rtnet$(MODULE)ap.o: $(RT28XX_AP_OBJ)
+ $(LD) -r $^ -o $@
+
+rtnet$(MODULE)apsta.o: $(RT28XX_APSTA_OBJ)
+ $(LD) -r $^ -o $@
+
+clean:
+ rm -f $(RT28xx_DIR)/common/*.o
+ rm -f $(RT28xx_DIR)/common/.*.{cmd,flags,d}
+ rm -f $(RT28xx_DIR)/os/linux/*.{o,ko,mod.{o,c}}
+ rm -f $(RT28xx_DIR)/os/linux/.*.{cmd,flags,d}
+ rm -fr $(RT28xx_DIR)/os/linux/.tmp_versions
+ rm -f $(RT28xx_DIR)/chips/*.o
+ rm -f $(RT28xx_DIR)/chips/.*.{cmd,flags,d}
+ifeq ($(RT28xx_MODE),AP)
+ rm -f $(RT28xx_DIR)/ap/*.o
+ rm -f $(RT28xx_DIR)/ap/.*.{cmd,flags,d}
+else
+ifeq ($(RT28xx_MODE),STA)
+ rm -f $(RT28xx_DIR)/sta/*.o
+ rm -f $(RT28xx_DIR)/sta/.*.{cmd,flags,d}
+else
+ifeq ($(RT28xx_MODE),APSTA)
+ rm -f $(RT28xx_DIR)/ap/*.o
+ rm -f $(RT28xx_DIR)/ap/.*.{cmd,flags,d}
+ rm -f $(RT28xx_DIR)/sta/*.o
+ rm -f $(RT28xx_DIR)/sta/.*.{cmd,flags,d}
+endif
+endif
+endif
+
+install:
+ install -d $(LINUX_SRC_MODULE)
+ install -m 644 -c $(addsuffix .o,$(MOD_NAME)) $(LINUX_SRC_MODULE)
+ /sbin/depmod -a ${shell uname -r}
+
+uninstall:
+ rm -rf $(addprefix $(LINUX_SRC_MODULE),$(addsuffix .o,$(MOD_NAME)))
+ /sbin/depmod -a ${shell uname -r}
+
+# Declare the contents of the .PHONY variable as phony. We keep that
+# # information in a variable so we can use it in if_changed and friends.
+.PHONY: $(PHONY)
diff --git a/cleopatre/devkit/mt7601udrv/os/linux/Makefile.4.util b/cleopatre/devkit/mt7601udrv/os/linux/Makefile.4.util
new file mode 100644
index 0000000000..dc26a243a9
--- /dev/null
+++ b/cleopatre/devkit/mt7601udrv/os/linux/Makefile.4.util
@@ -0,0 +1,82 @@
+include $(RT28xx_DIR)/os/linux/config.mk
+
+#ifdef CONFIG_AP_SUPPORT
+ifeq ($(RT28xx_MODE),AP)
+MOD_NAME = rtutil$(MODULE)ap
+endif
+#endif // CONFIG_AP_SUPPORT //
+
+
+
+OBJ := $(MOD_NAME).o
+
+#ifdef CONFIG_AP_SUPPORT
+
+RT28XX_AP_OBJ := \
+ ../../common/rt_os_util.o\
+ ../../os/linux/rt_linux_symb.o\
+ ../../os/linux/rt_rbus_pci_util.o\
+ ../../os/linux/rt_usb_util.o\
+ ../../os/linux/rt_linux.o
+
+ifeq ($(HAS_BGFP_SUPPORT),y)
+RT28XX_AP_OBJ += \
+ $(RT28xx_DIR)/os/linux/br_ftph.o
+endif
+
+#endif // CONFIG_AP_SUPPORT //
+
+
+
+
+
+PHONY := all clean
+
+all:$(OBJ)
+
+rtutil$(MODULE)sta.o: $(RT28XX_STA_OBJ)
+ $(LD) -r $^ -o $@
+
+rtutil$(MODULE)ap.o: $(RT28XX_AP_OBJ)
+ $(LD) -r $^ -o $@
+
+rtutil$(MODULE)apsta.o: $(RT28XX_APSTA_OBJ)
+ $(LD) -r $^ -o $@
+
+clean:
+ rm -f $(RT28xx_DIR)/common/*.o
+ rm -f $(RT28xx_DIR)/common/.*.{cmd,flags,d}
+ rm -f $(RT28xx_DIR)/os/linux/*.{o,ko,mod.{o,c}}
+ rm -f $(RT28xx_DIR)/os/linux/.*.{cmd,flags,d}
+ rm -fr $(RT28xx_DIR)/os/linux/.tmp_versions
+ rm -f $(RT28xx_DIR)/chips/*.o
+ rm -f $(RT28xx_DIR)/chips/.*.{cmd,flags,d}
+ifeq ($(RT28xx_MODE),AP)
+ rm -f $(RT28xx_DIR)/ap/*.o
+ rm -f $(RT28xx_DIR)/ap/.*.{cmd,flags,d}
+else
+ifeq ($(RT28xx_MODE),STA)
+ rm -f $(RT28xx_DIR)/sta/*.o
+ rm -f $(RT28xx_DIR)/sta/.*.{cmd,flags,d}
+else
+ifeq ($(RT28xx_MODE),APSTA)
+ rm -f $(RT28xx_DIR)/ap/*.o
+ rm -f $(RT28xx_DIR)/ap/.*.{cmd,flags,d}
+ rm -f $(RT28xx_DIR)/sta/*.o
+ rm -f $(RT28xx_DIR)/sta/.*.{cmd,flags,d}
+endif
+endif
+endif
+
+install:
+ install -d $(LINUX_SRC_MODULE)
+ install -m 644 -c $(addsuffix .o,$(MOD_NAME)) $(LINUX_SRC_MODULE)
+ /sbin/depmod -a ${shell uname -r}
+
+uninstall:
+ rm -rf $(addprefix $(LINUX_SRC_MODULE),$(addsuffix .o,$(MOD_NAME)))
+ /sbin/depmod -a ${shell uname -r}
+
+# Declare the contents of the .PHONY variable as phony. We keep that
+# # information in a variable so we can use it in if_changed and friends.
+.PHONY: $(PHONY)
diff --git a/cleopatre/devkit/mt7601udrv/os/linux/Makefile.6 b/cleopatre/devkit/mt7601udrv/os/linux/Makefile.6
new file mode 100644
index 0000000000..921c3eaa0f
--- /dev/null
+++ b/cleopatre/devkit/mt7601udrv/os/linux/Makefile.6
@@ -0,0 +1,652 @@
+include $(RT28xx_DIR)/os/linux/config.mk
+
+obj_wsc :=
+obj_vht :=
+obj_cmm := \
+ ../../common/crypt_md5.o\
+ ../../common/crypt_sha2.o\
+ ../../common/crypt_hmac.o\
+ ../../common/crypt_aes.o\
+ ../../common/crypt_arc4.o\
+ ../../common/mlme.o\
+ ../../common/cmm_wep.o\
+ ../../common/action.o\
+ ../../common/cmm_data.o\
+ ../../common/rtmp_init.o\
+ ../../common/rtmp_init_inf.o\
+ ../../common/cmm_tkip.o\
+ ../../common/cmm_aes.o\
+ ../../common/cmm_sync.o\
+ ../../common/eeprom.o\
+ ../../common/cmm_sanity.o\
+ ../../common/cmm_info.o\
+ ../../common/cmm_cfg.o\
+ ../../common/cmm_wpa.o\
+ ../../common/cmm_radar.o\
+ ../../common/spectrum.o\
+ ../../common/rtmp_timer.o\
+ ../../common/rt_channel.o\
+ ../../common/cmm_profile.o\
+ ../../common/cmm_asic.o\
+ ../../common/scan.o\
+ ../../common/cmm_cmd.o\
+ ../../common/uapsd.o\
+ ../../common/ps.o\
+ ../../rate_ctrl/ra_ctrl.o\
+ ../../rate_ctrl/alg_legacy.o\
+ ../../rate_ctrl/alg_ags.o\
+ ../../chips/rtmp_chip.o\
+ ../../common/txpower.o\
+ ../../mac/rtmp_mac.o\
+ ../../mgmt/mgmt_hw.o\
+ ../../mgmt/mgmt_entrytb.o\
+ ../../phy/rtmp_phy.o\
+ ../../phy/rlt_phy.o\
+ ../../phy/rlt_rf.o
+
+ifeq ($(HAS_BLOCK_NET_IF),y)
+obj_cmm += ../../common/netif_block.o
+endif
+
+ifeq ($(HAS_NEW_RATE_ADAPT_SUPPORT),y)
+obj_cmm += ../../rate_ctrl/alg_grp.o
+endif
+
+ifeq ($(HAS_RATE_ADAPT_AGS_SUPPORT),y)
+obj_cmm += ../../rate_ctrl/alg_ags.o
+endif
+
+ifeq ($(HAS_DFS_SUPPORT),y)
+obj_cmm += ../../common/cmm_dfs.o
+endif
+
+ifeq ($(HAS_CS_SUPPORT),y)
+obj_cmm += ../../common/cmm_cs.o
+endif
+
+#ifdef DOT11_N_SUPPORT
+ifeq ($(HAS_DOT11_N_SUPPORT),y)
+obj_cmm += \
+ ../../common/ba_action.o\
+ ../../mgmt/mgmt_ht.o
+
+#ifdef TXBF_SUPPORT
+ifeq ($(HAS_TXBF_SUPPORT),y)
+obj_cmm += \
+ ../../common/cmm_txbf.o\
+ ../../common/cmm_txbf_cal.o
+endif
+#endif // TXBF_SUPPORT //
+endif
+#endif // DOT11_N_SUPPORT //
+
+#ifdef DOT11_VHT_SUPPORT
+ifeq ($(HAS_DOT11_VHT_SUPPORT),y)
+obj_vht += ../../mgmt/mgmt_vht.o\
+ ../../common/vht.o
+endif
+#endif // DOT11_VHT_SUPPORT //
+
+#ifdef WSC_INCLUDED
+ifeq ($(HAS_WSC),y)
+obj_wsc += \
+ ../../common/wsc.o\
+ ../../common/wsc_tlv.o\
+ ../../common/crypt_biginteger.o\
+ ../../common/crypt_dh.o
+endif
+ifeq ($(HAS_WSC_V2),y)
+obj_wsc += ../../common/wsc_v2.o
+endif
+#endif // WSC_INCLUDED //
+
+
+#ifdef ANDES_FIRMWARE_SUPPORT
+ifeq ($(HAS_ANDES_FIRMWARE_SUPPORT),y)
+obj_cmm += ../../mcu/rtmp_and.o
+endif
+#endif /* ANDES_FIRMWARE_SUPPORT */
+
+#ifdef CONFIG_AP_SUPPORT
+ifeq ($(RT28xx_MODE),AP)
+ifneq ($(findstring 7601,$(CHIPSET)),)
+MOD_NAME = mt$(MODULE)ap
+else
+MOD_NAME = rt$(MODULE)ap
+endif
+DAT_PATH = /etc/Wireless/RT$(CHIPSET_DAT)AP
+DAT_FILE_NAME = RT$(CHIPSET_DAT)AP.dat
+endif
+#endif // CONFIG_AP_SUPPORT //
+
+
+
+obj-m := $(MOD_NAME).o
+
+#ifdef CONFIG_AP_SUPPORT
+ifeq ($(RT28xx_MODE),AP)
+$(MOD_NAME)-objs := \
+ ../../os/linux/rt_profile.o\
+ ../../ap/ap_mbss.o\
+ ../../ap/ap.o\
+ ../../ap/ap_assoc.o\
+ ../../ap/ap_auth.o\
+ ../../ap/ap_connect.o\
+ ../../ap/ap_mlme.o\
+ ../../ap/ap_sanity.o\
+ ../../ap/ap_sync.o\
+ ../../ap/ap_wpa.o\
+ ../../ap/ap_data.o\
+ ../../ap/ap_autoChSel.o\
+ ../../ap/ap_qload.o\
+ ../../ap/ap_cfg.o\
+ $(obj_vht)\
+ $(obj_cmm)\
+ $(obj_wsc)
+
+#ifdef WSC_INCLUDED
+ifeq ($(HAS_WSC),y)
+$(MOD_NAME)-objs += \
+ ../../common/wsc_ufd.o
+endif
+#endif // WSC_INCLUDE //
+
+ifeq ($(HAS_ATE),y)
+$(MOD_NAME)-objs += ../../ate/common/rt_ate.o
+endif
+
+ifeq ($(HAS_QA_SUPPORT),y)
+$(MOD_NAME)-objs += ../../ate/common/rt_qa.o
+endif
+
+ifeq ($(OSABL),NO)
+$(MOD_NAME)-objs += \
+ ../../ap/ap_mbss_inf.o\
+ ../../common/rt_os_util.o\
+ ../../os/linux/ap_ioctl.o\
+ ../../os/linux/rt_linux.o\
+ ../../os/linux/rt_main_dev.o
+else
+$(MOD_NAME)-objs += \
+ ../../os/linux/rt_symb.o
+endif
+
+#ifdef BG_FT_SUPPORT
+ifeq ($(OSABL),NO)
+ifeq ($(HAS_BGFP_SUPPORT),y)
+$(MOD_NAME)-objs += \
+ ../../os/linux/br_ftph.o
+endif
+endif
+#endif // BG_FT_SUPPORT //
+
+
+#ifdef CRDA_SUPPORT
+ifeq ($(OSABL),NO)
+ifeq ($(HAS_CFG80211_SUPPORT),y)
+$(MOD_NAME)-objs += \
+ ../../os/linux/cfg80211.o\
+ ../../os/linux/cfg80211drv.o
+endif
+endif
+
+ifeq ($(OSABL),YES)
+ifeq ($(HAS_CFG80211_SUPPORT),y)
+$(MOD_NAME)-objs += \
+ ../../os/linux/cfg80211drv.o
+endif
+endif
+#endif // CRDA_SUPPORT //
+
+#ifdef LED_CONTROL_SUPPORT
+ifeq ($(HAS_LED_CONTROL_SUPPORT),y)
+$(MOD_NAME)-objs += \
+ ../../common/rt_led.o
+endif
+#endif // LED_CONTROL_SUPPORT //
+
+
+ifeq ($(HAS_RT2880_RT2860_COEXIST),y)
+RT28XX_AP_OBJ += \
+ ../../os/linux/rt_pci_rbus.o\
+ ../../os/linux/rt_rbus_pci_util.o\
+ ../../os/linux/pci_main_dev.o\
+ ../../common/dfs.o
+endif
+
+
+
+ifeq ($(HAS_WDS),y)
+$(MOD_NAME)-objs += ../../ap/ap_wds.o
+
+ifeq ($(OSABL),NO)
+$(MOD_NAME)-objs += \
+ ../../ap/ap_wds_inf.o
+endif
+endif
+
+#ifdef APCLI_SUPPORT
+ifeq ($(HAS_APCLI),y)
+$(MOD_NAME)-objs += \
+ ../../ap/ap_apcli.o \
+ ../../ap/apcli_ctrl.o \
+ ../../ap/apcli_sync.o \
+ ../../ap/apcli_auth.o \
+ ../../ap/apcli_assoc.o \
+ ../../common/cmm_mat.o \
+ ../../common/cmm_mat_iparp.o \
+ ../../common/cmm_mat_pppoe.o \
+ ../../common/cmm_mat_ipv6.o
+
+ifeq ($(OSABL),NO)
+$(MOD_NAME)-objs += \
+ ../../ap/ap_apcli_inf.o
+endif
+endif
+#endif // APCLI_SUPPORT //
+
+ifeq ($(HAS_IGMP_SNOOP_SUPPORT),y)
+$(MOD_NAME)-objs += ../../common/igmp_snoop.o
+endif
+
+
+ifeq ($(HAS_QOS_DLS_SUPPORT),y)
+$(MOD_NAME)-objs += ../../ap/ap_dls.o
+endif
+
+ifeq ($(HAS_IDS_SUPPORT),y)
+$(MOD_NAME)-objs += ../../ap/ap_ids.o
+endif
+
+ifeq ($(PLATFORM),IKANOS_V160)
+$(MOD_NAME)-objs += ../../os/linux/vr_ikans.o
+endif
+
+ifeq ($(PLATFORM),IKANOS_V180)
+$(MOD_NAME)-objs += ../../os/linux/vr_ikans.o
+endif
+
+ifeq ($(PLATFORM),BL2348)
+ifeq ($(OSABL),NO)
+$(MOD_NAME)-objs += ../../os/linux/vr_bdlt.o
+endif
+endif
+#ifdef PLATFORM_BL23570
+ifeq ($(PLATFORM),BL23570)
+rt$(CHIPSET)ap-objs += \
+ ../../os/linux/vr_bdlt.o
+endif
+#endif // PLATFORM_BL23570 //
+
+
+#ifdef WAPI_SUPPORT
+ifeq ($(HAS_WAPI_SUPPORT),y)
+$(MOD_NAME)-objs += \
+ ../../common/wapi.o
+endif
+#endif // WAPI_SUPPORT //
+
+
+
+
+
+ifeq ($(HAS_CLIENT_WDS_SUPPORT),y)
+$(MOD_NAME)-objs += \
+ ../../common/client_wds.o
+endif
+
+ifeq ($(HAS_EASY_CONFIG_SETUP_SUPPORT),y)
+ifeq ($(PLATFORM),RALINK_3052)
+$(MOD_NAME)-objs += lib.a
+endif
+endif
+
+endif
+#endif // CONFIG_AP_SUPPORT //
+
+
+
+
+#chip releated
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#ifdef RT3290
+ifneq ($(findstring 3290,$(CHIPSET)),)
+$(MOD_NAME)-objs += \
+ ../../common/cmm_mac_pci.o\
+ ../../common/cmm_data_pci.o\
+ ../../os/linux/rt_rbus_pci_drv.o\
+ ../../common/rtmp_mcu.o\
+ ../../common/ee_prom.o\
+ ../../common/ee_efuse.o\
+ ../../common/rt_rf.o\
+ ../../chips/rt30xx.o\
+ ../../chips/rt3290.o
+
+ifeq ($(OSABL),NO)
+$(MOD_NAME)-objs += \
+ ../../os/linux/rt_pci_rbus.o\
+ ../../os/linux/rt_rbus_pci_util.o\
+ ../../os/linux/pci_main_dev.o
+endif
+
+ifneq ($(findstring $(RT28xx_MODE),STA APSTA),)
+$(MOD_NAME)-objs += \
+ ../../common/frq_cal.o
+endif
+
+endif
+#endif // RT3290 //
+
+#ifdef RT6592
+ifneq ($(findstring 6592,$(CHIPSET)),)
+$(MOD_NAME)-objs += \
+ ../../common/cmm_mac_pci.o\
+ ../../common/cmm_data_pci.o\
+ ../../os/linux/rt_rbus_pci_drv.o\
+ ../../common/rtmp_mcu.o\
+ ../../common/ee_prom.o\
+ ../../common/ee_efuse.o\
+ ../../common/rt_rf.o\
+ ../../chips/rt6592.o
+
+ifeq ($(OSABL),NO)
+$(MOD_NAME)-objs += \
+ ../../os/linux/rt_pci_rbus.o\
+ ../../os/linux/rt_rbus_pci_util.o\
+ ../../os/linux/pci_main_dev.o
+endif
+endif
+#endif // RT6592 //
+
+
+
+
+
+#ifdef RT6590
+ifneq ($(findstring 6590,$(CHIPSET)),)
+$(MOD_NAME)-objs += \
+ ../../common/cmm_mac_pci.o\
+ ../../common/cmm_data_pci.o\
+ ../../os/linux/rt_rbus_pci_drv.o\
+ ../../common/ee_efuse.o\
+ ../../common/ee_prom.o\
+ ../../common/rt_rf.o\
+ ../../chips/rt30xx.o\
+ ../../chips/rt65xx.o\
+ ../../chips/rt6590.o\
+ ../../mac/ral_nmac.o\
+ ../../mcu/rtmp_and.o
+
+ifeq ($(HAS_RTMP_FLASH_SUPPORT),y)
+$(MOD_NAME)-objs += \
+ ../../common/ee_flash.o
+endif
+
+ifeq ($(OSABL),NO)
+$(MOD_NAME)-objs += \
+ ../../os/linux/rt_pci_rbus.o\
+ ../../os/linux/rt_rbus_pci_util.o\
+ ../../os/linux/pci_main_dev.o
+endif
+
+ifneq ($(findstring $(RT28xx_MODE),STA APSTA),)
+$(MOD_NAME)-objs += \
+ ../../common/frq_cal.o
+endif
+
+endif
+#endif // RT6590 //
+
+
+#ifdef RT6570
+ifneq ($(findstring 6570,$(CHIPSET)),)
+$(MOD_NAME)-objs += \
+ ../../common/cmm_mac_usb.o\
+ ../../common/cmm_data_usb.o\
+ ../../common/rtusb_io.o\
+ ../../common/rtusb_data.o\
+ ../../common/rtusb_bulk.o\
+ ../../os/linux/rt_usb.o\
+ ../../common/ee_prom.o\
+ ../../common/ee_efuse.o\
+ ../../common/rtmp_mcu.o\
+ ../../common/rt_rf.o\
+ ../../chips/rt30xx.o\
+ ../../chips/rt65xx.o\
+ ../../chips/rt6590.o\
+ ../../mac/ral_nmac.o\
+ ../../mcu/rtmp_and.o
+
+ifeq ($(HAS_RTMP_FLASH_SUPPORT),y)
+$(MOD_NAME)-objs += \
+ ../../common/ee_flash.o
+endif
+
+ifeq ($(HAS_TSO_SUPPORT),y)
+$(MOD_NAME)-objs += \
+ ../../naf/net_acc.o\
+ ../../naf/tso.o\
+ ../../naf/cso.o
+endif
+
+ifeq ($(OSABL),NO)
+$(MOD_NAME)-objs += \
+ ../../os/linux/rt_usb.o\
+ ../../os/linux/rt_usb_util.o\
+ ../../os/linux/usb_main_dev.o\
+ ../../common/rtusb_dev_id.o
+endif
+
+ifneq ($(findstring $(RT28xx_MODE),STA APSTA),)
+$(MOD_NAME)-objs += \
+ ../../common/frq_cal.o
+endif
+
+endif
+#endif // RT6570 //
+
+
+#ifdef RT8592
+ifneq ($(findstring 8592,$(CHIPSET)),)
+$(MOD_NAME)-objs += \
+ ../../common/cmm_mac_pci.o\
+ ../../common/cmm_data_pci.o\
+ ../../os/linux/rt_rbus_pci_drv.o\
+ ../../common/ee_prom.o\
+ ../../common/ee_efuse.o\
+ ../../common/rtmp_mcu.o\
+ ../../common/rt_rf.o\
+ ../../chips/rt30xx.o\
+ ../../chips/rt65xx.o\
+ ../../chips/rt6592.o\
+ ../../chips/rt85592.o\
+ ../../mac/ral_nmac.o\
+ ../../mcu/rtmp_and.o
+
+ifeq ($(HAS_RTMP_FLASH_SUPPORT),y)
+$(MOD_NAME)-objs += \
+ ../../common/ee_flash.o
+endif
+
+ifeq ($(OSABL),NO)
+$(MOD_NAME)-objs += \
+ ../../os/linux/rt_pci_rbus.o\
+ ../../os/linux/rt_rbus_pci_util.o\
+ ../../os/linux/pci_main_dev.o
+endif
+
+ifneq ($(findstring $(RT28xx_MODE),STA APSTA),)
+$(MOD_NAME)-objs += \
+ ../../common/frq_cal.o
+endif
+
+endif
+#endif // RT8592 //
+
+
+#ifdef MT7601E
+ifneq ($(findstring 7601E,$(CHIPSET)),)
+$(MOD_NAME)-objs += \
+ ../../common/cmm_mac_pci.o\
+ ../../common/cmm_data_pci.o\
+ ../../os/linux/rt_rbus_pci_drv.o\
+ ../../common/ee_prom.o\
+ ../../common/ee_efuse.o\
+ ../../mcu/rtmp_and.o\
+ ../../mcu/rtmp_mcu.o\
+ ../../mcu/rtmp_M51.o\
+ ../../common/rt_rf.o\
+ ../../chips/rt30xx.o\
+ ../../chips/mt7601.o\
+ ../../mac/ral_omac.o
+
+ifeq ($(HAS_RTMP_FLASH_SUPPORT),y)
+$(MOD_NAME)-objs += \
+ ../../common/ee_flash.o
+endif
+
+ifeq ($(HAS_ATE),y)
+$(MOD_NAME)-objs += \
+ ../../ate/chips/mt7601_ate.o\
+ ../../ate/common/ate_usb.o
+endif
+
+ifeq ($(OSABL),NO)
+$(MOD_NAME)-objs += \
+ ../../os/linux/rt_pci_rbus.o\
+ ../../os/linux/rt_rbus_pci_util.o\
+ ../../os/linux/pci_main_dev.o
+endif
+
+ifneq ($(findstring $(RT28xx_MODE),STA APSTA),)
+$(MOD_NAME)-objs += \
+ ../../common/frq_cal.o
+endif
+
+endif
+#endif // MT7601E //
+
+
+#ifdef MT7601U
+ifneq ($(findstring 7601U,$(CHIPSET)),)
+$(MOD_NAME)-objs += \
+ ../../common/cmm_mac_usb.o\
+ ../../common/cmm_data_usb.o\
+ ../../common/rtusb_io.o\
+ ../../common/rtusb_data.o\
+ ../../common/rtusb_bulk.o\
+ ../../os/linux/rt_usb.o\
+ ../../common/ee_prom.o\
+ ../../common/ee_efuse.o\
+ ../../mcu/rtmp_and.o\
+ ../../mcu/rtmp_mcu.o\
+ ../../mcu/rtmp_M51.o\
+ ../../common/rt_rf.o\
+ ../../chips/mt7601.o\
+ ../../mac/ral_omac.o
+
+ifeq ($(HAS_RTMP_FLASH_SUPPORT),y)
+$(MOD_NAME)-objs += \
+ ../../common/ee_flash.o
+endif
+
+ifeq ($(HAS_ATE),y)
+$(MOD_NAME)-objs += \
+ ../../ate/chips/mt7601_ate.o\
+ ../../ate/common/ate_usb.o
+endif
+
+ifeq ($(HAS_TSO_SUPPORT),y)
+$(MOD_NAME)-objs += \
+ ../../naf/net_acc.o\
+ ../../naf/tso.o\
+ ../../naf/cso.o
+endif
+
+ifeq ($(OSABL),NO)
+$(MOD_NAME)-objs += \
+ ../../os/linux/rt_usb.o\
+ ../../os/linux/rt_usb_util.o\
+ ../../os/linux/usb_main_dev.o\
+ ../../common/rtusb_dev_id.o
+endif
+
+ifneq ($(findstring $(RT28xx_MODE),STA APSTA),)
+$(MOD_NAME)-objs += \
+ ../../common/frq_cal.o
+endif
+
+endif
+#endif // MT7601U //
+
+
+PHONY := clean install uninstall
+
+clean:
+ rm -f ../../common/*.o
+ rm -f ../../common/.*.{cmd,flags,d}
+ rm -f ../../os/linux/*.{o,ko,mod.{o,c}}
+ rm -f ../../os/linux/.*.{cmd,flags,d}
+ rm -fr ../../os/linux/.tmp_versions
+#Must clean Module.symvers; or you will suffer symbol version not match
+#when OS_ABL = YES.
+ rm -f ../../os/linux/Module.symvers
+ rm -f ../../os/linux/Modules.symvers
+ rm -f ../../os/linux/Module.markers
+ rm -f ../../os/linux/modules.order
+ rm -f ../../chips/*.o
+ rm -f ../../chips/.*.{cmd,flags,d}
+ifeq ($(RT28xx_MODE),AP)
+ rm -f ../../ap/*.o
+ rm -f ../../ap/.*.{cmd,flags,d}
+else
+ifeq ($(RT28xx_MODE),STA)
+ rm -f ../../sta/*.o
+ rm -f ../../sta/.*.{cmd,flags,d}
+else
+ifeq ($(RT28xx_MODE),APSTA)
+ rm -f ../../ap/*.o
+ rm -f ../../ap/.*.{cmd,flags,d}
+ rm -f ../../sta/*.o
+ rm -f ../../sta/.*.{cmd,flags,d}
+endif
+endif
+endif
+
+install:
+ rm -rf $(DAT_PATH)
+ $(shell [ ! -f /etc/Wireless ] && mkdir /etc/Wireless)
+ mkdir $(DAT_PATH)
+ cp $(RT28xx_DIR)/$(DAT_FILE_NAME) $(DAT_PATH)/.
+ install -d $(LINUX_SRC_MODULE)
+ install -m 644 -c $(addsuffix .ko,$(MOD_NAME)) $(LINUX_SRC_MODULE)
+ /sbin/depmod -a ${shell uname -r}
+
+uninstall:
+# rm -rf $(DAT_PATH)
+ rm -rf $(addprefix $(LINUX_SRC_MODULE),$(addsuffix .ko,$(MOD_NAME)))
+ /sbin/depmod -a ${shell uname -r}
+
+# Declare the contents of the .PHONY variable as phony. We keep that
+# information in a variable so we can use it in if_changed and friends.
+.PHONY: $(PHONY)
diff --git a/cleopatre/devkit/mt7601udrv/os/linux/Makefile.6.netif b/cleopatre/devkit/mt7601udrv/os/linux/Makefile.6.netif
new file mode 100644
index 0000000000..36911c7f12
--- /dev/null
+++ b/cleopatre/devkit/mt7601udrv/os/linux/Makefile.6.netif
@@ -0,0 +1,99 @@
+include $(RT28xx_DIR)/os/linux/config.mk
+
+#ifdef CONFIG_AP_SUPPORT
+ifeq ($(RT28xx_MODE),AP)
+MOD_NAME = rtnet$(MODULE)ap
+endif
+#endif // CONFIG_AP_SUPPORT //
+
+
+
+obj-m := $(MOD_NAME).o
+
+#ifdef CONFIG_AP_SUPPORT
+ifeq ($(RT28xx_MODE),AP)
+$(MOD_NAME)-objs := \
+ ../../ap/ap_mbss_inf.o\
+ ../../os/linux/ap_ioctl.o\
+ ../../os/linux/rt_main_dev.o
+
+ifeq ($(HAS_CFG80211_SUPPORT),y)
+$(MOD_NAME)-objs += \
+ ../../os/linux/cfg80211.o
+endif
+
+ifeq ($(HAS_WDS),y)
+$(MOD_NAME)-objs += \
+ ../../ap/ap_wds_inf.o
+endif
+
+ifeq ($(HAS_APCLI),y)
+$(MOD_NAME)-objs += \
+ ../../ap/ap_apcli_inf.o
+endif
+
+ifeq ($(HAS_MESH_SUPPORT),y)
+$(MOD_NAME)-objs += \
+ ../../common/mesh_inf.o
+endif
+
+endif
+#endif // CONFIG_AP_SUPPORT //
+
+
+
+#chip related
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#ifdef MT7601
+ifneq ($(findstring 7601,$(CHIPSET)),)
+$(MOD_NAME)-objs += \
+ ../../common/rtusb_dev_id.o\
+ ../../os/linux/usb_main_dev.o
+endif
+#endif // MT7601 //
+
+clean:
+ rm -f ../../common/*.o
+ rm -f ../../common/.*.{cmd,flags,d}
+ rm -f ../../os/linux/*.{o,ko,mod.{o,c}}
+ rm -f ../../os/linux/.*.{cmd,flags,d}
+ rm -fr ../../os/linux/.tmp_versions
+ rm -f ../../os/linux/Module.symvers
+ rm -f ../../os/linux/Modules.symvers
+ rm -f ../../os/linux/Module.markers
+ rm -f ../../os/linux/modules.order
+ rm -f ../../chips/*.o
+ rm -f ../../chips/.*.{cmd,flags,d}
+ifeq ($(RT28xx_MODE),AP)
+ rm -f ../../ap/*.o
+ rm -f ../../ap/.*.{cmd,flags,d}
+else
+ifeq ($(RT28xx_MODE),STA)
+ rm -f ../../sta/*.o
+ rm -f ../../sta/.*.{cmd,flags,d}
+endif
+endif
+
+install:
+ install -d $(LINUX_SRC_MODULE)
+ install -m 644 -c $(addsuffix .ko,$(MOD_NAME)) $(LINUX_SRC_MODULE)
+ /sbin/depmod -a ${shell uname -r}
+
+uninstall:
+ rm -rf $(addprefix $(LINUX_SRC_MODULE),$(addsuffix .ko,$(MOD_NAME)))
+ /sbin/depmod -a ${shell uname -r}
diff --git a/cleopatre/devkit/mt7601udrv/os/linux/Makefile.6.util b/cleopatre/devkit/mt7601udrv/os/linux/Makefile.6.util
new file mode 100644
index 0000000000..d237ab53a2
--- /dev/null
+++ b/cleopatre/devkit/mt7601udrv/os/linux/Makefile.6.util
@@ -0,0 +1,72 @@
+include $(RT28xx_DIR)/os/linux/config.mk
+
+#ifdef CONFIG_AP_SUPPORT
+ifeq ($(RT28xx_MODE),AP)
+MOD_NAME = rtutil$(MODULE)ap
+endif
+#endif // CONFIG_AP_SUPPORT //
+
+
+
+obj-m := $(MOD_NAME).o
+
+#ifdef CONFIG_AP_SUPPORT
+ifeq ($(RT28xx_MODE),AP)
+$(MOD_NAME)-objs := \
+ ../../common/rt_os_util.o\
+ ../../os/linux/rt_linux_symb.o\
+ ../../os/linux/rt_rbus_pci_util.o\
+ ../../os/linux/rt_usb_util.o\
+ ../../os/linux/rt_linux.o
+
+ifeq ($(PLATFORM),BL2348)
+$(MOD_NAME)-objs += \
+ ../../os/linux/vr_bdlt.o
+endif
+
+ifeq ($(PLATFORM),BLUBB)
+$(MOD_NAME)-objs += \
+ ../../os/linux/vr_bdlt.o
+endif
+
+ifeq ($(HAS_BGFP_SUPPORT),y)
+$(MOD_NAME)-objs += \
+ ../../os/linux/br_ftph.o
+endif
+endif
+#endif // CONFIG_AP_SUPPORT //
+
+
+
+
+
+clean:
+ rm -f ../../common/*.o
+ rm -f ../../common/.*.{cmd,flags,d}
+ rm -f ../../os/linux/*.{o,ko,mod.{o,c}}
+ rm -f ../../os/linux/.*.{cmd,flags,d}
+ rm -fr ../../os/linux/.tmp_versions
+ rm -f ../../os/linux/Module.symvers
+ rm -f ../../os/linux/Modules.symvers
+ rm -f ../../os/linux/Module.markers
+ rm -f ../../os/linux/modules.order
+ rm -f ../../chips/*.o
+ rm -f ../../chips/.*.{cmd,flags,d}
+ifeq ($(RT28xx_MODE),AP)
+ rm -f ../../ap/*.o
+ rm -f ../../ap/.*.{cmd,flags,d}
+else
+ifeq ($(RT28xx_MODE),STA)
+ rm -f ../../sta/*.o
+ rm -f ../../sta/.*.{cmd,flags,d}
+endif
+endif
+
+install:
+ install -d $(LINUX_SRC_MODULE)
+ install -m 644 -c $(addsuffix .ko,$(MOD_NAME)) $(LINUX_SRC_MODULE)
+ /sbin/depmod -a ${shell uname -r}
+
+uninstall:
+ rm -rf $(addprefix $(LINUX_SRC_MODULE),$(addsuffix .ko,$(MOD_NAME)))
+ /sbin/depmod -a ${shell uname -r}
diff --git a/cleopatre/devkit/mt7601udrv/os/linux/Makefile.ap.soc b/cleopatre/devkit/mt7601udrv/os/linux/Makefile.ap.soc
new file mode 100644
index 0000000000..1e781a3e22
--- /dev/null
+++ b/cleopatre/devkit/mt7601udrv/os/linux/Makefile.ap.soc
@@ -0,0 +1,394 @@
+EXTRA_CFLAGS = -Idrivers/net/wireless/rt2860v2/include -Idrivers/net/wireless/rt2860v2/ate/include
+
+obj-$(CONFIG_RT2860V2_AP) += rt2860v2_ap.o
+
+rt2860v2_ap-objs += ../rt2860v2/common/crypt_md5.o
+rt2860v2_ap-objs += ../rt2860v2/common/crypt_sha2.o
+rt2860v2_ap-objs += ../rt2860v2/common/crypt_hmac.o
+rt2860v2_ap-objs += ../rt2860v2/common/crypt_aes.o
+rt2860v2_ap-objs += ../rt2860v2/common/crypt_arc4.o
+rt2860v2_ap-objs += ../rt2860v2/common/mlme.o
+rt2860v2_ap-objs += ../rt2860v2/common/cmm_wep.o
+rt2860v2_ap-objs += ../rt2860v2/common/action.o
+rt2860v2_ap-objs += ../rt2860v2/common/ba_action.o
+rt2860v2_ap-objs += ../rt2860v2/common/cmm_data.o
+rt2860v2_ap-objs += ../rt2860v2/common/rtmp_init.o
+rt2860v2_ap-objs += ../rt2860v2/common/rtmp_init_inf.o
+rt2860v2_ap-objs += ../rt2860v2/common/cmm_tkip.o
+rt2860v2_ap-objs += ../rt2860v2/common/cmm_aes.o
+rt2860v2_ap-objs += ../rt2860v2/common/cmm_sync.o
+rt2860v2_ap-objs += ../rt2860v2/common/cmm_sanity.o
+rt2860v2_ap-objs += ../rt2860v2/common/cmm_info.o
+rt2860v2_ap-objs += ../rt2860v2/common/cmm_cfg.o
+rt2860v2_ap-objs += ../rt2860v2/common/cmm_wpa.o
+rt2860v2_ap-objs += ../rt2860v2/common/dfs.o
+rt2860v2_ap-objs += ../rt2860v2/common/dfs_mcu.o
+rt2860v2_ap-objs += ../rt2860v2/common/spectrum.o
+rt2860v2_ap-objs += ../rt2860v2/common/rtmp_timer.o
+rt2860v2_ap-objs += ../rt2860v2/common/rt_channel.o
+rt2860v2_ap-objs += ../rt2860v2/common/cmm_profile.o
+rt2860v2_ap-objs += ../rt2860v2/common/cmm_asic.o
+rt2860v2_ap-objs += ../rt2860v2/common/cmm_cmd.o
+rt2860v2_ap-objs += ../rt2860v2/common/rtmp_swmcu.o
+rt2860v2_ap-objs += ../rt2860v2/common/rt_os_util.o
+rt2860v2_ap-objs += ../rt2860v2/common/eeprom.o
+rt2860v2_ap-objs += ../rt2860v2/common/ee_flash.o
+rt2860v2_ap-objs += ../rt2860v2/common/cmm_mac_pci.o
+rt2860v2_ap-objs += ../rt2860v2/common/cmm_data_pci.o
+
+rt2860v2_ap-objs += ../rt2860v2/chips/rtmp_chip.o
+
+rt2860v2_ap-objs += ../rt2860v2/ap/ap.o
+rt2860v2_ap-objs += ../rt2860v2/ap/ap_assoc.o
+rt2860v2_ap-objs += ../rt2860v2/ap/ap_auth.o
+rt2860v2_ap-objs += ../rt2860v2/ap/ap_connect.o
+rt2860v2_ap-objs += ../rt2860v2/ap/ap_mlme.o
+rt2860v2_ap-objs += ../rt2860v2/ap/ap_sanity.o
+rt2860v2_ap-objs += ../rt2860v2/ap/ap_sync.o
+rt2860v2_ap-objs += ../rt2860v2/ap/ap_wpa.o
+rt2860v2_ap-objs += ../rt2860v2/ap/ap_data.o
+rt2860v2_ap-objs += ../rt2860v2/ap/ap_uapsd.o
+rt2860v2_ap-objs += ../rt2860v2/ap/ap_autoChSel.o
+rt2860v2_ap-objs += ../rt2860v2/ap/ap_qload.o
+rt2860v2_ap-objs += ../rt2860v2/ap/ap_cfg.o
+
+rt2860v2_ap-objs += ../rt2860v2/os/linux/rt_proc.o
+rt2860v2_ap-objs += ../rt2860v2/os/linux/rt_linux.o
+rt2860v2_ap-objs += ../rt2860v2/os/linux/rt_profile.o
+rt2860v2_ap-objs += ../rt2860v2/os/linux/rt_main_dev.o
+rt2860v2_ap-objs += ../rt2860v2/os/linux/ap_ioctl.o
+rt2860v2_ap-objs += ../rt2860v2/os/linux/rt_pci_rbus.o
+rt2860v2_ap-objs += ../rt2860v2/os/linux/rt_rbus_pci_util.o
+rt2860v2_ap-objs += ../rt2860v2/os/linux/rt_rbus_pci_drv.o
+rt2860v2_ap-objs += ../rt2860v2/os/linux/rbus_main_dev.o
+rt2860v2_ap-objs += ../rt2860v2/common/rt_ate.o
+
+ifeq ($(CONFIG_RT2860V2_AP_WMM_ACM),y)
+rt2860v2_ap-objs += ../rt2860v2/common/acm_edca.o
+rt2860v2_ap-objs += ../rt2860v2/common/acm_comm.o
+rt2860v2_ap-objs += ../rt2860v2/common/acm_iocl.o
+endif
+
+ifeq ($(CONFIG_RT2860V2_AP_LED),y)
+rt2860v2_ap-objs += ../rt2860v2/common/rt_led.o
+endif
+
+ifeq ($(CONFIG_RT2860V2_AP_WSC),y)
+rt2860v2_ap-objs += ../rt2860v2/common/wsc.o
+rt2860v2_ap-objs += ../rt2860v2/common/wsc_tlv.o
+rt2860v2_ap-objs += ../rt2860v2/common/crypt_dh.o
+rt2860v2_ap-objs += ../rt2860v2/common/crypt_biginteger.o
+rt2860v2_ap-objs += ../rt2860v2/common/wsc_ufd.o
+rt2860v2_ap-objs += ../rt2860v2/common/wsc_v2.o
+endif
+
+ifeq ($(CONFIG_RT2860V2_AP_NINTENDO),y)
+rt2860v2_ap-objs += ../rt2860v2/ap/ap_nintendo.o
+endif
+
+ifeq ($(CONFIG_RT2860V2_AP_WDS),y)
+rt2860v2_ap-objs += ../rt2860v2/ap/ap_wds.o
+rt2860v2_ap-objs += ../rt2860v2/ap/ap_wds_inf.o
+rt2860v2_ap-objs += ../rt2860v2/common/client_wds.o
+endif
+
+ifeq ($(CONFIG_RT2860V2_AP_MBSS),y)
+rt2860v2_ap-objs += ../rt2860v2/ap/ap_mbss.o
+rt2860v2_ap-objs += ../rt2860v2/ap/ap_mbss_inf.o
+endif
+
+ifeq ($(CONFIG_RT2860V2_AP_APCLI),y)
+rt2860v2_ap-objs += ../rt2860v2/ap/ap_apcli.o
+rt2860v2_ap-objs += ../rt2860v2/ap/ap_apcli_inf.o
+rt2860v2_ap-objs += ../rt2860v2/ap/apcli_assoc.o
+rt2860v2_ap-objs += ../rt2860v2/ap/apcli_auth.o
+rt2860v2_ap-objs += ../rt2860v2/ap/apcli_ctrl.o
+rt2860v2_ap-objs += ../rt2860v2/ap/apcli_sync.o
+rt2860v2_ap-objs += ../rt2860v2/common/cmm_mat.o
+rt2860v2_ap-objs += ../rt2860v2/common/cmm_mat_iparp.o
+rt2860v2_ap-objs += ../rt2860v2/common/cmm_mat_pppoe.o
+rt2860v2_ap-objs += ../rt2860v2/common/cmm_mat_ipv6.o
+endif
+
+ifeq ($(CONFIG_RT2860V2_AP_IGMP_SNOOP),y)
+rt2860v2_ap-objs += ../rt2860v2/common/igmp_snoop.o
+endif
+
+ifeq ($(CONFIG_RT2860V2_AP_NETIF_BLOCK),y)
+rt2860v2_ap-objs += ../rt2860v2/common/netif_block.o
+endif
+
+ifeq ($(CONFIG_RT2860V2_AP_DLS),y)
+rt2860v2_ap-objs += ../rt2860v2/ap/ap_dls.o
+endif
+
+ifeq ($(CONFIG_RT2860V2_AP_IDS),y)
+rt2860v2_ap-objs += ../rt2860v2/ap/ap_ids.o
+endif
+
+ifeq ($(CONFIG_RT2860V2_AP_MESH),y)
+rt2860v2_ap-objs += ../rt2860v2/common/mesh_bmpkt.o
+rt2860v2_ap-objs += ../rt2860v2/common/mesh_ctrl.o
+rt2860v2_ap-objs += ../rt2860v2/common/mesh_link_mng.o
+rt2860v2_ap-objs += ../rt2860v2/common/mesh_sanity.o
+rt2860v2_ap-objs += ../rt2860v2/common/mesh_tlv.o
+rt2860v2_ap-objs += ../rt2860v2/common/mesh.o
+rt2860v2_ap-objs += ../rt2860v2/common/mesh_inf.o
+rt2860v2_ap-objs += ../rt2860v2/common/mesh_forwarding.o
+rt2860v2_ap-objs += ../rt2860v2/common/mesh_path_mng.o
+endif
+
+ifeq ($(CONFIG_RT2860V2_RT3XXX_AP_ANTENNA_DIVERSITY),y)
+rt2860v2_ap-objs += ../rt2860v2/os/linux/ap_diversity.o
+endif
+
+ifeq ($(CONFIG_RT2860V2_AP_WAPI),y)
+rt2860v2_ap-objs += ../rt2860v2/common/wapi.o
+rt2860v2_ap-objs += ../rt2860v2/common/wapi_crypt.o
+rt2860v2_ap-objs += ../rt2860v2/common/wapi_sms4.o
+endif
+
+#ifeq ($(CONFIG_RT2860V2_80211R_FT),y)
+#rt2860v2_ap-objs += ../rt2860v2/common/ft.o
+#rt2860v2_ap-objs += ../rt2860v2/common/ft_tlv.o
+#rt2860v2_ap-objs += ../rt2860v2/common/ft_ioctl.o
+#rt2860v2_ap-objs += ../rt2860v2/common/ft_rc.o
+#rt2860v2_ap-objs += ../rt2860v2/ap/ap_ftkd.o
+#endif
+
+#ifeq ($(CONFIG_RT2860V2_80211K_RR),y)
+#rt2860v2_ap-objs += ../rt2860v2/common/rrm_tlv.o
+#rt2860v2_ap-objs += ../rt2860v2/common/rrm_sanity.o
+#rt2860v2_ap-objs += ../rt2860v2/common/rrm.o
+#endif
+
+ifeq ($(CONFIG_RT2860V2_AP_VIDEO_TURBINE),y)
+rt2860v2_ap-objs += ../rt2860v2/common/cmm_video.o
+endif
+
+ifeq ($(CONFIG_RALINK_RT2880),y)
+rt2860v2_ap-objs += ../rt2860v2/chips/rt2880.o
+endif
+
+ifeq ($(CONFIG_RALINK_RT3052),y)
+rt2860v2_ap-objs += ../rt2860v2/common/rt_rf.o
+rt2860v2_ap-objs += ../rt2860v2/chips/rt305x.o
+endif
+
+ifeq ($(CONFIG_RALINK_RT3352),y)
+rt2860v2_ap-objs += ../rt2860v2/common/rt_rf.o
+rt2860v2_ap-objs += ../rt2860v2/chips/rt305x.o
+rt2860v2_ap-objs += ../rt2860v2/chips/rt3352.o
+endif
+
+ifeq ($(CONFIG_RT3x52),y)
+rt2860v2_ap-objs += ../rt2860v2/common/rt_rf.o
+rt2860v2_ap-objs += ../rt2860v2/chips/rt305x.o
+rt2860v2_ap-objs += ../rt2860v2/chips/rt3352.o
+endif
+
+ifeq ($(CONFIG_RALINK_RT5350),y)
+rt2860v2_ap-objs += ../rt2860v2/common/rt_rf.o
+rt2860v2_ap-objs += ../rt2860v2/chips/rt305x.o
+rt2860v2_ap-objs += ../rt2860v2/chips/rt5350.o
+endif
+
+ifeq ($(CONFIG_RALINK_RT3883),y)
+rt2860v2_ap-objs += ../rt2860v2/common/rt_rf.o
+rt2860v2_ap-objs += ../rt2860v2/chips/rt3883.o
+ifeq ($(CONFIG_RT2860V2_AP_TXBF),y)
+rt2860v2_ap-objs += ../rt2860v2/common/cmm_txbf.o
+rt2860v2_ap-objs += ../rt2860v2/common/cmm_txbf_cal.o
+endif
+endif
+
+###################
+# CFLAGS
+##################
+EXTRA_CFLAGS += -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT -DLINUX \
+ -Wall -Wstrict-prototypes -Wno-trigraphs
+
+EXTRA_CFLAGS += -DCONFIG_AP_SUPPORT -DAP_SCAN_SUPPORT -DUAPSD_AP_SUPPORT -DRTMP_RBUS_SUPPORT -DRTMP_MAC_PCI
+EXTRA_CFLAGS += -DDOT11_N_SUPPORT -DSTATS_COUNT_SUPPORT -DRELASE_EXCLUDE -DIAPP_SUPPORT -DDOT1X_SUPPORT
+EXTRA_CFLAGS += -DRALINK_ATE -DRALINK_QA -DCONFIG_RT2880_ATE_CMD_NEW -DNEW_TXCONT -DNEW_TXCARRSUPP
+EXTRA_CFLAGS += -DCONFIG_RA_NAT_NONE
+
+#provide busy time statistics for every TBTT */
+#EXTRA_CFLAGS += -DQLOAD_FUNC_BUSY_TIME_STATS
+
+# provide busy time alarm mechanism
+# use the function to avoid to locate in some noise environments
+#EXTRA_CFLAGS += -DQLOAD_FUNC_BUSY_TIME_ALARM
+
+ifeq ($(CONFIG_RALINK_RT2880),y)
+EXTRA_CFLAGS += -DRT2880
+endif
+
+ifeq ($(CONFIG_RALINK_RT3052),y)
+ifeq ($(CONFIG_RALINK_RT3350),y)
+EXTRA_CFLAGS += -DRT3350 -DRT305x -DRTMP_RF_RW_SUPPORT
+else
+EXTRA_CFLAGS += -DRT3052 -DRT305x -DRTMP_RF_RW_SUPPORT
+endif
+endif
+
+ifeq ($(CONFIG_RALINK_RT3352),y)
+EXTRA_CFLAGS += -DRT3352 -DRT305x -DRTMP_RF_RW_SUPPORT -DSPECIFIC_BCN_BUF_SUPPORT -DVCORECAL_SUPPORT
+endif
+
+ifeq ($(CONFIG_RT3x52),y)
+EXTRA_CFLAGS += -DRT3052 -DRT3352 -DRT305x -DRTMP_RF_RW_SUPPORT -DSPECIFIC_BCN_BUF_SUPPORT -DVCORECAL_SUPPORT
+endif
+
+ifeq ($(CONFIG_RALINK_RT5350),y)
+EXTRA_CFLAGS += -DRT5350 -DRT305x -DRTMP_RF_RW_SUPPORT -DSPECIFIC_BCN_BUF_SUPPORT -DVCORECAL_SUPPORT
+endif
+
+ifeq ($(CONFIG_RALINK_RT3883),y)
+EXTRA_CFLAGS += -DRT3883 -DDOT11N_SS3_SUPPORT -DA_BAND_SUPPORT -DRTMP_RF_RW_SUPPORT -DSPECIFIC_BCN_BUF_SUPPORT -DVCORECAL_SUPPORT
+ifeq ($(CONFIG_RT2860V2_AP_TXBF),y)
+EXTRA_CFLAGS += -DTXBF_SUPPORT
+endif
+EXTRA_CFLAGS += -DSTREAM_MODE_SUPPORT
+endif
+
+ifeq ($(CONFIG_RT2860V2_AP_DLS),y)
+EXTRA_CFLAGS += -DQOS_DLS_SUPPORT
+endif
+
+ifeq ($(CONFIG_RT2860V2_AP_IDS),y)
+EXTRA_CFLAGS += -DIDS_SUPPORT
+endif
+
+ifeq ($(CONFIG_RT2860V2_AP_DFS),y)
+EXTRA_CFLAGS += -DDFS_SUPPORT
+EXTRA_CFLAGS += -DNEW_DFS
+endif
+
+ifeq ($(CONFIG_RT2860V2_AP_CARRIER),y)
+EXTRA_CFLAGS += -DCARRIER_DETECTION_SUPPORT
+ifeq ($(CONFIG_RALINK_RT3052),y)
+EXTRA_CFLAGS += -DTONE_RADAR_DETECT_SUPPORT
+endif
+endif
+
+ifeq ($(CONFIG_RT2860V2_AUTO_CH_SELECT_ENCANCE),y)
+EXTRA_CFLAGS += -DAUTO_CH_SELECT_ENHANCE
+endif
+
+ifeq ($(CONFIG_RT2860V2_80211N_DRAFT3),y)
+EXTRA_CFLAGS += -DDOT11N_DRAFT3
+endif
+
+ifeq ($(CONFIG_SINGLE_SKU),y)
+EXTRA_CFLAGS += -DSINGLE_SKU
+endif
+
+ifeq ($(CONFIG_RT2860V2_SNMP),y)
+EXTRA_CFLAGS += -DSNMP_SUPPORT
+endif
+
+ifeq ($(CONFIG_RT2860V2_MCAST_RATE_SPECIFIC),y)
+EXTRA_CFLAGS += -DMCAST_RATE_SPECIFIC
+endif
+
+ifeq ($(CONFIG_RT2860V2_AP_WMM_ACM),y)
+EXTRA_CFLAGS += -DWMM_ACM_SUPPORT
+endif
+
+ifeq ($(CONFIG_RT2860V2_AP_LED),y)
+EXTRA_CFLAGS += -DLED_CONTROL_SUPPORT -DCONFIG_SWMCU_SUPPORT
+ifeq ($(CONFIG_RT2860V2_AP_WSC),y)
+EXTRA_CFLAGS += -DWSC_LED_SUPPORT
+endif
+endif
+
+ifeq ($(CONFIG_RT2860V2_AP_NINTENDO),y)
+EXTRA_CFLAGS += -DNINTENDO_AP
+endif
+
+ifeq ($(CONFIG_RT2860V2_AP_WSC),y)
+EXTRA_CFLAGS += -DWSC_AP_SUPPORT -DWSC_V2_SUPPORT
+endif
+
+ifeq ($(CONFIG_RT2860V2_AP_LLTD),y)
+EXTRA_CFLAGS += -DLLTD_SUPPORT
+endif
+
+ifeq ($(CONFIG_RT2860V2_AP_WDS),y)
+EXTRA_CFLAGS += -DWDS_SUPPORT
+endif
+
+ifeq ($(CONFIG_RT2860V2_AP_MBSS),y)
+EXTRA_CFLAGS += -DMBSS_SUPPORT
+endif
+
+ifeq ($(CONFIG_NEW_MBSSID_MODE),y)
+EXTRA_CFLAGS += -DNEW_MBSSID_MODE
+endif
+
+ifeq ($(CONFIG_RT2860V2_AP_APCLI),y)
+EXTRA_CFLAGS += -DAPCLI_SUPPORT
+EXTRA_CFLAGS += -DMAT_SUPPORT
+endif
+
+ifeq ($(CONFIG_RT2860V2_AP_IGMP_SNOOP),y)
+EXTRA_CFLAGS += -DIGMP_SNOOP_SUPPORT
+endif
+
+ifeq ($(CONFIG_RT2860V2_AP_NETIF_BLOCK),y)
+EXTRA_CFLAGS += -DBLOCK_NET_IF
+endif
+
+ifeq ($(CONFIG_RT2860V2_AP_MESH),y)
+EXTRA_CFLAGS += -DMESH_SUPPORT -DINTEL_CMPC
+endif
+
+ifeq ($(CONFIG_RT2860V2_RT3XXX_AP_ANTENNA_DIVERSITY),y)
+EXTRA_CFLAGS += -DRT3XXX_ANTENNA_DIVERSITY_SUPPORT
+endif
+
+ifeq ($(CONFIG_RT2860V2_HW_ANTENNA_DIVERSITY),y)
+EXTRA_CFLAGS += -DHW_ANTENNA_DIVERSITY_SUPPORT
+endif
+
+ifeq ($(CONFIG_RT2860V2_AP_WAPI),y)
+EXTRA_CFLAGS += -DWAPI_SUPPORT
+ifeq ($(CONFIG_RALINK_RT3052),y)
+EXTRA_CFLAGS += -DSOFT_ENCRYPT
+endif
+endif
+
+ifeq ($(CONFIG_RT2860V2_AP_COC),y)
+EXTRA_CFLAGS += -DCOC_SUPPORT -DGREENAP_SUPPORT
+endif
+
+ifeq ($(CONFIG_RT2860V2_EXT_CHANNEL_LIST),y)
+EXTRA_CFLAGS += -DEXT_BUILD_CHANNEL_LIST
+endif
+
+ifeq ($(CONFIG_KTHREAD),y)
+EXTRA_CFLAGS += -DKTHREAD_SUPPORT
+endif
+
+ifeq ($(CONFIG_RT2860V2_AP_MEMORY_OPTIMIZATION),y)
+EXTRA_CFLAGS += -DMEMORY_OPTIMIZATION
+else
+EXTRA_CFLAGS += -DDBG
+endif
+
+ifeq ($(CONFIG_RT2860V2_AP_VIDEO_TURBINE),y)
+EXTRA_CFLAGS += -DVIDEO_TURBINE_SUPPORT
+endif
+
+ifeq ($(CONFIG_RA_NETWORK_WORKQUEUE_BH),y)
+EXTRA_CFLAGS += -DWORKQUEUE_BH
+endif
+
+ifeq ($(CONFIG_RT2860V2_AP_RTMP_INTERNAL_TX_ALC),y)
+EXTRA_CFLAGS += -DRTMP_INTERNAL_TX_ALC
+endif
+
+#ifeq ($(CONFIG_RT2860V2_AP_INTELLIGENT_RATE_ADAPTION),y)
+#EXTRA_CFLAGS += -DNEW_RATE_ADAPT_SUPPORT
+#endif
diff --git a/cleopatre/devkit/mt7601udrv/os/linux/Makefile.ap.usb b/cleopatre/devkit/mt7601udrv/os/linux/Makefile.ap.usb
new file mode 100644
index 0000000000..7adec8c6d4
--- /dev/null
+++ b/cleopatre/devkit/mt7601udrv/os/linux/Makefile.ap.usb
@@ -0,0 +1,334 @@
+# In-Tree Makefile for USB combo
+EXTRA_CFLAGS += -Idrivers/net/wireless/RT5572_ap/MODULE/include
+EXTRA_CFLAGS += -Idrivers/net/wireless/RT5572_ap/UTIL/include
+EXTRA_CFLAGS += -Idrivers/net/wireless/RT5572_ap/NETIF/include
+EXTRA_CFLAGS += -Idrivers/net/wireless/RT5572_ap/MODULE/ate/include
+
+# UTIL module
+obj-$(CONFIG_RTUSB_AP) += RT5572_ap_util.o
+RT5572_ap_util-y += UTIL/common/rt_os_util.o
+RT5572_ap_util-y += UTIL/os/linux/rt_linux_symb.o
+RT5572_ap_util-y += UTIL/os/linux/rt_rbus_pci_util.o
+RT5572_ap_util-y += UTIL/os/linux/rt_usb_util.o
+RT5572_ap_util-y += UTIL/os/linux/rt_linux.o
+
+# MODULE module
+obj-$(CONFIG_RTUSB_AP) += RT5572_ap.o
+RT5572_ap-y += MODULE/common/crypt_md5.o
+RT5572_ap-y += MODULE/common/crypt_sha2.o
+RT5572_ap-y += MODULE/common/crypt_hmac.o
+RT5572_ap-y += MODULE/common/crypt_aes.o
+RT5572_ap-y += MODULE/common/crypt_arc4.o
+RT5572_ap-y += MODULE/common/mlme.o
+RT5572_ap-y += MODULE/common/cmm_wep.o
+RT5572_ap-y += MODULE/common/action.o
+RT5572_ap-y += MODULE/common/cmm_data.o
+RT5572_ap-y += MODULE/common/rtmp_init.o
+RT5572_ap-y += MODULE/common/rtmp_init_inf.o
+RT5572_ap-y += MODULE/common/cmm_tkip.o
+RT5572_ap-y += MODULE/common/cmm_aes.o
+RT5572_ap-y += MODULE/common/cmm_sync.o
+RT5572_ap-y += MODULE/common/eeprom.o
+RT5572_ap-y += MODULE/common/cmm_sanity.o
+RT5572_ap-y += MODULE/common/cmm_info.o
+RT5572_ap-y += MODULE/common/cmm_cfg.o
+RT5572_ap-y += MODULE/common/cmm_wpa.o
+RT5572_ap-y += MODULE/common/cmm_radar.o
+RT5572_ap-y += MODULE/common/spectrum.o
+RT5572_ap-y += MODULE/common/rtmp_timer.o
+RT5572_ap-y += MODULE/common/rt_channel.o
+RT5572_ap-y += MODULE/common/cmm_profile.o
+RT5572_ap-y += MODULE/common/cmm_asic.o
+RT5572_ap-y += MODULE/common/cmm_cmd.o
+RT5572_ap-y += MODULE/rate_ctrl/ra_ctrl.o
+RT5572_ap-y += MODULE/rate_ctrl/alg_legacy.o
+RT5572_ap-y += MODULE/rate_ctrl/alg_ags.o
+RT5572_ap-y += MODULE/os/linux/rt_profile.o
+RT5572_ap-y += MODULE/chips/rtmp_chip.o
+RT5572_ap-y += MODULE/ap/ap.o
+RT5572_ap-y += MODULE/ap/ap_assoc.o
+RT5572_ap-y += MODULE/ap/ap_auth.o
+RT5572_ap-y += MODULE/ap/ap_connect.o
+RT5572_ap-y += MODULE/ap/ap_mlme.o
+RT5572_ap-y += MODULE/ap/ap_sanity.o
+RT5572_ap-y += MODULE/ap/ap_sync.o
+RT5572_ap-y += MODULE/ap/ap_wpa.o
+RT5572_ap-y += MODULE/ap/ap_data.o
+RT5572_ap-y += MODULE/common/uapsd.o
+RT5572_ap-y += MODULE/ap/ap_autoChSel.o
+RT5572_ap-y += MODULE/ap/ap_qload.o
+RT5572_ap-y += MODULE/ap/ap_cfg.o
+RT5572_ap-y += MODULE/common/ba_action.o
+RT5572_ap-y += MODULE/common/cmm_mac_usb.o
+RT5572_ap-y += MODULE/common/rtusb_io.o
+RT5572_ap-y += MODULE/common/rtusb_data.o
+RT5572_ap-y += MODULE/common/cmm_data_usb.o
+RT5572_ap-y += MODULE/common/rtmp_mcu.o
+RT5572_ap-y += MODULE/common/rtusb_bulk.o
+RT5572_ap-y += MODULE/os/linux/rt_usb.o
+RT5572_ap-y += MODULE/common/ee_prom.o
+RT5572_ap-y += MODULE/common/cmm_dfs.o
+RT5572_ap-y += MODULE/common/cmm_cs.o
+RT5572_ap-y += MODULE/common/ee_prom.o
+RT5572_ap-y += MODULE/common/ee_efuse.o
+RT5572_ap-y += MODULE/common/rt_rf.o
+RT5572_ap-y += MODULE/os/linux/rt_symb.o
+RT5572_ap-y += MODULE/common/rt_led.o
+
+# NET module
+obj-$(CONFIG_RTUSB_AP) += RT5572_ap_net.o
+RT5572_ap_net-y += NETIF/common/rtusb_dev_id.o
+RT5572_ap_net-y += NETIF/os/linux/ap_ioctl.o
+RT5572_ap_net-y += NETIF/os/linux/rt_main_dev.o
+RT5572_ap_net-y += NETIF/os/linux/usb_main_dev.o
+
+# By feature
+ifeq ($(CONFIG_RTUSB_AP_WSC),y)
+RT5572_ap-y += MODULE/common/wsc.o
+RT5572_ap-y += MODULE/common/wsc_tlv.o
+RT5572_ap-y += MODULE/common/wsc_ufd.o
+RT5572_ap-y += MODULE/common/crypt_biginteger.o
+RT5572_ap-y += MODULE/common/crypt_dh.o
+RT5572_ap-y += MODULE/common/wsc_v2.o
+endif
+
+ifeq ($(CONFIG_RTUSB_WDS),y)
+RT5572_ap-y += MODULE/ap/ap_wds.o
+RT5572_ap-y += MODULE/common/client_wds.o
+RT5572_ap_net-y += NETIF/ap/ap_wds_inf.o
+endif
+
+ifeq ($(CONFIG_RTUSB_AP_MBSS),y)
+RT5572_ap-y += MODULE/ap/ap_mbss.o
+RT5572_ap_net-y += NETIF/ap/ap_mbss_inf.o
+endif
+
+ifeq ($(CONFIG_RTUSB_APCLI),y)
+RT5572_ap-y += MODULE/ap/ap_apcli.o
+RT5572_ap-y += MODULE/ap/apcli_ctrl.o
+RT5572_ap-y += MODULE/ap/apcli_sync.o
+RT5572_ap-y += MODULE/ap/apcli_auth.o
+RT5572_ap-y += MODULE/ap/apcli_assoc.o
+RT5572_ap-y += MODULE/common/cmm_mat.o
+RT5572_ap-y += MODULE/common/cmm_mat_iparp.o
+RT5572_ap-y += MODULE/common/cmm_mat_pppoe.o
+RT5572_ap-y += MODULE/common/cmm_mat_ipv6.o
+RT5572_ap_net-y += NETIF/ap/ap_apcli_inf.o
+endif
+
+ifeq ($(CONFIG_RTUSB_DFS),y)
+RT5572_ap-y += MODULE/common/cmm_dfs.o
+endif
+
+ifeq ($(CONFIG_RTUSB_CS),y)
+RT5572_ap-y += MODULE/common/cmm_cs.o
+endif
+
+ifeq ($(CONFIG_RTUSB_IGMP_SNOOP),y)
+RT5572_ap-y += MODULE/common/igmp_snoop.o
+endif
+
+ifeq ($(CONFIG_RTUSB_NETIF_BLOCK),y)
+RT5572_ap-y += MODULE/common/netif_block.o
+endif
+
+ifeq ($(CONFIG_RTUSB_DLS),y)
+RT5572_ap-y += MODULE/ap/ap_dls.o
+endif
+
+ifeq ($(CONFIG_RTUSB_IDS),y)
+RT5572_ap-y += MODULE/ap/ap_ids.o
+endif
+
+ifeq ($(CONFIG_RTUSB_AP_FLASH_SUPPORT),y)
+RT5572_ap-y += MODULE/common/ee_flash.o
+endif
+
+# WAPI
+ifeq ($(CONFIG_RTUSB_AP_WAPI),y)
+RT5572_ap-y += MODULE/common/wapi.o
+RT5572_ap-y += MODULE/common/wapi_sms4.o
+RT5572_ap-y += MODULE/common/wapi_crypt.o
+endif
+
+# Chip related
+ifeq ($(CONFIG_RT2870_AP),y)
+RT5572_ap-y += MODULE/chips/rt28xx.o
+endif
+
+ifeq ($(CONFIG_RT3572_AP),y)
+RT5572_ap-y += MODULE/chips/rt28xx.o
+RT5572_ap-y += MODULE/chips/rt30xx.o
+RT5572_ap-y += MODULE/chips/rt35xx.o
+endif
+
+ifeq ($(CONFIG_RT3573_AP),y)
+RT5572_ap-y += MODULE/chips/rt28xx.o
+RT5572_ap-y += MODULE/chips/rt30xx.o
+RT5572_ap-y += MODULE/chips/rt35xx.o
+RT5572_ap-y += MODULE/chips/rt3593.o
+endif
+
+ifeq ($(CONFIG_RT5572_AP),y)
+RT5572_ap-y += MODULE/chips/rt30xx.o
+RT5572_ap-y += MODULE/chips/rt5592.o
+endif
+
+# ATE
+ifeq ($(CONFIG_RTUSB_AP_ATE),y)
+RT5572_ap-y += MODULE/ate/common/rt_ate.o
+RT5572_ap-y += MODULE/ate/common/ate_usb.o
+endif
+
+ifeq ($(CONFIG_RT2870_AP_ATE),y)
+RT5572_ap-y += MODULE/ate/chips/rt28xx_ate.o
+endif
+
+ifeq ($(CONFIG_RT3572_AP_ATE),y)
+RT5572_ap-y += MODULE/ate/chips/rt28xx_ate.o
+RT5572_ap-y += MODULE/ate/chips/rt35xx_ate.o
+endif
+
+ifeq ($(CONFIG_RT5572_AP_ATE),y)
+RT5572_ap-y += MODULE/ate/chips/rt5592_ate.o
+endif
+
+# QA tool
+ifeq ($(CONFIG_RTUSB_AP_QA),y)
+RT5572_ap-y += MODULE/ate/common/rt_qa.o
+endif
+###################
+# CFLAGS
+###################
+EXTRA_CFLAGS += -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT -DLINUX\
+ -Wall -Wstrict-prototypes -Wno-trigraphs
+EXTRA_CFLAGS += -DSYSTEM_LOG_SUPPORT -DKTHREAD_SUPPORT
+EXTRA_CFLAGS += -DCONFIG_AP_SUPPORT -DUAPSD_SUPPORT -DIAPP_SUPPORT -DDBG\
+ -DDOT1X_SUPPORT -DAP_SCAN_SUPPORT
+EXTRA_CFLAGS += -DRTMP_MAC_USB -DRTMP_USB_SUPPORT
+EXTRA_CFLAGS += -DSTATS_COUNT_SUPPORT -DDOT11_N_SUPPORT -DRTDEV_SUPPORT
+
+
+ifeq ($(CONFIG_RTUSB_AP),m)
+EXTRA_CFLAGS += -DOS_ABL_SUPPORT
+EXTRA_CFLAGS += -DOS_ABL_FUNC_SUPPORT
+EXTRA_CFLAGS += -DOS_ABL_OS_PCI_SUPPORT
+EXTRA_CFLAGS += -DOS_ABL_OS_USB_SUPPORT
+EXTRA_CFLAGS += -DOS_ABL_OS_AP_SUPPORT
+endif
+
+ifeq ($(CONFIG_RTUSB_AP_WSC),y)
+EXTRA_CFLAGS += -DWSC_AP_SUPPORT -DWSC_INCLUDED -DWSC_V2_SUPPORT
+endif
+
+ifeq ($(CONFIG_RTUSB_WDS),y)
+EXTRA_CFLAGS += -DWDS_SUPPORT
+endif
+
+ifeq ($(CONFIG_RTUSB_MBSS),y)
+EXTRA_CFLAGS += -DMBSS_SUPPORT
+endif
+
+ifeq ($(CONFIG_RTUSB_APCLI),y)
+EXTRA_CFLAGS += -DAPCLI_SUPPORT
+EXTRA_CFLAGS += -DMAT_SUPPORT
+EXTRA_CFLAGS += -DAP_SCAN_SUPPORT
+endif
+
+ifeq ($(CONFIG_RTUSB_AP_DLS),y)
+EXTRA_CFLAGS += -DQOS_DLS_SUPPORT
+endif
+
+ifeq ($(CONFIG_RTUSB_IDS),y)
+EXTRA_CFLAGS += -DIDS_SUPPORT
+endif
+
+ifeq ($(CONFIG_RTUSB_AP_FLASH_SUPPORT), y)
+EXTRA_CFLAGS += -DRTMP_FLASH_SUPPORT
+endif
+
+ifeq ($(CONFIG_RTUSB_AP_80211N_DRAFT3),y)
+EXTRA_CFLAGS += -DDOT11N_DRAFT3
+endif
+
+ifeq ($(CONFIG_RTUSB_LLTD),y)
+EXTRA_CFLAGS += -DLLTD_SUPPORT
+endif
+
+ifeq ($(CONFIG_RTUSB_IGMP_SNOOP),y)
+EXTRA_CFLAGS += -DIGMP_SNOOP_SUPPORT
+endif
+
+ifeq ($(CONFIG_RTUSB_NETIF_BLOCK),y)
+EXTRA_CFLAGS += -DBLOCK_NET_IF
+endif
+
+# Chip related
+ifeq ($(CONFIG_RT2870_AP), y)
+EXTRA_CFLAGS += -DRT2870 -DRT28xx -DRTMP_TIMER_TASK_SUPPORT -DA_BAND_SUPPORT
+
+ifeq ($(CONFIG_RTUSB_DFS), y)
+EXTRA_CFLAGS += -DDFS_SOFTWARE_SUPPORT
+endif
+
+endif
+
+ifeq ($(CONFIG_RT3572_AP), y)
+EXTRA_CFLAGS += -DRT2870 -DRT28xx -DRT30xx -DRT35xx -DRT3572 -DRTMP_TIMER_TASK_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DA_BAND_SUPPORT -DVCORECAL_SUPPORT
+
+ifeq ($(CONFIG_RTUSB_DFS), y)
+EXTRA_CFLAGS += -DDFS_DEBUG
+endif
+
+ifeq ($(CONFIG_RTUSB_CS_SUPPORT), y)
+EXTRA_CFLAGS += -DCARRIER_DETECTION_FIRMWARE_SUPPORT
+endif
+
+endif
+
+ifeq ($(CONFIG_RT3573_AP), y)
+EXTRA_CFLAGS += -DRT30xx -DRT35xx -DRT3593 -DRT3573 -DA_BAND_SUPPORT -DDOT11N_SS3_SUPPORT -DVCORECAL_SUPPORT
+endif
+
+ifeq ($(CONFIG_RT5572_AP), y)
+EXTRA_CFLAGS += -DRT30xx -DRT5572 -DRT5592 -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DRTMP_TIMER_TASK_SUPPORT -DA_BAND_SUPPORT -DIQ_CAL_SUPPORT -DVCORECAL_SUPPORT -DRTMP_TEMPERATURE_COMPENSATION
+
+ifeq ($(CONFIG_RTUSB_DFS), y)
+EXTRA_CFLAGS += -DDFS_SOFTWARE_SUPPORT -DDFS_HARDWARE_SUPPORT -DDFS_DEBUG
+endif
+
+ifeq ($(CONFIG_RTUSB_CS_SUPPORT), y)
+EXTRA_CFLAGS += -DCARRIER_DETECTION_FIRMWARE_SUPPORT
+endif
+
+endif
+
+# ATE
+ifeq ($(CONFIG_RTUSB_AP_ATE), y)
+EXTRA_CFLAGS += -DRALINK_ATE -DCONFIG_RT2880_ATE_CMD_NEW
+endif
+
+# QA
+ifeq ($(CONFIG_RTUSB_AP_QA), y)
+EXTRA_CFLAGS += -DRALINK_QA
+endif
+
+# WAPI
+ifeq ($(CONFIG_RTUSB_AP_WAPI), y)
+EXTRA_CFLAGS += -DWAPI_SUPPORT -DSOFT_ENCRYPT -DEXPORT_SYMTAB
+endif
+
+# NEW MBSS
+ifeq ($(CONFIG_RTUSB_AP_NEW_MBSS_MODE), y)
+EXTRA_CFLAGS += -DNEW_MBSSID_MODE
+endif
+
+clean:
+ @rm -f common/*.o
+ @rm -f ap/*.o
+ @rm -f sta/*.o
+ @rm -f os/linux/*.o
+ @rm -f chips/*.o
+ @rm -f `find ./ -name *.o.cmd`
+ @rm -f *.ko
+ @rm -f *.o
diff --git a/cleopatre/devkit/mt7601udrv/os/linux/Makefile.clean b/cleopatre/devkit/mt7601udrv/os/linux/Makefile.clean
new file mode 100644
index 0000000000..495fd2bed1
--- /dev/null
+++ b/cleopatre/devkit/mt7601udrv/os/linux/Makefile.clean
@@ -0,0 +1,58 @@
+include $(RT28xx_DIR)/os/linux/config.mk
+
+PHONY := clean install uninstall
+
+clean:
+ rm -f ../../common/*.o
+ rm -f ../../common/.*.cmd .*.flags .*.d
+ rm -f ../../os/linux/*.o *.ko *.mod.o *.mod.c
+ rm -f ../../os/linux/.*.cmd .*.flags .*.d
+ rm -fr ../../os/linux/.tmp_versions
+#Must clean Module.symvers; or you will suffer symbol version not match
+#when OS_ABL = YES.
+ rm -f ../../os/linux/Module.symvers
+ rm -f ../../os/linux/Modules.symvers
+ rm -f ../../os/linux/Module.markers
+ rm -f ../../os/linux/modules.order
+ rm -f ../../chips/*.o
+ rm -f ../../chips/.*.cmd .*.flags .*.d
+ rm -f ../../rate_ctrl/*.o
+ rm -f ../../rate_ctrl/.*.cmd .*.flags .*.d
+ rm -f ../../ate/common/*.o
+ rm -f ../../ate/common/.*.cmd .*.flags .*.d
+ rm -f ../../ate/chips/*.o
+ rm -f ../../ate/chips/.*.cmd .*.flags .*.d
+ rm -f ../../phy/*.o
+ rm -f ../../phy/.*.cmd .*.flags .*.d
+ rm -f ../../mac/*.o
+ rm -f ../../mac/.*.cmd .*.flags .*.d
+ rm -f ../../mcu/*.o
+ rm -f ../../mcu/.*.cmd .*.flags .*.d
+ rm -f ../../mgmt/*.o
+ rm -f ../../mgmt/.*.cmd .*.flags .*.d
+ rm -f ../../naf/*.o
+ rm -f ../../naf/.*.cmd .*.flags .*.d
+ifeq ($(RT28xx_MODE),AP)
+ rm -f ../../ap/*.o
+ rm -f ../../ap/.*.cmd .*.flags .*.d
+else
+ifeq ($(RT28xx_MODE),STA)
+ rm -f ../../sta/*.o
+ rm -f ../../sta/.*.cmd .*.flags .*.d
+ifeq ($(HAS_P2P_SUPPORT),y)
+ rm -f ../../ap/*.o
+ rm -f ../../ap/.*.cmd .*.flags .*.d
+endif
+else
+ifeq ($(RT28xx_MODE),APSTA)
+ rm -f ../../ap/*.o
+ rm -f ../../ap/.*.cmd .*.flags .*.d
+ rm -f ../../sta/*.o
+ rm -f ../../sta/.*.cmd .*.flags .*.d
+endif
+endif
+endif
+
+# Declare the contents of the .PHONY variable as phony. We keep that
+# information in a variable so we can use it in if_changed and friends.
+.PHONY: $(PHONY)
diff --git a/cleopatre/devkit/mt7601udrv/os/linux/Makefile.libautoprovision.6 b/cleopatre/devkit/mt7601udrv/os/linux/Makefile.libautoprovision.6
new file mode 100644
index 0000000000..e285006206
--- /dev/null
+++ b/cleopatre/devkit/mt7601udrv/os/linux/Makefile.libautoprovision.6
@@ -0,0 +1,9 @@
+include $(RT28xx_DIR)/os/linux/config.mk
+
+#ifdef CONFIG_AP_SUPPORT
+
+ifeq ($(HAS_SAMSUNG_EASY_CONFIG_SUPPORT),y)
+lib-y := ../../common/auto_provision.o
+endif
+
+#endif // CONFIG_AP_SUPPORT //
diff --git a/cleopatre/devkit/mt7601udrv/os/linux/Makefile.libwapi.4 b/cleopatre/devkit/mt7601udrv/os/linux/Makefile.libwapi.4
new file mode 100644
index 0000000000..51c5f958e0
--- /dev/null
+++ b/cleopatre/devkit/mt7601udrv/os/linux/Makefile.libwapi.4
@@ -0,0 +1,23 @@
+#
+# Release file for AP Mode
+#
+include $(RT28xx_DIR)/os/linux/config.mk
+
+MOD_NAME = wapi_module
+
+OBJ := $(MOD_NAME).o
+
+WAPI_M_OBJ := \
+ $(RT28xx_DIR)/common/wapi_sms4.o\
+ $(RT28xx_DIR)/common/wapi_crypt.o
+
+PHONY := all
+
+all:$(OBJ)
+
+$(MOD_NAME).o: $(WAPI_M_OBJ)
+ $(LD) -r $^ -o $@
+
+# Declare the contents of the .PHONY variable as phony. We keep that
+# information in a variable so we can use it in if_changed and friends.
+.PHONY: $(PHONY) \ No newline at end of file
diff --git a/cleopatre/devkit/mt7601udrv/os/linux/Makefile.libwapi.6 b/cleopatre/devkit/mt7601udrv/os/linux/Makefile.libwapi.6
new file mode 100644
index 0000000000..8ce3d92b80
--- /dev/null
+++ b/cleopatre/devkit/mt7601udrv/os/linux/Makefile.libwapi.6
@@ -0,0 +1,11 @@
+#
+# Release file for AP Mode
+#
+include $(RT28xx_DIR)/os/linux/config.mk
+
+obj-m := wapi_module.o
+
+wapi_module-objs := \
+ ../../common/wapi_sms4.o\
+ ../../common/wapi_crypt.o
+ \ No newline at end of file
diff --git a/cleopatre/devkit/mt7601udrv/os/linux/Makefile.sta.soc b/cleopatre/devkit/mt7601udrv/os/linux/Makefile.sta.soc
new file mode 100644
index 0000000000..74d8eb8e66
--- /dev/null
+++ b/cleopatre/devkit/mt7601udrv/os/linux/Makefile.sta.soc
@@ -0,0 +1,275 @@
+EXTRA_CFLAGS = -Idrivers/net/wireless/rt2860v2/include -Idrivers/net/wireless/rt2860v2/ate/include
+
+obj-$(CONFIG_RT2860V2_STA) += rt2860v2_sta.o
+
+rt2860v2_sta-objs += ../rt2860v2/common/crypt_md5.o
+rt2860v2_sta-objs += ../rt2860v2/common/crypt_sha2.o
+rt2860v2_sta-objs += ../rt2860v2/common/crypt_hmac.o
+rt2860v2_sta-objs += ../rt2860v2/common/mlme.o
+rt2860v2_sta-objs += ../rt2860v2/common/cmm_wep.o
+rt2860v2_sta-objs += ../rt2860v2/common/action.o
+rt2860v2_sta-objs += ../rt2860v2/common/ba_action.o
+rt2860v2_sta-objs += ../rt2860v2/common/cmm_data.o
+rt2860v2_sta-objs += ../rt2860v2/common/rtmp_init.o
+rt2860v2_sta-objs += ../rt2860v2/common/rtmp_init_inf.o
+rt2860v2_sta-objs += ../rt2860v2/common/cmm_tkip.o
+rt2860v2_sta-objs += ../rt2860v2/common/cmm_aes.o
+rt2860v2_sta-objs += ../rt2860v2/common/cmm_sync.o
+rt2860v2_sta-objs += ../rt2860v2/common/cmm_sanity.o
+rt2860v2_sta-objs += ../rt2860v2/common/cmm_info.o
+rt2860v2_sta-objs += ../rt2860v2/common/cmm_wpa.o
+rt2860v2_sta-objs += ../rt2860v2/common/dfs.o
+#rt2860v2_sta-objs += ../rt2860v2/common/dfs_mcu.o
+rt2860v2_sta-objs += ../rt2860v2/common/spectrum.o
+rt2860v2_sta-objs += ../rt2860v2/common/rt_os_util.o
+
+rt2860v2_sta-objs += ../rt2860v2/common/rtmp_timer.o
+rt2860v2_sta-objs += ../rt2860v2/common/rt_channel.o
+rt2860v2_sta-objs += ../rt2860v2/common/cmm_profile.o
+rt2860v2_sta-objs += ../rt2860v2/common/cmm_asic.o
+rt2860v2_sta-objs += ../rt2860v2/common/rtmp_swmcu.o
+rt2860v2_sta-objs += ../rt2860v2/common/cmm_cfg.o
+rt2860v2_sta-objs += ../rt2860v2/common/eeprom.o
+rt2860v2_sta-objs += ../rt2860v2/common/ee_flash.o
+#rt2860v2_sta-objs += ../rt2860v2/common/rtmp_mcu.o
+
+rt2860v2_sta-objs += ../rt2860v2/common/cmm_mac_pci.o
+rt2860v2_sta-objs += ../rt2860v2/common/cmm_data_pci.o
+rt2860v2_sta-objs += ../rt2860v2/common/crypt_aes.o
+rt2860v2_sta-objs += ../rt2860v2/common/crypt_arc4.o
+rt2860v2_sta-objs += ../rt2860v2/common/cmm_cmd.o
+rt2860v2_sta-objs += ../rt2860v2/common/cmm_wpa_adhoc.o
+
+rt2860v2_sta-objs += ../rt2860v2/sta/assoc.o
+rt2860v2_sta-objs += ../rt2860v2/sta/auth.o
+rt2860v2_sta-objs += ../rt2860v2/sta/auth_rsp.o
+rt2860v2_sta-objs += ../rt2860v2/sta/sync.o
+rt2860v2_sta-objs += ../rt2860v2/sta/sanity.o
+rt2860v2_sta-objs += ../rt2860v2/sta/rtmp_data.o
+rt2860v2_sta-objs += ../rt2860v2/sta/connect.o
+rt2860v2_sta-objs += ../rt2860v2/sta/wpa.o
+rt2860v2_sta-objs += ../rt2860v2/sta/sta_cfg.o
+
+rt2860v2_sta-objs += ../rt2860v2/os/linux/rt_proc.o
+rt2860v2_sta-objs += ../rt2860v2/os/linux/rt_linux.o
+rt2860v2_sta-objs += ../rt2860v2/os/linux/rt_profile.o
+rt2860v2_sta-objs += ../rt2860v2/os/linux/rt_main_dev.o
+rt2860v2_sta-objs += ../rt2860v2/os/linux/sta_ioctl.o
+rt2860v2_sta-objs += ../rt2860v2/common/rt_ate.o
+rt2860v2_sta-objs += ../rt2860v2/chips/rtmp_chip.o
+
+rt2860v2_sta-objs += ../rt2860v2/os/linux/rbus_main_dev.o
+rt2860v2_sta-objs += ../rt2860v2/os/linux/rt_pci_rbus.o
+rt2860v2_sta-objs += ../rt2860v2/os/linux/rt_rbus_pci_util.o
+rt2860v2_sta-objs += ../rt2860v2/os/linux/rt_rbus_pci_drv.o
+
+ifeq ($(CONFIG_RALINK_RT2880),y)
+rt2860v2_sta-objs += ../rt2860v2/chips/rt2880.o
+endif
+
+ifeq ($(CONFIG_RALINK_RT3052),y)
+rt2860v2_sta-objs += ../rt2860v2/common/rt_rf.o
+rt2860v2_sta-objs += ../rt2860v2/chips/rt305x.o
+endif
+
+ifeq ($(CONFIG_RALINK_RT3352),y)
+rt2860v2_sta-objs += ../rt2860v2/common/rt_rf.o
+rt2860v2_sta-objs += ../rt2860v2/chips/rt305x.o
+rt2860v2_sta-objs += ../rt2860v2/chips/rt3352.o
+endif
+
+ifeq ($(CONFIG_RT3x52),y)
+rt2860v2_sta-objs += ../rt2860v2/common/rt_rf.o
+rt2860v2_sta-objs += ../rt2860v2/chips/rt305x.o
+rt2860v2_sta-objs += ../rt2860v2/chips/rt3352.o
+endif
+
+ifeq ($(CONFIG_RALINK_RT5350),y)
+rt2860v2_sta-objs += ../rt2860v2/common/rt_rf.o
+rt2860v2_sta-objs += ../rt2860v2/chips/rt305x.o
+rt2860v2_sta-objs += ../rt2860v2/chips/rt5350.o
+endif
+
+ifeq ($(CONFIG_RALINK_RT3883),y)
+rt2860v2_ap-objs += ../rt2860v2/common/rt_rf.o
+rt2860v2_ap-objs += ../rt2860v2/chips/rt3883.o
+ifeq ($(CONFIG_RT2860V2_STA_TXBF),y)
+rt2860v2_ap-objs += ../rt2860v2/common/cmm_txbf.o
+rt2860v2_ap-objs += ../rt2860v2/common/cmm_txbf_cal.o
+endif
+endif
+
+ifeq ($(CONFIG_RT2860V2_STA_LED),y)
+rt2860v2_sta-objs += ../rt2860v2/common/rt_led.o
+endif
+
+ifeq ($(CONFIG_RT2860V2_STA_WMM_ACM),y)
+rt2860v2_sta-objs += ../rt2860v2/common/acm_edca.o
+rt2860v2_sta-objs += ../rt2860v2/common/acm_comm.o
+rt2860v2_sta-objs += ../rt2860v2/common/acm_iocl.o
+endif
+
+#ifeq ($(CONFIG_RT2860V2_STA_WAPI),y)
+#rt2860v2_sta-objs += wapi.obj
+#rt2860v2_sta-objs += wapi_sms4.obj
+#rt2860v2_sta-objs += wapi_crypt.obj
+#endif
+
+#ifeq ($(CONFIG_RT2860V2_RT3XXX_STA_ANTENNA_DIVERSITY),y)
+#rt2860v2_sta-objs += ../rt2860v2/os/linux/ap_diversity.o
+#endif
+
+ifeq ($(CONFIG_RT2860V2_STA_MESH),y)
+rt2860v2_sta-objs += ../rt2860v2/common/mesh_bmpkt.o
+rt2860v2_sta-objs += ../rt2860v2/common/mesh_ctrl.o
+rt2860v2_sta-objs += ../rt2860v2/common/mesh_link_mng.o
+rt2860v2_sta-objs += ../rt2860v2/common/mesh_sanity.o
+rt2860v2_sta-objs += ../rt2860v2/common/mesh_tlv.o
+rt2860v2_sta-objs += ../rt2860v2/common/mesh.o
+rt2860v2_sta-objs += ../rt2860v2/common/mesh_inf.o
+rt2860v2_sta-objs += ../rt2860v2/common/mesh_forwarding.o
+rt2860v2_sta-objs += ../rt2860v2/common/mesh_path_mng.o
+endif
+
+ifeq ($(CONFIG_RT2860V2_STA_DLS),y)
+rt2860v2_sta-objs += ../rt2860v2/sta/dls.o
+endif
+
+ifeq ($(CONFIG_RT2860V2_STA_WSC),y)
+rt2860v2_sta-objs += ../rt2860v2/common/wsc.o
+rt2860v2_sta-objs += ../rt2860v2/common/wsc_tlv.o
+rt2860v2_sta-objs += ../rt2860v2/common/crypt_biginteger.o
+rt2860v2_sta-objs += ../rt2860v2/common/crypt_dh.o
+endif
+
+ifeq ($(CONFIG_RT2860V2_STA_ETH_CONVERT),y)
+rt2860v2_sta-objs += ../rt2860v2/common/cmm_mat.o
+rt2860v2_sta-objs += ../rt2860v2/common/cmm_mat_iparp.o
+rt2860v2_sta-objs += ../rt2860v2/common/cmm_mat_pppoe.o
+rt2860v2_sta-objs += ../rt2860v2/common/cmm_mat_ipv6.o
+endif
+
+ifeq ($(CONFIG_RT2860V2_STA_VIDEO_TURBINE),y)
+rt2860v2_sta-objs += ../rt2860v2/common/cmm_video.o
+endif
+
+###################
+# CFLAGS
+##################
+EXTRA_CFLAGS += -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT -DLINUX \
+ -Wall -Wstrict-prototypes -Wno-trigraphs
+
+EXTRA_CFLAGS += -DCONFIG_STA_SUPPORT -DDBG -DRTMP_RBUS_SUPPORT -DRTMP_MAC_PCI
+EXTRA_CFLAGS += -DDOT11_N_SUPPORT -DSTATS_COUNT_SUPPORT -DRELASE_EXCLUDE
+EXTRA_CFLAGS += -DRALINK_ATE -DRALINK_QA -DNEW_TXCONT -DNEW_TXCARRSUPP -DCONFIG_RT2880_ATE_CMD_NEW
+
+ifeq ($(CONFIG_RALINK_RT2880),y)
+EXTRA_CFLAGS += -DRT2880
+endif
+
+ifeq ($(CONFIG_RALINK_RT3052),y)
+ifeq ($(CONFIG_RALINK_RT3350),y)
+EXTRA_CFLAGS += -DRT3350 -DRT305x -DRTMP_RF_RW_SUPPORT
+else
+EXTRA_CFLAGS += -DRT3052 -DRT305x -DRTMP_RF_RW_SUPPORT
+endif
+endif
+
+ifeq ($(CONFIG_RALINK_RT3352),y)
+EXTRA_CFLAGS += -DRT3352 -DRT305x -DRTMP_RF_RW_SUPPORT -DSPECIFIC_BCN_BUF_SUPPORT -DVCORECAL_SUPPORT
+endif
+
+ifeq ($(CONFIG_RT3x52),y)
+EXTRA_CFLAGS += -DRT3052 -DRT3352 -DRT305x -DRTMP_RF_RW_SUPPORT -DSPECIFIC_BCN_BUF_SUPPORT -DVCORECAL_SUPPORT
+endif
+
+ifeq ($(CONFIG_RALINK_RT5350),y)
+EXTRA_CFLAGS += -DRT5350 -DRT305x -DRTMP_RF_RW_SUPPORT -DVCORECAL_SUPPORT
+endif
+
+ifeq ($(CONFIG_RALINK_RT3883),y)
+EXTRA_CFLAGS += -DRT3883 -DDOT11N_SS3_SUPPORT -DA_BAND_SUPPORT -DRTMP_RF_RW_SUPPORT -DSPECIFIC_BCN_BUF_SUPPORT -DVCORECAL_SUPPORT
+ifeq ($(CONFIG_RT2860V2_AP_TXBF),y)
+EXTRA_CFLAGS += -DTXBF_SUPPORT
+endif
+EXTRA_CFLAGS += -DSTREAM_MODE_SUPPORT
+endif
+
+ifeq ($(CONFIG_RT2860V2_STA_WPA_SUPPLICANT),y)
+EXTRA_CFLAGS += -DWPA_SUPPLICANT_SUPPORT
+endif
+
+ifeq ($(CONFIG_RT2860V2_STA_WMM_ACM),y)
+EXTRA_CFLAGS += -DWMM_ACM_SUPPORT
+endif
+
+ifeq ($(CONFIG_RT2860V2_STA_LED),y)
+EXTRA_CFLAGS += -DLED_CONTROL_SUPPORT -DCONFIG_SWMCU_SUPPORT
+ifeq ($(CONFIG_RT2860V2_STA_WSC),y)
+EXTRA_CFLAGS += -DWSC_LED_SUPPORT
+endif
+endif
+
+ifeq ($(CONFIG_RT2860V2_SNMP),y)
+EXTRA_CFLAGS += -DSNMP_SUPPORT
+endif
+
+ifeq ($(CONFIG_RT2860V2_STA_CARRIER),y)
+EXTRA_CFLAGS += -DCARRIER_DETECTION_SUPPORT
+endif
+
+ifeq ($(CONFIG_RT2860V2_EXT_CHANNEL_LIST),y)
+EXTRA_CFLAGS += -DEXT_BUILD_CHANNEL_LIST
+endif
+
+ifeq ($(CONFIG_RT2860V2_STA_IDS),y)
+EXTRA_CFLAGS += -DIDS_SUPPORT
+endif
+
+ifeq ($(CONFIG_RT2860V2_STA_DLS),y)
+EXTRA_CFLAGS += -DQOS_DLS_SUPPORT
+endif
+
+#ifeq ($(CONFIG_RT2860V2_STA_WAPI),y)
+#EXTRA_CFLAGS += -DWAPI_SUPPORT
+#ifeq ($(CONFIG_RALINK_RT3052),y)
+#EXTRA_CFLAGS += -DWAPI_SUPPORT -DSOFT_ENCRYPT
+#endif
+#endif
+
+ifeq ($(CONFIG_RT2860V2_STA_MESH),y)
+EXTRA_CFLAGS += -DMESH_SUPPORT -DINTEL_CMPC
+endif
+
+ifeq ($(CONFIG_RT2860V2_RT3XXX_STA_ANTENNA_DIVERSITY),y)
+EXTRA_CFLAGS += -DRT3XXX_ANTENNA_DIVERSITY_SUPPORT
+endif
+
+ifeq ($(CONFIG_RT2860V2_HW_STA_ANTENNA_DIVERSITY),y)
+EXTRA_CFLAGS += -DHW_ANTENNA_DIVERSITY_SUPPORT
+endif
+
+ifeq ($(CONFIG_RT2860V2_STA_WSC),y)
+EXTRA_CFLAGS += -DWSC_STA_SUPPORT
+endif
+
+ifeq ($(CONFIG_RT2860V2_STA_ETH_CONVERT),y)
+EXTRA_CFLAGS += -DETH_CONVERT_SUPPORT -DMAT_SUPPORT
+endif
+
+ifeq ($(CONFIG_RT2860V2_STA_VIDEO_TURBINE),y)
+EXTRA_CFLAGS += -DVIDEO_TURBINE_SUPPORT
+endif
+
+ifeq ($(CONFIG_RA_NETWORK_WORKQUEUE_BH),y)
+EXTRA_CFLAGS += -DWORKQUEUE_BH
+endif
+
+ifeq ($(CONFIG_RT2860V2_STA_RTMP_INTERNAL_TX_ALC),y)
+EXTRA_CFLAGS += -DRTMP_INTERNAL_TX_ALC
+endif
+
+ifeq ($(CONFIG_RT2860V2_STA_80211N_DRAFT3),y)
+EXTRA_CFLAGS += -DDOT11N_DRAFT3
+endif
+
diff --git a/cleopatre/devkit/mt7601udrv/os/linux/ap_ioctl.c b/cleopatre/devkit/mt7601udrv/os/linux/ap_ioctl.c
new file mode 100644
index 0000000000..b2aad0d8bb
--- /dev/null
+++ b/cleopatre/devkit/mt7601udrv/os/linux/ap_ioctl.c
@@ -0,0 +1,441 @@
+/****************************************************************************
+ * Ralink Tech Inc.
+ * 4F, No. 2 Technology 5th Rd.
+ * Science-based Industrial Park
+ * Hsin-chu, Taiwan, R.O.C.
+ * (c) Copyright 2002, Ralink Technology, Inc.
+ *
+ * All rights reserved. Ralink's source code is an unpublished work and the
+ * use of a copyright notice does not imply otherwise. This source code
+ * contains confidential trade secret material of Ralink Tech. Any attemp
+ * or participation in deciphering, decoding, reverse engineering or in any
+ * way altering the source code is stricitly prohibited, unless the prior
+ * written consent of Ralink Technology, Inc. is obtained.
+ ****************************************************************************
+
+ Module Name:
+ ap_ioctl.c
+
+ Abstract:
+ IOCTL related subroutines
+
+ Revision History:
+ Who When What
+ --------- ---------- ----------------------------------------------
+*/
+#define RTMP_MODULE_OS
+
+/*#include "rt_config.h" */
+#include "rtmp_comm.h"
+#include "rt_os_util.h"
+#include "rt_os_net.h"
+#include <linux/wireless.h>
+
+struct iw_priv_args ap_privtab[] = {
+{ RTPRIV_IOCTL_SET,
+/* 1024 --> 1024 + 512 */
+/* larger size specific to allow 64 ACL MAC addresses to be set up all at once. */
+ IW_PRIV_TYPE_CHAR | 1536, 0,
+ "set"},
+{ RTPRIV_IOCTL_SHOW,
+ IW_PRIV_TYPE_CHAR | 1024, 0,
+ "show"},
+{ RTPRIV_IOCTL_GSITESURVEY,
+ IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | 1024 ,
+ "get_site_survey"},
+#ifdef INF_AR9
+ { RTPRIV_IOCTL_GET_AR9_SHOW,
+ IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | 1024 ,
+ "ar9_show"},
+#endif
+ { RTPRIV_IOCTL_SET_WSCOOB,
+ IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | 1024 ,
+ "set_wsc_oob"},
+{ RTPRIV_IOCTL_GET_MAC_TABLE,
+ IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | 1024 ,
+ "get_mac_table"},
+{ RTPRIV_IOCTL_E2P,
+ IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | 1024,
+ "e2p"},
+#ifdef DBG
+{ RTPRIV_IOCTL_BBP,
+ IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | 1024,
+ "bbp"},
+{ RTPRIV_IOCTL_MAC,
+ IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | 1024,
+ "mac"},
+{ RTPRIV_IOCTL_RF,
+ IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | 1024,
+ "rf"},
+#endif /* DBG */
+
+#ifdef WSC_AP_SUPPORT
+{ RTPRIV_IOCTL_WSC_PROFILE,
+ IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | 1024 ,
+ "get_wsc_profile"},
+#endif /* WSC_AP_SUPPORT */
+{ RTPRIV_IOCTL_QUERY_BATABLE,
+ IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | 1024 ,
+ "get_ba_table"},
+{ RTPRIV_IOCTL_STATISTICS,
+ IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | 1024,
+ "stat"}
+};
+
+
+#ifdef CONFIG_APSTA_MIXED_SUPPORT
+const struct iw_handler_def rt28xx_ap_iw_handler_def =
+{
+#define N(a) (sizeof (a) / sizeof (a[0]))
+ .private_args = (struct iw_priv_args *) ap_privtab,
+ .num_private_args = N(ap_privtab),
+#if IW_HANDLER_VERSION >= 7
+ .get_wireless_stats = rt28xx_get_wireless_stats,
+#endif
+};
+#endif /* CONFIG_APSTA_MIXED_SUPPORT */
+
+
+INT rt28xx_ap_ioctl(
+ IN struct net_device *net_dev,
+ IN OUT struct ifreq *rq,
+ IN INT cmd)
+{
+ VOID *pAd = NULL;
+ struct iwreq *wrqin = (struct iwreq *) rq;
+ RTMP_IOCTL_INPUT_STRUCT rt_wrq, *wrq = &rt_wrq;
+ INT Status = NDIS_STATUS_SUCCESS;
+ USHORT subcmd; /*, index; */
+/* POS_COOKIE pObj; */
+ INT apidx=0;
+ UINT32 org_len;
+ RT_CMD_AP_IOCTL_CONFIG IoctlConfig, *pIoctlConfig = &IoctlConfig;
+
+ GET_PAD_FROM_NET_DEV(pAd, net_dev);
+/* pObj = (POS_COOKIE) pAd->OS_Cookie; */
+
+ if (pAd == NULL)
+ {
+ /* if 1st open fail, pAd will be free;
+ So the net_dev->priv will be NULL in 2rd open */
+ return -ENETDOWN;
+ }
+
+ wrq->u.data.pointer = wrqin->u.data.pointer;
+ wrq->u.data.length = wrqin->u.data.length;
+ org_len = wrq->u.data.length;
+
+ pIoctlConfig->Status = 0;
+ pIoctlConfig->net_dev = net_dev;
+ pIoctlConfig->priv_flags = RT_DEV_PRIV_FLAGS_GET(net_dev);
+ pIoctlConfig->pCmdData = wrqin->u.data.pointer;
+ pIoctlConfig->CmdId_RTPRIV_IOCTL_SET = RTPRIV_IOCTL_SET;
+ pIoctlConfig->name = net_dev->name;
+ pIoctlConfig->apidx = 0;
+
+ if ((cmd != SIOCGIWPRIV) &&
+ RTMP_AP_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_PREPARE, 0,
+ pIoctlConfig, 0) != NDIS_STATUS_SUCCESS)
+ {
+ /* prepare error */
+ Status = pIoctlConfig->Status;
+ goto LabelExit;
+ }
+
+ apidx = pIoctlConfig->apidx;
+
+ /*+ patch for SnapGear Request even the interface is down */
+ if(cmd== SIOCGIWNAME){
+ DBGPRINT(RT_DEBUG_TRACE, ("IOCTL::SIOCGIWNAME\n"));
+
+ RTMP_COM_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_SIOCGIWNAME, 0, wrqin->u.name, 0);
+
+ return Status;
+ }/*- patch for SnapGear */
+
+
+ switch(cmd)
+ {
+ case RTPRIV_IOCTL_ATE:
+ {
+ RTMP_COM_IoctlHandle(pAd, wrq, CMD_RTPRIV_IOCTL_ATE, 0, wrqin->ifr_name, 0);
+ }
+ break;
+
+ case SIOCGIFHWADDR:
+ DBGPRINT(RT_DEBUG_TRACE, ("IOCTLIOCTLIOCTL::SIOCGIFHWADDR\n"));
+ RTMP_AP_IoctlHandle(pAd, wrq, CMD_RTPRIV_IOCTL_AP_SIOCGIFHWADDR, 0, NULL, 0);
+/* if (pObj->ioctl_if < MAX_MBSSID_NUM(pAd)) */
+/* strcpy((PSTRING) wrq->u.name, (PSTRING) pAd->ApCfg.MBSSID[pObj->ioctl_if].Bssid); */
+ break;
+ case SIOCSIWESSID: /*Set ESSID */
+ break;
+ case SIOCGIWESSID: /*Get ESSID */
+ {
+ RT_CMD_AP_IOCTL_SSID IoctlSSID, *pIoctlSSID = &IoctlSSID;
+ struct iw_point *erq = &wrqin->u.essid;
+ PCHAR pSsidStr = NULL;
+
+ erq->flags=1;
+ /*erq->length = pAd->ApCfg.MBSSID[pObj->ioctl_if].SsidLen; */
+
+ pIoctlSSID->priv_flags = RT_DEV_PRIV_FLAGS_GET(net_dev);
+ pIoctlSSID->apidx = apidx;
+ RTMP_AP_IoctlHandle(pAd, wrq, CMD_RTPRIV_IOCTL_AP_SIOCGIWESSID, 0, pIoctlSSID, 0);
+
+ pSsidStr = (PCHAR)pIoctlSSID->pSsidStr;
+ erq->length = pIoctlSSID->length;
+
+
+ if((erq->pointer) && (pSsidStr != NULL))
+ {
+ /*if(copy_to_user(erq->pointer, pAd->ApCfg.MBSSID[pObj->ioctl_if].Ssid, erq->length)) */
+ if(copy_to_user(erq->pointer, pSsidStr, erq->length))
+ {
+ Status = RTMP_IO_EFAULT;
+ break;
+ }
+ }
+ DBGPRINT(RT_DEBUG_TRACE, ("IOCTL::SIOCGIWESSID (Len=%d, ssid=%s...)\n", erq->length, (char *)erq->pointer));
+ }
+ break;
+ case SIOCGIWNWID: /* get network id */
+ case SIOCSIWNWID: /* set network id (the cell) */
+ Status = RTMP_IO_EOPNOTSUPP;
+ break;
+ case SIOCGIWFREQ: /* get channel/frequency (Hz) */
+ {
+ ULONG Channel;
+ RTMP_DRIVER_CHANNEL_GET(pAd, &Channel);
+ wrqin->u.freq.m = Channel; /*pAd->CommonCfg.Channel; */
+ wrqin->u.freq.e = 0;
+ wrqin->u.freq.i = 0;
+ }
+ break;
+ case SIOCSIWFREQ: /*set channel/frequency (Hz) */
+ Status = RTMP_IO_EOPNOTSUPP;
+ break;
+ case SIOCGIWNICKN:
+ case SIOCSIWNICKN: /*set node name/nickname */
+ Status = RTMP_IO_EOPNOTSUPP;
+ break;
+ case SIOCGIWRATE: /*get default bit rate (bps) */
+ {
+ RT_CMD_IOCTL_RATE IoctlRate, *pIoctlRate = &IoctlRate;
+
+ pIoctlRate->priv_flags = RT_DEV_PRIV_FLAGS_GET(net_dev);
+ RTMP_DRIVER_BITRATE_GET(pAd, pIoctlRate);
+
+
+ wrqin->u.bitrate.value = pIoctlRate->BitRate;
+ wrqin->u.bitrate.disabled = 0;
+ }
+ break;
+ case SIOCSIWRATE: /*set default bit rate (bps) */
+ case SIOCGIWRTS: /* get RTS/CTS threshold (bytes) */
+ case SIOCSIWRTS: /*set RTS/CTS threshold (bytes) */
+ case SIOCGIWFRAG: /*get fragmentation thr (bytes) */
+ case SIOCSIWFRAG: /*set fragmentation thr (bytes) */
+ case SIOCGIWENCODE: /*get encoding token & mode */
+ case SIOCSIWENCODE: /*set encoding token & mode */
+ Status = RTMP_IO_EOPNOTSUPP;
+ break;
+ case SIOCGIWAP: /*get access point MAC addresses */
+ {
+/* PCHAR pBssidStr; */
+
+ wrqin->u.ap_addr.sa_family = ARPHRD_ETHER;
+ /*memcpy(wrqin->u.ap_addr.sa_data, &pAd->ApCfg.MBSSID[pObj->ioctl_if].Bssid, ETH_ALEN); */
+
+ RTMP_AP_IoctlHandle(pAd, wrq, CMD_RTPRIV_IOCTL_AP_SIOCGIWAP, 0,
+ wrqin->u.ap_addr.sa_data, RT_DEV_PRIV_FLAGS_GET(net_dev));
+ }
+ break;
+ case SIOCGIWMODE: /*get operation mode */
+ wrqin->u.mode = IW_MODE_INFRA; /*SoftAP always on INFRA mode. */
+ break;
+ case SIOCSIWAP: /*set access point MAC addresses */
+ case SIOCSIWMODE: /*set operation mode */
+ case SIOCGIWSENS: /*get sensitivity (dBm) */
+ case SIOCSIWSENS: /*set sensitivity (dBm) */
+ case SIOCGIWPOWER: /*get Power Management settings */
+ case SIOCSIWPOWER: /*set Power Management settings */
+ case SIOCGIWTXPOW: /*get transmit power (dBm) */
+ case SIOCSIWTXPOW: /*set transmit power (dBm) */
+ /*case SIOCGIWRANGE: //Get range of parameters */
+ case SIOCGIWRETRY: /*get retry limits and lifetime */
+ case SIOCSIWRETRY: /*set retry limits and lifetime */
+ Status = RTMP_IO_EOPNOTSUPP;
+ break;
+ case SIOCGIWRANGE: /*Get range of parameters */
+ {
+/* struct iw_range range; */
+ struct iw_range *prange = NULL;
+ UINT32 len;
+
+ /* allocate memory */
+ os_alloc_mem(NULL, (UCHAR **)&prange, sizeof(struct iw_range));
+ if (prange == NULL)
+ {
+ DBGPRINT(RT_DEBUG_ERROR, ("%s: Allocate memory fail!!!\n", __FUNCTION__));
+ break;
+ }
+
+ memset(prange, 0, sizeof(struct iw_range));
+ prange->we_version_compiled = WIRELESS_EXT;
+ prange->we_version_source = 14;
+
+ /*
+ what is correct max? This was not
+ documented exactly. At least
+ 69 has been observed.
+ */
+ prange->max_qual.qual = 100;
+ prange->max_qual.level = 0; /* dB */
+ prange->max_qual.noise = 0; /* dB */
+ len = copy_to_user(wrq->u.data.pointer, prange, sizeof(struct iw_range));
+ os_free_mem(NULL, prange);
+ }
+ break;
+
+ case RT_PRIV_IOCTL:
+ case RT_PRIV_IOCTL_EXT:
+ {
+ subcmd = wrqin->u.data.flags;
+
+ Status = RTMP_AP_IoctlHandle(pAd, wrq, CMD_RT_PRIV_IOCTL, subcmd, wrqin->u.data.pointer, 0);
+ }
+ break;
+
+#ifdef HOSTAPD_SUPPORT
+ case SIOCSIWGENIE:
+ DBGPRINT(RT_DEBUG_TRACE,("ioctl SIOCSIWGENIE apidx=%d\n",apidx));
+ DBGPRINT(RT_DEBUG_TRACE,("ioctl SIOCSIWGENIE length=%d, pointer=%x\n", wrqin->u.data.length, wrqin->u.data.pointer));
+
+
+ RTMP_AP_IoctlHandle(pAd, wrqin, CMD_RTPRIV_IOCTL_AP_SIOCSIWGENIE, 0, NULL, 0);
+ break;
+#endif /* HOSTAPD_SUPPORT */
+
+ case SIOCGIWPRIV:
+ if (wrqin->u.data.pointer)
+ {
+ if ( access_ok(VERIFY_WRITE, wrqin->u.data.pointer, sizeof(ap_privtab)) != TRUE)
+ break;
+ if ((sizeof(ap_privtab) / sizeof(ap_privtab[0])) <= wrq->u.data.length)
+ {
+ wrqin->u.data.length = sizeof(ap_privtab) / sizeof(ap_privtab[0]);
+ if (copy_to_user(wrqin->u.data.pointer, ap_privtab, sizeof(ap_privtab)))
+ Status = RTMP_IO_EFAULT;
+ }
+ else
+ Status = RTMP_IO_E2BIG;
+ }
+ break;
+ case RTPRIV_IOCTL_SET:
+ {
+ if( access_ok(VERIFY_READ, wrqin->u.data.pointer, wrqin->u.data.length) == TRUE)
+ Status = RTMP_AP_IoctlHandle(pAd, wrq, CMD_RTPRIV_IOCTL_SET, 0, NULL, 0);
+ }
+ break;
+
+ case RTPRIV_IOCTL_SHOW:
+ {
+ if( access_ok(VERIFY_READ, wrqin->u.data.pointer, wrqin->u.data.length) == TRUE)
+ Status = RTMP_AP_IoctlHandle(pAd, wrq, CMD_RTPRIV_IOCTL_SHOW, 0, NULL, 0);
+ }
+ break;
+
+#ifdef INF_AR9
+#ifdef AR9_MAPI_SUPPORT
+ case RTPRIV_IOCTL_GET_AR9_SHOW:
+ {
+ if( access_ok(VERIFY_READ, wrqin->u.data.pointer, wrqin->u.data.length) == TRUE)
+ Status = RTMP_AP_IoctlHandle(pAd, wrq, CMD_RTPRIV_IOCTL_GET_AR9_SHOW, 0, NULL, 0);
+ }
+ break;
+#endif /*AR9_MAPI_SUPPORT*/
+#endif /* INF_AR9 */
+
+#ifdef WSC_AP_SUPPORT
+ case RTPRIV_IOCTL_SET_WSCOOB:
+ RTMP_AP_IoctlHandle(pAd, wrq, CMD_RTPRIV_IOCTL_SET_WSCOOB, 0, NULL, 0);
+ break;
+#endif/*WSC_AP_SUPPORT*/
+
+/* modified by Red@Ralink, 2009/09/30 */
+ case RTPRIV_IOCTL_GET_MAC_TABLE:
+ RTMP_AP_IoctlHandle(pAd, wrq, CMD_RTPRIV_IOCTL_GET_MAC_TABLE, 0, NULL, 0);
+ break;
+
+ case RTPRIV_IOCTL_GET_MAC_TABLE_STRUCT:
+ RTMP_AP_IoctlHandle(pAd, wrq, CMD_RTPRIV_IOCTL_GET_MAC_TABLE_STRUCT, 0, NULL, 0);
+ break;
+/* end of modification */
+
+#ifdef AP_SCAN_SUPPORT
+ case RTPRIV_IOCTL_GSITESURVEY:
+ RTMP_AP_IoctlHandle(pAd, wrq, CMD_RTPRIV_IOCTL_GSITESURVEY, 0, NULL, 0);
+ break;
+#endif /* AP_SCAN_SUPPORT */
+
+ case RTPRIV_IOCTL_STATISTICS:
+ RTMP_AP_IoctlHandle(pAd, wrq, CMD_RTPRIV_IOCTL_STATISTICS, 0, NULL, 0);
+ break;
+
+#ifdef WSC_AP_SUPPORT
+ case RTPRIV_IOCTL_WSC_PROFILE:
+ RTMP_AP_IoctlHandle(pAd, wrq, CMD_RTPRIV_IOCTL_WSC_PROFILE, 0, NULL, 0);
+ break;
+#endif /* WSC_AP_SUPPORT */
+#ifdef DOT11_N_SUPPORT
+ case RTPRIV_IOCTL_QUERY_BATABLE:
+ RTMP_AP_IoctlHandle(pAd, wrq, CMD_RTPRIV_IOCTL_QUERY_BATABLE, 0, NULL, 0);
+ break;
+#endif /* DOT11_N_SUPPORT */
+ case RTPRIV_IOCTL_E2P:
+ RTMP_AP_IoctlHandle(pAd, wrq, CMD_RTPRIV_IOCTL_E2P, 0, NULL, 0);
+ break;
+
+#ifdef DBG
+ case RTPRIV_IOCTL_BBP:
+ RTMP_AP_IoctlHandle(pAd, wrq, CMD_RTPRIV_IOCTL_BBP, 0, NULL, 0);
+ break;
+
+ case RTPRIV_IOCTL_MAC:
+ RTMP_AP_IoctlHandle(pAd, wrq, CMD_RTPRIV_IOCTL_MAC, 0, NULL, 0);
+ break;
+
+ case RTPRIV_IOCTL_RF:
+ RTMP_AP_IoctlHandle(pAd, wrq, CMD_RTPRIV_IOCTL_RF, 0, NULL, 0);
+ break;
+#endif /* DBG */
+
+ default:
+/* DBGPRINT(RT_DEBUG_ERROR, ("IOCTL::unknown IOCTL's cmd = 0x%08x\n", cmd)); */
+ Status = RTMP_IO_EOPNOTSUPP;
+ break;
+ }
+
+LabelExit:
+ if (Status != 0)
+ {
+ RT_CMD_STATUS_TRANSLATE(Status);
+ }
+ else
+ {
+ /*
+ If wrq length is modified, we reset the lenght of origin wrq;
+
+ Or we can not modify it because the address of wrq->u.data.length
+ maybe same as other union field, ex: iw_range, etc.
+
+ if the length is not changed but we change it, the value for other
+ union will also be changed, this is not correct.
+ */
+ if (wrq->u.data.length != org_len)
+ wrqin->u.data.length = wrq->u.data.length;
+ }
+
+ return Status;
+}
diff --git a/cleopatre/devkit/mt7601udrv/os/linux/br_ftph.c b/cleopatre/devkit/mt7601udrv/os/linux/br_ftph.c
new file mode 100644
index 0000000000..6e5eb6e55d
--- /dev/null
+++ b/cleopatre/devkit/mt7601udrv/os/linux/br_ftph.c
@@ -0,0 +1,195 @@
+/****************************************************************************
+ * Ralink Tech Inc.
+ * 4F, No. 2 Technology 5th Rd.
+ * Science-based Industrial Park
+ * Hsin-chu, Taiwan, R.O.C.
+ * (c) Copyright 2002, Ralink Technology, Inc.
+ *
+ * All rights reserved. Ralink's source code is an unpublished work and the
+ * use of a copyright notice does not imply otherwise. This source code
+ * contains confidential trade secret material of Ralink Tech. Any attemp
+ * or participation in deciphering, decoding, reverse engineering or in any
+ * way altering the source code is stricitly prohibited, unless the prior
+ * written consent of Ralink Technology, Inc. is obtained.
+ ****************************************************************************
+
+ Module Name:
+ bg_ftph.c
+
+ Abstract:
+ Provide fast path between LAN and WLAN.
+
+ Revision History:
+ Who When What
+ -------- ---------- ----------------------------------------------
+ Sample Lin 01-22-2008 Created
+
+ */
+
+#include "rt_config.h"
+
+#ifdef BG_FT_SUPPORT
+#if defined(CONFIG_BRIDGE) || defined(CONFIG_BRIDGE_MODULE)
+#include <linux/netfilter_bridge.h>
+#include "../net/bridge/br_private.h"
+
+/* extern export symbol in other drivers */
+/*
+ Example in other drivers:
+ UINT32 (*RALINK_FP_Handle)(PNDIS_PACKET pPacket);
+ EXPORT_SYMBOL(RALINK_FP_Handle);
+
+ packet_forward()
+ {
+ UINT32 HandRst = 1;
+
+ ......
+
+ if (RALINK_FP_Handle != NULL)
+ HandRst = RALINK_FP_Handle(skb);
+
+ if (HandRst != 0)
+ {
+ /* pass the packet to upper layer */
+ skb->protocol = eth_type_trans(skb, skb->dev);
+ netif_rx(skb);
+ }
+ }
+*/
+UINT32 BG_FTPH_PacketFromApHandle(
+ IN PNDIS_PACKET pPacket);
+
+#ifdef BG_FT_OPEN_SUPPORT
+extern UINT32 (*RALINK_FP_Handle)(PNDIS_PACKET pPacket);
+#else
+UINT32 (*RALINK_FP_Handle)(PNDIS_PACKET pPacket);
+#endif /* BG_FT_OPEN_SUPPORT */
+
+
+
+
+/* --------------------------------- Public -------------------------------- */
+
+/*
+========================================================================
+Routine Description:
+ Init bridge fast path module.
+
+Arguments:
+ None
+
+Return Value:
+ None
+
+Note:
+ Used in module init.
+========================================================================
+*/
+VOID BG_FTPH_Init(VOID)
+{
+ RALINK_FP_Handle = BG_FTPH_PacketFromApHandle;
+}
+
+
+/*
+========================================================================
+Routine Description:
+ Remove bridge fast path module.
+
+Arguments:
+ None
+
+Return Value:
+ None
+
+Note:
+ Used in module remove.
+========================================================================
+*/
+VOID BG_FTPH_Remove(VOID)
+{
+ RALINK_FP_Handle = NULL;
+} /* End of BG_FTPH_Init */
+
+
+
+
+/*
+========================================================================
+Routine Description:
+ Forward the received packet.
+
+Arguments:
+ pPacket - the received packet
+
+Return Value:
+ None
+
+Note:
+========================================================================
+*/
+UINT32 BG_FTPH_PacketFromApHandle(
+ IN PNDIS_PACKET pPacket)
+{
+ struct net_device *pNetDev;
+ struct sk_buff *pRxPkt;
+ struct net_bridge_fdb_entry *pSrcFdbEntry, *pDstFdbEntry;
+
+
+ /* init */
+ pRxPkt = RTPKT_TO_OSPKT(pPacket);
+ pNetDev = pRxPkt->dev;
+
+ /* if pNetDev is promisc mode ??? */
+ DBGPRINT(RT_DEBUG_INFO, ("ft bg> BG_FTPH_PacketFromApHandle\n"));
+
+ if (pNetDev != NULL)
+ {
+ if (pNetDev->br_port != NULL)
+ {
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,12)
+ pDstFdbEntry = br_fdb_get_hook(pNetDev->br_port->br, pRxPkt->data);
+ pSrcFdbEntry = br_fdb_get_hook(pNetDev->br_port->br, pRxPkt->data + 6);
+#else
+ /* br_fdb_get is not exported symbol, need exported in net/bridge/br.c */
+ pDstFdbEntry = br_fdb_get(pNetDev->br_port->br, pRxPkt->data);
+ pSrcFdbEntry = br_fdb_get(pNetDev->br_port->br, pRxPkt->data + 6);
+#endif
+
+ /* check destination address in bridge forwarding table */
+ if ((pSrcFdbEntry == NULL) ||
+ (pDstFdbEntry == NULL) ||
+ (pDstFdbEntry->is_local) ||
+ (pDstFdbEntry->dst == NULL) ||
+ (pDstFdbEntry->dst->dev == NULL) ||
+ (pDstFdbEntry->dst->dev == pNetDev) ||
+ (pNetDev->br_port->state != BR_STATE_FORWARDING) ||
+ ((pSrcFdbEntry->dst != NULL) &&
+ (pSrcFdbEntry->dst->dev != NULL) &&
+ (pSrcFdbEntry->dst->dev != pNetDev)))
+ {
+
+ goto LabelPassToUpperLayer;
+ } /* End of if */
+
+ if ((!pDstFdbEntry->is_local) &&
+ (pDstFdbEntry->dst != NULL) &&
+ (pDstFdbEntry->dst->dev != NULL))
+ {
+ pRxPkt->dev = pDstFdbEntry->dst->dev;
+ pDstFdbEntry->dst->dev->hard_start_xmit(pRxPkt, pDstFdbEntry->dst->dev);
+ return 0;
+ } /* End of if */
+ } /* End of if */
+ } /* End of if */
+
+LabelPassToUpperLayer:
+ DBGPRINT(RT_DEBUG_TRACE, ("ft bg> Pass packet to bridge module.\n"));
+ return 1;
+} /* End of BG_FTPH_PacketFromApHandle */
+
+
+#endif /* CONFIG_BRIDGE || CONFIG_BRIDGE_MODULE */
+#endif /* BG_FT_SUPPORT */
+
+/* End of bg_ftph.c */
diff --git a/cleopatre/devkit/mt7601udrv/os/linux/cfg80211.c b/cleopatre/devkit/mt7601udrv/os/linux/cfg80211.c
new file mode 100644
index 0000000000..00fd0e22d8
--- /dev/null
+++ b/cleopatre/devkit/mt7601udrv/os/linux/cfg80211.c
@@ -0,0 +1,1576 @@
+/****************************************************************************
+ * Ralink Tech Inc.
+ * Taiwan, R.O.C.
+ *
+ * (c) Copyright 2009, Ralink Technology, Inc.
+ *
+ * All rights reserved. Ralink's source code is an unpublished work and the
+ * use of a copyright notice does not imply otherwise. This source code
+ * contains confidential trade secret material of Ralink Tech. Any attemp
+ * or participation in deciphering, decoding, reverse engineering or in any
+ * way altering the source code is stricitly prohibited, unless the prior
+ * written consent of Ralink Technology, Inc. is obtained.
+ ***************************************************************************/
+
+/****************************************************************************
+
+ Abstract:
+
+ All related CFG80211 function body.
+
+ History:
+ 1. 2009/09/17 Sample Lin
+ (1) Init version.
+ 2. 2009/10/27 Sample Lin
+ (1) Do not use ieee80211_register_hw() to create virtual interface.
+ Use wiphy_register() to register nl80211 command handlers.
+ (2) Support iw utility.
+ 3. 2009/11/03 Sample Lin
+ (1) Change name MAC80211 to CFG80211.
+ (2) Modify CFG80211_OpsChannelSet().
+ (3) Move CFG80211_Register()/CFG80211_UnRegister() to open/close.
+ 4. 2009/12/16 Sample Lin
+ (1) Patch for Linux 2.6.32.
+ (2) Add more supported functions in CFG80211_Ops.
+ 5. 2010/12/10 Sample Lin
+ (1) Modify for OS_ABL.
+ 6. 2011/04/19 Sample Lin
+ (1) Add more supported functions in CFG80211_Ops v33 ~ 38.
+
+ Note:
+ The feature is supported only in "LINUX" 2.6.28 ~ 2.6.38.
+
+***************************************************************************/
+
+
+/* #include "rt_config.h" */
+#define RTMP_MODULE_OS
+
+/*#include "rt_config.h" */
+#include "rtmp_comm.h"
+#include "rt_os_util.h"
+#include "rt_os_net.h"
+
+
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,28))
+#ifdef RT_CFG80211_SUPPORT
+
+/* 36 ~ 64, 100 ~ 136, 140 ~ 161 */
+#define CFG80211_NUM_OF_CHAN_5GHZ \
+ (sizeof(Cfg80211_Chan)-CFG80211_NUM_OF_CHAN_2GHZ)
+
+#ifdef OS_ABL_FUNC_SUPPORT
+/*
+ Array of bitrates the hardware can operate with
+ in this band. Must be sorted to give a valid "supported
+ rates" IE, i.e. CCK rates first, then OFDM.
+
+ For HT, assign MCS in another structure, ieee80211_sta_ht_cap.
+*/
+const struct ieee80211_rate Cfg80211_SupRate[12] = {
+ {
+ .flags = IEEE80211_RATE_SHORT_PREAMBLE,
+ .bitrate = 10,
+ .hw_value = 0,
+ .hw_value_short = 0,
+ },
+ {
+ .flags = IEEE80211_RATE_SHORT_PREAMBLE,
+ .bitrate = 20,
+ .hw_value = 1,
+ .hw_value_short = 1,
+ },
+ {
+ .flags = IEEE80211_RATE_SHORT_PREAMBLE,
+ .bitrate = 55,
+ .hw_value = 2,
+ .hw_value_short = 2,
+ },
+ {
+ .flags = IEEE80211_RATE_SHORT_PREAMBLE,
+ .bitrate = 110,
+ .hw_value = 3,
+ .hw_value_short = 3,
+ },
+ {
+ .flags = 0,
+ .bitrate = 60,
+ .hw_value = 4,
+ .hw_value_short = 4,
+ },
+ {
+ .flags = 0,
+ .bitrate = 90,
+ .hw_value = 5,
+ .hw_value_short = 5,
+ },
+ {
+ .flags = 0,
+ .bitrate = 120,
+ .hw_value = 6,
+ .hw_value_short = 6,
+ },
+ {
+ .flags = 0,
+ .bitrate = 180,
+ .hw_value = 7,
+ .hw_value_short = 7,
+ },
+ {
+ .flags = 0,
+ .bitrate = 240,
+ .hw_value = 8,
+ .hw_value_short = 8,
+ },
+ {
+ .flags = 0,
+ .bitrate = 360,
+ .hw_value = 9,
+ .hw_value_short = 9,
+ },
+ {
+ .flags = 0,
+ .bitrate = 480,
+ .hw_value = 10,
+ .hw_value_short = 10,
+ },
+ {
+ .flags = 0,
+ .bitrate = 540,
+ .hw_value = 11,
+ .hw_value_short = 11,
+ },
+};
+#endif /* OS_ABL_FUNC_SUPPORT */
+
+/* all available channels */
+static const UCHAR Cfg80211_Chan[] = {
+ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
+
+ /* 802.11 UNI / HyperLan 2 */
+ 36, 38, 40, 44, 46, 48, 52, 54, 56, 60, 62, 64,
+
+ /* 802.11 HyperLan 2 */
+ 100, 104, 108, 112, 116, 118, 120, 124, 126, 128, 132, 134, 136,
+
+ /* 802.11 UNII */
+ 140, 149, 151, 153, 157, 159, 161, 165, 167, 169, 171, 173,
+
+ /* Japan */
+ 184, 188, 192, 196, 208, 212, 216,
+};
+
+
+static const UINT32 CipherSuites[] = {
+ WLAN_CIPHER_SUITE_WEP40,
+ WLAN_CIPHER_SUITE_WEP104,
+ WLAN_CIPHER_SUITE_TKIP,
+ WLAN_CIPHER_SUITE_CCMP,
+};
+
+
+
+/*
+ The driver's regulatory notification callback.
+*/
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,30))
+static INT32 CFG80211_RegNotifier(
+ IN struct wiphy *pWiphy,
+ IN struct regulatory_request *pRequest);
+#else
+static INT32 CFG80211_RegNotifier(
+ IN struct wiphy *pWiphy,
+ IN enum reg_set_by Request);
+#endif /* LINUX_VERSION_CODE */
+
+
+
+
+/* =========================== Private Function ============================== */
+
+/* get RALINK pAd control block in 80211 Ops */
+#define MAC80211_PAD_GET(__pAd, __pWiphy) \
+ { \
+ ULONG *__pPriv; \
+ __pPriv = (ULONG *)(wiphy_priv(__pWiphy)); \
+ __pAd = (VOID *)(*__pPriv); \
+ if (__pAd == NULL) \
+ { \
+ DBGPRINT(RT_DEBUG_ERROR, \
+ ("80211> %s but pAd = NULL!", __FUNCTION__)); \
+ return -EINVAL; \
+ } \
+ }
+
+/*
+========================================================================
+Routine Description:
+ Set channel.
+
+Arguments:
+ pWiphy - Wireless hardware description
+ pChan - Channel information
+ ChannelType - Channel type
+
+Return Value:
+ 0 - success
+ -x - fail
+
+Note:
+ For iw utility: set channel, set freq
+
+ enum nl80211_channel_type {
+ NL80211_CHAN_NO_HT,
+ NL80211_CHAN_HT20,
+ NL80211_CHAN_HT40MINUS,
+ NL80211_CHAN_HT40PLUS
+ };
+========================================================================
+*/
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
+static int CFG80211_OpsChannelSet(
+ IN struct wiphy *pWiphy,
+ IN struct net_device *pDev,
+ IN struct ieee80211_channel *pChan,
+ IN enum nl80211_channel_type ChannelType)
+
+#else
+static int CFG80211_OpsChannelSet(
+ IN struct wiphy *pWiphy,
+ IN struct ieee80211_channel *pChan,
+ IN enum nl80211_channel_type ChannelType)
+#endif /* LINUX_VERSION_CODE */
+{
+ VOID *pAd;
+ CFG80211_CB *p80211CB;
+ CMD_RTPRIV_IOCTL_80211_CHAN ChanInfo;
+ UINT32 ChanId;
+
+
+ CFG80211DBG(RT_DEBUG_ERROR, ("80211> %s ==>\n", __FUNCTION__));
+ MAC80211_PAD_GET(pAd, pWiphy);
+
+ /* get channel number */
+ ChanId = ieee80211_frequency_to_channel(pChan->center_freq);
+ CFG80211DBG(RT_DEBUG_ERROR, ("80211> Channel = %d\n", ChanId));
+ CFG80211DBG(RT_DEBUG_ERROR, ("80211> ChannelType = %d\n", ChannelType));
+
+ /* init */
+ memset(&ChanInfo, 0, sizeof(ChanInfo));
+ ChanInfo.ChanId = ChanId;
+
+ p80211CB = NULL;
+ RTMP_DRIVER_80211_CB_GET(pAd, &p80211CB);
+
+ if (p80211CB == NULL)
+ {
+ CFG80211DBG(RT_DEBUG_ERROR, ("80211> p80211CB == NULL!\n"));
+ return 0;
+ }
+
+ if (p80211CB->pCfg80211_Wdev->iftype == NL80211_IFTYPE_STATION)
+ ChanInfo.IfType = RT_CMD_80211_IFTYPE_STATION;
+ else if (p80211CB->pCfg80211_Wdev->iftype == NL80211_IFTYPE_ADHOC)
+ ChanInfo.IfType = RT_CMD_80211_IFTYPE_ADHOC;
+ else if (p80211CB->pCfg80211_Wdev->iftype == NL80211_IFTYPE_MONITOR)
+ ChanInfo.IfType = RT_CMD_80211_IFTYPE_MONITOR;
+
+ if (ChannelType == NL80211_CHAN_NO_HT)
+ ChanInfo.ChanType = RT_CMD_80211_CHANTYPE_NOHT;
+ else if (ChannelType == NL80211_CHAN_HT20)
+ ChanInfo.ChanType = RT_CMD_80211_CHANTYPE_HT20;
+ else if (ChannelType == NL80211_CHAN_HT40MINUS)
+ ChanInfo.ChanType = RT_CMD_80211_CHANTYPE_HT40MINUS;
+ else if (ChannelType == NL80211_CHAN_HT40PLUS)
+ ChanInfo.ChanType = RT_CMD_80211_CHANTYPE_HT40PLUS;
+
+ ChanInfo.MonFilterFlag = p80211CB->MonFilterFlag;
+
+ /* set channel */
+ RTMP_DRIVER_80211_CHAN_SET(pAd, &ChanInfo);
+
+ return 0;
+} /* End of CFG80211_OpsChannelSet */
+
+
+/*
+========================================================================
+Routine Description:
+ Change type/configuration of virtual interface.
+
+Arguments:
+ pWiphy - Wireless hardware description
+ IfIndex - Interface index
+ Type - Interface type, managed/adhoc/ap/station, etc.
+ pFlags - Monitor flags
+ pParams - Mesh parameters
+
+Return Value:
+ 0 - success
+ -x - fail
+
+Note:
+ For iw utility: set type, set monitor
+========================================================================
+*/
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,32))
+static int CFG80211_OpsVirtualInfChg(
+ IN struct wiphy *pWiphy,
+ IN struct net_device *pNetDevIn,
+ IN enum nl80211_iftype Type,
+ IN u32 *pFlags,
+ struct vif_params *pParams)
+#else
+static int CFG80211_OpsVirtualInfChg(
+ IN struct wiphy *pWiphy,
+ IN int IfIndex,
+ IN enum nl80211_iftype Type,
+ IN u32 *pFlags,
+ struct vif_params *pParams)
+#endif /* LINUX_VERSION_CODE */
+{
+ VOID *pAd;
+ CFG80211_CB *pCfg80211_CB;
+ struct net_device *pNetDev;
+ UINT32 Filter;
+
+
+ CFG80211DBG(RT_DEBUG_ERROR, ("80211> %s ==>\n", __FUNCTION__));
+ MAC80211_PAD_GET(pAd, pWiphy);
+
+ CFG80211DBG(RT_DEBUG_ERROR, ("80211> Type = %d\n", Type));
+
+ /* sanity check */
+ {
+ DBGPRINT(RT_DEBUG_ERROR, ("80211> Wrong interface type %d!\n", Type));
+ return -EINVAL;
+ } /* End of if */
+
+ /* update interface type */
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,32))
+ pNetDev = pNetDevIn;
+#else
+ pNetDev = __dev_get_by_index(&init_net, IfIndex);
+#endif /* LINUX_VERSION_CODE */
+
+ if (pNetDev == NULL)
+ return -ENODEV;
+ /* End of if */
+
+ pNetDev->ieee80211_ptr->iftype = Type;
+
+ if (pFlags != NULL)
+ {
+ Filter = 0;
+
+ if (((*pFlags) & NL80211_MNTR_FLAG_FCSFAIL) == NL80211_MNTR_FLAG_FCSFAIL)
+ Filter |= RT_CMD_80211_FILTER_FCSFAIL;
+
+ if (((*pFlags) & NL80211_MNTR_FLAG_FCSFAIL) == NL80211_MNTR_FLAG_PLCPFAIL)
+ Filter |= RT_CMD_80211_FILTER_PLCPFAIL;
+
+ if (((*pFlags) & NL80211_MNTR_FLAG_CONTROL) == NL80211_MNTR_FLAG_CONTROL)
+ Filter |= RT_CMD_80211_FILTER_CONTROL;
+
+ if (((*pFlags) & NL80211_MNTR_FLAG_CONTROL) == NL80211_MNTR_FLAG_OTHER_BSS)
+ Filter |= RT_CMD_80211_FILTER_OTHER_BSS;
+ } /* End of if */
+
+ RTMP_DRIVER_80211_VIF_SET(pAd, Filter, Type);
+
+ RTMP_DRIVER_80211_CB_GET(pAd, &pCfg80211_CB);
+ pCfg80211_CB->MonFilterFlag = Filter;
+ return 0;
+} /* End of CFG80211_OpsVirtualInfChg */
+
+
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,30))
+#if defined(SIOCGIWSCAN) || defined(RT_CFG80211_SUPPORT)
+extern int rt_ioctl_siwscan(struct net_device *dev,
+ struct iw_request_info *info,
+ union iwreq_data *wreq, char *extra);
+#endif
+/*
+========================================================================
+Routine Description:
+ Request to do a scan. If returning zero, the scan request is given
+ the driver, and will be valid until passed to cfg80211_scan_done().
+ For scan results, call cfg80211_inform_bss(); you can call this outside
+ the scan/scan_done bracket too.
+
+Arguments:
+ pWiphy - Wireless hardware description
+ pNdev - Network device interface
+ pRequest - Scan request
+
+Return Value:
+ 0 - success
+ -x - fail
+
+Note:
+ For iw utility: scan
+
+ struct cfg80211_scan_request {
+ struct cfg80211_ssid *ssids;
+ int n_ssids;
+ struct ieee80211_channel **channels;
+ u32 n_channels;
+ const u8 *ie;
+ size_t ie_len;
+
+ * @ssids: SSIDs to scan for (active scan only)
+ * @n_ssids: number of SSIDs
+ * @channels: channels to scan on.
+ * @n_channels: number of channels for each band
+ * @ie: optional information element(s) to add into Probe Request or %NULL
+ * @ie_len: length of ie in octets
+========================================================================
+*/
+static int CFG80211_OpsScan(
+ IN struct wiphy *pWiphy,
+ IN struct net_device *pNdev,
+ IN struct cfg80211_scan_request *pRequest)
+{
+
+ return -EOPNOTSUPP;
+} /* End of CFG80211_OpsScan */
+#endif /* LINUX_VERSION_CODE */
+
+
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,31))
+#endif /* LINUX_VERSION_CODE */
+
+
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,32))
+/*
+========================================================================
+Routine Description:
+ Set the transmit power according to the parameters.
+
+Arguments:
+ pWiphy - Wireless hardware description
+ Type -
+ dBm - dBm
+
+Return Value:
+ 0 - success
+ -x - fail
+
+Note:
+ Type -
+ TX_POWER_AUTOMATIC: the dbm parameter is ignored
+ TX_POWER_LIMITED: limit TX power by the dbm parameter
+ TX_POWER_FIXED: fix TX power to the dbm parameter
+========================================================================
+*/
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,36))
+static int CFG80211_OpsTxPwrSet(
+ IN struct wiphy *pWiphy,
+ IN enum nl80211_tx_power_setting Type,
+ IN int dBm)
+{
+ CFG80211DBG(RT_DEBUG_ERROR, ("80211> %s ==>\n", __FUNCTION__));
+ return -EOPNOTSUPP;
+} /* End of CFG80211_OpsTxPwrSet */
+
+#else
+static int CFG80211_OpsTxPwrSet(
+ IN struct wiphy *pWiphy,
+ IN enum tx_power_setting Type,
+ IN int dBm)
+{
+ CFG80211DBG(RT_DEBUG_ERROR, ("80211> %s ==>\n", __FUNCTION__));
+ return -EOPNOTSUPP;
+} /* End of CFG80211_OpsTxPwrSet */
+#endif /* LINUX_VERSION_CODE */
+
+
+/*
+========================================================================
+Routine Description:
+ Store the current TX power into the dbm variable.
+
+Arguments:
+ pWiphy - Wireless hardware description
+ pdBm - dBm
+
+Return Value:
+ 0 - success
+ -x - fail
+
+Note:
+========================================================================
+*/
+static int CFG80211_OpsTxPwrGet(
+ IN struct wiphy *pWiphy,
+ IN int *pdBm)
+{
+ CFG80211DBG(RT_DEBUG_ERROR, ("80211> %s ==>\n", __FUNCTION__));
+ return -EOPNOTSUPP;
+} /* End of CFG80211_OpsTxPwrGet */
+
+
+/*
+========================================================================
+Routine Description:
+ Power management.
+
+Arguments:
+ pWiphy - Wireless hardware description
+ pNdev -
+ FlgIsEnabled -
+ Timeout -
+
+Return Value:
+ 0 - success
+ -x - fail
+
+Note:
+========================================================================
+*/
+static int CFG80211_OpsPwrMgmt(
+ IN struct wiphy *pWiphy,
+ IN struct net_device *pNdev,
+ IN bool FlgIsEnabled,
+ IN int Timeout)
+{
+ CFG80211DBG(RT_DEBUG_ERROR, ("80211> %s ==>\n", __FUNCTION__));
+ return -EOPNOTSUPP;
+} /* End of CFG80211_OpsPwrMgmt */
+
+
+/*
+========================================================================
+Routine Description:
+ Get information for a specific station.
+
+Arguments:
+ pWiphy - Wireless hardware description
+ pNdev -
+ pMac - STA MAC
+ pSinfo - STA INFO
+
+Return Value:
+ 0 - success
+ -x - fail
+
+Note:
+========================================================================
+*/
+static int CFG80211_OpsStaGet(
+ IN struct wiphy *pWiphy,
+ IN struct net_device *pNdev,
+ IN UINT8 *pMac,
+ IN struct station_info *pSinfo)
+{
+ VOID *pAd;
+ CMD_RTPRIV_IOCTL_80211_STA StaInfo;
+
+
+ CFG80211DBG(RT_DEBUG_ERROR, ("80211> %s ==>\n", __FUNCTION__));
+ MAC80211_PAD_GET(pAd, pWiphy);
+
+ /* init */
+ memset(pSinfo, 0, sizeof(*pSinfo));
+ memset(&StaInfo, 0, sizeof(StaInfo));
+
+ memcpy(StaInfo.MAC, pMac, 6);
+
+ /* get sta information */
+ if (RTMP_DRIVER_80211_STA_GET(pAd, &StaInfo) != NDIS_STATUS_SUCCESS)
+ return -ENOENT;
+
+ if (StaInfo.TxRateFlags != RT_CMD_80211_TXRATE_LEGACY)
+ {
+ pSinfo->txrate.flags = RATE_INFO_FLAGS_MCS;
+ if (StaInfo.TxRateFlags & RT_CMD_80211_TXRATE_BW_40)
+ pSinfo->txrate.flags |= RATE_INFO_FLAGS_40_MHZ_WIDTH;
+ /* End of if */
+ if (StaInfo.TxRateFlags & RT_CMD_80211_TXRATE_SHORT_GI)
+ pSinfo->txrate.flags |= RATE_INFO_FLAGS_SHORT_GI;
+ /* End of if */
+
+ pSinfo->txrate.mcs = StaInfo.TxRateMCS;
+ }
+ else
+ {
+ pSinfo->txrate.legacy = StaInfo.TxRateMCS;
+ } /* End of if */
+
+ pSinfo->filled |= STATION_INFO_TX_BITRATE;
+
+ /* fill signal */
+ pSinfo->signal = StaInfo.Signal;
+ pSinfo->filled |= STATION_INFO_SIGNAL;
+
+#ifdef CONFIG_AP_SUPPORT
+ /* fill tx count */
+ pSinfo->tx_packets = StaInfo.TxPacketCnt;
+ pSinfo->filled |= STATION_INFO_TX_PACKETS;
+
+ /* fill inactive time */
+ pSinfo->inactive_time = StaInfo.InactiveTime;
+ pSinfo->filled |= STATION_INFO_INACTIVE_TIME;
+#endif /* CONFIG_AP_SUPPORT */
+
+ return 0;
+} /* End of CFG80211_OpsStaGet */
+
+
+/*
+========================================================================
+Routine Description:
+ List all stations known, e.g. the AP on managed interfaces.
+
+Arguments:
+ pWiphy - Wireless hardware description
+ pNdev -
+ Idx -
+ pMac -
+ pSinfo -
+
+Return Value:
+ 0 - success
+ -x - fail
+
+Note:
+========================================================================
+*/
+static int CFG80211_OpsStaDump(
+ IN struct wiphy *pWiphy,
+ IN struct net_device *pNdev,
+ IN int Idx,
+ IN UINT8 *pMac,
+ IN struct station_info *pSinfo)
+{
+ VOID *pAd;
+
+
+ if (Idx != 0)
+ return -ENOENT;
+ /* End of if */
+
+ CFG80211DBG(RT_DEBUG_ERROR, ("80211> %s ==>\n", __FUNCTION__));
+ MAC80211_PAD_GET(pAd, pWiphy);
+
+
+ return -EOPNOTSUPP;
+} /* End of CFG80211_OpsStaDump */
+
+
+/*
+========================================================================
+Routine Description:
+ Notify that wiphy parameters have changed.
+
+Arguments:
+ pWiphy - Wireless hardware description
+ Changed -
+
+Return Value:
+ 0 - success
+ -x - fail
+
+Note:
+========================================================================
+*/
+static int CFG80211_OpsWiphyParamsSet(
+ IN struct wiphy *pWiphy,
+ IN UINT32 Changed)
+{
+ CFG80211DBG(RT_DEBUG_ERROR, ("80211> %s ==>\n", __FUNCTION__));
+ return -EOPNOTSUPP;
+} /* End of CFG80211_OpsWiphyParamsSet */
+
+
+/*
+========================================================================
+Routine Description:
+ Add a key with the given parameters.
+
+Arguments:
+ pWiphy - Wireless hardware description
+ pNdev -
+ KeyIdx -
+ Pairwise -
+ pMacAddr -
+ pParams -
+
+Return Value:
+ 0 - success
+ -x - fail
+
+Note:
+ pMacAddr will be NULL when adding a group key.
+========================================================================
+*/
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37))
+static int CFG80211_OpsKeyAdd(
+ IN struct wiphy *pWiphy,
+ IN struct net_device *pNdev,
+ IN UINT8 KeyIdx,
+ IN bool Pairwise,
+ IN const UINT8 *pMacAddr,
+ IN struct key_params *pParams)
+#else
+
+static int CFG80211_OpsKeyAdd(
+ IN struct wiphy *pWiphy,
+ IN struct net_device *pNdev,
+ IN UINT8 KeyIdx,
+ IN const UINT8 *pMacAddr,
+ IN struct key_params *pParams)
+#endif /* LINUX_VERSION_CODE */
+{
+ VOID *pAd;
+ CMD_RTPRIV_IOCTL_80211_KEY KeyInfo;
+
+
+ CFG80211DBG(RT_DEBUG_ERROR, ("80211> %s ==>\n", __FUNCTION__));
+ MAC80211_PAD_GET(pAd, pWiphy);
+
+#ifdef RT_CFG80211_DEBUG
+ hex_dump("KeyBuf=", (UINT8 *)pParams->key, pParams->key_len);
+#endif /* RT_CFG80211_DEBUG */
+
+ CFG80211DBG(RT_DEBUG_ERROR, ("80211> KeyIdx = %d\n", KeyIdx));
+
+ if (pParams->key_len >= sizeof(KeyInfo.KeyBuf))
+ return -EINVAL;
+ /* End of if */
+
+
+#ifdef CONFIG_AP_SUPPORT
+ return -ENOTSUPP;
+#endif /* CONFIG_AP_SUPPORT */
+} /* End of CFG80211_OpsKeyAdd */
+
+
+/*
+========================================================================
+Routine Description:
+ Get information about the key with the given parameters.
+
+Arguments:
+ pWiphy - Wireless hardware description
+ pNdev -
+ KeyIdx -
+ Pairwise -
+ pMacAddr -
+ pCookie -
+ pCallback -
+
+Return Value:
+ 0 - success
+ -x - fail
+
+Note:
+ pMacAddr will be NULL when requesting information for a group key.
+
+ All pointers given to the pCallback function need not be valid after
+ it returns.
+
+ This function should return an error if it is not possible to
+ retrieve the key, -ENOENT if it doesn't exist.
+========================================================================
+*/
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37))
+static int CFG80211_OpsKeyGet(
+ IN struct wiphy *pWiphy,
+ IN struct net_device *pNdev,
+ IN UINT8 KeyIdx,
+ IN bool Pairwise,
+ IN const UINT8 *pMacAddr,
+ IN void *pCookie,
+ IN void (*pCallback)(void *cookie,
+ struct key_params *))
+#else
+
+static int CFG80211_OpsKeyGet(
+ IN struct wiphy *pWiphy,
+ IN struct net_device *pNdev,
+ IN UINT8 KeyIdx,
+ IN const UINT8 *pMacAddr,
+ IN void *pCookie,
+ IN void (*pCallback)(void *cookie,
+ struct key_params *))
+#endif /* LINUX_VERSION_CODE */
+{
+
+ CFG80211DBG(RT_DEBUG_ERROR, ("80211> %s ==>\n", __FUNCTION__));
+ return -ENOTSUPP;
+} /* End of CFG80211_OpsKeyGet */
+
+
+/*
+========================================================================
+Routine Description:
+ Remove a key given the pMacAddr (NULL for a group key) and KeyIdx.
+
+Arguments:
+ pWiphy - Wireless hardware description
+ pNdev -
+ KeyIdx -
+ pMacAddr -
+
+Return Value:
+ 0 - success
+ -x - fail
+
+Note:
+ return -ENOENT if the key doesn't exist.
+========================================================================
+*/
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37))
+static int CFG80211_OpsKeyDel(
+ IN struct wiphy *pWiphy,
+ IN struct net_device *pNdev,
+ IN UINT8 KeyIdx,
+ IN bool Pairwise,
+ IN const UINT8 *pMacAddr)
+#else
+
+static int CFG80211_OpsKeyDel(
+ IN struct wiphy *pWiphy,
+ IN struct net_device *pNdev,
+ IN UINT8 KeyIdx,
+ IN const UINT8 *pMacAddr)
+#endif /* LINUX_VERSION_CODE */
+{
+ CFG80211DBG(RT_DEBUG_ERROR, ("80211> %s ==>\n", __FUNCTION__));
+ return -ENOTSUPP;
+} /* End of CFG80211_OpsKeyDel */
+
+
+/*
+========================================================================
+Routine Description:
+ Set the default key on an interface.
+
+Arguments:
+ pWiphy - Wireless hardware description
+ pNdev -
+ KeyIdx -
+
+Return Value:
+ 0 - success
+ -x - fail
+
+Note:
+========================================================================
+*/
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38))
+static int CFG80211_OpsKeyDefaultSet(
+ IN struct wiphy *pWiphy,
+ IN struct net_device *pNdev,
+ IN UINT8 KeyIdx,
+ IN bool Unicast,
+ IN bool Multicast)
+#else
+
+static int CFG80211_OpsKeyDefaultSet(
+ IN struct wiphy *pWiphy,
+ IN struct net_device *pNdev,
+ IN UINT8 KeyIdx)
+#endif /* LINUX_VERSION_CODE */
+{
+ VOID *pAd;
+
+
+ CFG80211DBG(RT_DEBUG_ERROR, ("80211> %s ==>\n", __FUNCTION__));
+ MAC80211_PAD_GET(pAd, pWiphy);
+
+ CFG80211DBG(RT_DEBUG_ERROR, ("80211> KeyIdx = %d\n", KeyIdx));
+
+ RTMP_DRIVER_80211_KEY_DEFAULT_SET(pAd, KeyIdx);
+ return 0;
+} /* End of CFG80211_OpsKeyDefaultSet */
+
+
+#endif /* LINUX_VERSION_CODE */
+
+
+#ifdef RFKILL_HW_SUPPORT
+static int CFG80211_OpsRFKill(
+ IN struct wiphy *pWiphy)
+{
+ VOID *pAd;
+ BOOLEAN active;
+
+
+ MAC80211_PAD_GET(pAd, pWiphy);
+
+ RTMP_DRIVER_80211_RFKILL(pAd, &active);
+ wiphy_rfkill_set_hw_state(pWiphy, !active);
+ return active;
+}
+
+
+VOID CFG80211_RFKillStatusUpdate(
+ IN PVOID pAd,
+ IN BOOLEAN active)
+{
+ struct wiphy *pWiphy;
+ CFG80211_CB *pCfg80211_CB;
+
+
+ RTMP_DRIVER_80211_CB_GET(pAd, &pCfg80211_CB);
+ pWiphy = pCfg80211_CB->pCfg80211_Wdev->wiphy;
+ wiphy_rfkill_set_hw_state(pWiphy, !active);
+ return;
+}
+#endif /* RFKILL_HW_SUPPORT */
+
+
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,33))
+/*
+========================================================================
+Routine Description:
+ Get site survey information.
+
+Arguments:
+ pWiphy - Wireless hardware description
+ pNdev - Network device interface
+ Idx -
+ pSurvey -
+
+Return Value:
+ 0 - success
+ -x - fail
+
+Note:
+ For iw utility: survey dump
+========================================================================
+*/
+static int CFG80211_OpsSurveyGet(
+ IN struct wiphy *pWiphy,
+ IN struct net_device *pNdev,
+ IN int Idx,
+ IN struct survey_info *pSurvey)
+{
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37))
+ VOID *pAd;
+ CMD_RTPRIV_IOCTL_80211_SURVEY SurveyInfo;
+
+
+ if (Idx != 0)
+ return -ENOENT;
+ /* End of if */
+
+ CFG80211DBG(RT_DEBUG_ERROR, ("80211> %s ==>\n", __FUNCTION__));
+
+ MAC80211_PAD_GET(pAd, pWiphy);
+
+ /* get information from driver */
+ RTMP_DRIVER_80211_SURVEY_GET(pAd, &SurveyInfo);
+
+ /* return the information to upper layer */
+ pSurvey->channel = ((CFG80211_CB *)(SurveyInfo.pCfg80211))->pCfg80211_Channels;
+ pSurvey->filled = SURVEY_INFO_CHANNEL_TIME_BUSY |
+ SURVEY_INFO_CHANNEL_TIME_EXT_BUSY;
+ pSurvey->channel_time_busy = SurveyInfo.ChannelTimeBusy; /* unit: us */
+ pSurvey->channel_time_ext_busy = SurveyInfo.ChannelTimeExtBusy;
+
+ CFG80211DBG(RT_DEBUG_ERROR, ("80211> busy time = %ld %ld\n",
+ (ULONG)SurveyInfo.ChannelTimeBusy,
+ (ULONG)SurveyInfo.ChannelTimeExtBusy));
+ return 0;
+#else
+
+ return -ENOTSUPP;
+#endif /* LINUX_VERSION_CODE */
+} /* End of CFG80211_OpsSurveyGet */
+
+
+/*
+========================================================================
+Routine Description:
+ Cache a PMKID for a BSSID.
+
+Arguments:
+ pWiphy - Wireless hardware description
+ pNdev - Network device interface
+ pPmksa - PMKID information
+
+Return Value:
+ 0 - success
+ -x - fail
+
+Note:
+ This is mostly useful for fullmac devices running firmwares capable of
+ generating the (re) association RSN IE.
+ It allows for faster roaming between WPA2 BSSIDs.
+========================================================================
+*/
+static int CFG80211_OpsPmksaSet(
+ IN struct wiphy *pWiphy,
+ IN struct net_device *pNdev,
+ IN struct cfg80211_pmksa *pPmksa)
+{
+
+ return 0;
+} /* End of CFG80211_OpsPmksaSet */
+
+
+/*
+========================================================================
+Routine Description:
+ Delete a cached PMKID.
+
+Arguments:
+ pWiphy - Wireless hardware description
+ pNdev - Network device interface
+ pPmksa - PMKID information
+
+Return Value:
+ 0 - success
+ -x - fail
+
+Note:
+========================================================================
+*/
+static int CFG80211_OpsPmksaDel(
+ IN struct wiphy *pWiphy,
+ IN struct net_device *pNdev,
+ IN struct cfg80211_pmksa *pPmksa)
+{
+
+ return 0;
+} /* End of CFG80211_OpsPmksaDel */
+
+
+/*
+========================================================================
+Routine Description:
+ Flush a cached PMKID.
+
+Arguments:
+ pWiphy - Wireless hardware description
+ pNdev - Network device interface
+
+Return Value:
+ 0 - success
+ -x - fail
+
+Note:
+========================================================================
+*/
+static int CFG80211_OpsPmksaFlush(
+ IN struct wiphy *pWiphy,
+ IN struct net_device *pNdev)
+{
+
+ return 0;
+} /* End of CFG80211_OpsPmksaFlush */
+#endif /* LINUX_VERSION_CODE */
+
+
+
+
+struct cfg80211_ops CFG80211_Ops = {
+ /* set channel for a given wireless interface */
+ .set_channel = CFG80211_OpsChannelSet,
+ /* change type/configuration of virtual interface */
+ .change_virtual_intf = CFG80211_OpsVirtualInfChg,
+
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,30))
+ /* request to do a scan */
+ /*
+ Note: must exist whatever AP or STA mode; Or your kernel will crash
+ in v2.6.38.
+ */
+ .scan = CFG80211_OpsScan,
+#endif /* LINUX_VERSION_CODE */
+
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,31))
+#endif /* LINUX_VERSION_CODE */
+
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,32))
+ /* set the transmit power according to the parameters */
+ .set_tx_power = CFG80211_OpsTxPwrSet,
+ /* store the current TX power into the dbm variable */
+ .get_tx_power = CFG80211_OpsTxPwrGet,
+ /* configure WLAN power management */
+ .set_power_mgmt = CFG80211_OpsPwrMgmt,
+ /* get station information for the station identified by @mac */
+ .get_station = CFG80211_OpsStaGet,
+ /* dump station callback */
+ .dump_station = CFG80211_OpsStaDump,
+ /* notify that wiphy parameters have changed */
+ .set_wiphy_params = CFG80211_OpsWiphyParamsSet,
+ /* add a key with the given parameters */
+ .add_key = CFG80211_OpsKeyAdd,
+ /* get information about the key with the given parameters */
+ .get_key = CFG80211_OpsKeyGet,
+ /* remove a key given the @mac_addr */
+ .del_key = CFG80211_OpsKeyDel,
+ /* set the default key on an interface */
+ .set_default_key = CFG80211_OpsKeyDefaultSet,
+#endif /* LINUX_VERSION_CODE */
+
+#ifdef RFKILL_HW_SUPPORT
+ /* polls the hw rfkill line */
+ .rfkill_poll = CFG80211_OpsRFKill,
+#endif /* RFKILL_HW_SUPPORT */
+
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,33))
+ /* get site survey information */
+ .dump_survey = CFG80211_OpsSurveyGet,
+ /* cache a PMKID for a BSSID */
+ .set_pmksa = CFG80211_OpsPmksaSet,
+ /* delete a cached PMKID */
+ .del_pmksa = CFG80211_OpsPmksaDel,
+ /* flush all cached PMKIDs */
+ .flush_pmksa = CFG80211_OpsPmksaFlush,
+#endif /* LINUX_VERSION_CODE */
+
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,34))
+ /*
+ Request the driver to remain awake on the specified
+ channel for the specified duration to complete an off-channel
+ operation (e.g., public action frame exchange).
+ */
+ .remain_on_channel = NULL,
+ /* cancel an on-going remain-on-channel operation */
+ .cancel_remain_on_channel = NULL,
+#if (LINUX_VERSION_CODE == KERNEL_VERSION(2,6,34))
+ /* transmit an action frame */
+ .action = NULL,
+#endif /* LINUX_VERSION_CODE */
+#endif /* LINUX_VERSION_CODE */
+
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
+ /* configure connection quality monitor RSSI threshold */
+ .set_cqm_rssi_config = NULL,
+#endif /* LINUX_VERSION_CODE */
+
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37))
+ /* notify driver that a management frame type was registered */
+ .mgmt_frame_register = NULL,
+#endif /* LINUX_VERSION_CODE */
+
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38))
+ /* set antenna configuration (tx_ant, rx_ant) on the device */
+ .set_antenna = NULL,
+ /* get current antenna configuration from device (tx_ant, rx_ant) */
+ .get_antenna = NULL,
+#endif /* LINUX_VERSION_CODE */
+};
+
+
+
+
+/* =========================== Global Function ============================== */
+
+/*
+========================================================================
+Routine Description:
+ Allocate a wireless device.
+
+Arguments:
+ pAd - WLAN control block pointer
+ pDev - Generic device interface
+
+Return Value:
+ wireless device
+
+Note:
+========================================================================
+*/
+static struct wireless_dev *CFG80211_WdevAlloc(
+ IN CFG80211_CB *pCfg80211_CB,
+ IN CFG80211_BAND *pBandInfo,
+ IN VOID *pAd,
+ IN struct device *pDev)
+{
+ struct wireless_dev *pWdev;
+ ULONG *pPriv;
+
+
+ /*
+ * We're trying to have the following memory layout:
+ *
+ * +------------------------+
+ * | struct wiphy |
+ * +------------------------+
+ * | pAd pointer |
+ * +------------------------+
+ */
+
+ pWdev = kzalloc(sizeof(struct wireless_dev), GFP_KERNEL);
+ if (pWdev == NULL)
+ {
+ DBGPRINT(RT_DEBUG_ERROR, ("80211> Wireless device allocation fail!\n"));
+ return NULL;
+ } /* End of if */
+
+ pWdev->wiphy = wiphy_new(&CFG80211_Ops, sizeof(ULONG *));
+ if (pWdev->wiphy == NULL)
+ {
+ DBGPRINT(RT_DEBUG_ERROR, ("80211> Wiphy device allocation fail!\n"));
+ goto LabelErrWiphyNew;
+ } /* End of if */
+
+ /* keep pAd pointer */
+ pPriv = (ULONG *)(wiphy_priv(pWdev->wiphy));
+ *pPriv = (ULONG)pAd;
+
+ set_wiphy_dev(pWdev->wiphy, pDev);
+
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,30))
+ pWdev->wiphy->max_scan_ssids = pBandInfo->MaxBssTable;
+#endif /* KERNEL_VERSION */
+
+#ifdef CONFIG_AP_SUPPORT
+ pWdev->wiphy->interface_modes = BIT(NL80211_IFTYPE_AP);
+#ifdef WDS_SUPPORT
+ pWdev->wiphy->interface_modes | = BIT(NL80211_IFTYPE_WDS);
+#endif /* WDS_SUPPORT */
+#endif /* CONFIG_STA_SUPPORT */
+
+ pWdev->wiphy->reg_notifier = CFG80211_RegNotifier;
+
+ /* init channel information */
+ CFG80211_SupBandInit(pCfg80211_CB, pBandInfo, pWdev->wiphy, NULL, NULL);
+
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,30))
+ /* CFG80211_SIGNAL_TYPE_MBM: signal strength in mBm (100*dBm) */
+ pWdev->wiphy->signal_type = CFG80211_SIGNAL_TYPE_MBM;
+#endif /* KERNEL_VERSION */
+
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,32))
+ pWdev->wiphy->cipher_suites = CipherSuites;
+ pWdev->wiphy->n_cipher_suites = ARRAY_SIZE(CipherSuites);
+#endif /* LINUX_VERSION_CODE */
+
+ if (wiphy_register(pWdev->wiphy) < 0)
+ {
+ DBGPRINT(RT_DEBUG_ERROR, ("80211> Register wiphy device fail!\n"));
+ goto LabelErrReg;
+ } /* End of if */
+
+ return pWdev;
+
+ LabelErrReg:
+ wiphy_free(pWdev->wiphy);
+
+ LabelErrWiphyNew:
+ os_free_mem(NULL, pWdev);
+
+ return NULL;
+} /* End of CFG80211_WdevAlloc */
+
+
+/*
+========================================================================
+Routine Description:
+ Register MAC80211 Module.
+
+Arguments:
+ pAdCB - WLAN control block pointer
+ pDev - Generic device interface
+ pNetDev - Network device
+
+Return Value:
+ NONE
+
+Note:
+ pDev != pNetDev
+ #define SET_NETDEV_DEV(net, pdev) ((net)->dev.parent = (pdev))
+
+ Can not use pNetDev to replace pDev; Or kernel panic.
+========================================================================
+*/
+BOOLEAN CFG80211_Register(
+ IN VOID *pAd,
+ IN struct device *pDev,
+ IN struct net_device *pNetDev)
+{
+ CFG80211_CB *pCfg80211_CB = NULL;
+ CFG80211_BAND BandInfo;
+
+
+ /* allocate MAC80211 structure */
+ os_alloc_mem(NULL, (UCHAR **)&pCfg80211_CB, sizeof(CFG80211_CB));
+ if (pCfg80211_CB == NULL)
+ {
+ DBGPRINT(RT_DEBUG_ERROR, ("80211> Allocate MAC80211 CB fail!\n"));
+ return FALSE;
+ } /* End of if */
+
+ /* allocate wireless device */
+ RTMP_DRIVER_80211_BANDINFO_GET(pAd, &BandInfo);
+
+ pCfg80211_CB->pCfg80211_Wdev = \
+ CFG80211_WdevAlloc(pCfg80211_CB, &BandInfo, pAd, pDev);
+ if (pCfg80211_CB->pCfg80211_Wdev == NULL)
+ {
+ DBGPRINT(RT_DEBUG_ERROR, ("80211> Allocate Wdev fail!\n"));
+ os_free_mem(NULL, pCfg80211_CB);
+ return FALSE;
+ } /* End of if */
+
+ /* bind wireless device with net device */
+#ifdef CONFIG_AP_SUPPORT
+ /* default we are AP mode */
+ pCfg80211_CB->pCfg80211_Wdev->iftype = NL80211_IFTYPE_AP;
+#endif /* CONFIG_AP_SUPPORT */
+
+
+ pNetDev->ieee80211_ptr = pCfg80211_CB->pCfg80211_Wdev;
+ SET_NETDEV_DEV(pNetDev, wiphy_dev(pCfg80211_CB->pCfg80211_Wdev->wiphy));
+ pCfg80211_CB->pCfg80211_Wdev->netdev = pNetDev;
+
+#ifdef RFKILL_HW_SUPPORT
+ wiphy_rfkill_start_polling(pCfg80211_CB->pCfg80211_Wdev->wiphy);
+#endif /* RFKILL_HW_SUPPORT */
+
+ RTMP_DRIVER_80211_CB_SET(pAd, pCfg80211_CB);
+
+ CFG80211DBG(RT_DEBUG_ERROR, ("80211> CFG80211_Register\n"));
+ return TRUE;
+} /* End of CFG80211_Register */
+
+
+
+
+/* =========================== Local Function =============================== */
+
+/*
+========================================================================
+Routine Description:
+ The driver's regulatory notification callback.
+
+Arguments:
+ pWiphy - Wireless hardware description
+ pRequest - Regulatory request
+
+Return Value:
+ 0
+
+Note:
+========================================================================
+*/
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,30))
+static INT32 CFG80211_RegNotifier(
+ IN struct wiphy *pWiphy,
+ IN struct regulatory_request *pRequest)
+{
+ VOID *pAd;
+ ULONG *pPriv;
+
+
+ /* sanity check */
+ pPriv = (ULONG *)(wiphy_priv(pWiphy));
+ pAd = (VOID *)(*pPriv);
+
+ if (pAd == NULL)
+ {
+ DBGPRINT(RT_DEBUG_ERROR, ("crda> reg notify but pAd = NULL!"));
+ return 0;
+ } /* End of if */
+
+ /*
+ Change the band settings (PASS scan, IBSS allow, or DFS) in mac80211
+ based on EEPROM.
+
+ IEEE80211_CHAN_DISABLED: This channel is disabled.
+ IEEE80211_CHAN_PASSIVE_SCAN: Only passive scanning is permitted
+ on this channel.
+ IEEE80211_CHAN_NO_IBSS: IBSS is not allowed on this channel.
+ IEEE80211_CHAN_RADAR: Radar detection is required on this channel.
+ IEEE80211_CHAN_NO_FAT_ABOVE: extension channel above this channel
+ is not permitted.
+ IEEE80211_CHAN_NO_FAT_BELOW: extension channel below this channel
+ is not permitted.
+ */
+
+ /*
+ Change regulatory rule here.
+
+ struct ieee80211_channel {
+ enum ieee80211_band band;
+ u16 center_freq;
+ u8 max_bandwidth;
+ u16 hw_value;
+ u32 flags;
+ int max_antenna_gain;
+ int max_power;
+ bool beacon_found;
+ u32 orig_flags;
+ int orig_mag, orig_mpwr;
+ };
+
+ In mac80211 layer, it will change flags, max_antenna_gain,
+ max_bandwidth, max_power.
+ */
+
+ switch(pRequest->initiator)
+ {
+ case NL80211_REGDOM_SET_BY_CORE:
+ /*
+ Core queried CRDA for a dynamic world regulatory domain.
+ */
+ CFG80211DBG(RT_DEBUG_ERROR, ("crda> requlation requestion by core: "));
+ break;
+
+ case NL80211_REGDOM_SET_BY_USER:
+ /*
+ User asked the wireless core to set the regulatory domain.
+ (when iw, network manager, wpa supplicant, etc.)
+ */
+ CFG80211DBG(RT_DEBUG_ERROR, ("crda> requlation requestion by user: "));
+ break;
+
+ case NL80211_REGDOM_SET_BY_DRIVER:
+ /*
+ A wireless drivers has hinted to the wireless core it thinks
+ its knows the regulatory domain we should be in.
+ (when driver initialization, calling regulatory_hint)
+ */
+ CFG80211DBG(RT_DEBUG_ERROR, ("crda> requlation requestion by driver: "));
+ break;
+
+ case NL80211_REGDOM_SET_BY_COUNTRY_IE:
+ /*
+ The wireless core has received an 802.11 country information
+ element with regulatory information it thinks we should consider.
+ (when beacon receive, calling regulatory_hint_11d)
+ */
+ CFG80211DBG(RT_DEBUG_ERROR, ("crda> requlation requestion by country IE: "));
+ break;
+ } /* End of switch */
+
+ CFG80211DBG(RT_DEBUG_ERROR,
+ ("%c%c\n", pRequest->alpha2[0], pRequest->alpha2[1]));
+
+ /* only follow rules from user */
+ if (pRequest->initiator == NL80211_REGDOM_SET_BY_USER)
+ {
+ /* keep Alpha2 and we can re-call the function when interface is up */
+ CMD_RTPRIV_IOCTL_80211_REG_NOTIFY RegInfo;
+
+ RegInfo.Alpha2[0] = pRequest->alpha2[0];
+ RegInfo.Alpha2[1] = pRequest->alpha2[1];
+ RegInfo.pWiphy = pWiphy;
+
+ RTMP_DRIVER_80211_REG_NOTIFY(pAd, &RegInfo);
+ } /* End of if */
+
+ return 0;
+} /* End of CFG80211_RegNotifier */
+
+#else
+
+static INT32 CFG80211_RegNotifier(
+ IN struct wiphy *pWiphy,
+ IN enum reg_set_by Request)
+{
+ struct device *pDev = pWiphy->dev.parent;
+ struct net_device *pNetDev = dev_get_drvdata(pDev);
+ VOID *pAd = (VOID *)RTMP_OS_NETDEV_GET_PRIV(pNetDev);
+ UINT32 ReqType = Request;
+
+
+ /* sanity check */
+ if (pAd == NULL)
+ {
+ DBGPRINT(RT_DEBUG_ERROR, ("crda> reg notify but pAd = NULL!"));
+ return 0;
+ } /* End of if */
+
+ /*
+ Change the band settings (PASS scan, IBSS allow, or DFS) in mac80211
+ based on EEPROM.
+
+ IEEE80211_CHAN_DISABLED: This channel is disabled.
+ IEEE80211_CHAN_PASSIVE_SCAN: Only passive scanning is permitted
+ on this channel.
+ IEEE80211_CHAN_NO_IBSS: IBSS is not allowed on this channel.
+ IEEE80211_CHAN_RADAR: Radar detection is required on this channel.
+ IEEE80211_CHAN_NO_FAT_ABOVE: extension channel above this channel
+ is not permitted.
+ IEEE80211_CHAN_NO_FAT_BELOW: extension channel below this channel
+ is not permitted.
+ */
+
+ /*
+ Change regulatory rule here.
+
+ struct ieee80211_channel {
+ enum ieee80211_band band;
+ u16 center_freq;
+ u8 max_bandwidth;
+ u16 hw_value;
+ u32 flags;
+ int max_antenna_gain;
+ int max_power;
+ bool beacon_found;
+ u32 orig_flags;
+ int orig_mag, orig_mpwr;
+ };
+
+ In mac80211 layer, it will change flags, max_antenna_gain,
+ max_bandwidth, max_power.
+ */
+
+ switch(ReqType)
+ {
+ case REGDOM_SET_BY_CORE:
+ /*
+ Core queried CRDA for a dynamic world regulatory domain.
+ */
+ CFG80211DBG(RT_DEBUG_ERROR, ("crda> requlation requestion by core: "));
+ break;
+
+ case REGDOM_SET_BY_USER:
+ /*
+ User asked the wireless core to set the regulatory domain.
+ (when iw, network manager, wpa supplicant, etc.)
+ */
+ CFG80211DBG(RT_DEBUG_ERROR, ("crda> requlation requestion by user: "));
+ break;
+
+ case REGDOM_SET_BY_DRIVER:
+ /*
+ A wireless drivers has hinted to the wireless core it thinks
+ its knows the regulatory domain we should be in.
+ (when driver initialization, calling regulatory_hint)
+ */
+ CFG80211DBG(RT_DEBUG_ERROR, ("crda> requlation requestion by driver: "));
+ break;
+
+ case REGDOM_SET_BY_COUNTRY_IE:
+ /*
+ The wireless core has received an 802.11 country information
+ element with regulatory information it thinks we should consider.
+ (when beacon receive, calling regulatory_hint_11d)
+ */
+ CFG80211DBG(RT_DEBUG_ERROR, ("crda> requlation requestion by country IE: "));
+ break;
+ } /* End of switch */
+
+ DBGPRINT(RT_DEBUG_ERROR, ("00\n"));
+
+ /* only follow rules from user */
+ if (ReqType == REGDOM_SET_BY_USER)
+ {
+ /* keep Alpha2 and we can re-call the function when interface is up */
+ CMD_RTPRIV_IOCTL_80211_REG_NOTIFY RegInfo;
+
+ RegInfo.Alpha2[0] = '0';
+ RegInfo.Alpha2[1] = '0';
+ RegInfo.pWiphy = pWiphy;
+
+ RTMP_DRIVER_80211_REG_NOTIFY(pAd, &RegInfo);
+ } /* End of if */
+
+ return 0;
+} /* End of CFG80211_RegNotifier */
+#endif /* LINUX_VERSION_CODE */
+
+
+#endif /* RT_CFG80211_SUPPORT */
+#endif /* LINUX_VERSION_CODE */
+
+/* End of crda.c */
diff --git a/cleopatre/devkit/mt7601udrv/os/linux/cfg80211drv.c b/cleopatre/devkit/mt7601udrv/os/linux/cfg80211drv.c
new file mode 100644
index 0000000000..3eee8a2f00
--- /dev/null
+++ b/cleopatre/devkit/mt7601udrv/os/linux/cfg80211drv.c
@@ -0,0 +1,1675 @@
+/****************************************************************************
+ * Ralink Tech Inc.
+ * Taiwan, R.O.C.
+ *
+ * (c) Copyright 2002, Ralink Technology, Inc.
+ *
+ * All rights reserved. Ralink's source code is an unpublished work and the
+ * use of a copyright notice does not imply otherwise. This source code
+ * contains confidential trade secret material of Ralink Tech. Any attemp
+ * or participation in deciphering, decoding, reverse engineering or in any
+ * way altering the source code is stricitly prohibited, unless the prior
+ * written consent of Ralink Technology, Inc. is obtained.
+ ***************************************************************************/
+
+/****************************************************************************
+
+ Abstract:
+
+ All related CFG80211 function body.
+
+ History:
+
+***************************************************************************/
+
+#ifdef RT_CFG80211_SUPPORT
+
+#include "rt_config.h"
+
+#define RT_CFG80211_DEBUG /* debug use */
+#define CFG80211CB (pAd->pCfg80211_CB)
+
+#ifdef RT_CFG80211_DEBUG
+#define CFG80211DBG(__Flg, __pMsg) DBGPRINT(__Flg, __pMsg)
+#else
+#define CFG80211DBG(__Flg, __pMsg)
+#endif /* RT_CFG80211_DEBUG */
+
+
+
+
+INT CFG80211DRV_IoctlHandle(
+ IN VOID *pAdSrc,
+ IN RTMP_IOCTL_INPUT_STRUCT *wrq,
+ IN INT cmd,
+ IN USHORT subcmd,
+ IN VOID *pData,
+ IN ULONG Data)
+{
+ PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdSrc;
+
+
+ switch(cmd)
+ {
+ case CMD_RTPRIV_IOCTL_80211_START:
+ case CMD_RTPRIV_IOCTL_80211_END:
+ /* nothing to do */
+ break;
+
+ case CMD_RTPRIV_IOCTL_80211_CB_GET:
+ *(VOID **)pData = (VOID *)(pAd->pCfg80211_CB);
+ break;
+
+ case CMD_RTPRIV_IOCTL_80211_CB_SET:
+ pAd->pCfg80211_CB = pData;
+ break;
+
+ case CMD_RTPRIV_IOCTL_80211_CHAN_SET:
+ if (CFG80211DRV_OpsSetChannel(pAd, pData) != TRUE)
+ return NDIS_STATUS_FAILURE;
+ break;
+
+ case CMD_RTPRIV_IOCTL_80211_VIF_CHG:
+ if (CFG80211DRV_OpsChgVirtualInf(pAd, pData, Data) != TRUE)
+ return NDIS_STATUS_FAILURE;
+ break;
+
+ case CMD_RTPRIV_IOCTL_80211_SCAN:
+ CFG80211DRV_OpsScan(pAd);
+ break;
+
+ case CMD_RTPRIV_IOCTL_80211_IBSS_JOIN:
+ CFG80211DRV_OpsJoinIbss(pAd, pData);
+ break;
+
+ case CMD_RTPRIV_IOCTL_80211_STA_LEAVE:
+ CFG80211DRV_OpsLeave(pAd);
+ break;
+
+ case CMD_RTPRIV_IOCTL_80211_STA_GET:
+ if (CFG80211DRV_StaGet(pAd, pData) != TRUE)
+ return NDIS_STATUS_FAILURE;
+ break;
+
+ case CMD_RTPRIV_IOCTL_80211_KEY_ADD:
+ CFG80211DRV_KeyAdd(pAd, pData);
+ break;
+
+ case CMD_RTPRIV_IOCTL_80211_KEY_DEFAULT_SET:
+ break;
+
+ case CMD_RTPRIV_IOCTL_80211_CONNECT_TO:
+ CFG80211DRV_Connect(pAd, pData);
+ break;
+
+#ifdef RFKILL_HW_SUPPORT
+ case CMD_RTPRIV_IOCTL_80211_RFKILL:
+ {
+ UINT32 data = 0;
+ BOOLEAN active;
+
+ /* Read GPIO pin2 as Hardware controlled radio state */
+ RTMP_IO_READ32(pAd, GPIO_CTRL_CFG, &data);
+ active = !!(data & 0x04);
+
+ if (!active)
+ {
+ RTMPSetLED(pAd, LED_RADIO_OFF);
+ *(UINT8 *)pData = 0;
+ }
+ else
+ *(UINT8 *)pData = 1;
+ }
+ break;
+#endif /* RFKILL_HW_SUPPORT */
+
+ case CMD_RTPRIV_IOCTL_80211_REG_NOTIFY_TO:
+ CFG80211DRV_RegNotify(pAd, pData);
+ break;
+
+ case CMD_RTPRIV_IOCTL_80211_UNREGISTER:
+ CFG80211_UnRegister(pAd, pData);
+ break;
+
+ case CMD_RTPRIV_IOCTL_80211_BANDINFO_GET:
+ {
+ CFG80211_BAND *pBandInfo = (CFG80211_BAND *)pData;
+ CFG80211_BANDINFO_FILL(pAd, pBandInfo);
+ }
+ break;
+
+ case CMD_RTPRIV_IOCTL_80211_SURVEY_GET:
+ CFG80211DRV_SurveyGet(pAd, pData);
+ break;
+
+ case CMD_RTPRIV_IOCTL_80211_EXTRA_IES_SET:
+ CFG80211DRV_OpsExtraIesSet(pAd);
+ break;
+
+ case CMD_RTPRIV_IOCTL_80211_REMAIN_ON_CHAN_SET:
+ CFG80211DRV_OpsRemainOnChannel(pAd, pData, Data);
+ break;
+ case CMD_RTPRIV_IOCTL_80211_CANCEL_REMAIN_ON_CHAN_SET:
+ CFG80211DRV_OpsCancelRemainOnChannel(pAd, Data);
+ break;
+
+ case CMD_RTPRIV_IOCTL_80211_MGMT_FRAME_REG:
+ if (Data)
+ pAd->Cfg80211ProbeReqCount++;
+ else
+ {
+ pAd->Cfg80211ProbeReqCount--;
+ }
+
+ if (pAd->Cfg80211ProbeReqCount > 0)
+ pAd->Cfg80211RegisterProbeReqFrame = TRUE;
+ else
+ pAd->Cfg80211RegisterProbeReqFrame = FALSE;
+
+ DBGPRINT(RT_DEBUG_ERROR, ("pAd->Cfg80211RegisterProbeReqFrame=%d[%d]\n",pAd->Cfg80211RegisterProbeReqFrame, pAd->Cfg80211ProbeReqCount));
+ break;
+
+ case CMD_RTPRIV_IOCTL_80211_ACTION_FRAME_REG:
+ if (Data)
+ pAd->Cfg80211ActionCount++;
+ else
+ pAd->Cfg80211ActionCount--;
+
+ if (pAd->Cfg80211ActionCount > 0)
+ pAd->Cfg80211RegisterActionFrame = TRUE;
+ else
+ pAd->Cfg80211RegisterActionFrame = FALSE;
+
+ DBGPRINT(RT_DEBUG_TRACE, ("pAd->Cfg80211RegisterActionFrame=%d [%d]\n",pAd->Cfg80211RegisterActionFrame, pAd->Cfg80211ActionCount));
+ break;
+
+ case CMD_RTPRIV_IOCTL_80211_CHANNEL_LOCK:
+ //pAd->CommonCfg.CentralChannel = Data;
+ //DBGPRINT(RT_DEBUG_TRACE, ("CMD_RTPRIV_IOCTL_80211_CHANNEL_LOCK %d\n", Data));
+ if (pAd->CommonCfg.Channel != Data)
+ {
+ pAd->CommonCfg.Channel= Data;
+ AsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE);
+ AsicLockChannel(pAd, pAd->CommonCfg.Channel);
+ }
+ break;
+
+ case CMD_RTPRIV_IOCTL_80211_MGMT_FRAME_SEND:
+ /* send a managment frame */
+ pAd->TxStatusInUsed = TRUE;
+ pAd->TxStatusSeq = pAd->Sequence;
+ if (pData != NULL)
+ {
+#ifdef WFD_SUPPORT
+ if (pAd->StaCfg.WfdCfg.bSuppInsertWfdIe)
+ {
+ PP2P_PUBLIC_FRAME pFrame = (PP2P_PUBLIC_FRAME)pData;
+ ULONG WfdIeLen = 0, WfdIeBitmap = 0;
+
+ switch (pFrame->p80211Header.FC.SubType)
+ {
+ case SUBTYPE_BEACON:
+ case SUBTYPE_PROBE_REQ:
+ case SUBTYPE_ASSOC_REQ:
+ case SUBTYPE_REASSOC_REQ:
+ WfdIeBitmap = (0x1 << SUBID_WFD_DEVICE_INFO) | (0x1 << SUBID_WFD_ASSOCIATED_BSSID) |
+ (0x1 << SUBID_WFD_COUPLED_SINK_INFO);
+ break;
+
+ case SUBTYPE_ASSOC_RSP:
+ case SUBTYPE_REASSOC_RSP:
+ WfdIeBitmap = (0x1 << SUBID_WFD_DEVICE_INFO) | (0x1 << SUBID_WFD_ASSOCIATED_BSSID) |
+ (0x1 << SUBID_WFD_COUPLED_SINK_INFO) | (0x1 << SUBID_WFD_SESSION_INFO);
+ break;
+
+ case SUBTYPE_PROBE_RSP:
+ WfdIeBitmap = (0x1 << SUBID_WFD_DEVICE_INFO) | (0x1 << SUBID_WFD_ASSOCIATED_BSSID) |
+ (0x1 << SUBID_WFD_COUPLED_SINK_INFO) | (0x1 << SUBID_WFD_SESSION_INFO);
+ break;
+
+ case SUBTYPE_ACTION:
+ if ((pFrame->Category == CATEGORY_PUBLIC) &&
+ (pFrame->Action == ACTION_WIFI_DIRECT))
+ {
+ switch (pFrame->Subtype)
+ {
+ case GO_NEGOCIATION_REQ:
+ case GO_NEGOCIATION_RSP:
+ case GO_NEGOCIATION_CONFIRM:
+ case P2P_PROVISION_REQ:
+ WfdIeBitmap = (0x1 << SUBID_WFD_DEVICE_INFO) | (0x1 << SUBID_WFD_ASSOCIATED_BSSID) |
+ (0x1 << SUBID_WFD_COUPLED_SINK_INFO);
+ break;
+
+ case P2P_INVITE_REQ:
+ case P2P_INVITE_RSP:
+ case P2P_PROVISION_RSP:
+ WfdIeBitmap = (0x1 << SUBID_WFD_DEVICE_INFO) | (0x1 << SUBID_WFD_ASSOCIATED_BSSID) |
+ (0x1 << SUBID_WFD_COUPLED_SINK_INFO) | (0x1 << SUBID_WFD_SESSION_INFO);
+ break;
+ }
+ }
+ break;
+ }
+
+ if (WfdIeBitmap > 0)
+ {
+ PUCHAR pOutBuffer;
+ NDIS_STATUS NStatus;
+
+ NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); /* Get an unused nonpaged memory */
+ if (NStatus != NDIS_STATUS_SUCCESS)
+ DBGPRINT(RT_DEBUG_ERROR, ("%s: Allocate memory fail!!!\n", __FUNCTION__));
+ else
+ {
+ memcpy(pOutBuffer, pData, Data);
+ WfdMakeWfdIE(pAd, WfdIeBitmap, pOutBuffer + Data, &WfdIeLen);
+ Data += WfdIeLen;
+
+ if (pAd->pTxStatusBuf != NULL)
+ os_free_mem(NULL, pAd->pTxStatusBuf);
+
+ os_alloc_mem(NULL, (UCHAR **)&pAd->pTxStatusBuf, Data);
+ if (pAd->pTxStatusBuf != NULL)
+ {
+ NdisCopyMemory(pAd->pTxStatusBuf, pOutBuffer, Data);
+ pAd->TxStatusBufLen = Data;
+ }
+ else
+ {
+ DBGPRINT(RT_DEBUG_TRACE, ("YF_TX_STATUS: MEM ALLOC ERROR\n"));
+ MlmeFreeMemory(pAd, pOutBuffer);
+ return NDIS_STATUS_FAILURE;
+ }
+ MiniportMMRequest(pAd, 0, pOutBuffer, Data);
+ }
+ }
+ }
+ else
+#endif /* WFD_SUPPORT */
+ {
+ if (pAd->pTxStatusBuf != NULL)
+ os_free_mem(NULL, pAd->pTxStatusBuf);
+
+ os_alloc_mem(NULL, (UCHAR **)&pAd->pTxStatusBuf, Data);
+ if (pAd->pTxStatusBuf != NULL)
+ {
+ NdisCopyMemory(pAd->pTxStatusBuf, pData, Data);
+ pAd->TxStatusBufLen = Data;
+ }
+ else
+ {
+ DBGPRINT(RT_DEBUG_TRACE, ("YF_TX_STATUS: MEM ALLOC ERROR\n"));
+ return NDIS_STATUS_FAILURE;
+ }
+ // pAd->pTxStatusBuf
+ // pAd->TxStatusBufLen = Data
+ //DBGPRINT(RT_DEBUG_TRACE, ("YF_TX_STATUS: send %d\n", pAd->TxStatusSeq));
+ MiniportMMRequest(pAd, 0, pData, Data);
+ //DBGPRINT(RT_DEBUG_TRACE, ("YF_TX_STATUS: sent %d\n", pAd->TxStatusSeq));
+ }
+ }
+ break;
+
+ case CMD_RTPRIV_IOCTL_80211_REMAIN_ON_CHAN_DUR_TIMER_INIT:
+ DBGPRINT(RT_DEBUG_TRACE, ("ROC TIMER INIT\n"));
+ RTMPInitTimer(pAd, &pAd->Cfg80211RemainOnChannelDurationTimer, GET_TIMER_FUNCTION(RemainOnChannelTimeout), pAd, FALSE);
+ break;
+
+ case CMD_RTPRIV_IOCTL_80211_CHANNEL_LIST_SET:
+ DBGPRINT(RT_DEBUG_TRACE, ("CMD_RTPRIV_IOCTL_80211_CHANNEL_LIST_SET: %d\n", Data));
+ UINT32 *pChanList = (UINT32 *) pData;
+
+ if (pChanList != NULL)
+ {
+
+ if (pAd->pCfg80211ChanList != NULL)
+ os_free_mem(NULL, pAd->pCfg80211ChanList);
+
+ os_alloc_mem(NULL, (UINT32 **)&pAd->pCfg80211ChanList, sizeof(UINT32 *) * Data);
+ if (pAd->pCfg80211ChanList != NULL)
+ {
+ NdisCopyMemory(pAd->pCfg80211ChanList, pChanList, sizeof(UINT32 *) * Data);
+ pAd->Cfg80211ChanListLan = Data;
+ }
+ else
+ {
+ return NDIS_STATUS_FAILURE;
+ }
+ }
+
+ break;
+
+ case CMD_RTPRIV_IOCTL_80211_BEACON_SET:
+ CFG80211DRV_OpsBeaconSet(pAd, pData, 0);
+ break;
+
+ case CMD_RTPRIV_IOCTL_80211_BEACON_ADD:
+ CFG80211DRV_OpsBeaconSet(pAd, pData, 1);
+ break;
+
+ case CMD_RTPRIV_IOCTL_80211_BEACON_DEL:
+#ifdef WFD_SUPPORT
+ pAd->StaCfg.WfdCfg.bSuppGoOn = FALSE;
+#endif /* WFD_SUPPORT */
+ break;
+
+ case CMD_RTPRIV_IOCTL_80211_CHANGE_BSS_PARM:
+ CFG80211DRV_OpsChangeBssParm(pAd, pData);
+ break;
+
+ case CMD_RTPRIV_IOCTL_80211_AP_PROBE_RSP:
+ if (pData != NULL)
+ {
+ if (pAd->pCfg80211RrobeRsp != NULL)
+ os_free_mem(NULL, pAd->pCfg80211RrobeRsp);
+
+ os_alloc_mem(NULL, (UCHAR **)&pAd->pCfg80211RrobeRsp, Data);
+ if (pAd->pCfg80211RrobeRsp != NULL)
+ {
+ NdisCopyMemory(pAd->pCfg80211RrobeRsp, pData, Data);
+ pAd->Cfg80211AssocRspLen = Data;
+ }
+ else
+ {
+ DBGPRINT(RT_DEBUG_TRACE, ("YF_AP: MEM ALLOC ERROR\n"));
+ return NDIS_STATUS_FAILURE;
+ }
+
+ }
+ else
+ return NDIS_STATUS_FAILURE;
+ break;
+
+ case CMD_RTPRIV_IOCTL_80211_PORT_SECURED:
+ CFG80211_StaPortSecured(pAd, pData, Data);
+ break;
+
+ case CMD_RTPRIV_IOCTL_80211_AP_STA_DEL:
+ CFG80211_ApStaDel(pAd, pData);
+ break;
+ case CMD_RTPRIV_IOCTL_80211_BITRATE_SET:
+ // pAd->CommonCfg.PhyMode = PHY_11AN_MIXED;
+ // RTMPSetPhyMode(pAd, pAd->CommonCfg.PhyMode);
+ //Set_WirelessMode_Proc(pAd, PHY_11AGN_MIXED);
+ break;
+#ifdef RT_P2P_SPECIFIC_WIRELESS_EVENT
+ case CMD_RTPRIV_IOCTL_80211_SEND_WIRELESS_EVENT:
+ CFG80211_SendWirelessEvent(pAd, pData);
+ break;
+#endif /* RT_P2P_SPECIFIC_WIRELESS_EVENT */
+ default:
+ return NDIS_STATUS_FAILURE;
+ }
+
+ return NDIS_STATUS_SUCCESS;
+}
+
+static VOID CFG80211DRV_DisableApInterface(
+ VOID *pAdOrg)
+{
+ UINT32 Value;
+ PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdOrg;
+ pAd->ApCfg.MBSSID[MAIN_MBSSID].bBcnSntReq = FALSE;
+
+ /* Disable pre-tbtt interrupt */
+ RTMP_IO_READ32(pAd, INT_TIMER_EN, &Value);
+ Value &=0xe;
+ RTMP_IO_WRITE32(pAd, INT_TIMER_EN, Value);
+
+ if (!INFRA_ON(pAd))
+ {
+ /* Disable piggyback */
+ RTMPSetPiggyBack(pAd, FALSE);
+ AsicUpdateProtect(pAd, 0, (ALLN_SETPROTECT|CCKSETPROTECT|OFDMSETPROTECT), TRUE, FALSE);
+
+ }
+
+ if (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))
+ {
+ /*RTMP_ASIC_INTERRUPT_DISABLE(pAd); */
+ AsicDisableSync(pAd);
+
+#ifdef LED_CONTROL_SUPPORT
+ /* Set LED */
+ RTMPSetLED(pAd, LED_LINK_DOWN);
+#endif /* LED_CONTROL_SUPPORT */
+ }
+
+#ifdef RTMP_MAC_USB
+ /* For RT2870, we need to clear the beacon sync buffer. */
+ RTUSBBssBeaconExit(pAd);
+#endif /* RTMP_MAC_USB */
+
+}
+
+VOID CFG80211DRV_OpsChangeBssParm(
+ VOID *pAdOrg,
+ VOID *pData)
+{
+ PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdOrg;
+ CMD_RTPRIV_IOCTL_80211_BSS_PARM *pBssInfo;
+ BOOLEAN TxPreamble;
+
+ CFG80211DBG(RT_DEBUG_TRACE, ("%s\n", __FUNCTION__));
+
+ pBssInfo = (CMD_RTPRIV_IOCTL_80211_BSS_PARM *)pData;
+
+ /* Short Preamble */
+ if (pBssInfo->use_short_preamble != -1)
+ {
+ CFG80211DBG(RT_DEBUG_TRACE, ("%s: ShortPreamble %d\n", __FUNCTION__, pBssInfo->use_short_preamble));
+ pAd->CommonCfg.TxPreamble = (pBssInfo->use_short_preamble == 0 ? Rt802_11PreambleLong : Rt802_11PreambleShort);
+ TxPreamble = (pAd->CommonCfg.TxPreamble == Rt802_11PreambleLong ? 0 : 1);
+ MlmeSetTxPreamble(pAd, (USHORT)pAd->CommonCfg.TxPreamble);
+ }
+
+ /* CTS Protection */
+ if (pBssInfo->use_cts_prot != -1)
+ {
+ CFG80211DBG(RT_DEBUG_TRACE, ("%s: CTS Protection %d\n", __FUNCTION__, pBssInfo->use_cts_prot));
+ }
+
+ /* Short Slot */
+ if (pBssInfo->use_short_slot_time != -1)
+ {
+ CFG80211DBG(RT_DEBUG_TRACE, ("%s: Short Slot %d\n", __FUNCTION__, pBssInfo->use_short_slot_time));
+ }
+}
+
+BOOLEAN CFG80211DRV_OpsSetChannel(
+ VOID *pAdOrg,
+ VOID *pData)
+{
+ PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdOrg;
+ CMD_RTPRIV_IOCTL_80211_CHAN *pChan;
+ UINT8 ChanId;
+ UINT8 IfType;
+ UINT8 ChannelType;
+ STRING ChStr[5] = { 0 };
+#ifdef DOT11_N_SUPPORT
+ UCHAR BW_Old;
+ BOOLEAN FlgIsChanged;
+#endif /* DOT11_N_SUPPORT */
+
+
+ /* init */
+ pChan = (CMD_RTPRIV_IOCTL_80211_CHAN *)pData;
+ ChanId = pChan->ChanId;
+ IfType = pChan->IfType;
+ ChannelType = pChan->ChanType;
+
+#ifdef DOT11_N_SUPPORT
+ if (IfType != RT_CMD_80211_IFTYPE_MONITOR)
+ {
+ /* get channel BW */
+ FlgIsChanged = FALSE;
+ BW_Old = pAd->CommonCfg.RegTransmitSetting.field.BW;
+
+ /* set to new channel BW */
+ if (ChannelType == RT_CMD_80211_CHANTYPE_HT20)
+ {
+ pAd->CommonCfg.RegTransmitSetting.field.BW = BW_20;
+ FlgIsChanged = TRUE;
+ }
+ else if ((ChannelType == RT_CMD_80211_CHANTYPE_HT40MINUS) ||
+ (ChannelType == RT_CMD_80211_CHANTYPE_HT40PLUS))
+ {
+ /* not support NL80211_CHAN_HT40MINUS or NL80211_CHAN_HT40PLUS */
+ /* i.e. primary channel = 36, secondary channel must be 40 */
+ pAd->CommonCfg.RegTransmitSetting.field.BW = BW_40;
+ FlgIsChanged = TRUE;
+ } /* End of if */
+
+ CFG80211DBG(RT_DEBUG_ERROR, ("80211> New BW = %d\n",
+ pAd->CommonCfg.RegTransmitSetting.field.BW));
+
+ /* change HT/non-HT mode (do NOT change wireless mode here) */
+ if (((ChannelType == RT_CMD_80211_CHANTYPE_NOHT) &&
+ (pAd->CommonCfg.HT_Disable == 0)) ||
+ ((ChannelType != RT_CMD_80211_CHANTYPE_NOHT) &&
+ (pAd->CommonCfg.HT_Disable == 1)))
+ {
+ if (ChannelType == RT_CMD_80211_CHANTYPE_NOHT)
+ pAd->CommonCfg.HT_Disable = 1;
+ else
+ pAd->CommonCfg.HT_Disable = 0;
+ /* End of if */
+
+ FlgIsChanged = TRUE;
+ CFG80211DBG(RT_DEBUG_ERROR, ("80211> HT Disable = %d\n",
+ pAd->CommonCfg.HT_Disable));
+ } /* End of if */
+ }
+ else
+ {
+ /* for monitor mode */
+ FlgIsChanged = TRUE;
+ pAd->CommonCfg.HT_Disable = 0;
+ pAd->CommonCfg.RegTransmitSetting.field.BW = BW_40;
+ } /* End of if */
+
+ if (FlgIsChanged == TRUE)
+ SetCommonHT(pAd);
+ /* End of if */
+#endif /* DOT11_N_SUPPORT */
+
+ /* switch to the channel */
+ sprintf(ChStr, "%d", ChanId);
+ if (Set_Channel_Proc(pAd, ChStr) == FALSE)
+ {
+ CFG80211DBG(RT_DEBUG_ERROR, ("80211> Change channel fail!\n"));
+ } /* End of if */
+
+
+ return TRUE;
+}
+
+
+BOOLEAN CFG80211DRV_OpsChgVirtualInf(
+ VOID *pAdOrg,
+ VOID *pFlgFilter,
+ UINT8 IfType)
+{
+
+ return TRUE;
+}
+
+
+BOOLEAN CFG80211DRV_OpsScan(
+ VOID *pAdOrg)
+{
+ PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdOrg;
+
+
+ if (pAd->FlgCfg80211Scanning == TRUE)
+ return FALSE; /* scanning */
+ /* End of if */
+
+ /* do scan */
+ pAd->FlgCfg80211Scanning = TRUE;
+ return TRUE;
+}
+
+/* REF: ap_connect.c ApMakeBssBeacon */
+BOOLEAN CFG80211DRV_OpsBeaconSet(
+ VOID *pAdOrg,
+ VOID *pData,
+ BOOLEAN isAdd)
+{
+ CFG80211DBG(RT_DEBUG_TRACE, ("80211> CFG80211DRV_OpsBeaconSet ==> %d\n", isAdd));
+ PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdOrg;
+ CMD_RTPRIV_IOCTL_80211_BEACON *pBeacon;
+ PTXWI_STRUC pTxWI = &pAd->BeaconTxWI;
+ HTTRANSMIT_SETTING BeaconTransmit; /* MGMT frame PHY rate setting when operatin at Ht rate. */
+ BCN_TIME_CFG_STRUC csr9;
+ UCHAR *ptr;
+ UINT i;
+ UINT32 longValue;
+ UINT8 TXWISize = pAd->chipCap.TXWISize;
+ UINT32 rx_filter_flag;
+ BOOLEAN TxPreamble, SpectrumMgmt = FALSE;
+ BOOLEAN bWmmCapable = FALSE;
+ UCHAR BBPR1 = 0, BBPR3 = 0;
+ INT idx;
+ ULONG offset;
+
+ CFG80211DBG(RT_DEBUG_TRACE, ("80211> CFG80211DRV_OpsBeaconSet ==> \n"));
+ pBeacon = (CMD_RTPRIV_IOCTL_80211_BEACON *)pData;
+
+#ifdef WFD_SUPPORT
+ if (pAd->StaCfg.WfdCfg.bSuppInsertWfdIe)
+ {
+ ULONG TmpLen, WfdIeBitmap;
+
+ ptr = pBeacon->beacon + pBeacon->beacon_len;
+ WfdIeBitmap = (0x1 << SUBID_WFD_DEVICE_INFO) | (0x1 << SUBID_WFD_ASSOCIATED_BSSID) |
+ (0x1 << SUBID_WFD_COUPLED_SINK_INFO);
+ WfdMakeWfdIE(pAd, WfdIeBitmap, ptr, &TmpLen);
+ pBeacon->beacon_len += TmpLen;
+ }
+#endif /* WFD_SUPPORT */
+
+ if (isAdd)
+ {
+ rx_filter_flag = APNORMAL;
+ RTMP_IO_WRITE32(pAd, RX_FILTR_CFG, rx_filter_flag); /* enable RX of DMA block */
+
+ pAd->ApCfg.BssidNum = 1;
+ pAd->MacTab.MsduLifeTime = 20; /* default 5 seconds */
+ pAd->ApCfg.MBSSID[MAIN_MBSSID].bBcnSntReq = TRUE;
+
+#ifdef INF_AMAZON_SE
+ printk("YF DEBUG: INF_AMAZON_SE\n");
+ for (i = 0; i < NUM_OF_TX_RING; i++)
+ {
+ pAd->BulkOutDataSizeLimit[i]=24576;
+ }
+#endif /* INF_AMAZON_SE */
+
+ AsicDisableSync(pAd);
+
+ if (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED)
+ {
+ if (pAd->CommonCfg.Channel > 14)
+ pAd->ApCfg.MBSSID[MAIN_MBSSID].PhyMode = PHY_11AN_MIXED;
+ else
+ pAd->ApCfg.MBSSID[MAIN_MBSSID].PhyMode = PHY_11BGN_MIXED;
+ }
+ else
+ {
+ if (pAd->CommonCfg.Channel > 14)
+ pAd->ApCfg.MBSSID[MAIN_MBSSID].PhyMode = PHY_11A;
+ else
+ pAd->ApCfg.MBSSID[MAIN_MBSSID].PhyMode = PHY_11BG_MIXED;
+ }
+
+ TxPreamble = (pAd->CommonCfg.TxPreamble == Rt802_11PreambleLong ? 0 : 1);
+ }
+
+ PMULTISSID_STRUCT pMbss = &pAd->ApCfg.MBSSID[MAIN_MBSSID];
+
+ const UCHAR *ssid_ie = NULL;
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,33))
+ ssid_ie = cfg80211_find_ie(WLAN_EID_SSID, pBeacon->beacon+36, pBeacon->beacon_len-36);
+#endif
+ NdisZeroMemory(pMbss->Ssid, pMbss->SsidLen);
+ if (ssid_ie == NULL)
+ {
+ printk("YF Debug: SSID Not Found In Packet\n");
+ NdisMoveMemory(pMbss->Ssid, "P2P_Linux_AP", 12);
+ pMbss->SsidLen = 12;
+ }
+ else
+ {
+ pMbss->SsidLen = ssid_ie[1];
+ NdisCopyMemory(pMbss->Ssid, ssid_ie+2, pMbss->SsidLen);
+ printk("YF Debug: SSID: %s, %d\n", pMbss->Ssid, pMbss->SsidLen);
+ }
+
+ if (isAdd)
+ {
+ //if (pMbss->bWmmCapable)
+ //{
+ bWmmCapable = FALSE;
+ pMbss->bWmmCapable = FALSE;
+ //}
+
+ pMbss->MSSIDDev = pAd->net_dev;
+ COPY_MAC_ADDR(pMbss->Bssid, pAd->CurrentAddress);
+ printk("AP BSSID %02x:%02x:%02x:%02x:%02x:%02x\n", PRINT_MAC(pAd->CurrentAddress));
+
+ /* GO always use WPA2PSK / AES */
+ pMbss->AuthMode = Ndis802_11AuthModeWPA2PSK;
+ pMbss->WepStatus = Ndis802_11Encryption3Enabled;
+ pMbss->WscSecurityMode = WPA2PSKAES;
+ pMbss->GroupKeyWepStatus = pMbss->WepStatus;
+ pMbss->CapabilityInfo =
+ CAP_GENERATE(1, 0, (pMbss->WepStatus != Ndis802_11EncryptionDisabled), TxPreamble, pAd->CommonCfg.bUseShortSlotTime, SpectrumMgmt);
+
+ RTMPMakeRSNIE(pAd, Ndis802_11AuthModeWPA2PSK, Ndis802_11Encryption3Enabled, MAIN_MBSSID);
+
+#ifdef DOT11_N_SUPPORT
+ RTMPSetPhyMode(pAd, pAd->CommonCfg.PhyMode);
+ SetCommonHT(pAd);
+
+ if ((pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED) && (pAd->Antenna.field.TxPath == 2))
+ {
+ RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R1, &BBPR1);
+ BBPR1 &= (~0x18);
+ BBPR1 |= 0x10;
+ RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R1, BBPR1);
+ }
+ else
+#endif /* DOT11_N_SUPPORT */
+ {
+ RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R1, &BBPR1);
+ BBPR1 &= (~0x18);
+ RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R1, BBPR1);
+ }
+
+ /* Receiver Antenna selection, write to BBP R3(bit4:3) */
+ RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &BBPR3);
+ BBPR3 &= (~0x18);
+ if(pAd->Antenna.field.RxPath == 3)
+ {
+ BBPR3 |= (0x10);
+ }
+ else if(pAd->Antenna.field.RxPath == 2)
+ {
+ BBPR3 |= (0x8);
+ }
+ else if(pAd->Antenna.field.RxPath == 1)
+ {
+ BBPR3 |= (0x0);
+ }
+ RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, BBPR3);
+
+ if(!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED))
+ {
+ if ((pAd->CommonCfg.PhyMode > PHY_11G) || bWmmCapable)
+ {
+ /* EDCA parameters used for AP's own transmission */
+ pAd->CommonCfg.APEdcaParm.bValid = TRUE;
+ pAd->CommonCfg.APEdcaParm.Aifsn[0] = 3;
+ pAd->CommonCfg.APEdcaParm.Aifsn[1] = 7;
+ pAd->CommonCfg.APEdcaParm.Aifsn[2] = 1;
+ pAd->CommonCfg.APEdcaParm.Aifsn[3] = 1;
+
+ pAd->CommonCfg.APEdcaParm.Cwmin[0] = 4;
+ pAd->CommonCfg.APEdcaParm.Cwmin[1] = 4;
+ pAd->CommonCfg.APEdcaParm.Cwmin[2] = 3;
+ pAd->CommonCfg.APEdcaParm.Cwmin[3] = 2;
+
+ pAd->CommonCfg.APEdcaParm.Cwmax[0] = 6;
+ pAd->CommonCfg.APEdcaParm.Cwmax[1] = 10;
+ pAd->CommonCfg.APEdcaParm.Cwmax[2] = 4;
+ pAd->CommonCfg.APEdcaParm.Cwmax[3] = 3;
+
+ pAd->CommonCfg.APEdcaParm.Txop[0] = 0;
+ pAd->CommonCfg.APEdcaParm.Txop[1] = 0;
+ pAd->CommonCfg.APEdcaParm.Txop[2] = 94; /*96; */
+ pAd->CommonCfg.APEdcaParm.Txop[3] = 47; /*48; */
+ AsicSetEdcaParm(pAd, &pAd->CommonCfg.APEdcaParm);
+
+ /* EDCA parameters to be annouced in outgoing BEACON, used by WMM STA */
+ pAd->ApCfg.BssEdcaParm.bValid = TRUE;
+ pAd->ApCfg.BssEdcaParm.Aifsn[0] = 3;
+ pAd->ApCfg.BssEdcaParm.Aifsn[1] = 7;
+ pAd->ApCfg.BssEdcaParm.Aifsn[2] = 2;
+ pAd->ApCfg.BssEdcaParm.Aifsn[3] = 2;
+
+ pAd->ApCfg.BssEdcaParm.Cwmin[0] = 4;
+ pAd->ApCfg.BssEdcaParm.Cwmin[1] = 4;
+ pAd->ApCfg.BssEdcaParm.Cwmin[2] = 3;
+ pAd->ApCfg.BssEdcaParm.Cwmin[3] = 2;
+
+ pAd->ApCfg.BssEdcaParm.Cwmax[0] = 10;
+ pAd->ApCfg.BssEdcaParm.Cwmax[1] = 10;
+ pAd->ApCfg.BssEdcaParm.Cwmax[2] = 4;
+ pAd->ApCfg.BssEdcaParm.Cwmax[3] = 3;
+
+ pAd->ApCfg.BssEdcaParm.Txop[0] = 0;
+ pAd->ApCfg.BssEdcaParm.Txop[1] = 0;
+ pAd->ApCfg.BssEdcaParm.Txop[2] = 94; /*96; */
+ pAd->ApCfg.BssEdcaParm.Txop[3] = 47; /*48; */
+ }
+ else
+ {
+ AsicSetEdcaParm(pAd, NULL);
+ }
+ }
+
+#ifdef DOT11_N_SUPPORT
+ if (pAd->CommonCfg.PhyMode < PHY_11ABGN_MIXED)
+ {
+ /* Patch UI */
+ pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth = BW_20;
+ }
+
+ /* init */
+ if (pAd->CommonCfg.bRdg)
+ {
+ RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_RDG_ACTIVE);
+ AsicEnableRDG(pAd);
+ }
+ else
+ {
+ RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_RDG_ACTIVE);
+ AsicDisableRDG(pAd);
+ }
+#endif /* DOT11_N_SUPPORT */
+
+ //AsicSetBssid(pAd, pAd->CurrentAddress);
+ AsicSetMcastWC(pAd);
+
+ /* In AP mode, First WCID Table in ASIC will never be used. To prevent it's 0xff-ff-ff-ff-ff-ff, Write 0 here. */
+ /* p.s ASIC use all 0xff as termination of WCID table search. */
+ RTMP_IO_WRITE32(pAd, MAC_WCID_BASE, 0x00);
+ RTMP_IO_WRITE32(pAd, MAC_WCID_BASE+4, 0x0);
+
+ /* reset WCID table */
+ for (idx=2; idx<255; idx++)
+ {
+ offset = MAC_WCID_BASE + (idx * HW_WCID_ENTRY_SIZE);
+ RTMP_IO_WRITE32(pAd, offset, 0x0);
+ RTMP_IO_WRITE32(pAd, offset+4, 0x0);
+ }
+
+ pAd->MacTab.Content[0].Addr[0] = 0x01;
+ pAd->MacTab.Content[0].HTPhyMode.field.MODE = MODE_OFDM;
+ pAd->MacTab.Content[0].HTPhyMode.field.MCS = 3;
+
+ AsicBBPAdjust(pAd);
+ //MlmeSetTxPreamble(pAd, (USHORT)pAd->CommonCfg.TxPreamble);
+
+ {
+ ULONG Addr4;
+ UINT32 regValue;
+ PUCHAR pP2PBssid = &pAd->CurrentAddress[0];
+
+ Addr4 = (ULONG)(pP2PBssid[0]) |
+ (ULONG)(pP2PBssid[1] << 8) |
+ (ULONG)(pP2PBssid[2] << 16) |
+ (ULONG)(pP2PBssid[3] << 24);
+ RTMP_IO_WRITE32(pAd, MAC_BSSID_DW0, Addr4);
+
+ Addr4 = 0;
+
+ Addr4 = (ULONG)(pP2PBssid[4]) | (ULONG)(pP2PBssid[5] << 8);
+ RTMP_IO_WRITE32(pAd, MAC_BSSID_DW1, Addr4);
+
+ RTMP_IO_READ32(pAd, MAC_BSSID_DW1, &regValue);
+ regValue &= 0x0000FFFF;
+
+ regValue |= (1 << 16);
+
+ if (pAd->chipCap.MBSSIDMode == MBSSID_MODE1)
+ regValue |= (1 << 21);
+ RTMP_IO_WRITE32(pAd, MAC_BSSID_DW1, regValue);
+ }
+
+
+#ifdef RTMP_MAC_USB
+ printk("YF DEBUG: RTUSBBssBeaconInit\n");
+ RTUSBBssBeaconInit(pAd);
+#endif /* RTMP_MAC_USB */
+ }
+
+ UCHAR apcliIdx, apidx = MAIN_MBSSID;
+
+ //pAd->ApCfg.MBSSID[MAIN_MBSSID].PhyMode = PHY_11BGN_MIXED;
+
+
+ printk("YF DEBUG: Beacon Len %d\n", pBeacon->beacon_len);
+ printk("YF DEBUG: Beacon Interval %d\n", pBeacon->interval);
+ BeaconTransmit.word = 0;
+
+ RTMPWriteTxWI(pAd, pTxWI, FALSE, FALSE, TRUE, FALSE, FALSE, TRUE, 0, BSS0Mcast_WCID,
+ pBeacon->beacon_len, PID_MGMT, 0, 0,IFS_HTTXOP, FALSE, &BeaconTransmit);
+
+ ptr = (PUCHAR)&pAd->BeaconTxWI;
+#ifdef RT_BIG_ENDIAN
+ RTMPWIEndianChange(ptr, TYPE_TXWI);
+#endif
+
+ for (i=0; i<TXWISize; i+=4) /* 16-byte TXWI field */
+ {
+ longValue = *ptr + (*(ptr+1)<<8) + (*(ptr+2)<<16) + (*(ptr+3)<<24);
+ RTMP_IO_WRITE32(pAd, pAd->BeaconOffset[0] + i, longValue);
+ ptr += 4;
+ }
+
+ /* update BEACON frame content. start right after the 16-byte TXWI field. */
+ ptr = pBeacon->beacon;
+#ifdef RT_BIG_ENDIAN
+ RTMPFrameEndianChange(pAd, ptr, DIR_WRITE, FALSE);
+#endif
+
+ for (i= 0; i< pBeacon->beacon_len; i+=4)
+ {
+ longValue = *ptr + (*(ptr+1)<<8) + (*(ptr+2)<<16) + (*(ptr+3)<<24);
+ RTMP_IO_WRITE32(pAd, pAd->BeaconOffset[0] + TXWISize + i, longValue);
+ ptr += 4;
+ }
+
+ if (isAdd)
+ {
+ /* Enable Bss Sync*/
+ RTMP_IO_READ32(pAd, BCN_TIME_CFG, &csr9.word);
+ csr9.field.BeaconInterval = (pBeacon->interval) << 4; /* ASIC register in units of 1/16 TU*/
+ csr9.field.bTsfTicking = 1;
+ csr9.field.TsfSyncMode = 3;
+ csr9.field.bTBTTEnable = 1;
+ csr9.field.bBeaconGen = 1;
+ RTMP_IO_WRITE32(pAd, BCN_TIME_CFG, csr9.word);
+
+ pAd->P2pCfg.bSentProbeRSP = TRUE;
+
+#ifdef RTMP_MAC_USB
+ /*
+ * Support multiple BulkIn IRP,
+ * the value on pAd->CommonCfg.NumOfBulkInIRP may be large than 1.
+ */
+
+ UCHAR num_idx;
+
+ for(num_idx=0; num_idx < pAd->CommonCfg.NumOfBulkInIRP; num_idx++)
+ {
+ RTUSBBulkReceive(pAd);
+ printk("RTUSBBulkReceive!\n" );
+ }
+
+#endif /* RTMP_MAC_USB */
+ }
+
+#ifdef WFD_SUPPORT
+ pAd->StaCfg.WfdCfg.bSuppGoOn = TRUE;
+#endif /* WFD_SUPPORT */
+
+ return TRUE;
+
+}
+
+BOOLEAN CFG80211DRV_OpsExtraIesSet(
+ VOID *pAdOrg)
+{
+ PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdOrg;
+
+ CFG80211_CB *pCfg80211_CB = pAd->pCfg80211_CB;
+ UINT ie_len = pCfg80211_CB->pCfg80211_ScanReq->ie_len;
+ CFG80211DBG(RT_DEBUG_ERROR, ("80211> CFG80211DRV_OpsExtraIesSet ==> %d\n", ie_len));
+
+ if (pAd->StaCfg.pWpsProbeReqIe)
+ {
+ os_free_mem(NULL, pAd->StaCfg.pWpsProbeReqIe);
+ pAd->StaCfg.pWpsProbeReqIe = NULL;
+ }
+
+ pAd->StaCfg.WpsProbeReqIeLen = 0;
+
+ CFG80211DBG(RT_DEBUG_ERROR, ("80211> is_wpa_supplicant_up ==> %d\n", pAd->StaCfg.WpaSupplicantUP));
+ os_alloc_mem(pAd, (UCHAR **)&(pAd->StaCfg.pWpsProbeReqIe), ie_len);
+ if (pAd->StaCfg.pWpsProbeReqIe)
+ {
+ memcpy(pAd->StaCfg.pWpsProbeReqIe, pCfg80211_CB->pCfg80211_ScanReq->ie, ie_len);
+ pAd->StaCfg.WpsProbeReqIeLen = ie_len;
+ //hex_dump("WpsProbeReqIe", pAd->StaCfg.pWpsProbeReqIe, pAd->StaCfg.WpsProbeReqIeLen);
+ DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_WPS_PROBE_REQ_IE, WpsProbeReqIeLen = %d!!\n",
+ pAd->StaCfg.WpsProbeReqIeLen));
+ }
+ else
+ {
+ CFG80211DBG(RT_DEBUG_ERROR, ("80211> CFG80211DRV_OpsExtraIesSet ==> allocate fail. \n"));
+ return FALSE;
+ }
+ return TRUE;
+}
+
+
+BOOLEAN CFG80211DRV_OpsJoinIbss(
+ VOID *pAdOrg,
+ VOID *pData)
+{
+ return TRUE;
+}
+
+
+BOOLEAN CFG80211DRV_OpsLeave(
+ VOID *pAdOrg)
+{
+ return TRUE;
+}
+
+
+BOOLEAN CFG80211DRV_StaGet(
+ VOID *pAdOrg,
+ VOID *pData)
+{
+ PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdOrg;
+ CMD_RTPRIV_IOCTL_80211_STA *pIbssInfo;
+
+
+ pIbssInfo = (CMD_RTPRIV_IOCTL_80211_STA *)pData;
+
+#ifdef CONFIG_AP_SUPPORT
+{
+ MAC_TABLE_ENTRY *pEntry;
+ ULONG DataRate = 0;
+ UINT32 RSSI;
+
+
+ pEntry = MacTableLookup(pAd, pIbssInfo->MAC);
+ if (pEntry == NULL)
+ return FALSE;
+ /* End of if */
+
+ /* fill tx rate */
+ getRate(pEntry->HTPhyMode, &DataRate);
+
+ if ((pEntry->HTPhyMode.field.MODE == MODE_HTMIX) ||
+ (pEntry->HTPhyMode.field.MODE == MODE_HTGREENFIELD))
+ {
+ if (pEntry->HTPhyMode.field.BW)
+ pIbssInfo->TxRateFlags |= RT_CMD_80211_TXRATE_BW_40;
+ /* End of if */
+ if (pEntry->HTPhyMode.field.ShortGI)
+ pIbssInfo->TxRateFlags |= RT_CMD_80211_TXRATE_SHORT_GI;
+ /* End of if */
+
+ pIbssInfo->TxRateMCS = pEntry->HTPhyMode.field.MCS;
+ }
+ else
+ {
+ pIbssInfo->TxRateFlags = RT_CMD_80211_TXRATE_LEGACY;
+ pIbssInfo->TxRateMCS = DataRate*1000; /* unit: 100kbps */
+ } /* End of if */
+
+ /* fill signal */
+ RSSI = (pEntry->RssiSample.AvgRssi0 +
+ pEntry->RssiSample.AvgRssi1 +
+ pEntry->RssiSample.AvgRssi2) / 3;
+ pIbssInfo->Signal = RSSI;
+
+ /* fill tx count */
+ pIbssInfo->TxPacketCnt = pEntry->OneSecTxNoRetryOkCount +
+ pEntry->OneSecTxRetryOkCount +
+ pEntry->OneSecTxFailCount;
+
+ /* fill inactive time */
+ pIbssInfo->InactiveTime = pEntry->NoDataIdleCount * 1000; /* unit: ms */
+ pIbssInfo->InactiveTime *= MLME_TASK_EXEC_MULTIPLE;
+ pIbssInfo->InactiveTime /= 20;
+}
+#endif /* CONFIG_AP_SUPPORT */
+
+
+ return TRUE;
+}
+
+
+BOOLEAN CFG80211DRV_KeyAdd(
+ VOID *pAdOrg,
+ VOID *pData)
+{
+
+ return TRUE;
+}
+
+
+BOOLEAN CFG80211DRV_Connect(
+ VOID *pAdOrg,
+ VOID *pData)
+{
+
+ return TRUE;
+}
+
+
+VOID CFG80211DRV_RegNotify(
+ VOID *pAdOrg,
+ VOID *pData)
+{
+ PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdOrg;
+ CMD_RTPRIV_IOCTL_80211_REG_NOTIFY *pRegInfo;
+
+
+ pRegInfo = (CMD_RTPRIV_IOCTL_80211_REG_NOTIFY *)pData;
+
+ /* keep Alpha2 and we can re-call the function when interface is up */
+ pAd->Cfg80211_Alpha2[0] = pRegInfo->Alpha2[0];
+ pAd->Cfg80211_Alpha2[1] = pRegInfo->Alpha2[1];
+
+ /* apply the new regulatory rule */
+ if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_START_UP))
+ {
+ /* interface is up */
+ CFG80211_RegRuleApply(pAd, pRegInfo->pWiphy, (UCHAR *)pRegInfo->Alpha2);
+ }
+ else
+ {
+ CFG80211DBG(RT_DEBUG_ERROR, ("crda> interface is down!\n"));
+ } /* End of if */
+}
+
+
+VOID CFG80211DRV_SurveyGet(
+ VOID *pAdOrg,
+ VOID *pData)
+{
+ PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdOrg;
+ CMD_RTPRIV_IOCTL_80211_SURVEY *pSurveyInfo;
+
+
+ pSurveyInfo = (CMD_RTPRIV_IOCTL_80211_SURVEY *)pData;
+
+ pSurveyInfo->pCfg80211 = pAd->pCfg80211_CB;
+
+#ifdef AP_QLOAD_SUPPORT
+ pSurveyInfo->ChannelTimeBusy = pAd->QloadLatestChannelBusyTimePri;
+ pSurveyInfo->ChannelTimeExtBusy = pAd->QloadLatestChannelBusyTimeSec;
+#endif /* AP_QLOAD_SUPPORT */
+}
+
+
+VOID CFG80211_UnRegister(
+ IN VOID *pAdOrg,
+ IN VOID *pNetDev)
+{
+ PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdOrg;
+
+
+ /* sanity check */
+ if (pAd->pCfg80211_CB == NULL)
+ return;
+ /* End of if */
+
+ CFG80211OS_UnRegister(pAd->pCfg80211_CB, pNetDev);
+ pAd->pCfg80211_CB = NULL;
+ pAd->CommonCfg.HT_Disable = 0;
+}
+
+
+/*
+========================================================================
+Routine Description:
+ Parse and handle country region in beacon from associated AP.
+
+Arguments:
+ pAdCB - WLAN control block pointer
+ pVIE - Beacon elements
+ LenVIE - Total length of Beacon elements
+
+Return Value:
+ NONE
+
+Note:
+========================================================================
+*/
+VOID CFG80211_BeaconCountryRegionParse(
+ IN VOID *pAdCB,
+ IN NDIS_802_11_VARIABLE_IEs *pVIE,
+ IN UINT16 LenVIE)
+{
+ PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdCB;
+ UCHAR *pElement = (UCHAR *)pVIE;
+ UINT32 LenEmt;
+
+
+ while(LenVIE > 0)
+ {
+ pVIE = (NDIS_802_11_VARIABLE_IEs *)pElement;
+
+ if (pVIE->ElementID == IE_COUNTRY)
+ {
+ /* send command to do regulation hint only when associated */
+ RTEnqueueInternalCmd(pAd, CMDTHREAD_REG_HINT_11D,
+ pVIE->data, pVIE->Length);
+ break;
+ } /* End of if */
+
+ LenEmt = pVIE->Length + 2;
+
+ if (LenVIE <= LenEmt)
+ break; /* length is not enough */
+ /* End of if */
+
+ pElement += LenEmt;
+ LenVIE -= LenEmt;
+ } /* End of while */
+} /* End of CFG80211_BeaconCountryRegionParse */
+
+
+/*
+========================================================================
+Routine Description:
+ Hint to the wireless core a regulatory domain from driver.
+
+Arguments:
+ pAd - WLAN control block pointer
+ pCountryIe - pointer to the country IE
+ CountryIeLen - length of the country IE
+
+Return Value:
+ NONE
+
+Note:
+ Must call the function in kernel thread.
+========================================================================
+*/
+VOID CFG80211_RegHint(
+ IN VOID *pAdCB,
+ IN UCHAR *pCountryIe,
+ IN ULONG CountryIeLen)
+{
+ PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdCB;
+
+
+ CFG80211OS_RegHint(CFG80211CB, pCountryIe, CountryIeLen);
+} /* End of CFG80211_RegHint */
+
+
+/*
+========================================================================
+Routine Description:
+ Hint to the wireless core a regulatory domain from country element.
+
+Arguments:
+ pAdCB - WLAN control block pointer
+ pCountryIe - pointer to the country IE
+ CountryIeLen - length of the country IE
+
+Return Value:
+ NONE
+
+Note:
+ Must call the function in kernel thread.
+========================================================================
+*/
+VOID CFG80211_RegHint11D(
+ IN VOID *pAdCB,
+ IN UCHAR *pCountryIe,
+ IN ULONG CountryIeLen)
+{
+ /* no regulatory_hint_11d() in 2.6.32 */
+ PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdCB;
+
+
+ CFG80211OS_RegHint11D(CFG80211CB, pCountryIe, CountryIeLen);
+} /* End of CFG80211_RegHint11D */
+
+
+/*
+========================================================================
+Routine Description:
+ Apply new regulatory rule.
+
+Arguments:
+ pAdCB - WLAN control block pointer
+ pWiphy - Wireless hardware description
+ pAlpha2 - Regulation domain (2B)
+
+Return Value:
+ NONE
+
+Note:
+ Can only be called when interface is up.
+
+ For general mac80211 device, it will be set to new power by Ops->config()
+ In rt2x00/, the settings is done in rt2x00lib_config().
+========================================================================
+*/
+VOID CFG80211_RegRuleApply(
+ IN VOID *pAdCB,
+ IN VOID *pWiphy,
+ IN UCHAR *pAlpha2)
+{
+ PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdCB;
+ VOID *pBand24G, *pBand5G;
+ UINT32 IdBand, IdChan, IdPwr;
+ UINT32 ChanNum, ChanId, Power, RecId, DfsType;
+ BOOLEAN FlgIsRadar;
+ ULONG IrqFlags;
+#ifdef DFS_SUPPORT
+ RADAR_DETECT_STRUCT *pRadarDetect;
+#endif /* DFS_SUPPORT */
+
+
+ CFG80211DBG(RT_DEBUG_ERROR, ("crda> CFG80211_RegRuleApply ==>\n"));
+
+ /* init */
+ pBand24G = NULL;
+ pBand5G = NULL;
+
+ if (pAd == NULL)
+ return;
+
+ RTMP_IRQ_LOCK(&pAd->irq_lock, IrqFlags);
+
+ /* zero first */
+ NdisZeroMemory(pAd->ChannelList,
+ MAX_NUM_OF_CHANNELS * sizeof(CHANNEL_TX_POWER));
+
+ /* 2.4GHZ & 5GHz */
+ RecId = 0;
+#ifdef DFS_SUPPORT
+ pRadarDetect = &pAd->CommonCfg.RadarDetect;
+#endif /* DFS_SUPPORT */
+
+ /* find the DfsType */
+ DfsType = CE;
+
+ pBand24G = NULL;
+ pBand5G = NULL;
+
+ if (CFG80211OS_BandInfoGet(CFG80211CB, pWiphy, &pBand24G, &pBand5G) == FALSE)
+ return;
+
+#ifdef AUTO_CH_SELECT_ENHANCE
+#ifdef EXT_BUILD_CHANNEL_LIST
+ if ((pAlpha2[0] != '0') && (pAlpha2[1] != '0'))
+ {
+ UINT32 IdReg;
+
+ if (pBand5G != NULL)
+ {
+ for(IdReg=0; ; IdReg++)
+ {
+ if (ChRegion[IdReg].CountReg[0] == 0x00)
+ break;
+ /* End of if */
+
+ if ((pAlpha2[0] == ChRegion[IdReg].CountReg[0]) &&
+ (pAlpha2[1] == ChRegion[IdReg].CountReg[1]))
+ {
+ if (pAd->CommonCfg.DfsType != MAX_RD_REGION)
+ DfsType = pAd->CommonCfg.DfsType;
+ else
+ DfsType = ChRegion[IdReg].DfsType;
+
+ CFG80211DBG(RT_DEBUG_ERROR,
+ ("crda> find region %c%c, DFS Type %d\n",
+ pAlpha2[0], pAlpha2[1], DfsType));
+ break;
+ } /* End of if */
+ } /* End of for */
+ } /* End of if */
+ } /* End of if */
+#endif /* EXT_BUILD_CHANNEL_LIST */
+#endif /* AUTO_CH_SELECT_ENHANCE */
+
+ for(IdBand=0; IdBand<2; IdBand++)
+ {
+ if (((IdBand == 0) && (pBand24G == NULL)) ||
+ ((IdBand == 1) && (pBand5G == NULL)))
+ {
+ continue;
+ } /* End of if */
+
+ if (IdBand == 0)
+ {
+ CFG80211DBG(RT_DEBUG_ERROR, ("crda> reset chan/power for 2.4GHz\n"));
+ }
+ else
+ {
+ CFG80211DBG(RT_DEBUG_ERROR, ("crda> reset chan/power for 5GHz\n"));
+ } /* End of if */
+
+ ChanNum = CFG80211OS_ChanNumGet(CFG80211CB, pWiphy, IdBand);
+
+ for(IdChan=0; IdChan<ChanNum; IdChan++)
+ {
+ if (CFG80211OS_ChanInfoGet(CFG80211CB, pWiphy, IdBand, IdChan,
+ &ChanId, &Power, &FlgIsRadar) == FALSE)
+ {
+ /* the channel is not allowed in the regulatory domain */
+ /* get next channel information */
+ continue;
+ }
+
+ if (!WMODE_CAP_2G(pAd->CommonCfg.PhyMode))
+ {
+ /* 5G-only mode */
+ if (ChanId <= CFG80211_NUM_OF_CHAN_2GHZ)
+ continue;
+ }
+
+ if (!WMODE_CAP_5G(pAd->CommonCfg.PhyMode))
+ {
+ /* 2.4G-only mode */
+ if (ChanId > CFG80211_NUM_OF_CHAN_2GHZ)
+ continue;
+ }
+
+ for(IdPwr=0; IdPwr<MAX_NUM_OF_CHANNELS; IdPwr++)
+ {
+ if (ChanId == pAd->TxPower[IdPwr].Channel)
+ {
+ /* init the channel info. */
+ NdisMoveMemory(&pAd->ChannelList[RecId],
+ &pAd->TxPower[IdPwr],
+ sizeof(CHANNEL_TX_POWER));
+
+ /* keep channel number */
+ pAd->ChannelList[RecId].Channel = ChanId;
+
+ /* keep maximum tranmission power */
+ pAd->ChannelList[RecId].MaxTxPwr = Power;
+
+ /* keep DFS flag */
+ if (FlgIsRadar == TRUE)
+ pAd->ChannelList[RecId].DfsReq = TRUE;
+ else
+ pAd->ChannelList[RecId].DfsReq = FALSE;
+ /* End of if */
+
+ /* keep DFS type */
+ pAd->ChannelList[RecId].RegulatoryDomain = DfsType;
+
+ /* re-set DFS info. */
+ pAd->CommonCfg.RDDurRegion = DfsType;
+
+ CFG80211DBG(RT_DEBUG_ERROR,
+ ("Chan %03d:\tpower %d dBm, "
+ "DFS %d, DFS Type %d\n",
+ ChanId, Power,
+ ((FlgIsRadar == TRUE)?1:0),
+ DfsType));
+
+ /* change to record next channel info. */
+ RecId ++;
+ break;
+ } /* End of if */
+ } /* End of for */
+ } /* End of for */
+ } /* End of for */
+
+ pAd->ChannelListNum = RecId;
+ RTMP_IRQ_UNLOCK(&pAd->irq_lock, IrqFlags);
+
+ CFG80211DBG(RT_DEBUG_ERROR, ("crda> Number of channels = %d\n", RecId));
+} /* End of CFG80211_RegRuleApply */
+
+
+/*
+========================================================================
+Routine Description:
+ Inform us that a scan is got.
+
+Arguments:
+ pAdCB - WLAN control block pointer
+
+Return Value:
+ NONE
+
+Note:
+ Call RT_CFG80211_SCANNING_INFORM, not CFG80211_Scaning
+========================================================================
+*/
+VOID CFG80211_Scaning(
+ IN VOID *pAdCB,
+ IN UINT32 BssIdx,
+ IN UINT32 ChanId,
+ IN UCHAR *pFrame,
+ IN UINT32 FrameLen,
+ IN INT32 RSSI)
+{
+} /* End of CFG80211_Scaning */
+
+
+/*
+========================================================================
+Routine Description:
+ Inform us that scan ends.
+
+Arguments:
+ pAdCB - WLAN control block pointer
+ FlgIsAborted - 1: scan is aborted
+
+Return Value:
+ NONE
+
+Note:
+========================================================================
+*/
+VOID CFG80211_ScanEnd(
+ IN VOID *pAdCB,
+ IN BOOLEAN FlgIsAborted)
+{
+} /* End of CFG80211_ScanEnd */
+
+
+/*
+========================================================================
+Routine Description:
+ Inform CFG80211 about association status.
+
+Arguments:
+ pAdCB - WLAN control block pointer
+ pBSSID - the BSSID of the AP
+ pReqIe - the element list in the association request frame
+ ReqIeLen - the request element length
+ pRspIe - the element list in the association response frame
+ RspIeLen - the response element length
+ FlgIsSuccess - 1: success; otherwise: fail
+
+Return Value:
+ None
+
+Note:
+========================================================================
+*/
+VOID CFG80211_ConnectResultInform(
+ IN VOID *pAdCB,
+ IN UCHAR *pBSSID,
+ IN UCHAR *pReqIe,
+ IN UINT32 ReqIeLen,
+ IN UCHAR *pRspIe,
+ IN UINT32 RspIeLen,
+ IN UCHAR FlgIsSuccess)
+{
+ PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdCB;
+
+
+ CFG80211DBG(RT_DEBUG_ERROR, ("80211> CFG80211_ConnectResultInform ==>\n"));
+
+ CFG80211OS_ConnectResultInform(CFG80211CB,
+ pBSSID,
+ pReqIe,
+ ReqIeLen,
+ pRspIe,
+ RspIeLen,
+ FlgIsSuccess);
+
+ pAd->FlgCfg80211Connecting = FALSE;
+} /* End of CFG80211_ConnectResultInform */
+
+
+/*
+========================================================================
+Routine Description:
+ Re-Initialize wireless channel/PHY in 2.4GHZ and 5GHZ.
+
+Arguments:
+ pAdCB - WLAN control block pointer
+
+Return Value:
+ TRUE - re-init successfully
+ FALSE - re-init fail
+
+Note:
+ CFG80211_SupBandInit() is called in xx_probe().
+ But we do not have complete chip information in xx_probe() so we
+ need to re-init bands in xx_open().
+========================================================================
+*/
+BOOLEAN CFG80211_SupBandReInit(
+ IN VOID *pAdCB)
+{
+ PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdCB;
+ CFG80211_BAND BandInfo;
+
+
+ CFG80211DBG(RT_DEBUG_ERROR, ("80211> re-init bands...\n"));
+
+ /* re-init bands */
+ NdisZeroMemory(&BandInfo, sizeof(BandInfo));
+ CFG80211_BANDINFO_FILL(pAd, &BandInfo);
+
+ return CFG80211OS_SupBandReInit(CFG80211CB, &BandInfo);
+} /* End of CFG80211_SupBandReInit */
+
+
+INT CFG80211_StaPortSecured(
+ IN VOID *pAdCB,
+ IN UCHAR *pMac,
+ IN UINT flag)
+{
+ PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdCB;
+ MAC_TABLE_ENTRY *pEntry;
+
+ pEntry = MacTableLookup(pAd, pMac);
+ if (!pEntry)
+ {
+ printk("Can't find pEntry in CFG80211_StaPortSecured\n");
+ }
+ else
+ {
+ if (flag)
+ {
+ printk("AID:%d, PortSecured\n", pEntry->Aid);
+ pEntry->PrivacyFilter = Ndis802_11PrivFilterAcceptAll;
+ pEntry->WpaState = AS_PTKINITDONE;
+ pEntry->PortSecured = WPA_802_1X_PORT_SECURED;
+ }
+ else
+ {
+ printk("AID:%d, PortNotSecured\n", pEntry->Aid);
+ pEntry->PrivacyFilter = Ndis802_11PrivFilter8021xWEP;
+ pEntry->PortSecured = WPA_802_1X_PORT_NOT_SECURED;
+ }
+ }
+
+ return 0;
+}
+
+INT CFG80211_ApStaDel(
+ IN VOID *pAdCB,
+ IN UCHAR *pMac)
+{
+ PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdCB;
+ MAC_TABLE_ENTRY *pEntry;
+
+ if (pMac == NULL)
+ {
+ MacTableReset(pAd);
+ }
+ else
+ {
+ pEntry = MacTableLookup(pAd, pMac);
+ if (pEntry)
+ {
+ // MlmeDeAuthAction(pAd, pEntry, 2, FALSE);
+ }
+ else
+ printk("Can't find pEntry in ApStaDel\n");
+ }
+}
+
+//CMD_RTPRIV_IOCTL_80211_KEY_DEFAULT_SET:
+INT CFG80211_setDefaultKey(
+ IN VOID *pAdCB,
+ IN UINT Data
+)
+{
+ PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdCB;
+ CFG80211_CB *p80211CB = pAd->pCfg80211_CB;
+
+ if (p80211CB->pCfg80211_Wdev->iftype == RT_CMD_80211_IFTYPE_AP)
+ //if (pAd->VifNextMode == RT_CMD_80211_IFTYPE_AP)
+ {
+ printk("Set Ap Default Key: %d\n", Data);
+ pAd->ApCfg.MBSSID[MAIN_MBSSID].DefaultKeyId = Data;
+ }
+ else
+ return 0;
+
+}
+
+#ifdef RT_P2P_SPECIFIC_WIRELESS_EVENT
+INT CFG80211_SendWirelessEvent(
+ IN VOID *pAdCB,
+ IN UCHAR *pMacAddr)
+{
+ PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdCB;
+
+ P2pSendWirelessEvent(pAd, RT_P2P_CONNECTED, NULL, pMacAddr);
+
+ return 0;
+}
+#endif /* RT_P2P_SPECIFIC_WIRELESS_EVENT */
+
+
+#endif /* RT_CFG80211_SUPPORT */
+
+/* End of cfg80211drv.c */
diff --git a/cleopatre/devkit/mt7601udrv/os/linux/config.mk b/cleopatre/devkit/mt7601udrv/os/linux/config.mk
new file mode 100644
index 0000000000..87b00d5cf6
--- /dev/null
+++ b/cleopatre/devkit/mt7601udrv/os/linux/config.mk
@@ -0,0 +1,1125 @@
+# Support ATE function
+HAS_ATE=y
+
+# Support QA ATE function
+HAS_QA_SUPPORT=y
+
+HAS_RSSI_FEEDBACK=n
+
+# Support XLINK mode
+HAS_XLINK=n
+
+# Support WSC function
+HAS_WSC=y
+HAS_WSC_V2=y
+HAS_WSC_LED=n
+
+
+# Support LLTD function
+HAS_LLTD=n
+
+# Support WDS function
+HAS_WDS=n
+
+# Support AP-Client function
+HAS_APCLI=n
+
+
+
+
+#Support Net interface block while Tx-Sw queue full
+HAS_BLOCK_NET_IF=n
+
+#Support IGMP-Snooping function.
+HAS_IGMP_SNOOP_SUPPORT=n
+
+#Support DFS function
+HAS_DFS_SUPPORT=n
+
+#Support Carrier-Sense function
+HAS_CS_SUPPORT=n
+
+#Support HE_BD_SUPPORT
+HAS_HE_BD_SUPPORT=n
+
+
+# Support user specific transmit rate of Multicast packet.
+HAS_MCAST_RATE_SPECIFIC_SUPPORT=n
+
+# Support for Multiple Cards
+HAS_MC_SUPPORT=n
+
+#Support for PCI-MSI
+HAS_MSI_SUPPORT=n
+
+
+#Support for IEEE802.11e DLS
+HAS_QOS_DLS_SUPPORT=n
+
+#Support for EXT_CHANNEL
+HAS_EXT_BUILD_CHANNEL_LIST=n
+
+#Support for IDS
+HAS_IDS_SUPPORT=n
+
+
+#Support for Net-SNMP
+HAS_SNMP_SUPPORT=n
+
+#Support features of 802.11n Draft3
+HAS_DOT11N_DRAFT3_SUPPORT=n
+
+#Support features of Single SKU.
+HAS_SINGLE_SKU_SUPPORT=n
+
+#Support features of Single SKU.
+HAS_SINGLE_SKU_V2_SUPPORT=n
+
+#Support features of 802.11n
+HAS_DOT11_N_SUPPORT=y
+
+#Support for 802.11ac VHT
+HAS_DOT11_VHT_SUPPORT=n
+
+#Support for WAPI
+HAS_WAPI_SUPPORT=n
+
+
+#Support for 2860/2880 co-exist
+HAS_RT2880_RT2860_COEXIST=n
+
+HAS_KTHREAD_SUPPORT=n
+
+
+
+
+
+#Support for WiFi Display
+HAS_WFD_SUPPORT=n
+
+#Support for Auto channel select enhance
+HAS_AUTO_CH_SELECT_ENHANCE=n
+
+#Support statistics count
+HAS_STATS_COUNT=y
+
+#Support TSSI Antenna Variation
+HAS_TSSI_ANTENNA_VARIATION=n
+
+#Support USB_BULK_BUF_ALIGMENT
+HAS_USB_BULK_BUF_ALIGMENT=n
+
+#Support for USB_SUPPORT_SELECTIVE_SUSPEND
+HAS_USB_SUPPORT_SELECTIVE_SUSPEND=n
+
+#Support USB load firmware by multibyte
+HAS_USB_FIRMWARE_MULTIBYTE_WRITE=n
+
+
+#Support ANDROID_SUPPORT
+HAS_ANDROID_SUPPORT=n
+
+#HAS_IFUP_IN_PROBE_SUPPORT
+HAS_IFUP_IN_PROBE_SUPPORT=n
+
+
+
+
+#Support TXRX SW Antenna Diversity
+HAS_TXRX_SW_ANTDIV_SUPPORT=n
+
+#Client support WDS function
+HAS_CLIENT_WDS_SUPPORT=n
+
+#Support for Bridge Fast Path & Bridge Fast Path function open to other module
+HAS_BGFP_SUPPORT=n
+HAS_BGFP_OPEN_SUPPORT=n
+
+# Support HOSTAPD function
+HAS_HOSTAPD_SUPPORT=n
+
+#Support GreenAP function
+HAS_GREENAP_SUPPORT=n
+
+#Support MAC80211 LINUX-only function
+#Please make sure the version for CFG80211.ko and MAC80211.ko is same as the one
+#our driver references to.
+HAS_CFG80211_SUPPORT=n
+
+#Support RFKILL hardware block/unblock LINUX-only function
+HAS_RFKILL_HW_SUPPORT=n
+
+
+
+HAS_APCLI_WPA_SUPPLICANT=n
+
+HAS_RTMP_FLASH_SUPPORT=n
+
+ifeq ($(OSABL),YES)
+HAS_OSABL_FUNC_SUPPORT=y
+HAS_OSABL_OS_PCI_SUPPORT=y
+HAS_OSABL_OS_USB_SUPPORT=y
+HAS_OSABL_OS_RBUS_SUPPORT=n
+HAS_OSABL_OS_AP_SUPPORT=y
+HAS_OSABL_OS_STA_SUPPORT=y
+endif
+
+HAS_LED_CONTROL_SUPPORT=n
+
+
+#Support WIDI feature
+#Must enable HAS_WSC at the same time.
+
+HAS_TXBF_SUPPORT=n
+
+HAS_STREAM_MODE_SUPPORT=n
+
+HAS_NEW_RATE_ADAPT_SUPPORT=n
+
+HAS_RATE_ADAPT_AGS_SUPPORT=n
+
+
+
+
+#MT7601
+HAS_RX_CSO_SUPPORT=y
+
+
+HAS_WOW_SUPPORT=n
+HAS_WOW_IFDOWN_SUPPORT=n
+HAS_NEW_WOW_SUPPORT=n
+
+HAS_ANDES_FIRMWARE_SUPPORT=n
+
+HAS_HDR_TRANS_SUPPORT=n
+
+HAS_MULTI_CHANNEL=n
+
+HAS_MICROWAVE_OVEN_SUPPORT=n
+
+HAS_WIFI_P2P_CONCURRENT_FAST_SCAN=n
+
+#################################################
+
+CC := $(CROSS_COMPILE)gcc
+LD := $(CROSS_COMPILE)ld
+
+WFLAGS := -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT -DLINUX -Wall -Wstrict-prototypes -Wno-trigraphs
+WFLAGS += -DSYSTEM_LOG_SUPPORT -DRT28xx_MODE=$(RT28xx_MODE) -DCHIPSET=$(MODULE) -DRESOURCE_PRE_ALLOC
+#WFLAGS += -DFPGA_MODE
+WFLAGS += -I$(RT28xx_DIR)/include
+
+
+
+
+
+ifeq ($(HAS_WIFI_P2P_CONCURRENT_FAST_SCAN),y)
+WFLAGS += -DWIFI_P2P_CONCURRENT_FAST_SCAN
+endif
+
+ifeq ($(HAS_HE_BD_SUPPORT),y)
+WFLAGS += -DHE_BD_SUPPORT
+endif
+
+ifeq ($(HAS_KTHREAD_SUPPORT),y)
+WFLAGS += -DKTHREAD_SUPPORT
+endif
+
+ifeq ($(HAS_RTMP_FLASH_SUPPORT),y)
+WFLAGS += -DRTMP_FLASH_SUPPORT
+endif
+
+ifeq ($(HAS_STREAM_MODE_SUPPORT),y)
+WFLAGS += -DSTREAM_MODE_SUPPORT
+endif
+
+ifeq ($(HAS_SINGLE_SKU_SUPPORT),y)
+WFLAGS += -DSINGLE_SKU
+endif
+
+ifeq ($(HAS_SINGLE_SKU_V2_SUPPORT),y)
+WFLAGS += -DSINGLE_SKU_V2
+endif
+
+ifeq ($(HAS_DOT11_VHT_SUPPORT),y)
+WFLAGS += -DDOT11_VHT_AC
+endif
+
+ifeq ($(HAS_ANDES_FIRMWARE_SUPPORT),y)
+WFLAGS += -DANDES_FIRMWARE_SUPPORT
+endif
+
+ifeq ($(HAS_HDR_TRANS_SUPPORT),y)
+WFLAGS += -DHDR_TRANS_SUPPORT
+endif
+
+# config for AP mode
+
+ifeq ($(RT28xx_MODE),AP)
+#WFLAGS += -DCONFIG_AP_SUPPORT -DUAPSD_SUPPORT -DMBSS_SUPPORT -DIAPP_SUPPORT -DDBG -DDOT1X_SUPPORT -DAP_SCAN_SUPPORT -DSCAN_SUPPORT
+WFLAGS += -DCONFIG_AP_SUPPORT -DUAPSD_SUPPORT -DMBSS_SUPPORT -DIAPP_SUPPORT -DDOT1X_SUPPORT -DAP_SCAN_SUPPORT -DSCAN_SUPPORT
+
+ifeq ($(HAS_APCLI_WPA_SUPPLICANT),y)
+WFLAGS += -DApCli_WPA_SUPPLICANT_SUPPORT
+endif
+
+ifeq ($(HAS_HOSTAPD_SUPPORT),y)
+WFLAGS += -DHOSTAPD_SUPPORT
+endif
+
+ifeq ($(HAS_ATE),y)
+WFLAGS += -DRALINK_ATE
+WFLAGS += -DCONFIG_RT2880_ATE_CMD_NEW
+WFLAGS += -I$(RT28xx_DIR)/ate/include
+ifeq ($(HAS_QA_SUPPORT),y)
+WFLAGS += -DRALINK_QA
+endif
+endif
+
+ifeq ($(HAS_RSSI_FEEDBACK),y)
+WFLAGS += -DRSSI_FEEDBACK
+endif
+
+
+
+
+ifeq ($(HAS_WSC),y)
+WFLAGS += -DWSC_AP_SUPPORT
+
+ifeq ($(HAS_WSC_V2),y)
+WFLAGS += -DWSC_V2_SUPPORT
+endif
+ifeq ($(HAS_WSC_LED),y)
+WFLAGS += -DWSC_LED_SUPPORT
+endif
+endif
+
+
+ifeq ($(HAS_WDS),y)
+WFLAGS += -DWDS_SUPPORT
+endif
+
+ifeq ($(HAS_APCLI),y)
+WFLAGS += -DAPCLI_SUPPORT -DMAT_SUPPORT -DAP_SCAN_SUPPORT -DSCAN_SUPPORT
+#ifeq ($(HAS_ETH_CONVERT_SUPPORT), y)
+#WFLAGS += -DETH_CONVERT_SUPPORT
+endif
+
+ifeq ($(HAS_IGMP_SNOOP_SUPPORT),y)
+WFLAGS += -DIGMP_SNOOP_SUPPORT
+endif
+
+ifeq ($(HAS_CS_SUPPORT),y)
+WFLAGS += -DCARRIER_DETECTION_SUPPORT
+endif
+
+ifeq ($(HAS_MCAST_RATE_SPECIFIC_SUPPORT), y)
+WFLAGS += -DMCAST_RATE_SPECIFIC
+endif
+
+ifneq ($(findstring 2860,$(CHIPSET)),)
+ifeq ($(HAS_MSI_SUPPORT),y)
+WFLAGS += -DPCI_MSI_SUPPORT
+endif
+endif
+
+
+ifeq ($(HAS_QOS_DLS_SUPPORT),y)
+WFLAGS += -DQOS_DLS_SUPPORT
+endif
+
+ifeq ($(HAS_SNMP_SUPPORT),y)
+WFLAGS += -DSNMP_SUPPORT
+endif
+
+ifeq ($(HAS_DOT11_N_SUPPORT),y)
+WFLAGS += -DDOT11_N_SUPPORT
+
+ifeq ($(HAS_DOT11N_DRAFT3_SUPPORT),y)
+WFLAGS += -DDOT11N_DRAFT3
+endif
+
+ifeq ($(HAS_TXBF_SUPPORT),y)
+WFLAGS += -DTXBF_SUPPORT
+endif
+
+ifeq ($(HAS_NEW_RATE_ADAPT_SUPPORT),y)
+WFLAGS += -DNEW_RATE_ADAPT_SUPPORT
+endif
+
+ifeq ($(HAS_RATE_ADAPT_AGS_SUPPORT),y)
+WFLAGS += -DAGS_SUPPORT
+endif
+
+ifeq ($(HAS_GREENAP_SUPPORT),y)
+WFLAGS += -DGREENAP_SUPPORT
+endif
+
+endif
+
+ifeq ($(HAS_AUTO_CH_SELECT_ENHANCE),y)
+WFLAGS += -DAUTO_CH_SELECT_ENHANCE
+endif
+
+ifeq ($(HAS_STATS_COUNT),y)
+WFLAGS += -DSTATS_COUNT_SUPPORT
+endif
+
+ifeq ($(HAS_TSSI_ANTENNA_VARIATION),y)
+WFLAGS += -DTSSI_ANTENNA_VARIATION
+endif
+
+ifeq ($(HAS_USB_BULK_BUF_ALIGMENT),y)
+WFLAGS += -DUSB_BULK_BUF_ALIGMENT
+endif
+
+
+ifeq ($(HAS_CFG80211_SUPPORT),y)
+WFLAGS += -DRT_CFG80211_SUPPORT -DEXT_BUILD_CHANNEL_LIST
+ifeq ($(HAS_RFKILL_HW_SUPPORT),y)
+WFLAGS += -DRFKILL_HW_SUPPORT
+endif
+endif
+
+ifeq ($(OSABL),YES)
+WFLAGS += -DOS_ABL_SUPPORT
+ifeq ($(HAS_OSABL_FUNC_SUPPORT),y)
+WFLAGS += -DOS_ABL_FUNC_SUPPORT
+endif
+ifeq ($(HAS_OSABL_OS_PCI_SUPPORT),y)
+WFLAGS += -DOS_ABL_OS_PCI_SUPPORT
+endif
+ifeq ($(HAS_OSABL_OS_USB_SUPPORT),y)
+WFLAGS += -DOS_ABL_OS_USB_SUPPORT
+endif
+ifeq ($(HAS_OSABL_OS_RBUS_SUPPORT),y)
+WFLAGS += -DOS_ABL_OS_RBUS_SUPPORT
+endif
+ifeq ($(HAS_OSABL_OS_AP_SUPPORT),y)
+WFLAGS += -DOS_ABL_OS_AP_SUPPORT
+endif
+ifeq ($(HAS_OSABL_OS_STA_SUPPORT),y)
+WFLAGS += -DOS_ABL_OS_STA_SUPPORT
+endif
+endif
+
+
+ifeq ($(HAS_TXRX_SW_ANTDIV_SUPPORT),y)
+WFLAGS += -DTXRX_SW_ANTDIV_SUPPORT
+endif
+
+
+endif #// endif of RT2860_MODE == AP //
+
+#################################################
+
+
+#################################################
+
+#################################################
+
+#
+# Common compiler flag
+#
+
+
+
+
+
+
+ifeq ($(HAS_EXT_BUILD_CHANNEL_LIST),y)
+WFLAGS += -DEXT_BUILD_CHANNEL_LIST
+endif
+
+ifeq ($(HAS_IDS_SUPPORT),y)
+WFLAGS += -DIDS_SUPPORT
+endif
+
+ifeq ($(HAS_WAPI_SUPPORT),y)
+WFLAGS += -DWAPI_SUPPORT -DSOFT_ENCRYPT -DEXPORT_SYMTAB
+endif
+
+ifeq ($(OSABL),YES)
+WFLAGS += -DEXPORT_SYMTAB
+endif
+
+ifeq ($(HAS_CLIENT_WDS_SUPPORT),y)
+WFLAGS += -DCLIENT_WDS
+endif
+
+ifeq ($(HAS_BGFP_SUPPORT),y)
+WFLAGS += -DBG_FT_SUPPORT
+endif
+
+ifeq ($(HAS_BGFP_OPEN_SUPPORT),y)
+WFLAGS += -DBG_FT_OPEN_SUPPORT
+endif
+
+
+ifeq ($(HAS_LED_CONTROL_SUPPORT),y)
+WFLAGS += -DLED_CONTROL_SUPPORT
+endif
+
+
+ifeq ($(HAS_MICROWAVE_OVEN_SUPPORT),y)
+WFLAGS += -DMICROWAVE_OVEN_SUPPORT
+endif
+
+#################################################
+# ChipSet specific definitions.
+#
+ifneq ($(findstring 2860,$(CHIPSET)),)
+WFLAGS +=-DRTMP_MAC_PCI -DRTMP_PCI_SUPPORT -DRT2860 -DRT28xx -DA_BAND_SUPPORT
+CHIPSET_DAT = 2860
+endif
+
+ifneq ($(findstring 3090,$(CHIPSET)),)
+WFLAGS +=-DRTMP_MAC_PCI -DRT30xx -DRT3090 -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DVCORECAL_SUPPORT
+CHIPSET_DAT = 2860
+endif
+
+ifneq ($(findstring 2870,$(CHIPSET)),)
+WFLAGS +=-DRTMP_MAC_USB -DRTMP_USB_SUPPORT -DRT2870 -DRT28xx -DRTMP_TIMER_TASK_SUPPORT -DA_BAND_SUPPORT
+CHIPSET_DAT = 2870
+endif
+
+ifneq ($(findstring 2070,$(CHIPSET)),)
+WFLAGS +=-DRTMP_MAC_USB -DRT30xx -DRT3070 -DRT2070 -DRTMP_USB_SUPPORT -DRTMP_TIMER_TASK_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT
+CHIPSET_DAT = 2870
+endif
+
+ifneq ($(findstring 3070,$(CHIPSET)),)
+WFLAGS +=-DRTMP_MAC_USB -DRT30xx -DRT3070 -DRTMP_USB_SUPPORT -DRTMP_TIMER_TASK_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DVCORECAL_SUPPORT
+CHIPSET_DAT = 2870
+
+ifneq ($(findstring $(RT28xx_MODE),AP),)
+ifeq ($(HAS_CS_SUPPORT), y)
+WFLAGS += -DCARRIER_DETECTION_FIRMWARE_SUPPORT
+endif
+endif
+
+endif
+
+ifneq ($(findstring 2880,$(CHIPSET)),)
+WFLAGS += -DRT2880 -DRT28xx -DRTMP_MAC_PCI -DCONFIG_RALINK_RT2880_MP -DRTMP_RBUS_SUPPORT -DMERGE_ARCH_TEAM -DA_BAND_SUPPORT -DCONFIG_SWMCU_SUPPORT
+ifeq ($(HAS_WIFI_LED_SHARE), y)
+WFLAGS += -DCONFIG_WIFI_LED_SHARE
+endif
+endif
+
+ifneq ($(findstring 3572,$(CHIPSET)),)
+WFLAGS +=-DRTMP_MAC_USB -DRTMP_USB_SUPPORT -DRT2870 -DRT28xx -DRT30xx -DRT35xx -DRT3572 -DRTMP_TIMER_TASK_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DA_BAND_SUPPORT -DVCORECAL_SUPPORT
+CHIPSET_DAT = 2870
+
+ifneq ($(findstring $(RT28xx_MODE),AP),)
+ifeq ($(HAS_CS_SUPPORT), y)
+WFLAGS += -DCARRIER_DETECTION_FIRMWARE_SUPPORT
+endif
+endif
+
+endif
+
+ifneq ($(findstring 3573,$(CHIPSET)),)
+WFLAGS += -DRTMP_MAC_USB -DRTMP_USB_SUPPORT -DRT30xx -DRT35xx -DRT3593 -DRT3573\
+ -DRTMP_TIMER_TASK_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT\
+ -DA_BAND_SUPPORT -DDOT11N_SS3_SUPPORT \
+ -DVCORECAL_SUPPORT -DNEW_MBSSID_MODE
+#WFLAGS += -DNEW_RATE_ADAPT_SUPPORT
+CHIPSET_DAT = 2870
+
+ifneq ($(findstring $(RT28xx_MODE),STA APSTA),)
+WFLAGS += -DRTMP_FREQ_CALIBRATION_SUPPORT
+endif
+
+ifneq ($(findstring $(RT28xx_MODE),AP),)
+WFLAGS += -DSPECIFIC_BCN_BUF_SUPPORT
+endif
+
+ifneq ($(findstring $(RT28xx_MODE),AP),)
+ifeq ($(HAS_CS_SUPPORT), y)
+WFLAGS += -DCARRIER_DETECTION_FIRMWARE_SUPPORT
+endif
+endif
+
+endif
+
+ifneq ($(findstring 3062,$(CHIPSET)),)
+WFLAGS +=-DRTMP_MAC_PCI -DRT2860 -DRT28xx -DRT30xx -DRT35xx -DRT3062 -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DVCORECAL_SUPPORT
+CHIPSET_DAT = 2860
+endif
+
+ifneq ($(findstring 3562,$(CHIPSET)),)
+WFLAGS +=-DRTMP_MAC_PCI -DRT2860 -DRT28xx -DRT30xx -DRT35xx -DRT3562 -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DA_BAND_SUPPORT -DVCORECAL_SUPPORT
+
+CHIPSET_DAT = 2860
+endif
+
+ifneq ($(findstring 3593,$(CHIPSET)),)
+WFLAGS +=-DRTMP_MAC_PCI -DDOT11N_SS3_SUPPORT -DRT3593 -DRT28xx -DRT30xx -DRT35xx -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DA_BAND_SUPPORT -DNEW_MBSSID_MODE -DVCORECAL_SUPPORT
+
+#WFLAGS += -DNEW_RATE_ADAPT_SUPPORT
+CHIPSET_DAT = 2860
+
+ifneq ($(findstring $(RT28xx_MODE),STA APSTA),)
+WFLAGS += -DRTMP_FREQ_CALIBRATION_SUPPORT
+endif
+
+ifneq ($(findstring $(RT28xx_MODE),AP),)
+WFLAGS += -DSPECIFIC_BCN_BUF_SUPPORT
+endif
+endif
+
+ifneq ($(findstring 3390,$(CHIPSET)),)
+WFLAGS +=-DRTMP_MAC_PCI -DRT30xx -DRT33xx -DRT3090 -DRT3390 -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DRTMP_INTERNAL_TX_ALC -DVCORECAL_SUPPORT
+CHIPSET_DAT = 2860
+endif
+
+ifneq ($(findstring 8592,$(CHIPSET)),)
+WFLAGS += -DRT8592 -DRT65xx -DRLT_MAC -DRTMP_MAC_PCI -DRTMP_PCI_SUPPORT -DA_BAND_SUPPORT -DRX_DMA_SCATTER
+WFLAGS += -DRTMP_RF_RW_SUPPORT -DIQ_CAL_SUPPORT -DVCORECAL_SUPPORT
+#WFLAGS += -DRTMP_EFUSE_SUPPORT
+ifneq ($(findstring $(RT28xx_MODE),AP),)
+# TODO: shiang-6590, need to ask hardware about the memory base setting first!!
+#WFLAGS += -DSPECIFIC_BCN_BUF_SUPPORT
+endif
+CHIPSET_DAT = 2860
+endif
+
+ifneq ($(findstring 6590,$(CHIPSET)),)
+WFLAGS += -DRT6590 -DRT65xx -DRLT_MAC -DRLT_RF -DRTMP_MAC_PCI -DRTMP_PCI_SUPPORT -DA_BAND_SUPPORT -DRX_DMA_SCATTER
+#-DRTMP_FREQ_CALIBRATION_SUPPORT -DVCORECAL_SUPPORT
+ifneq ($(findstring $(RT28xx_MODE),AP),)
+#WFLAGS += -DSPECIFIC_BCN_BUF_SUPPORT
+endif
+CHIPSET_DAT = 2860
+endif
+
+
+ifneq ($(findstring 6570,$(CHIPSET)),)
+WFLAGS += -DRT6570 -DRT65xx -DRLT_MAC -DRLT_RF -DRTMP_MAC_USB -DRTMP_USB_SUPPORT -DRTMP_TIMER_TASK_SUPPORT -DA_BAND_SUPPORT -DRX_DMA_SCATTER -DRTMP_EFUSE_SUPPORT -DNEW_MBSSID_MODE
+ifneq ($(findstring $(RT28xx_MODE),AP),)
+#WFLAGS += -DSPECIFIC_BCN_BUF_SUPPORT
+endif
+
+ifeq ($(HAS_CSO_SUPPORT), y)
+WFLAGS += -DCONFIG_CSO_SUPPORT
+endif
+
+ifeq ($(HAS_TSO_SUPPORT), y)
+WFLAGS += -DCONFIG_CSO_SUPPORT -DCONFIG_TSO_SUPPORT -DTX_PKT_SG
+endif
+
+CHIPSET_DAT = 2870
+endif
+
+ifneq ($(findstring 7601E,$(CHIPSET)),)
+WFLAGS += -DMT7601E -DMT7601 -DRLT_MAC -DRLT_RF -DRTMP_MAC_PCI -DRTMP_PCI_SUPPORT -DRX_DMA_SCATTER -DVCORECAL_SUPPORT -DVCORECAL_SUPPORT -DRTMP_EFUSE_SUPPORT -DhNEW_MBSSID_MODE -DRTMP_INTERNAL_TX_ALC -DCONFIG_ANDES_SUPPORT
+#-DRTMP_FREQ_CALIBRATION_SUPPORT
+ifneq ($(findstring $(RT28xx_MODE),AP),)
+#WFLAGS += -DSPECIFIC_BCN_BUF_SUPPORT
+endif
+
+ifneq ($(findstring $(RT28xx_MODE),STA APSTA),)
+WFLAGS += -DRTMP_FREQ_CALIBRATION_SUPPORT
+endif
+
+CHIPSET_DAT = 2860
+endif
+
+
+ifneq ($(findstring 7601U,$(CHIPSET)),)
+WFLAGS += -DMT7601U -DMT7601 -DRLT_MAC -DRLT_RF -DRTMP_MAC_USB -DRTMP_USB_SUPPORT -DRTMP_TIMER_TASK_SUPPORT -DRX_DMA_SCATTER -DVCORECAL_SUPPORT -DRTMP_EFUSE_SUPPORT -DNEW_MBSSID_MODE -DRTMP_INTERNAL_TX_ALC -DCONFIG_ANDES_SUPPORT -DDPD_CALIBRATION_SUPPORT
+ifneq ($(findstring $(RT28xx_MODE),AP),)
+#WFLAGS += -DSPECIFIC_BCN_BUF_SUPPORT
+endif
+
+ifeq ($(HAS_RX_CSO_SUPPORT), y)
+WFLAGS += -DCONFIG_RX_CSO_SUPPORT
+endif
+
+ifneq ($(findstring $(RT28xx_MODE),AP),)
+else
+WFLAGS += -DRTMP_FREQ_CALIBRATION_SUPPORT
+endif
+
+CHIPSET_DAT = 2870
+endif
+
+ifneq ($(findstring 3370,$(CHIPSET)),)
+WFLAGS +=-DRTMP_MAC_USB -DRT30xx -DRT33xx -DRT3070 -DRT3370 -DRTMP_USB_SUPPORT -DRTMP_TIMER_TASK_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DRTMP_INTERNAL_TX_ALC -DVCORECAL_SUPPORT
+CHIPSET_DAT = 2870
+
+ifneq ($(findstring $(RT28xx_MODE),AP),)
+ifeq ($(HAS_CS_SUPPORT), y)
+WFLAGS += -DCARRIER_DETECTION_FIRMWARE_SUPPORT
+endif
+endif
+
+endif
+
+ifneq ($(findstring 5390,$(CHIPSET)),)
+WFLAGS +=-DRTMP_MAC_PCI -DRT30xx -DRT33xx -DRT3090 -DRT3390 -DRT5390 -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DRTMP_FREQ_CALIBRATION_SUPPORT -DRTMP_INTERNAL_TX_ALC -DVCORECAL_SUPPORT -DIQ_CAL_SUPPORT -DNEW_MBSSID_MODE -DRTMP_TEMPERATURE_COMPENSATION -DRTMP_MAC
+CHIPSET_DAT = 2860
+
+ifneq ($(findstring $(RT28xx_MODE),AP),)
+WFLAGS += -DSPECIFIC_BCN_BUF_SUPPORT
+endif
+endif
+
+ifneq ($(findstring 5370,$(CHIPSET)),)
+WFLAGS +=-DRTMP_MAC_USB -DRT30xx -DRT33xx -DRT3070 -DRT3370 -DRT5370 -DRTMP_USB_SUPPORT -DRTMP_TIMER_TASK_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DRTMP_INTERNAL_TX_ALC -DRTMP_FREQ_CALIBRATION_SUPPORT -DVCORECAL_SUPPORT -DIQ_CAL_SUPPORT -DNEW_MBSSID_MODE -DRTMP_TEMPERATURE_COMPENSATION -DRTMP_MAC
+CHIPSET_DAT = 2870
+
+ifneq ($(findstring $(RT28xx_MODE),AP),)
+ifeq ($(HAS_CS_SUPPORT), y)
+WFLAGS += -DCARRIER_DETECTION_FIRMWARE_SUPPORT
+endif
+endif
+
+ifneq ($(findstring $(RT28xx_MODE),AP),)
+WFLAGS += -DSPECIFIC_BCN_BUF_SUPPORT
+endif
+endif
+
+ifneq ($(findstring 3052,$(CHIPSET)),)
+WFLAGS += -DRTMP_MAC_PCI -DRTMP_RBUS_SUPPORT -DRT3052 -DRT305x -DRTMP_RF_RW_SUPPORT -DCONFIG_SWMCU_SUPPORT -DVCORECAL_SUPPORT
+CHIPSET_DAT = 2870
+ifeq ($(HAS_WIFI_LED_SHARE), y)
+WFLAGS += -DCONFIG_WIFI_LED_SHARE
+endif
+endif
+
+ifneq ($(findstring 3352,$(CHIPSET)),)
+WFLAGS += -DRTMP_MAC_PCI -DRTMP_RBUS_SUPPORT -DRT3352 -DRT305x -DRTMP_RF_RW_SUPPORT -DVCORECAL_SUPPORT -DCONFIG_SWMCU_SUPPORT -DRTMP_INTERNAL_TX_ALC -DNEW_MBSSID_MODE
+CHIPSET_DAT = 2860
+ifeq ($(HAS_WIFI_LED_SHARE), y)
+WFLAGS += -DCONFIG_WIFI_LED_SHARE
+endif
+ifneq ($(findstring $(RT28xx_MODE),AP),)
+WFLAGS += -DSPECIFIC_BCN_BUF_SUPPORT
+endif
+endif
+
+ifneq ($(findstring 5350,$(CHIPSET)),)
+WFLAGS += -DRTMP_MAC_PCI -DRTMP_RBUS_SUPPORT -DRT5350 -DRT305x -DRT3050 -DRT3350 -DRTMP_RF_RW_SUPPORT -DVCORECAL_SUPPORT -DCONFIG_SWMCU_SUPPORT -DRTMP_INTERNAL_TX_ALC -DRTMP_FREQ_CALIBRATION_SUPPORT -DIQ_CAL_SUPPORT -DNEW_MBSSID_MODE
+CHIPSET_DAT = 2860
+ifeq ($(HAS_WIFI_LED_SHARE), y)
+WFLAGS += -DCONFIG_WIFI_LED_SHARE
+endif
+ifneq ($(findstring $(RT28xx_MODE),AP),)
+WFLAGS += -DSPECIFIC_BCN_BUF_SUPPORT
+endif
+endif
+
+ifneq ($(findstring 5592,$(CHIPSET)),)
+WFLAGS += -DRTMP_MAC_PCI -DRTMP_PCI_SUPPORT -DRT30xx -DRT5592\
+ -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT\
+ -DA_BAND_SUPPORT -DIQ_CAL_SUPPORT -DRX_DMA_SCATTER -DVCORECAL_SUPPORT\
+ -DNEW_MBSSID_MODE -DRTMP_TEMPERATURE_COMPENSATION
+CHIPSET_DAT = 2860
+ifeq ($(HAS_CSO_SUPPORT), y)
+WFLAGS += -DCONFIG_CSO_SUPPORT
+endif
+
+ifneq ($(findstring $(RT28xx_MODE),STA APSTA),)
+WFLAGS += -DRTMP_FREQ_CALIBRATION_SUPPORT
+endif
+
+ifneq ($(findstring $(RT28xx_MODE),AP),)
+WFLAGS += -DSPECIFIC_BCN_BUF_SUPPORT
+endif
+
+endif
+
+ifneq ($(findstring 5572,$(CHIPSET)),)
+WFLAGS += -DRTMP_MAC_USB -DRTMP_USB_SUPPORT -DRT30xx -DRT5572 -DRT5592\
+ -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DNEW_MBSSID_MODE\
+ -DRTMP_TIMER_TASK_SUPPORT -DA_BAND_SUPPORT -DIQ_CAL_SUPPORT -DVCORECAL_SUPPORT\
+ -DRTMP_TEMPERATURE_COMPENSATION
+CHIPSET_DAT = 2870
+ifeq ($(HAS_CSO_SUPPORT), y)
+WFLAGS += -DCONFIG_CSO_SUPPORT
+endif
+
+ifneq ($(findstring $(RT28xx_MODE),AP),)
+ifeq ($(HAS_CS_SUPPORT), y)
+WFLAGS += -DCARRIER_DETECTION_FIRMWARE_SUPPORT
+endif
+endif
+
+ifneq ($(findstring $(RT28xx_MODE),STA APSTA),)
+WFLAGS += -DRTMP_FREQ_CALIBRATION_SUPPORT
+endif
+
+ifneq ($(findstring $(RT28xx_MODE),AP),)
+#WFLAGS += -DSPECIFIC_BCN_BUF_SUPPORT
+endif
+
+endif
+
+ifneq ($(findstring 3290,$(CHIPSET)),)
+WFLAGS += -DRTMP_MAC_PCI -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DRTMP_FREQ_CALIBRATION_SUPPORT -DRTMP_INTERNAL_TX_ALC -DRT30xx -DRT3290 -DVCORECAL_SUPPORT
+CHIPSET_DAT = 2860
+
+ifneq ($(findstring $(RT28xx_MODE),STA APSTA),)
+WFLAGS += -DRTMP_FREQ_CALIBRATION_SUPPORT -DPCIE_PS_SUPPORT
+endif
+
+ifneq ($(findstring $(RT28xx_MODE),AP),)
+WFLAGS += -DSPECIFIC_BCN_BUF_SUPPORT
+endif
+endif
+
+
+ifeq ($(CHIPSET),USB)
+#3572
+WFLAGS +=-DRTMP_MAC_USB -DRTMP_USB_SUPPORT -DRT2870 -DRT28xx -DRT30xx -DRT35xx -DRTMP_TIMER_TASK_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DA_BAND_SUPPORT -DSPECIFIC_VCORECAL_SUPPORT
+#3370
+WFLAGS += -DRT33xx -DRT3070 -DRT3370 -DRTMP_TIMER_TASK_SUPPORT -DRTMP_INTERNAL_TX_ALC
+CHIPSET_DAT = 2870
+endif
+
+
+ifeq ($(CHIPSET),PCI)
+#3562
+WFLAGS +=-DRTMP_MAC_PCI -DRT2860 -DRT28xx -DRT30xx -DRT35xx -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DA_BAND_SUPPORT -DSPECIFIC_VCORECAL_SUPPORT
+#3390
+WFLAGS +=-DRT33xx -DRT3090 -DRT3390 -DRTMP_INTERNAL_TX_ALC
+endif
+
+
+ifeq ($(CHIPSET),RBUS)
+WFLAGS += -DMERGE_ARCH_TEAM -DCONFIG_SWMCU_SUPPORT -DCONFIG_RA_NAT_NONE -DRTMP_RBUS_SUPPORT
+#5350, 3050, 3350, 3883
+WFLAGS +=-DRTMP_MAC_PCI -DRT305x -DRT5350 -DRT3050 -DRT3350 -DRT3883 -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DA_BAND_SUPPORT -DVCORECAL_SUPPORT
+
+ifneq ($(findstring $(RT28xx_MODE),AP),)
+WFLAGS += -DSPECIFIC_BCN_BUF_SUPPORT
+endif
+#WFLAGS += -DDBG_CTRL_SUPPORT
+#WFLAGS += -DINCLUDE_DEBUG_QUEUE
+#WFLAGS += -DRANGE_EXTEND -DCFO_TRACK -DPRE_ANT_SWITCH
+endif
+
+
+#################################################
+
+
+ifeq ($(PLATFORM),5VT)
+#WFLAGS += -DCONFIG_5VT_ENHANCE
+endif
+
+ifeq ($(HAS_BLOCK_NET_IF),y)
+WFLAGS += -DBLOCK_NET_IF
+endif
+
+ifeq ($(HAS_DFS_SUPPORT),y)
+WFLAGS += -DDFS_SUPPORT
+endif
+
+ifeq ($(HAS_MC_SUPPORT),y)
+WFLAGS += -DMULTIPLE_CARD_SUPPORT
+endif
+
+ifeq ($(HAS_LLTD),y)
+WFLAGS += -DLLTD_SUPPORT
+endif
+
+ifeq ($(PLATFORM),RMI)
+WFLAGS += -DRT_BIG_ENDIAN
+endif
+
+ifeq ($(PLATFORM),UBICOM_IPX8)
+WFLAGS += -DRT_BIG_ENDIAN -DUNALIGNMENT_SUPPORT -DPLATFORM_UBM_IPX8 -DNO_CONSISTENT_MEM_SUPPORT -DCACHE_LINE_32B
+endif
+
+ifeq ($(PLATFORM),BL2348)
+WFLAGS += -DRT_BIG_ENDIAN
+endif
+
+ifeq ($(PLATFORM),BL23570)
+WFLAGS += -DRT_BIG_ENDIAN
+endif
+
+ifeq ($(PLATFORM),BLUBB)
+WFLAGS += -DRT_BIG_ENDIAN
+endif
+
+ifeq ($(PLATFORM),BLPMP)
+WFLAGS += -DRT_BIG_ENDIAN
+endif
+
+ifeq ($(PLATFORM),RMI_64)
+WFLAGS += -DRT_BIG_ENDIAN
+endif
+ifeq ($(PLATFORM),IXP)
+WFLAGS += -DRT_BIG_ENDIAN
+endif
+
+ifeq ($(PLATFORM),IKANOS_V160)
+WFLAGS += -DRT_BIG_ENDIAN -DIKANOS_VX_1X0
+endif
+
+ifeq ($(PLATFORM),IKANOS_V180)
+WFLAGS += -DRT_BIG_ENDIAN -DIKANOS_VX_1X0
+endif
+
+ifeq ($(PLATFORM),INF_TWINPASS)
+WFLAGS += -DRT_BIG_ENDIAN -DINF_TWINPASS
+endif
+
+ifeq ($(PLATFORM),INF_DANUBE)
+ifneq (,$(findstring 2.4,$(LINUX_SRC)))
+# Linux 2.4
+WFLAGS += -DINF_DANUBE -DRT_BIG_ENDIAN
+else
+# Linux 2.6
+WFLAGS += -DRT_BIG_ENDIAN
+endif
+endif
+
+ifeq ($(PLATFORM),INF_AR9)
+WFLAGS += -DRT_BIG_ENDIAN -DINF_AR9
+# support MAPI function for AR9.
+#WFLAGS += -DAR9_MAPI_SUPPORT
+endif
+
+ifeq ($(PLATFORM),INF_VR9)
+WFLAGS += -DRT_BIG_ENDIAN -DINF_AR9 -DINF_VR9
+endif
+
+ifeq ($(PLATFORM),CAVM_OCTEON)
+WFLAGS += -DRT_BIG_ENDIAN
+endif
+
+ifeq ($(PLATFORM),BRCM_6358)
+WFLAGS += -DRT_BIG_ENDIAN -DBRCM_6358
+endif
+
+ifeq ($(PLATFORM),INF_AMAZON_SE)
+WFLAGS += -DRT_BIG_ENDIAN -DINF_AMAZON_SE
+endif
+
+ifeq ($(PLATFORM),RALINK_3052)
+WFLAGS += -DPLATFORM_RALINK_3052
+endif
+
+ifeq ($(PLATFORM),FREESCALE8377)
+#EXTRA_CFLAGS := -v -I$(RT28xx_DIR)/include -I$(LINUX_SRC)/include $(WFLAGS)-O2 -Wall -Wstrict-prototypes -Wno-trigraphs
+#export EXTRA_CFLAGS
+WFLAGS += -DRT_BIG_ENDIAN
+EXTRA_CFLAGS := $(WFLAGS) -I$(RT28xx_DIR)/include
+endif
+
+ifeq ($(PLATFORM),ST)
+#WFLAGS += -DST
+WFLAGS += -DST
+endif
+
+#kernel build options for 2.4
+# move to Makefile outside LINUX_SRC := /opt/star/kernel/linux-2.4.27-star
+
+ifeq ($(PLATFORM),RALINK_3052)
+CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include/asm-mips/mach-generic -I$(LINUX_SRC)/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe -finline-limit=100000 -march=mips2 -mabi=32 -Wa,--trap -DLINUX -nostdinc -iwithprefix include $(WFLAGS)
+export CFLAGS
+endif
+
+ifeq ($(PLATFORM), RALINK_2880)
+CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe -finline-limit=100000 -march=mips2 -mabi=32 -Wa,--trap -DLINUX -nostdinc -iwithprefix include $(WFLAGS)
+export CFLAGS
+endif
+
+ifeq ($(PLATFORM),STAR)
+CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -Uarm -fno-common -pipe -mapcs-32 -D__LINUX_ARM_ARCH__=4 -march=armv4 -mshort-load-bytes -msoft-float -Uarm -DMODULE -DMODVERSIONS -include $(LINUX_SRC)/include/linux/modversions.h $(WFLAGS)
+
+export CFLAGS
+endif
+
+ifeq ($(PLATFORM),UBICOM_IPX8)
+EXTRA_CFLAGS += $(WFLAGS)
+export EXTRA_CFLAGS
+endif
+
+ifeq ($(PLATFORM),SIGMA)
+CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -I$(LINUX_SRC)/include/asm/gcc -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -DEM86XX_CHIP=EM86XX_CHIPID_TANGO2 -DEM86XX_REVISION=6 -I$(LINUX_SRC)/include/asm-mips/mach-generic -I$(RT2860_DIR)/include -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -ffreestanding -O2 -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe -mabi=32 -march=mips32r2 -Wa,-32 -Wa,-march=mips32r2 -Wa,-mips32r2 -Wa,--trap -DMODULE $(WFLAGS) -DSIGMA863X_PLATFORM
+
+export CFLAGS
+endif
+
+ifeq ($(PLATFORM),SIGMA_8622)
+CFLAGS := -D__KERNEL__ -I$(CROSS_COMPILE_INCLUDE)/include -I$(LINUX_SRC)/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -fno-common -pipe -fno-builtin -D__linux__ -DNO_MM -mapcs-32 -march=armv4 -mtune=arm7tdmi -msoft-float -DMODULE -mshort-load-bytes -nostdinc -iwithprefix -DMODULE $(WFLAGS)
+export CFLAGS
+endif
+
+ifeq ($(PLATFORM),5VT)
+CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -mlittle-endian -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -O3 -fno-omit-frame-pointer -fno-optimize-sibling-calls -fno-omit-frame-pointer -mapcs -mno-sched-prolog -mabi=apcs-gnu -mno-thumb-interwork -D__LINUX_ARM_ARCH__=5 -march=armv5te -mtune=arm926ej-s --param max-inline-insns-single=40000 -Uarm -Wdeclaration-after-statement -Wno-pointer-sign -DMODULE $(WFLAGS)
+
+export CFLAGS
+endif
+
+ifeq ($(PLATFORM),IKANOS_V160)
+CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -I$(LINUX_SRC)/include/asm/gcc -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -I$(LINUX_SRC)/include/asm-mips/mach-generic -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -ffreestanding -O2 -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe -march=lx4189 -Wa, -DMODULE $(WFLAGS)
+export CFLAGS
+endif
+
+ifeq ($(PLATFORM),IKANOS_V180)
+CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -I$(LINUX_SRC)/include/asm/gcc -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -I$(LINUX_SRC)/include/asm-mips/mach-generic -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -ffreestanding -O2 -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe -mips32r2 -Wa, -DMODULE $(WFLAGS)
+export CFLAGS
+endif
+
+ifeq ($(PLATFORM),INF_TWINPASS)
+CFLAGS := -D__KERNEL__ -DMODULE -I$(LINUX_SRC)/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fomit-frame-pointer -fno-strict-aliasing -fno-common -G 0 -mno-abicalls -fno-pic -march=4kc -mips32 -Wa,--trap -pipe -mlong-calls $(WFLAGS)
+export CFLAGS
+endif
+
+ifeq ($(PLATFORM),INF_DANUBE)
+ ifneq (,$(findstring 2.4,$(LINUX_SRC)))
+ CFLAGS := $(WFLAGS) -Wundef -fno-strict-aliasing -fno-common -ffreestanding -Os -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe -msoft-float -mabi=32 -march=mips32 -Wa,-32 -Wa,-march=mips32 -Wa,-mips32 -Wa,--trap -I$(LINUX_SRC)/include/asm-mips/mach-generic
+ else
+ CFLAGS := $(WFLAGS) -Wundef -fno-strict-aliasing -fno-common -ffreestanding -Os -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe -msoft-float -mabi=32 -march=mips32r2 -Wa,-32 -Wa,-march=mips32r2 -Wa,-mips32r2 -Wa,--trap -I$(LINUX_SRC)/include/asm-mips/mach-generic
+ endif
+export CFLAGS
+endif
+
+ifeq ($(PLATFORM),INF_AR9)
+CFLAGS := $(WFLAGS) -Wundef -fno-strict-aliasing -fno-common -fno-pic -ffreestanding -Os -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe -msoft-float -mabi=32 -mlong-calls -march=mips32r2 -mtune=34kc -march=mips32r2 -Wa,-32 -Wa,-march=mips32r2 -Wa,-mips32r2 -Wa,--trap -I$(LINUX_SRC)/include/asm-mips/mach-generic
+export CFLAGS
+endif
+
+ifeq ($(PLATFORM),INF_VR9)
+CFLAGS := $(WFLAGS) -Wundef -fno-strict-aliasing -fno-common -fno-pic -ffreestanding -Os -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe -msoft-float -mabi=32 -mlong-calls -march=mips32r2 -march=mips32r2 -Wa,-32 -Wa,-march=mips32r2 -Wa,-mips32r2 -Wa,--trap -I$(LINUX_SRC)/include/asm-mips/mach-generic
+export CFLAGS
+endif
+
+ifeq ($(PLATFORM),BRCM_6358)
+CFLAGS := $(WFLAGS) -nostdinc -iwithprefix include -D__KERNEL__ -Wall -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -I $(LINUX_SRC)/include/asm/gcc -G 0 -mno-abicalls -fno-pic -pipe -finline-limit=100000 -mabi=32 -march=mips32 -Wa,-32 -Wa,-march=mips32 -Wa,-mips32 -Wa,--trap -I$(LINUX_SRC)/include/asm-mips/mach-bcm963xx -I$(LINUX_SRC)/include/asm-mips/mach-generic -Os -fomit-frame-pointer -Wdeclaration-after-statement -DMODULE -mlong-calls
+export CFLAGS
+endif
+
+ifeq ($(PLATFORM),INF_AMAZON_SE)
+CFLAGS := -D__KERNEL__ -DMODULE=1 -I$(LINUX_SRC)/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -DCONFIG_IFX_ALG_QOS -DCONFIG_WAN_VLAN_SUPPORT -fomit-frame-pointer -DIFX_PPPOE_FRAME -G 0 -fno-pic -mno-abicalls -mlong-calls -pipe -finline-limit=100000 -mabi=32 -march=mips32 -Wa,-32 -Wa,-march=mips32 -Wa,-mips32 -Wa,--trap -nostdinc -iwithprefix include $(WFLAGS)
+export CFLAGS
+endif
+
+ifeq ($(PLATFORM),ST)
+CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -Wall -O2 -Wundef -Wstrict-prototypes -Wno-trigraphs -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-aliasing -fno-common -fomit-frame-pointer -ffreestanding -m4-nofpu -o $(WFLAGS)
+export CFLAGS
+endif
+
+ifeq ($(PLATFORM),PC)
+ ifneq (,$(findstring 2.4,$(LINUX_SRC)))
+ # Linux 2.4
+ CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -O2 -fomit-frame-pointer -fno-strict-aliasing -fno-common -pipe -mpreferred-stack-boundary=2 -march=i686 -DMODULE -DMODVERSIONS -include $(LINUX_SRC)/include/linux/modversions.h $(WFLAGS)
+ export CFLAGS
+ else
+ # Linux 2.6
+ EXTRA_CFLAGS := $(WFLAGS)
+ endif
+endif
+
+ifeq ($(PLATFORM),INTELP6)
+ EXTRA_CFLAGS := $(WFLAGS)
+endif
+
+#If the kernel version of RMI is newer than 2.6.27, please change "CFLAGS" to "EXTRA_FLAGS"
+ifeq ($(PLATFORM),RMI)
+EXTRA_CFLAGS := -D__KERNEL__ -DMODULE=1 -I$(LINUX_SRC)/include -I$(LINUX_SRC)/include/asm-mips/mach-generic -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -DCONFIG_IFX_ALG_QOS -DCONFIG_WAN_VLAN_SUPPORT -fomit-frame-pointer -DIFX_PPPOE_FRAME -G 0 -fno-pic -mno-abicalls -mlong-calls -pipe -finline-limit=100000 -mabi=32 -G 0 -mno-abicalls -fno-pic -pipe -msoft-float -march=xlr -ffreestanding -march=xlr -Wa,--trap, -nostdinc -iwithprefix include $(WFLAGS)
+export EXTRA_CFLAGS
+endif
+
+ifeq ($(PLATFORM),RMI_64)
+EXTRA_CFLAGS := -D__KERNEL__ -DMODULE=1 -I$(LINUX_SRC)/include -I$(LINUX_SRC)/include/asm-mips/mach-generic -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -DCONFIG_IFX_ALG_QOS -DCONFIG_WAN_VLAN_SUPPORT -fomit-frame-pointer -DIFX_PPPOE_FRAME -G 0 -fno-pic -mno-abicalls -mlong-calls -pipe -finline-limit=100000 -mabi=64 -G 0 -mno-abicalls -fno-pic -pipe -msoft-float -march=xlr -ffreestanding -march=xlr -Wa,--trap, -nostdinc -iwithprefix include $(WFLAGS)
+export EXTRA_CFLAGS
+endif
+
+ifeq ($(PLATFORM),IXP)
+ CFLAGS := -v -D__KERNEL__ -DMODULE -I$(LINUX_SRC)/include -mbig-endian -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -Uarm -fno-common -pipe -mapcs-32 -D__LINUX_ARM_ARCH__=5 -mcpu=xscale -mtune=xscale -malignment-traps -msoft-float $(WFLAGS)
+ EXTRA_CFLAGS := -v $(WFLAGS) -mbig-endian
+ export CFLAGS
+endif
+
+ifeq ($(PLATFORM),SMDK)
+ EXTRA_CFLAGS := $(WFLAGS)
+endif
+
+ifeq ($(PLATFORM),CAVM_OCTEON)
+ EXTRA_CFLAGS := $(WFLAGS) -mabi=64 $(WFLAGS)
+export CFLAGS
+endif
+
+ifeq ($(PLATFORM),DM6446)
+ CFLAGS := -nostdinc -iwithprefix include -D__KERNEL__ -I$(LINUX_SRC)/include -Wall -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Os -fno-omit-frame-pointer -fno-omit-frame-pointer -mapcs -mno-sched-prolog -mlittle-endian -mabi=apcs-gnu -D__LINUX_ARM_ARCH__=5 -march=armv5te -mtune=arm9tdmi -msoft-float -Uarm -Wdeclaration-after-statement -c -o $(WFLAGS)
+export CFLAGS
+endif
+
+ifeq ($(PLATFORM),BL2348)
+CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -I$(LINUX_SRC)/include/asm/gcc -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -DEM86XX_CHIP=EM86XX_CHIPID_TANGO2 -DEM86XX_REVISION=6 -I$(LINUX_SRC)/include/asm-mips/mach-generic -I$(RT2860_DIR)/include -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -ffreestanding -O2 -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe -mabi=32 -march=mips32r2 -Wa,-32 -Wa,-march=mips32r2 -Wa,-mips32r2 -Wa,--trap -DMODULE $(WFLAGS) -DSIGMA863X_PLATFORM -DEXPORT_SYMTAB -DPLATFORM_BL2348
+export CFLAGS
+endif
+
+ifeq ($(PLATFORM),BL23570)
+EXTRA_CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -I$(LINUX_SRC)/include/asm/gcc -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -DEM86XX_CHIP=EM86XX_CHIPID_TANGO2 -DEM86XX_REVISION=6 -I$(LINUX_SRC)/include/asm-mips/mach-generic -I$(RT2860_DIR)/include -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -ffreestanding -O2 -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe -mabi=32 -march=74kc -Wa,-32 -Wa,-march=mips32r2 -Wa,-mips32r2 -Wa,--trap -DMODULE $(WFLAGS) -DSIGMA863X_PLATFORM -DEXPORT_SYMTAB -DPLATFORM_BL23570
+export EXTRA_CFLAGS
+endif
+
+ifeq ($(PLATFORM),BLUBB)
+CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -I$(LINUX_SRC)/include/asm/gcc -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -DEM86XX_CHIP=EM86XX_CHIPID_TANGO2 -DEM86XX_REVISION=6 -I$(LINUX_SRC)/include/asm-mips/mach-generic -I$(RT2860_DIR)/include -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -ffreestanding -O2 -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe -mabi=32 -march=mips32r2 -Wa,-32 -Wa,-march=mips32r2 -Wa,-mips32r2 -Wa,--trap -DMODULE $(WFLAGS) -DSIGMA863X_PLATFORM -DEXPORT_SYMTAB -DPLATFORM_BL2348
+export CFLAGS
+endif
+
+ifeq ($(PLATFORM),BLPMP)
+CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -I$(LINUX_SRC)/include/asm/gcc -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -DEM86XX_CHIP=EM86XX_CHIPID_TANGO2 -DEM86XX_REVISION=6 -I$(LINUX_SRC)/include/asm-mips/mach-generic -I$(RT2860_DIR)/include -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -ffreestanding -O2 -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe -mabi=32 -march=mips32r2 -Wa,-32 -Wa,-march=mips32r2 -Wa,-mips32r2 -Wa,--trap -DMODULE $(WFLAGS) -DSIGMA863X_PLATFORM -DEXPORT_SYMTAB
+export CFLAGS
+endif
+
+ifeq ($(PLATFORM),MT85XX)
+ ifneq (,$(findstring 2.4,$(LINUX_SRC)))
+ # Linux 2.4
+ CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -O2 -fomit-frame-pointer -fno-strict-aliasing -fno-common -pipe -mpreferred-stack-boundary=2 -march=i686 -DMODULE -DMODVERSIONS -include $(LINUX_SRC)/include/linux/modversions.h $(WFLAGS)
+ export CFLAGS
+ else
+ # Linux 2.6
+ EXTRA_CFLAGS += $(WFLAGS) -DMT85XX
+ EXTRA_CFLAGS += -D _NO_TYPEDEF_BOOL_ \
+ -D _NO_TYPEDEF_UCHAR_ \
+ -D _NO_TYPEDEF_UINT8_ \
+ -D _NO_TYPEDEF_UINT16_ \
+ -D _NO_TYPEDEF_UINT32_ \
+ -D _NO_TYPEDEF_UINT64_ \
+ -D _NO_TYPEDEF_CHAR_ \
+ -D _NO_TYPEDEF_INT16_ \
+ -D _NO_TYPEDEF_INT32_ \
+ -D _NO_TYPEDEF_INT64_ \
+
+ endif
+endif
+
+ifeq ($(PLATFORM),NXP_TV550)
+ ifneq (,$(findstring 2.4,$(LINUX_SRC)))
+ # Linux 2.4
+ CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -O2 -fomit-frame-pointer -fno-strict-aliasing -fno-common -pipe -mpreferred-stack-boundary=2 -march=mips -DMODULE -DMODVERSIONS -include $(LINUX_SRC)/include/linux/modversions.h $(WFLAGS)
+ export CFLAGS
+ else
+ # Linux 2.6
+ EXTRA_CFLAGS := $(WFLAGS)
+ endif
+endif
+
+ifeq ($(PLATFORM),MVL5)
+CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -mlittle-endian -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -O3 -fno-omit-frame-pointer -fno-optimize-sibling-calls -fno-omit-frame-pointer -mapcs -mno-sched-prolog -mno-thumb-interwork -D__LINUX_ARM_ARCH__=5 -march=armv5te -mtune=arm926ej-s --param max-inline-insns-single=40000 -Uarm -Wdeclaration-after-statement -Wno-pointer-sign -DMODULE $(WFLAGS)
+export CFLAGS
+endif
+
+ifeq ($(PLATFORM),RALINK_3352)
+CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include/asm-mips/mach-generic -I$(LINUX_SRC)/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe -finline-limit=100000 -march=mips2 -mabi=32 -Wa,--trap -DLINUX -nostdinc -iwithprefix include $(WFLAGS)
+export CFLAGS
+endif
+
+ifeq ($(PLATFORM),MT7620)
+ EXTRA_CFLAGS := $(WFLAGS)
+endif
+
+ifeq ($(PLATFORM),MSTARPLC)
+EXTRA_CFLAGS += $(WFLAGS) -I$(RT28xx_DIR)/include
+export EXTRA_CFLAGS
+endif
diff --git a/cleopatre/devkit/mt7601udrv/os/linux/config.mk.bak b/cleopatre/devkit/mt7601udrv/os/linux/config.mk.bak
new file mode 100644
index 0000000000..d2643e27cb
--- /dev/null
+++ b/cleopatre/devkit/mt7601udrv/os/linux/config.mk.bak
@@ -0,0 +1,1637 @@
+# Support ATE function
+HAS_ATE=n
+
+# Support QA ATE function
+HAS_QA_SUPPORT=n
+
+#ifdef RSSI_FEEDBACK
+HAS_RSSI_FEEDBACK=n
+#endif // RSSI_FEEDBACK //
+
+#ifdef XLINK_SUPPORT
+# Support XLINK mode
+HAS_XLINK=n
+#endif // XLINK_SUPPORT //
+
+#ifdef WSC_INCLUDED
+# Support WSC function
+HAS_WSC=n
+#ifdef WSC_V2_SUPPORT
+HAS_WSC_V2=n
+#endif // WSC_V2_SUPPORT //
+HAS_WSC_LED=n
+#ifdef IWSC_SUPPORT
+HAS_IWSC_SUPPORT=n
+#endif // IWSC_SUPPORT //
+#endif // WSC_INCLUDED //
+
+#ifdef NINTENDO_AP
+HAS_NINTENDO=n
+#endif // NINTENDO_AP //
+
+# Support LLTD function
+HAS_LLTD=n
+
+#ifdef WDS_SUPPORT
+# Support WDS function
+HAS_WDS=n
+#endif // WDS_SUPPORT //
+
+#ifdef APCLI_SUPPORT
+# Support AP-Client function
+HAS_APCLI=n
+#endif // APCLI_SUPPORT //
+
+#ifdef WPA_SUPPLICANT_SUPPORT
+# Support Wpa_Supplicant
+# i.e. wpa_supplicant -Dralink
+HAS_WPA_SUPPLICANT=n
+#endif // WPA_SUPPLICANT_SUPPORT //
+
+
+#ifdef NATIVE_WPA_SUPPLICANT_SUPPORT
+# Support Native WpaSupplicant for Network Maganger
+# i.e. wpa_supplicant -Dwext
+HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=n
+#endif // NATIVE_WPA_SUPPLICANT_SUPPORT //
+
+#Support Net interface block while Tx-Sw queue full
+HAS_BLOCK_NET_IF=n
+
+#Support IGMP-Snooping function.
+HAS_IGMP_SNOOP_SUPPORT=n
+
+#Support DFS function
+HAS_DFS_SUPPORT=n
+
+#Support Carrier-Sense function
+HAS_CS_SUPPORT=n
+
+#ifdef ETH_CONVERT_SUPPORT
+# Support for STA Ethernet Converter
+HAS_ETH_CONVERT_SUPPORT=n
+#endif // ETH_CONVERT_SUPPORT //
+
+# Support user specific transmit rate of Multicast packet.
+HAS_MCAST_RATE_SPECIFIC_SUPPORT=n
+
+#ifdef MULTI_CARD
+# Support for Multiple Cards
+HAS_MC_SUPPORT=n
+#endif // MULTI_CARD //
+
+#Support for PCI-MSI
+HAS_MSI_SUPPORT=n
+
+#ifdef WMM_ACM_SUPPORT
+# Support for WMM ACM v1.1
+HAS_WMM_ACM_SUPPORT=n
+#endif // WMM_ACM_SUPPORT //
+
+#Support for IEEE802.11e DLS
+HAS_QOS_DLS_SUPPORT=n
+
+#Support for EXT_CHANNEL
+HAS_EXT_BUILD_CHANNEL_LIST=n
+
+#Support for IDS
+HAS_IDS_SUPPORT=n
+
+#ifdef MESH_SUPPORT
+#Support for MESH
+HAS_MESH_SUPPORT=n
+#endif // MESH_SUPPORT //
+
+#Support for Net-SNMP
+HAS_SNMP_SUPPORT=n
+
+#ifdef DOT11N_DRAFT3
+#Support features of 802.11n Draft3
+HAS_DOT11N_DRAFT3_SUPPORT=n
+#endif // DOT11N_DRAFT3 //
+
+#Support features of Single SKU.
+HAS_SINGLE_SKU_SUPPORT=n
+
+#ifdef DOT11_N_SUPPORT
+#Support features of 802.11n
+HAS_DOT11_N_SUPPORT=y
+#endif // DOT11_N_SUPPORT //
+
+#ifdef DOT11_VHT_SUPPORT
+#Support for 802.11ac VHT
+HAS_DOT11_VHT_SUPPORT=y
+#endif // DOT11_VHT_SUPPORT //
+
+#ifdef WAPI_SUPPORT
+#Support for WAPI
+HAS_WAPI_SUPPORT=n
+#endif // WAPI_SUPPORT //
+
+#ifdef DOT11R_FT_SUPPORT
+#Support for dot11r FT
+HAS_DOT11R_FT_SUPPORT=n
+#endif // DOT11R_FT_SUPPORT //
+
+#Support for 2860/2880 co-exist
+HAS_RT2880_RT2860_COEXIST=n
+
+HAS_KTHREAD_SUPPORT=n
+
+#ifdef DOT11K_RRM_SUPPORT
+#Support for dot11k RRM
+HAS_DOT11K_RRM_SUPPORT=n
+#endif // DOT11K_RRM_SUPPORT //
+
+#ifdef DOT11V_WNM_SUPPORT
+#Support for dot 11v WNM
+HAS_DOT11V_WNM_SUPPORT=n
+#endif // DOT11V_WNM_SUPPORT //
+
+#ifdef DOT11Z_TDLS_SUPPORT
+#Support for dot11z TDLS
+HAS_DOT11Z_TDLS_SUPPORT=n
+#endif // DOT11Z_TDLS_SUPPORT //
+
+#ifdef P2P_SUPPORT
+#Support for WiFi-Driect(Peer to Peer)
+HAS_P2P_SUPPORT=n
+HAS_P2P_ODD_MAC_ADJUST=n
+HAS_P2P_SPECIFIC_WIRELESS_EVENT=n
+#endif // P2P_SUPPORT //
+
+#Support for Auto channel select enhance
+HAS_AUTO_CH_SELECT_ENHANCE=n
+
+#Support statistics count
+HAS_STATS_COUNT=y
+
+#Support TSSI Antenna Variation
+HAS_TSSI_ANTENNA_VARIATION=n
+
+#Support USB_BULK_BUF_ALIGMENT
+HAS_USB_BULK_BUF_ALIGMENT=n
+
+#Support for USB_SUPPORT_SELECTIVE_SUSPEND
+HAS_USB_SUPPORT_SELECTIVE_SUSPEND=n
+
+#Support USB load firmware by multibyte
+HAS_USB_FIRMWARE_MULTIBYTE_WRITE=n
+
+
+#Support ANDROID_SUPPORT
+HAS_ANDROID_SUPPORT=n
+
+#HAS_IFUP_IN_PROBE_SUPPORT
+HAS_IFUP_IN_PROBE_SUPPORT=n
+
+
+#ifdef DOT11W_PMF_SUPPORT
+#Support for dot11w Protected Management Frame
+HAS_DOT11W_PMF_SUPPORT=n
+#endif // DOT11W_PMF_SUPPORT //
+
+#ifdef ANT_DIVERSITY_SUPPORT
+#Support Antenna Diversity
+HAS_ANTENNA_DIVERSITY_SUPPORT=n
+#endif // ANT_DIVERSITY_SUPPORT //
+
+#ifdef TXRX_SW_ANTDIV_SUPPORT
+#Support TXRX SW Antenna Diversity
+HAS_TXRX_SW_ANTDIV_SUPPORT=n
+#endif // TXRX_SW_ANTDIV_SUPPORT //
+
+#Client support WDS function
+HAS_CLIENT_WDS_SUPPORT=n
+
+#Support for Bridge Fast Path & Bridge Fast Path function open to other module
+HAS_BGFP_SUPPORT=n
+HAS_BGFP_OPEN_SUPPORT=n
+
+# Support HOSTAPD function
+HAS_HOSTAPD_SUPPORT=n
+
+#Support GreenAP function
+HAS_GREENAP_SUPPORT=n
+
+#Support MAC80211 LINUX-only function
+#Please make sure the version for CFG80211.ko and MAC80211.ko is same as the one
+#our driver references to.
+HAS_CFG80211_SUPPORT=n
+
+#Support RFKILL hardware block/unblock LINUX-only function
+HAS_RFKILL_HW_SUPPORT=n
+
+#ifdef EASY_CONFIG_SETUP
+HAS_EASY_CONFIG_SETUP_SUPPORT=n
+#endif // EASY_CONFIG_SETUP //
+
+#ifdef RELEASE_EXCLUDE
+#Support GPL Cryptography
+HAS_GPL_ALGORITHM_SUPPORT=n
+
+#ifdef HW_COEXISTENCE_SUPPORT
+HAS_HW_COEXISTENCE_SUPPORT=n
+#endif // HW_COEXISTENCE_SUPPORT //
+
+#ifdef BT_COEXISTENCE_SUPPORT
+HAS_BT_COEXISTENCE_SUPPORT=n
+#endif // BT_COEXISTENCE_SUPPORT //
+#endif //RELEASE_EXCLUDE //
+
+HAS_APCLI_WPA_SUPPLICANT=n
+
+HAS_RTMP_FLASH_SUPPORT=n
+
+#ifdef OS_ABL_FUNC_SUPPORT
+ifeq ($(OSABL),YES)
+HAS_OSABL_FUNC_SUPPORT=y
+HAS_OSABL_OS_PCI_SUPPORT=y
+HAS_OSABL_OS_USB_SUPPORT=y
+HAS_OSABL_OS_RBUS_SUPPORT=n
+HAS_OSABL_OS_AP_SUPPORT=y
+HAS_OSABL_OS_STA_SUPPORT=y
+endif
+#endif // OS_ABL_FUNC_SUPPORT //
+
+#ifdef LED_CONTROL_SUPPORT
+HAS_LED_CONTROL_SUPPORT=y
+#endif // LED_CONTROL_SUPPORT //
+
+#ifdef CONFIG_WIFI_LED_SHARE
+HAS_WIFI_LED_SHARE=n
+#endif // CONFIG_WIFI_LED_SHARE //
+
+#Support WIDI feature
+#Must enable HAS_WSC at the same time.
+#ifdef WIDI_SUPPORT
+HAS_WIDI_SUPPORT=n
+HAS_INTEL_WFD_SUPPORT=n
+HAS_WFA_WFD_SUPPORT=n
+#endif // HAS_WIDI_SUPPORT //
+
+#ifdef TXBF_SUPPORT
+HAS_TXBF_SUPPORT=n
+#endif // TXBF_SUPPORT //
+
+#ifdef STREAM_MODE_SUPPORT
+HAS_STREAM_MODE_SUPPORT=n
+#endif // STREAM_MODE_SUPPORT //
+
+#ifdef NEW_RATE_ADAPT_SUPPORT
+HAS_NEW_RATE_ADAPT_SUPPORT=n
+#endif // NEW_RATE_ADAPT_SUPPORT //
+
+#ifdef DPA_S
+HAS_DPA_S_SUPPORT=n
+#endif
+
+#ifdef DPA_T
+HAS_DPA_T_SUPPORT=n
+#endif
+
+#ifdef CONFIG_CSO_SUPPORT
+#RT5572 RT5592
+HAS_CSO_SUPPORT=y
+#endif
+
+#ifdef CONFIG_TSO_SUPPORT
+#RT6590 RT6570
+HAS_TSO_SUPPORT=y
+#endif
+
+#ifdef WOW_SUPPORT
+HAS_WOW_SUPPORT=n
+HAS_WOW_IFDOWN_SUPPORT=n
+#endif
+
+#################################################
+
+CC := $(CROSS_COMPILE)gcc
+LD := $(CROSS_COMPILE)ld
+
+WFLAGS := -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT -DLINUX -Wall -Wstrict-prototypes -Wno-trigraphs
+WFLAGS += -DSYSTEM_LOG_SUPPORT -DRT28xx_MODE=$(RT28xx_MODE) -DCHIPSET=$(MODULE) -DRESOURCE_PRE_ALLOC
+#WFLAGS += -DFPGA_MODE
+WFLAGS += -I$(RT28xx_DIR)/include
+
+#ifdef DPA_S
+ifeq ($(HAS_DPA_S_SUPPORT),y)
+WFLAGS += -DDPA_S
+endif
+#endif
+
+#ifdef DPA_T
+ifeq ($(HAS_DPA_T_SUPPORT),y)
+WFLAGS += -DDPA_T
+endif
+#endif
+
+#ifdef RELEASE_EXCLUDE
+#removed for building in RT3052 ApSoc SDK
+ifneq ($(PLATFORM),RALINK_3052)
+ifneq ($(PLATFORM),DM6446)
+#WFLAGS += -Wpointer-sign
+endif
+endif
+#endif // RELEASE_EXCLUDE //
+
+#ifdef RELEASE_EXCLUDE
+ifeq ($(HAS_GPL_ALGORITHM_SUPPORT),y)
+WFLAGS += -DCRYPT_GPL_ALGORITHM
+endif
+#endif // RELEASE_EXCLUDE //
+
+
+ifeq ($(HAS_KTHREAD_SUPPORT),y)
+WFLAGS += -DKTHREAD_SUPPORT
+endif
+
+ifeq ($(HAS_RTMP_FLASH_SUPPORT),y)
+WFLAGS += -DRTMP_FLASH_SUPPORT
+endif
+
+ifeq ($(HAS_STREAM_MODE_SUPPORT),y)
+WFLAGS += -DSTREAM_MODE_SUPPORT
+endif
+
+ifeq ($(HAS_SINGLE_SKU_SUPPORT),y)
+WFLAGS += -DSINGLE_SKU
+endif
+
+ifeq ($(HAS_DOT11_VHT_SUPPORT),y)
+WFLAGS += -DDOT11_VHT_SUPPORT
+endif
+
+
+#ifdef CONFIG_AP_SUPPORT
+# config for AP mode
+
+ifeq ($(RT28xx_MODE),AP)
+WFLAGS += -DCONFIG_AP_SUPPORT -DUAPSD_SUPPORT -DMBSS_SUPPORT -DIAPP_SUPPORT -DDBG -DDOT1X_SUPPORT -DAP_SCAN_SUPPORT -DSCAN_SUPPORT
+
+ifeq ($(HAS_APCLI_WPA_SUPPLICANT),y)
+WFLAGS += -DApCli_WPA_SUPPLICANT_SUPPORT
+endif
+
+ifeq ($(HAS_HOSTAPD_SUPPORT),y)
+WFLAGS += -DHOSTAPD_SUPPORT
+endif
+
+ifeq ($(HAS_ATE),y)
+WFLAGS += -DRALINK_ATE
+WFLAGS += -DCONFIG_RT2880_ATE_CMD_NEW
+WFLAGS += -I$(RT28xx_DIR)/ate/include
+ifeq ($(HAS_QA_SUPPORT),y)
+WFLAGS += -DRALINK_QA
+endif
+endif
+
+#ifdef RSSI_FEEDBACK
+ifeq ($(HAS_RSSI_FEEDBACK),y)
+WFLAGS += -DRSSI_FEEDBACK
+endif
+#endif // RSSI_FEEDBACK //
+
+#ifdef GEMTEK_ATE
+ifeq ($(RELEASE), DPB)
+WFLAGS += -DGEMTEK_ATE
+endif
+#endif // GEMTEK_ATE //
+
+
+#ifdef NINTENDO_AP
+ifeq ($(HAS_NINTENDO),y)
+WFLAGS += -DNINTENDO_AP
+endif
+#endif // NINTENDO_AP //
+
+#ifdef WSC_INCLUDED
+ifeq ($(HAS_WSC),y)
+WFLAGS += -DWSC_AP_SUPPORT
+
+ifeq ($(HAS_WSC_V2),y)
+WFLAGS += -DWSC_V2_SUPPORT
+endif
+ifeq ($(HAS_WSC_LED),y)
+WFLAGS += -DWSC_LED_SUPPORT
+endif
+endif
+#endif // WSC_INCLUDED //
+
+#ifdef EASY_CONFIG_SETUP
+ifeq ($(HAS_EASY_CONFIG_SETUP_SUPPORT),y)
+WFLAGS += -DEASY_CONFIG_SETUP -DWAC_SUPPORT
+endif
+#endif // EASY_CONFIG_SETUP //
+
+#ifdef WDS_SUPPORT
+ifeq ($(HAS_WDS),y)
+WFLAGS += -DWDS_SUPPORT
+endif
+#endif // WDS_SUPPORT //
+
+#ifdef APCLI_SUPPORT
+ifeq ($(HAS_APCLI),y)
+WFLAGS += -DAPCLI_SUPPORT -DMAT_SUPPORT -DAP_SCAN_SUPPORT -DSCAN_SUPPORT
+#ifeq ($(HAS_ETH_CONVERT_SUPPORT), y)
+#WFLAGS += -DETH_CONVERT_SUPPORT
+#endif
+endif
+#endif // APCLI_SUPPORT //
+
+ifeq ($(HAS_IGMP_SNOOP_SUPPORT),y)
+WFLAGS += -DIGMP_SNOOP_SUPPORT
+endif
+
+ifeq ($(HAS_CS_SUPPORT),y)
+WFLAGS += -DCARRIER_DETECTION_SUPPORT
+endif
+
+ifeq ($(HAS_MCAST_RATE_SPECIFIC_SUPPORT), y)
+WFLAGS += -DMCAST_RATE_SPECIFIC
+endif
+
+ifneq ($(findstring 2860,$(CHIPSET)),)
+ifeq ($(HAS_MSI_SUPPORT),y)
+WFLAGS += -DPCI_MSI_SUPPORT
+endif
+endif
+
+#ifdef WMM_ACM_SUPPORT
+ifeq ($(HAS_WMM_ACM_SUPPORT),y)
+WFLAGS += -DWMM_ACM_SUPPORT
+endif
+#endif // WMM_ACM_SUPPORT //
+
+ifeq ($(HAS_QOS_DLS_SUPPORT),y)
+WFLAGS += -DQOS_DLS_SUPPORT
+endif
+
+ifeq ($(HAS_SNMP_SUPPORT),y)
+WFLAGS += -DSNMP_SUPPORT
+endif
+
+#ifdef DOT11_N_SUPPORT
+ifeq ($(HAS_DOT11_N_SUPPORT),y)
+WFLAGS += -DDOT11_N_SUPPORT
+
+#ifdef DOT11N_DRAFT3
+ifeq ($(HAS_DOT11N_DRAFT3_SUPPORT),y)
+WFLAGS += -DDOT11N_DRAFT3
+endif
+#endif // DOT11N_DRAFT3 //
+
+#ifdef TXBF_SUPPORT
+ifeq ($(HAS_TXBF_SUPPORT),y)
+WFLAGS += -DTXBF_SUPPORT
+endif
+#endif // TXBF_SUPPORT //
+
+#ifdef NEW_RATE_ADAPT_SUPPORT
+ifeq ($(HAS_NEW_RATE_ADAPT_SUPPORT),y)
+WFLAGS += -DNEW_RATE_ADAPT_SUPPORT
+endif
+#endif // NEW_RATE_ADAPT_SUPPORT //
+
+ifeq ($(HAS_GREENAP_SUPPORT),y)
+WFLAGS += -DGREENAP_SUPPORT
+endif
+
+endif
+#endif // DOT11_N_SUPPORT //
+
+ifeq ($(HAS_AUTO_CH_SELECT_ENHANCE),y)
+WFLAGS += -DAUTO_CH_SELECT_ENHANCE
+endif
+
+ifeq ($(HAS_STATS_COUNT),y)
+WFLAGS += -DSTATS_COUNT_SUPPORT
+endif
+
+ifeq ($(HAS_TSSI_ANTENNA_VARIATION),y)
+WFLAGS += -DTSSI_ANTENNA_VARIATION
+endif
+
+ifeq ($(HAS_USB_BULK_BUF_ALIGMENT),y)
+WFLAGS += -DUSB_BULK_BUF_ALIGMENT
+endif
+
+
+ifeq ($(HAS_CFG80211_SUPPORT),y)
+WFLAGS += -DRT_CFG80211_SUPPORT
+ifeq ($(HAS_RFKILL_HW_SUPPORT),y)
+WFLAGS += -DRFKILL_HW_SUPPORT
+endif
+endif
+
+ifeq ($(OSABL),YES)
+WFLAGS += -DOS_ABL_SUPPORT
+ifeq ($(HAS_OSABL_FUNC_SUPPORT),y)
+WFLAGS += -DOS_ABL_FUNC_SUPPORT
+endif
+ifeq ($(HAS_OSABL_OS_PCI_SUPPORT),y)
+WFLAGS += -DOS_ABL_OS_PCI_SUPPORT
+endif
+ifeq ($(HAS_OSABL_OS_USB_SUPPORT),y)
+WFLAGS += -DOS_ABL_OS_USB_SUPPORT
+endif
+ifeq ($(HAS_OSABL_OS_RBUS_SUPPORT),y)
+WFLAGS += -DOS_ABL_OS_RBUS_SUPPORT
+endif
+ifeq ($(HAS_OSABL_OS_AP_SUPPORT),y)
+WFLAGS += -DOS_ABL_OS_AP_SUPPORT
+endif
+ifeq ($(HAS_OSABL_OS_STA_SUPPORT),y)
+WFLAGS += -DOS_ABL_OS_STA_SUPPORT
+endif
+endif
+
+#ifdef ANT_DIVERSITY_SUPPORT
+ifeq ($(HAS_ANTENNA_DIVERSITY_SUPPORT),y)
+WFLAGS += -DANT_DIVERSITY_SUPPORT
+endif
+#endif // ANT_DIVERSITY_SUPPORT //
+
+#ifdef TXRX_SW_ANTDIV_SUPPORT
+ifeq ($(HAS_TXRX_SW_ANTDIV_SUPPORT),y)
+WFLAGS += -DTXRX_SW_ANTDIV_SUPPORT
+endif
+#endif // TXRX_SW_ANTDIV_SUPPORT //
+
+#ifdef RELEASE_EXCLUDE
+#ifdef HW_COEXISTENCE_SUPPORT
+ifeq ($(HAS_HW_COEXISTENCE_SUPPORT),y)
+WFLAGS += -DHW_COEXISTENCE_SUPPORT
+endif
+#endif // HW_COEXISTENCE_SUPPORT //
+#endif //RELEASE_EXCLUDE //
+
+endif #// endif of RT2860_MODE == AP //
+#endif // CONFIG_AP_SUPPORT //
+
+#################################################
+
+#ifdef CONFIG_STA_SUPPORT
+# config for STA mode
+
+ifeq ($(RT28xx_MODE),STA)
+WFLAGS += -DCONFIG_STA_SUPPORT -DSCAN_SUPPORT -DDBG
+
+#ifdef XLINK_SUPPORT
+ifeq ($(HAS_XLINK),y)
+WFLAGS += -DXLINK_SUPPORT
+endif
+#endif // XLINK_SUPPORT //
+
+#ifdef ADHOC_WPA2PSK_SUPPORT
+WFLAGS += -DADHOC_WPA2PSK_SUPPORT
+#endif // ADHOC_WPA2PSK_SUPPORT //
+
+#ifdef WPA_SUPPLICANT_SUPPORT
+ifeq ($(HAS_WPA_SUPPLICANT),y)
+WFLAGS += -DWPA_SUPPLICANT_SUPPORT
+#ifdef NATIVE_WPA_SUPPLICANT_SUPPORT
+ifeq ($(HAS_NATIVE_WPA_SUPPLICANT_SUPPORT),y)
+WFLAGS += -DNATIVE_WPA_SUPPLICANT_SUPPORT
+endif
+#endif // NATIVE_WPA_SUPPLICANT_SUPPORT //
+endif
+#endif // WPA_SUPPLICANT_SUPPORT //
+
+#ifdef WSC_INCLUDED
+ifeq ($(HAS_WSC),y)
+WFLAGS += -DWSC_STA_SUPPORT
+ifeq ($(HAS_WSC_V2),y)
+WFLAGS += -DWSC_V2_SUPPORT
+endif
+ifeq ($(HAS_WSC_LED),y)
+WFLAGS += -DWSC_LED_SUPPORT
+endif
+ifeq ($(HAS_IWSC_SUPPORT),y)
+WFLAGS += -DIWSC_SUPPORT
+endif
+endif
+#endif // WSC_INCLUDED //
+
+#ifdef STA_EASY_CONFIG_SETUP
+ifeq ($(HAS_WSC),y)
+ifeq ($(HAS_EASY_CONFIG_SETUP_SUPPORT),y)
+WFLAGS += -DEASY_CONFIG_SETUP -DSTA_EASY_CONFIG_SETUP -DWAC_SUPPORT
+endif
+endif
+#endif // STA_EASY_CONFIG_SETUP //
+
+#ifdef ETH_CONVERT_SUPPORT
+ifeq ($(HAS_ETH_CONVERT_SUPPORT), y)
+WFLAGS += -DETH_CONVERT_SUPPORT -DMAT_SUPPORT
+endif
+#endif // ETH_CONVERT_SUPPORT //
+
+ifeq ($(HAS_ATE),y)
+WFLAGS += -DRALINK_ATE
+WFLAGS += -DCONFIG_RT2880_ATE_CMD_NEW
+WFLAGS += -I$(RT28xx_DIR)/ate/include
+ifeq ($(HAS_QA_SUPPORT),y)
+WFLAGS += -DRALINK_QA
+endif
+endif
+
+#ifdef WMM_ACM_SUPPORT
+ifeq ($(HAS_WMM_ACM_SUPPORT),y)
+WFLAGS += -DWMM_ACM_SUPPORT
+endif
+#endif // WMM_ACM_SUPPORT //
+
+ifeq ($(HAS_SNMP_SUPPORT),y)
+WFLAGS += -DSNMP_SUPPORT
+endif
+
+ifeq ($(HAS_QOS_DLS_SUPPORT),y)
+WFLAGS += -DQOS_DLS_SUPPORT
+endif
+
+#ifdef DOT11_N_SUPPORT
+ifeq ($(HAS_DOT11_N_SUPPORT),y)
+WFLAGS += -DDOT11_N_SUPPORT
+
+#ifdef DOT11N_DRAFT3
+ifeq ($(HAS_DOT11N_DRAFT3_SUPPORT),y)
+WFLAGS += -DDOT11N_DRAFT3
+endif
+#endif // DOT11N_DRAFT3 //
+
+#ifdef TXBF_SUPPORT
+ifeq ($(HAS_TXBF_SUPPORT),y)
+WFLAGS += -DTXBF_SUPPORT
+endif
+#endif // TXBF_SUPPORT //
+
+#ifdef NEW_RATE_ADAPT_SUPPORT
+ifeq ($(HAS_NEW_RATE_ADAPT_SUPPORT),y)
+WFLAGS += -DNEW_RATE_ADAPT_SUPPORT
+endif
+#endif // NEW_RATE_ADAPT_SUPPORT //
+
+endif
+#endif // DOT11_N_SUPPORT //
+
+#ifdef DOT11Z_TDLS_SUPPORT
+ifeq ($(HAS_DOT11Z_TDLS_SUPPORT),y)
+WFLAGS += -DDOT11Z_TDLS_SUPPORT
+endif
+#endif // DOT11Z_TDLS_SUPPORT //
+
+#ifdef P2P_SUPPORT
+ifeq ($(HAS_P2P_SUPPORT),y)
+WFLAGS += -DP2P_SUPPORT -DAPCLI_SUPPORT -DMAT_SUPPORT -DAP_SCAN_SUPPORT -DSCAN_SUPPORT -DP2P_APCLI_SUPPORT -DCONFIG_AP_SUPPORT -DCONFIG_APSTA_MIXED_SUPPORT -DUAPSD_SUPPORT -DMBSS_SUPPORT -DIAPP_SUPPORT -DDOT1X_SUPPORT -DWSC_AP_SUPPORT -DWSC_STA_SUPPORT
+endif
+
+ifeq ($(HAS_P2P_ODD_MAC_ADJUST),y)
+WFLAGS += -DP2P_ODD_MAC_ADJUST
+endif
+
+ifeq ($(HAS_P2P_SPECIFIC_WIRELESS_EVENT),y)
+WFLAGS += -DRT_P2P_SPECIFIC_WIRELESS_EVENT
+endif
+#endif // P2P_SUPPORT //
+
+ifeq ($(HAS_CS_SUPPORT),y)
+WFLAGS += -DCARRIER_DETECTION_SUPPORT
+endif
+
+ifeq ($(HAS_STATS_COUNT),y)
+WFLAGS += -DSTATS_COUNT_SUPPORT
+endif
+
+ifeq ($(HAS_TSSI_ANTENNA_VARIATION),y)
+WFLAGS += -DTSSI_ANTENNA_VARIATION
+endif
+
+ifeq ($(HAS_ANDROID_SUPPORT),y)
+WFLAGS += -DANDROID_SUPPORT
+endif
+
+
+ifeq ($(HAS_IFUP_IN_PROBE_SUPPORT),y)
+WFLAGS += -DIFUP_IN_PROBE
+endif
+
+ifeq ($(HAS_USB_SUPPORT_SELECTIVE_SUSPEND),y)
+WFLAGS += -DUSB_SUPPORT_SELECTIVE_SUSPEND
+endif
+
+ifeq ($(HAS_USB_FIRMWARE_MULTIBYTE_WRITE),y)
+WFLAGS += -DUSB_FIRMWARE_MULTIBYTE_WRITE -DMULTIWRITE_BYTES=4
+endif
+
+ifeq ($(HAS_CFG80211_SUPPORT),y)
+WFLAGS += -DRT_CFG80211_SUPPORT
+ifeq ($(HAS_RFKILL_HW_SUPPORT),y)
+WFLAGS += -DRFKILL_HW_SUPPORT
+endif
+endif
+
+ifeq ($(OSABL),YES)
+WFLAGS += -DOS_ABL_SUPPORT
+ifeq ($(HAS_OSABL_FUNC_SUPPORT),y)
+WFLAGS += -DOS_ABL_FUNC_SUPPORT
+endif
+ifeq ($(HAS_OSABL_OS_PCI_SUPPORT),y)
+WFLAGS += -DOS_ABL_OS_PCI_SUPPORT
+endif
+ifeq ($(HAS_OSABL_OS_USB_SUPPORT),y)
+WFLAGS += -DOS_ABL_OS_USB_SUPPORT
+endif
+ifeq ($(HAS_OSABL_OS_RBUS_SUPPORT),y)
+WFLAGS += -DOS_ABL_OS_RBUS_SUPPORT
+endif
+ifeq ($(HAS_OSABL_OS_AP_SUPPORT),y)
+WFLAGS += -DOS_ABL_OS_AP_SUPPORT
+endif
+ifeq ($(HAS_OSABL_OS_STA_SUPPORT),y)
+WFLAGS += -DOS_ABL_OS_STA_SUPPORT
+endif
+endif
+
+#ifdef ANT_DIVERSITY_SUPPORT
+ifeq ($(HAS_ANTENNA_DIVERSITY_SUPPORT),y)
+WFLAGS += -DANT_DIVERSITY_SUPPORT
+endif
+#endif // ANT_DIVERSITY_SUPPORT //
+
+#ifdef TXRX_SW_ANTDIV_SUPPORT
+ifeq ($(HAS_TXRX_SW_ANTDIV_SUPPORT),y)
+WFLAGS += -DTXRX_SW_ANTDIV_SUPPORT
+endif
+#endif // TXRX_SW_ANTDIV_SUPPORT //
+
+#ifdef RELEASE_EXCLUDE
+#ifdef HW_COEXISTENCE_SUPPORT
+ifeq ($(HAS_HW_COEXISTENCE_SUPPORT),y)
+WFLAGS += -DHW_COEXISTENCE_SUPPORT
+endif
+#endif // HW_COEXISTENCE_SUPPORT //
+
+#ifdef BT_COEXISTENCE_SUPPORT
+ifeq ($(HAS_BT_COEXISTENCE_SUPPORT),y)
+WFLAGS += -DHW_COEXISTENCE_SUPPORT -DBT_COEXISTENCE_SUPPORT
+endif
+#endif // BT_COEXISTENCE_SUPPORT //
+#endif //RELEASE_EXCLUDE //
+
+ifeq ($(HAS_WIDI_SUPPORT),y)
+WFLAGS += -DWIDI_SUPPORT
+
+ifeq ($(HAS_P2P_SUPPORT),y)
+ifeq ($(HAS_INTEL_WFD_SUPPORT),y)
+WFLAGS += -DINTEL_WFD_SUPPORT
+endif
+
+ifeq ($(HAS_WFA_WFD_SUPPORT),y)
+WFLAGS += -DWFA_WFD_SUPPORT
+endif
+endif
+
+endif
+
+#ifdef WOW_SUPPORT
+ifeq ($(HAS_WOW_SUPPORT),y)
+WFLAGS += -DWOW_SUPPORT
+endif
+#endif // WOW_SUPPORT //
+
+#ifdef WOW_IFDOWN_SUPPORT
+ifeq ($(HAS_WOW_IFDOWN_SUPPORT),y)
+WFLAGS += -DWOW_IFDOWN_SUPPORT
+endif
+#endif // WOW_IFDOWN_SUPPORT //
+
+endif
+# endif of ifeq ($(RT28xx_MODE),STA)
+#endif // CONFIG_STA_SUPPORT //
+
+#################################################
+
+#ifdef CONFIG_APSTA_SUPPORT
+# config for APSTA
+
+ifeq ($(RT28xx_MODE),APSTA)
+WFLAGS += -DCONFIG_AP_SUPPORT -DCONFIG_STA_SUPPORT -DCONFIG_APSTA_MIXED_SUPPORT -DUAPSD_SUPPORT -DMBSS_SUPPORT -DIAPP_SUPPORT -DDOT1X_SUPPORT -DAP_SCAN_SUPPORT -DSCAN_SUPPORT -DDBG
+
+#ifdef NINTENDO_AP
+ifeq ($(HAS_NINTENDO),y)
+WFLAGS += -DNINTENDO_AP
+endif
+#endif // NINTENDO_AP //
+
+#ifdef WSC_INCLUDED
+ifeq ($(HAS_WSC),y)
+WFLAGS += -DWSC_AP_SUPPORT -DWSC_STA_SUPPORT
+endif
+#endif // WSC_INCLUDED //
+
+#ifdef WDS_SUPPORT
+ifeq ($(HAS_WDS),y)
+WFLAGS += -DWDS_SUPPORT
+endif
+#endif // WDS_SUPPORT //
+
+#ifdef APCLI_SUPPORT
+ifeq ($(HAS_APCLI),y)
+WFLAGS += -DAPCLI_SUPPORT -DMAT_SUPPORT
+endif
+#endif // APCLI_SUPPORT //
+
+ifeq ($(HAS_IGMP_SNOOP_SUPPORT),y)
+WFLAGS += -DIGMP_SNOOP_SUPPORT
+endif
+
+ifeq ($(HAS_CS_SUPPORT),y)
+WFLAGS += -DCARRIER_DETECTION_SUPPORT
+endif
+
+ifeq ($(HAS_MCAST_RATE_SPECIFIC_SUPPORT), y)
+WFLAGS += -DMCAST_RATE_SPECIFIC
+endif
+
+ifeq ($(HAS_QOS_DLS_SUPPORT),y)
+WFLAGS += -DQOS_DLS_SUPPORT
+endif
+
+#ifdef WPA_SUPPLICANT_SUPPORT
+ifeq ($(HAS_WPA_SUPPLICANT),y)
+WFLAGS += -DWPA_SUPPLICANT_SUPPORT
+#ifdef NATIVE_WPA_SUPPLICANT_SUPPORT
+ifeq ($(HAS_NATIVE_WPA_SUPPLICANT_SUPPORT),y)
+WFLAGS += -DNATIVE_WPA_SUPPLICANT_SUPPORT
+endif
+#endif // NATIVE_WPA_SUPPLICANT_SUPPORT //
+endif
+#endif // WPA_SUPPLICANT_SUPPORT //
+
+#ifdef ETH_CONVERT_SUPPORT
+ifeq ($(HAS_ETH_CONVERT_SUPPORT), y)
+WFLAGS += -DETH_CONVERT_SUPPORT -DMAT_SUPPORT
+endif
+#endif // ETH_CONVERT_SUPPORT //
+
+#ifdef DOT11_N_SUPPORT
+ifeq ($(HAS_DOT11_N_SUPPORT),y)
+WFLAGS += -DDOT11_N_SUPPORT
+endif
+
+#ifdef TXBF_SUPPORT
+ifeq ($(HAS_TXBF_SUPPORT),y)
+WFLAGS += -DTXBF_SUPPORT
+endif
+#endif // TXBF_SUPPORT //
+
+#ifdef NEW_RATE_ADAPT_SUPPORT
+ifeq ($(HAS_NEW_RATE_ADAPT_SUPPORT),y)
+WFLAGS += -DNEW_RATE_ADAPT_SUPPORT
+endif
+#endif // NEW_RATE_ADAPT_SUPPORT //
+
+#endif // DOT11_N_SUPPORT //
+
+ifeq ($(HAS_CS_SUPPORT),y)
+WFLAGS += -DCARRIER_DETECTION_SUPPORT
+endif
+
+ifeq ($(HAS_STATS_COUNT),y)
+WFLAGS += -DSTATS_COUNT_SUPPORT
+endif
+
+ifeq ($(HAS_TSSI_ANTENNA_VARIATION),y)
+WFLAGS += -DTSSI_ANTENNA_VARIATION
+endif
+
+ifeq ($(HAS_CFG80211_SUPPORT),y)
+WFLAGS += -DRT_CFG80211_SUPPORT
+ifeq ($(HAS_RFKILL_HW_SUPPORT),y)
+WFLAGS += -DRFKILL_HW_SUPPORT
+endif
+endif
+
+ifeq ($(OSABL),YES)
+WFLAGS += -DOS_ABL_SUPPORT
+ifeq ($(HAS_OSABL_FUNC_SUPPORT),y)
+WFLAGS += -DOS_ABL_FUNC_SUPPORT
+endif
+ifeq ($(HAS_OSABL_OS_PCI_SUPPORT),y)
+WFLAGS += -DOS_ABL_OS_PCI_SUPPORT
+endif
+ifeq ($(HAS_OSABL_OS_USB_SUPPORT),y)
+WFLAGS += -DOS_ABL_OS_USB_SUPPORT
+endif
+ifeq ($(HAS_OSABL_OS_RBUS_SUPPORT),y)
+WFLAGS += -DOS_ABL_OS_RBUS_SUPPORT
+endif
+ifeq ($(HAS_OSABL_OS_AP_SUPPORT),y)
+WFLAGS += -DOS_ABL_OS_AP_SUPPORT
+endif
+ifeq ($(HAS_OSABL_OS_STA_SUPPORT),y)
+WFLAGS += -DOS_ABL_OS_STA_SUPPORT
+endif
+endif
+
+ifeq ($(HAS_P2P_SUPPORT),y)
+WFLAGS += -DP2P_SUPPORT
+WFLAGS += -DAPCLI_SUPPORT -DMAT_SUPPORT -DAP_SCAN_SUPPORT -DSCAN_SUPPORT -DP2P_APCLI_SUPPORT
+endif
+
+endif
+# endif of ifeq ($(RT28xx_MODE),APSTA)
+#endif // CONFIG_APSTA_SUPPORT //
+#################################################
+
+#
+# Common compiler flag
+#
+
+#ifdef RELEASE_EXCLUDE
+#Remove internal debug code when offical release
+WFLAGS += -DRELEASE_EXCLUDE
+#endif // RELEASE_EXCLUDE //
+
+#ifdef MESH_SUPPORT
+ifeq ($(HAS_MESH_SUPPORT),y)
+WFLAGS += -DMESH_SUPPORT -DINTEL_CMPC -DAP_SCAN_SUPPORT -DSCAN_SUPPORT
+endif
+#endif // MESH_SUPPORT //
+
+#ifdef DOT11R_FT_SUPPORT
+ifeq ($(HAS_DOT11R_FT_SUPPORT),y)
+WFLAGS += -DDOT11R_FT_SUPPORT
+endif
+#endif // DOT11R_FT_SUPPORT //
+
+#ifdef DOT11K_RRM_SUPPORT
+ifeq ($(HAS_DOT11K_RRM_SUPPORT),y)
+WFLAGS += -DDOT11K_RRM_SUPPORT -DAP_SCAN_SUPPORT -DSCAN_SUPPORT
+endif
+#endif // DOT11K_RRM_SUPPORT //
+
+#ifdef DOT11V_WNM_SUPPORT
+ifeq ($(HAS_DOT11V_WNM_SUPPORT),y)
+WFLAGS += -DDOT11V_WNM_SUPPORT
+endif
+#endif // DOT11V_WNM_SUPPORT //
+
+ifeq ($(HAS_EXT_BUILD_CHANNEL_LIST),y)
+WFLAGS += -DEXT_BUILD_CHANNEL_LIST
+endif
+
+ifeq ($(HAS_IDS_SUPPORT),y)
+WFLAGS += -DIDS_SUPPORT
+endif
+
+#ifdef WAPI_SUPPORT
+ifeq ($(HAS_WAPI_SUPPORT),y)
+WFLAGS += -DWAPI_SUPPORT -DSOFT_ENCRYPT -DEXPORT_SYMTAB
+endif
+#endif // WAPI_SUPPORT //
+
+ifeq ($(OSABL),YES)
+WFLAGS += -DEXPORT_SYMTAB
+endif
+
+ifeq ($(HAS_CLIENT_WDS_SUPPORT),y)
+WFLAGS += -DCLIENT_WDS
+endif
+
+ifeq ($(HAS_BGFP_SUPPORT),y)
+WFLAGS += -DBG_FT_SUPPORT
+endif
+
+ifeq ($(HAS_BGFP_OPEN_SUPPORT),y)
+WFLAGS += -DBG_FT_OPEN_SUPPORT
+endif
+
+#ifdef DOT11W_PMF_SUPPORT
+ifeq ($(HAS_DOT11W_PMF_SUPPORT),y)
+WFLAGS += -DDOT11W_PMF_SUPPORT -DSOFT_ENCRYPT
+endif
+#endif // DOT11W_PMF_SUPPORT //
+
+#ifdef LED_CONTROL_SUPPORT
+ifeq ($(HAS_LED_CONTROL_SUPPORT),y)
+WFLAGS += -DLED_CONTROL_SUPPORT
+endif
+#endif // LED_CONTROL_SUPPORT //
+
+#################################################
+# ChipSet specific definitions.
+#
+ifneq ($(findstring 2860,$(CHIPSET)),)
+WFLAGS +=-DRTMP_MAC_PCI -DRTMP_PCI_SUPPORT -DRT2860 -DRT28xx -DA_BAND_SUPPORT
+CHIPSET_DAT = 2860
+endif
+
+ifneq ($(findstring 3090,$(CHIPSET)),)
+WFLAGS +=-DRTMP_MAC_PCI -DRT30xx -DRT3090 -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DVCORECAL_SUPPORT
+CHIPSET_DAT = 2860
+endif
+
+ifneq ($(findstring 2870,$(CHIPSET)),)
+WFLAGS +=-DRTMP_MAC_USB -DRTMP_USB_SUPPORT -DRT2870 -DRT28xx -DRTMP_TIMER_TASK_SUPPORT -DA_BAND_SUPPORT
+CHIPSET_DAT = 2870
+endif
+
+ifneq ($(findstring 2070,$(CHIPSET)),)
+WFLAGS +=-DRTMP_MAC_USB -DRT30xx -DRT3070 -DRT2070 -DRTMP_USB_SUPPORT -DRTMP_TIMER_TASK_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT
+CHIPSET_DAT = 2870
+endif
+
+ifneq ($(findstring 3070,$(CHIPSET)),)
+WFLAGS +=-DRTMP_MAC_USB -DRT30xx -DRT3070 -DRTMP_USB_SUPPORT -DRTMP_TIMER_TASK_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DVCORECAL_SUPPORT
+CHIPSET_DAT = 2870
+
+ifneq ($(findstring $(RT28xx_MODE),AP),)
+ifeq ($(HAS_CS_SUPPORT), y)
+WFLAGS += -DCARRIER_DETECTION_FIRMWARE_SUPPORT
+endif
+endif
+
+endif
+
+ifneq ($(findstring 2880,$(CHIPSET)),)
+WFLAGS += -DRT2880 -DRT28xx -DRTMP_MAC_PCI -DCONFIG_RALINK_RT2880_MP -DRTMP_RBUS_SUPPORT -DMERGE_ARCH_TEAM -DA_BAND_SUPPORT -DCONFIG_SWMCU_SUPPORT
+ifeq ($(HAS_WIFI_LED_SHARE), y)
+WFLAGS += -DCONFIG_WIFI_LED_SHARE
+endif
+endif
+
+ifneq ($(findstring 3572,$(CHIPSET)),)
+WFLAGS +=-DRTMP_MAC_USB -DRTMP_USB_SUPPORT -DRT2870 -DRT28xx -DRT30xx -DRT35xx -DRT3572 -DRTMP_TIMER_TASK_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DA_BAND_SUPPORT -DVCORECAL_SUPPORT
+CHIPSET_DAT = 2870
+
+ifneq ($(findstring $(RT28xx_MODE),AP),)
+ifeq ($(HAS_CS_SUPPORT), y)
+WFLAGS += -DCARRIER_DETECTION_FIRMWARE_SUPPORT
+endif
+endif
+
+endif
+
+ifneq ($(findstring 3573,$(CHIPSET)),)
+WFLAGS += -DRTMP_MAC_USB -DRTMP_USB_SUPPORT -DRT30xx -DRT35xx -DRT3593 -DRT3573\
+ -DRTMP_TIMER_TASK_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT\
+ -DA_BAND_SUPPORT -DDOT11N_SS3_SUPPORT \
+ -DVCORECAL_SUPPORT -DNEW_MBSSID_MODE
+#WFLAGS += -DNEW_RATE_ADAPT_SUPPORT
+CHIPSET_DAT = 2870
+
+ifneq ($(findstring $(RT28xx_MODE),STA APSTA),)
+WFLAGS += -DRTMP_FREQ_CALIBRATION_SUPPORT
+endif
+
+ifneq ($(findstring $(RT28xx_MODE),AP),)
+WFLAGS += -DSPECIFIC_BCN_BUF_SUPPORT
+endif
+
+ifneq ($(findstring $(RT28xx_MODE),AP),)
+ifeq ($(HAS_CS_SUPPORT), y)
+WFLAGS += -DCARRIER_DETECTION_FIRMWARE_SUPPORT
+endif
+endif
+
+endif
+
+ifneq ($(findstring 3062,$(CHIPSET)),)
+WFLAGS +=-DRTMP_MAC_PCI -DRT2860 -DRT28xx -DRT30xx -DRT35xx -DRT3062 -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DVCORECAL_SUPPORT
+CHIPSET_DAT = 2860
+endif
+
+ifneq ($(findstring 3562,$(CHIPSET)),)
+WFLAGS +=-DRTMP_MAC_PCI -DRT2860 -DRT28xx -DRT30xx -DRT35xx -DRT3562 -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DA_BAND_SUPPORT -DVCORECAL_SUPPORT
+
+CHIPSET_DAT = 2860
+endif
+
+ifneq ($(findstring 3593,$(CHIPSET)),)
+WFLAGS +=-DRTMP_MAC_PCI -DDOT11N_SS3_SUPPORT -DRT3593 -DRT28xx -DRT30xx -DRT35xx -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DA_BAND_SUPPORT -DNEW_MBSSID_MODE -DVCORECAL_SUPPORT
+
+#WFLAGS += -DNEW_RATE_ADAPT_SUPPORT
+CHIPSET_DAT = 2860
+
+ifneq ($(findstring $(RT28xx_MODE),STA APSTA),)
+WFLAGS += -DRTMP_FREQ_CALIBRATION_SUPPORT
+endif
+
+ifneq ($(findstring $(RT28xx_MODE),AP),)
+WFLAGS += -DSPECIFIC_BCN_BUF_SUPPORT
+endif
+endif
+
+ifneq ($(findstring 3390,$(CHIPSET)),)
+WFLAGS +=-DRTMP_MAC_PCI -DRT30xx -DRT33xx -DRT3090 -DRT3390 -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DRTMP_INTERNAL_TX_ALC -DVCORECAL_SUPPORT
+CHIPSET_DAT = 2860
+endif
+
+ifneq ($(findstring 8592,$(CHIPSET)),)
+WFLAGS += -DRT8592 -DRT65xx -DRLT_MAC -DRTMP_MAC_PCI -DRTMP_PCI_SUPPORT -DA_BAND_SUPPORT -DRX_DMA_SCATTER
+WFLAGS += -DRTMP_EFUSE_SUPPORT -DRTMP_RF_RW_SUPPORT
+WFLAGS += -DDOT11_VHT_SUPPORT
+ifneq ($(findstring $(RT28xx_MODE),AP),)
+#WFLAGS += -DSPECIFIC_BCN_BUF_SUPPORT
+endif
+CHIPSET_DAT = 2860
+endif
+
+ifneq ($(findstring 6590,$(CHIPSET)),)
+WFLAGS += -DRT6590 -DRT65xx -DRLT_MAC -DRTMP_MAC_PCI -DRTMP_PCI_SUPPORT -DA_BAND_SUPPORT -DRX_DMA_SCATTER
+ifneq ($(findstring $(RT28xx_MODE),AP),)
+#WFLAGS += -DSPECIFIC_BCN_BUF_SUPPORT
+endif
+CHIPSET_DAT = 2860
+endif
+
+
+ifneq ($(findstring 6570,$(CHIPSET)),)
+WFLAGS += -DRT6570 -DRT65xx -DRLT_MAC -DRTMP_MAC_USB -DRTMP_USB_SUPPORT -DRTMP_TIMER_TASK_SUPPORT -DA_BAND_SUPPORT -DRX_DMA_SCATTER
+ifneq ($(findstring $(RT28xx_MODE),AP),)
+#WFLAGS += -DSPECIFIC_BCN_BUF_SUPPORT
+endif
+
+ifeq ($(HAS_CSO_SUPPORT), y)
+WFLAGS += -DCONFIG_CSO_SUPPORT
+endif
+ifeq ($(HAS_TSO_SUPPORT), y)
+WFLAGS += -DCONFIG_CSO_SUPPORT -DCONFIG_TSO_SUPPORT -DTX_PKT_SG
+endif
+
+CHIPSET_DAT = 2870
+endif
+
+ifneq ($(findstring 3370,$(CHIPSET)),)
+WFLAGS +=-DRTMP_MAC_USB -DRT30xx -DRT33xx -DRT3070 -DRT3370 -DRTMP_USB_SUPPORT -DRTMP_TIMER_TASK_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DRTMP_INTERNAL_TX_ALC -DVCORECAL_SUPPORT
+CHIPSET_DAT = 2870
+
+ifneq ($(findstring $(RT28xx_MODE),AP),)
+ifeq ($(HAS_CS_SUPPORT), y)
+WFLAGS += -DCARRIER_DETECTION_FIRMWARE_SUPPORT
+endif
+endif
+
+endif
+
+ifneq ($(findstring 5390,$(CHIPSET)),)
+WFLAGS +=-DRTMP_MAC_PCI -DRT30xx -DRT33xx -DRT3090 -DRT3390 -DRT5390 -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DRTMP_FREQ_CALIBRATION_SUPPORT -DRTMP_INTERNAL_TX_ALC -DVCORECAL_SUPPORT -DIQ_CAL_SUPPORT -DNEW_MBSSID_MODE -DRTMP_TEMPERATURE_COMPENSATION
+CHIPSET_DAT = 2860
+
+ifneq ($(findstring $(RT28xx_MODE),AP),)
+WFLAGS += -DSPECIFIC_BCN_BUF_SUPPORT
+endif
+endif
+
+ifneq ($(findstring 5370,$(CHIPSET)),)
+WFLAGS +=-DRTMP_MAC_USB -DRT30xx -DRT33xx -DRT3070 -DRT3370 -DRT5370 -DRTMP_USB_SUPPORT -DRTMP_TIMER_TASK_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DRTMP_INTERNAL_TX_ALC -DRTMP_FREQ_CALIBRATION_SUPPORT -DVCORECAL_SUPPORT -DIQ_CAL_SUPPORT -DNEW_MBSSID_MODE -DRTMP_TEMPERATURE_COMPENSATION
+CHIPSET_DAT = 2870
+
+ifneq ($(findstring $(RT28xx_MODE),AP),)
+ifeq ($(HAS_CS_SUPPORT), y)
+WFLAGS += -DCARRIER_DETECTION_FIRMWARE_SUPPORT
+endif
+endif
+
+ifneq ($(findstring $(RT28xx_MODE),AP),)
+WFLAGS += -DSPECIFIC_BCN_BUF_SUPPORT
+endif
+endif
+
+ifneq ($(findstring 3052,$(CHIPSET)),)
+WFLAGS += -DRTMP_MAC_PCI -DRTMP_RBUS_SUPPORT -DRT3052 -DRT305x -DRTMP_RF_RW_SUPPORT -DCONFIG_SWMCU_SUPPORT -DVCORECAL_SUPPORT
+CHIPSET_DAT = 2870
+ifeq ($(HAS_WIFI_LED_SHARE), y)
+WFLAGS += -DCONFIG_WIFI_LED_SHARE
+endif
+endif
+
+ifneq ($(findstring 3352,$(CHIPSET)),)
+WFLAGS += -DRTMP_MAC_PCI -DRTMP_RBUS_SUPPORT -DRT3352 -DRT305x -DRTMP_RF_RW_SUPPORT -DVCORECAL_SUPPORT -DCONFIG_SWMCU_SUPPORT -DRTMP_INTERNAL_TX_ALC -DNEW_MBSSID_MODE
+CHIPSET_DAT = 2860
+ifeq ($(HAS_WIFI_LED_SHARE), y)
+WFLAGS += -DCONFIG_WIFI_LED_SHARE
+endif
+ifneq ($(findstring $(RT28xx_MODE),AP),)
+WFLAGS += -DSPECIFIC_BCN_BUF_SUPPORT
+endif
+endif
+
+ifneq ($(findstring 5350,$(CHIPSET)),)
+WFLAGS += -DRTMP_MAC_PCI -DRTMP_RBUS_SUPPORT -DRT5350 -DRT305x -DRT3050 -DRT3350 -DRTMP_RF_RW_SUPPORT -DVCORECAL_SUPPORT -DCONFIG_SWMCU_SUPPORT -DRTMP_INTERNAL_TX_ALC -DRTMP_FREQ_CALIBRATION_SUPPORT -DIQ_CAL_SUPPORT -DNEW_MBSSID_MODE
+CHIPSET_DAT = 2860
+ifeq ($(HAS_WIFI_LED_SHARE), y)
+WFLAGS += -DCONFIG_WIFI_LED_SHARE
+endif
+ifneq ($(findstring $(RT28xx_MODE),AP),)
+WFLAGS += -DSPECIFIC_BCN_BUF_SUPPORT
+endif
+endif
+
+ifneq ($(findstring 5592,$(CHIPSET)),)
+WFLAGS += -DRTMP_MAC_PCI -DRTMP_PCI_SUPPORT -DRT30xx -DRT5592\
+ -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT\
+ -DA_BAND_SUPPORT -DIQ_CAL_SUPPORT -DRX_DMA_SCATTER -DVCORECAL_SUPPORT\
+ -DNEW_MBSSID_MODE -DRTMP_TEMPERATURE_COMPENSATION
+CHIPSET_DAT = 2860
+ifeq ($(HAS_CSO_SUPPORT), y)
+WFLAGS += -DCONFIG_CSO_SUPPORT
+endif
+
+ifneq ($(findstring $(RT28xx_MODE),STA APSTA),)
+WFLAGS += -DRTMP_FREQ_CALIBRATION_SUPPORT
+endif
+
+ifneq ($(findstring $(RT28xx_MODE),AP),)
+WFLAGS += -DSPECIFIC_BCN_BUF_SUPPORT
+endif
+
+endif
+
+ifneq ($(findstring 5572,$(CHIPSET)),)
+WFLAGS += -DRTMP_MAC_USB -DRTMP_USB_SUPPORT -DRT30xx -DRT5572 -DRT5592\
+ -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DNEW_MBSSID_MODE\
+ -DRTMP_TIMER_TASK_SUPPORT -DA_BAND_SUPPORT -DIQ_CAL_SUPPORT -DVCORECAL_SUPPORT\
+ -DRTMP_TEMPERATURE_COMPENSATION
+CHIPSET_DAT = 2870
+ifeq ($(HAS_CSO_SUPPORT), y)
+WFLAGS += -DCONFIG_CSO_SUPPORT
+endif
+
+ifneq ($(findstring $(RT28xx_MODE),AP),)
+ifeq ($(HAS_CS_SUPPORT), y)
+WFLAGS += -DCARRIER_DETECTION_FIRMWARE_SUPPORT
+endif
+endif
+
+ifneq ($(findstring $(RT28xx_MODE),STA APSTA),)
+WFLAGS += -DRTMP_FREQ_CALIBRATION_SUPPORT
+endif
+
+ifneq ($(findstring $(RT28xx_MODE),AP),)
+#WFLAGS += -DSPECIFIC_BCN_BUF_SUPPORT
+endif
+
+endif
+
+ifneq ($(findstring 3290,$(CHIPSET)),)
+WFLAGS += -DRTMP_MAC_PCI -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DRTMP_FREQ_CALIBRATION_SUPPORT -DRTMP_INTERNAL_TX_ALC -DRT30xx -DRT3290 -DVCORECAL_SUPPORT
+CHIPSET_DAT = 2860
+
+ifneq ($(findstring $(RT28xx_MODE),STA APSTA),)
+WFLAGS += -DRTMP_FREQ_CALIBRATION_SUPPORT -DPCIE_PS_SUPPORT
+endif
+
+ifneq ($(findstring $(RT28xx_MODE),AP),)
+WFLAGS += -DSPECIFIC_BCN_BUF_SUPPORT
+endif
+endif
+
+
+ifeq ($(CHIPSET),USB)
+#3572
+WFLAGS +=-DRTMP_MAC_USB -DRTMP_USB_SUPPORT -DRT2870 -DRT28xx -DRT30xx -DRT35xx -DRTMP_TIMER_TASK_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DA_BAND_SUPPORT -DSPECIFIC_VCORECAL_SUPPORT
+#3370
+WFLAGS += -DRT33xx -DRT3070 -DRT3370 -DRTMP_TIMER_TASK_SUPPORT -DRTMP_INTERNAL_TX_ALC
+CHIPSET_DAT = 2870
+endif
+
+
+ifeq ($(CHIPSET),PCI)
+#3562
+WFLAGS +=-DRTMP_MAC_PCI -DRT2860 -DRT28xx -DRT30xx -DRT35xx -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DA_BAND_SUPPORT -DSPECIFIC_VCORECAL_SUPPORT
+#3390
+WFLAGS +=-DRT33xx -DRT3090 -DRT3390 -DRTMP_INTERNAL_TX_ALC
+endif
+
+
+ifeq ($(CHIPSET),RBUS)
+WFLAGS += -DMERGE_ARCH_TEAM -DCONFIG_SWMCU_SUPPORT -DCONFIG_RA_NAT_NONE -DRTMP_RBUS_SUPPORT
+#5350, 3050, 3350, 3883
+WFLAGS +=-DRTMP_MAC_PCI -DRT305x -DRT5350 -DRT3050 -DRT3350 -DRT3883 -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DA_BAND_SUPPORT -DVCORECAL_SUPPORT
+
+ifneq ($(findstring $(RT28xx_MODE),AP),)
+WFLAGS += -DSPECIFIC_BCN_BUF_SUPPORT
+endif
+#WFLAGS += -DDBG_CTRL_SUPPORT
+#WFLAGS += -DINCLUDE_DEBUG_QUEUE
+#WFLAGS += -DRANGE_EXTEND -DCFO_TRACK -DPRE_ANT_SWITCH
+endif
+
+
+#################################################
+
+
+ifeq ($(PLATFORM),5VT)
+#WFLAGS += -DCONFIG_5VT_ENHANCE
+endif
+
+ifeq ($(HAS_BLOCK_NET_IF),y)
+WFLAGS += -DBLOCK_NET_IF
+endif
+
+ifeq ($(HAS_DFS_SUPPORT),y)
+WFLAGS += -DDFS_SUPPORT
+endif
+
+#ifdef MULTI_CARD
+ifeq ($(HAS_MC_SUPPORT),y)
+WFLAGS += -DMULTIPLE_CARD_SUPPORT
+endif
+#endif // MULTI_CARD //
+
+ifeq ($(HAS_LLTD),y)
+WFLAGS += -DLLTD_SUPPORT
+endif
+
+ifeq ($(PLATFORM),RMI)
+WFLAGS += -DRT_BIG_ENDIAN
+endif
+
+ifeq ($(PLATFORM),UBICOM_IPX8)
+WFLAGS += -DRT_BIG_ENDIAN -DUNALIGNMENT_SUPPORT -DPLATFORM_UBM_IPX8 -DNO_CONSISTENT_MEM_SUPPORT -DCACHE_LINE_32B
+endif
+
+ifeq ($(PLATFORM),BL2348)
+WFLAGS += -DRT_BIG_ENDIAN
+endif
+
+ifeq ($(PLATFORM),BL23570)
+WFLAGS += -DRT_BIG_ENDIAN
+endif
+
+ifeq ($(PLATFORM),BLUBB)
+WFLAGS += -DRT_BIG_ENDIAN
+endif
+
+ifeq ($(PLATFORM),BLPMP)
+WFLAGS += -DRT_BIG_ENDIAN
+endif
+
+ifeq ($(PLATFORM),RMI_64)
+WFLAGS += -DRT_BIG_ENDIAN
+endif
+ifeq ($(PLATFORM),IXP)
+WFLAGS += -DRT_BIG_ENDIAN
+endif
+
+ifeq ($(PLATFORM),IKANOS_V160)
+WFLAGS += -DRT_BIG_ENDIAN -DIKANOS_VX_1X0
+endif
+
+ifeq ($(PLATFORM),IKANOS_V180)
+WFLAGS += -DRT_BIG_ENDIAN -DIKANOS_VX_1X0
+endif
+
+ifeq ($(PLATFORM),INF_TWINPASS)
+WFLAGS += -DRT_BIG_ENDIAN -DINF_TWINPASS
+endif
+
+ifeq ($(PLATFORM),INF_DANUBE)
+ifneq (,$(findstring 2.4,$(LINUX_SRC)))
+# Linux 2.4
+WFLAGS += -DINF_DANUBE -DRT_BIG_ENDIAN
+else
+# Linux 2.6
+WFLAGS += -DRT_BIG_ENDIAN
+endif
+endif
+
+ifeq ($(PLATFORM),INF_AR9)
+WFLAGS += -DRT_BIG_ENDIAN -DINF_AR9
+# support MAPI function for AR9.
+#WFLAGS += -DAR9_MAPI_SUPPORT
+endif
+
+ifeq ($(PLATFORM),INF_VR9)
+WFLAGS += -DRT_BIG_ENDIAN -DINF_AR9 -DINF_VR9
+endif
+
+ifeq ($(PLATFORM),CAVM_OCTEON)
+WFLAGS += -DRT_BIG_ENDIAN
+endif
+
+ifeq ($(PLATFORM),BRCM_6358)
+WFLAGS += -DRT_BIG_ENDIAN -DBRCM_6358
+endif
+
+ifeq ($(PLATFORM),INF_AMAZON_SE)
+WFLAGS += -DRT_BIG_ENDIAN -DINF_AMAZON_SE
+endif
+
+ifeq ($(PLATFORM),RALINK_3052)
+WFLAGS += -DPLATFORM_RALINK_3052
+endif
+
+ifeq ($(PLATFORM),FREESCALE8377)
+#EXTRA_CFLAGS := -v -I$(RT28xx_DIR)/include -I$(LINUX_SRC)/include $(WFLAGS)-O2 -Wall -Wstrict-prototypes -Wno-trigraphs
+#export EXTRA_CFLAGS
+WFLAGS += -DRT_BIG_ENDIAN
+EXTRA_CFLAGS := $(WFLAGS) -I$(RT28xx_DIR)/include
+endif
+
+ifeq ($(PLATFORM),ST)
+#WFLAGS += -DST
+WFLAGS += -DST
+endif
+
+#kernel build options for 2.4
+# move to Makefile outside LINUX_SRC := /opt/star/kernel/linux-2.4.27-star
+
+ifeq ($(PLATFORM),RALINK_3052)
+CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include/asm-mips/mach-generic -I$(LINUX_SRC)/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe -finline-limit=100000 -march=mips2 -mabi=32 -Wa,--trap -DLINUX -nostdinc -iwithprefix include $(WFLAGS)
+export CFLAGS
+endif
+
+ifeq ($(PLATFORM), RALINK_2880)
+CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe -finline-limit=100000 -march=mips2 -mabi=32 -Wa,--trap -DLINUX -nostdinc -iwithprefix include $(WFLAGS)
+export CFLAGS
+endif
+
+ifeq ($(PLATFORM),STAR)
+CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -Uarm -fno-common -pipe -mapcs-32 -D__LINUX_ARM_ARCH__=4 -march=armv4 -mshort-load-bytes -msoft-float -Uarm -DMODULE -DMODVERSIONS -include $(LINUX_SRC)/include/linux/modversions.h $(WFLAGS)
+
+export CFLAGS
+endif
+
+ifeq ($(PLATFORM),UBICOM_IPX8)
+EXTRA_CFLAGS += $(WFLAGS)
+export EXTRA_CFLAGS
+endif
+
+ifeq ($(PLATFORM),SIGMA)
+CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -I$(LINUX_SRC)/include/asm/gcc -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -DEM86XX_CHIP=EM86XX_CHIPID_TANGO2 -DEM86XX_REVISION=6 -I$(LINUX_SRC)/include/asm-mips/mach-generic -I$(RT2860_DIR)/include -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -ffreestanding -O2 -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe -mabi=32 -march=mips32r2 -Wa,-32 -Wa,-march=mips32r2 -Wa,-mips32r2 -Wa,--trap -DMODULE $(WFLAGS) -DSIGMA863X_PLATFORM
+
+export CFLAGS
+endif
+
+ifeq ($(PLATFORM),SIGMA_8622)
+CFLAGS := -D__KERNEL__ -I$(CROSS_COMPILE_INCLUDE)/include -I$(LINUX_SRC)/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -fno-common -pipe -fno-builtin -D__linux__ -DNO_MM -mapcs-32 -march=armv4 -mtune=arm7tdmi -msoft-float -DMODULE -mshort-load-bytes -nostdinc -iwithprefix -DMODULE $(WFLAGS)
+export CFLAGS
+endif
+
+ifeq ($(PLATFORM),5VT)
+CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -mlittle-endian -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -O3 -fno-omit-frame-pointer -fno-optimize-sibling-calls -fno-omit-frame-pointer -mapcs -mno-sched-prolog -mabi=apcs-gnu -mno-thumb-interwork -D__LINUX_ARM_ARCH__=5 -march=armv5te -mtune=arm926ej-s --param max-inline-insns-single=40000 -Uarm -Wdeclaration-after-statement -Wno-pointer-sign -DMODULE $(WFLAGS)
+
+export CFLAGS
+endif
+
+ifeq ($(PLATFORM),IKANOS_V160)
+CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -I$(LINUX_SRC)/include/asm/gcc -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -I$(LINUX_SRC)/include/asm-mips/mach-generic -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -ffreestanding -O2 -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe -march=lx4189 -Wa, -DMODULE $(WFLAGS)
+export CFLAGS
+endif
+
+ifeq ($(PLATFORM),IKANOS_V180)
+CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -I$(LINUX_SRC)/include/asm/gcc -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -I$(LINUX_SRC)/include/asm-mips/mach-generic -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -ffreestanding -O2 -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe -mips32r2 -Wa, -DMODULE $(WFLAGS)
+export CFLAGS
+endif
+
+ifeq ($(PLATFORM),INF_TWINPASS)
+CFLAGS := -D__KERNEL__ -DMODULE -I$(LINUX_SRC)/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fomit-frame-pointer -fno-strict-aliasing -fno-common -G 0 -mno-abicalls -fno-pic -march=4kc -mips32 -Wa,--trap -pipe -mlong-calls $(WFLAGS)
+export CFLAGS
+endif
+
+ifeq ($(PLATFORM),INF_DANUBE)
+ ifneq (,$(findstring 2.4,$(LINUX_SRC)))
+ CFLAGS := $(WFLAGS) -Wundef -fno-strict-aliasing -fno-common -ffreestanding -Os -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe -msoft-float -mabi=32 -march=mips32 -Wa,-32 -Wa,-march=mips32 -Wa,-mips32 -Wa,--trap -I$(LINUX_SRC)/include/asm-mips/mach-generic
+ else
+ CFLAGS := $(WFLAGS) -Wundef -fno-strict-aliasing -fno-common -ffreestanding -Os -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe -msoft-float -mabi=32 -march=mips32r2 -Wa,-32 -Wa,-march=mips32r2 -Wa,-mips32r2 -Wa,--trap -I$(LINUX_SRC)/include/asm-mips/mach-generic
+ endif
+export CFLAGS
+endif
+
+ifeq ($(PLATFORM),INF_AR9)
+CFLAGS := $(WFLAGS) -Wundef -fno-strict-aliasing -fno-common -fno-pic -ffreestanding -Os -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe -msoft-float -mabi=32 -mlong-calls -march=mips32r2 -mtune=34kc -march=mips32r2 -Wa,-32 -Wa,-march=mips32r2 -Wa,-mips32r2 -Wa,--trap -I$(LINUX_SRC)/include/asm-mips/mach-generic
+export CFLAGS
+endif
+
+ifeq ($(PLATFORM),INF_VR9)
+CFLAGS := $(WFLAGS) -Wundef -fno-strict-aliasing -fno-common -fno-pic -ffreestanding -Os -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe -msoft-float -mabi=32 -mlong-calls -march=mips32r2 -march=mips32r2 -Wa,-32 -Wa,-march=mips32r2 -Wa,-mips32r2 -Wa,--trap -I$(LINUX_SRC)/include/asm-mips/mach-generic
+export CFLAGS
+endif
+
+ifeq ($(PLATFORM),BRCM_6358)
+CFLAGS := $(WFLAGS) -nostdinc -iwithprefix include -D__KERNEL__ -Wall -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -I $(LINUX_SRC)/include/asm/gcc -G 0 -mno-abicalls -fno-pic -pipe -finline-limit=100000 -mabi=32 -march=mips32 -Wa,-32 -Wa,-march=mips32 -Wa,-mips32 -Wa,--trap -I$(LINUX_SRC)/include/asm-mips/mach-bcm963xx -I$(LINUX_SRC)/include/asm-mips/mach-generic -Os -fomit-frame-pointer -Wdeclaration-after-statement -DMODULE -mlong-calls
+export CFLAGS
+endif
+
+ifeq ($(PLATFORM),INF_AMAZON_SE)
+CFLAGS := -D__KERNEL__ -DMODULE=1 -I$(LINUX_SRC)/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -DCONFIG_IFX_ALG_QOS -DCONFIG_WAN_VLAN_SUPPORT -fomit-frame-pointer -DIFX_PPPOE_FRAME -G 0 -fno-pic -mno-abicalls -mlong-calls -pipe -finline-limit=100000 -mabi=32 -march=mips32 -Wa,-32 -Wa,-march=mips32 -Wa,-mips32 -Wa,--trap -nostdinc -iwithprefix include $(WFLAGS)
+export CFLAGS
+endif
+
+ifeq ($(PLATFORM),ST)
+CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -Wall -O2 -Wundef -Wstrict-prototypes -Wno-trigraphs -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-aliasing -fno-common -fomit-frame-pointer -ffreestanding -m4-nofpu -o $(WFLAGS)
+export CFLAGS
+endif
+
+ifeq ($(PLATFORM),PC)
+ ifneq (,$(findstring 2.4,$(LINUX_SRC)))
+ # Linux 2.4
+ CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -O2 -fomit-frame-pointer -fno-strict-aliasing -fno-common -pipe -mpreferred-stack-boundary=2 -march=i686 -DMODULE -DMODVERSIONS -include $(LINUX_SRC)/include/linux/modversions.h $(WFLAGS)
+ export CFLAGS
+ else
+ # Linux 2.6
+ EXTRA_CFLAGS := $(WFLAGS)
+ endif
+endif
+
+ifeq ($(PLATFORM),INTELP6)
+ EXTRA_CFLAGS := $(WFLAGS)
+endif
+
+#If the kernel version of RMI is newer than 2.6.27, please change "CFLAGS" to "EXTRA_FLAGS"
+ifeq ($(PLATFORM),RMI)
+EXTRA_CFLAGS := -D__KERNEL__ -DMODULE=1 -I$(LINUX_SRC)/include -I$(LINUX_SRC)/include/asm-mips/mach-generic -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -DCONFIG_IFX_ALG_QOS -DCONFIG_WAN_VLAN_SUPPORT -fomit-frame-pointer -DIFX_PPPOE_FRAME -G 0 -fno-pic -mno-abicalls -mlong-calls -pipe -finline-limit=100000 -mabi=32 -G 0 -mno-abicalls -fno-pic -pipe -msoft-float -march=xlr -ffreestanding -march=xlr -Wa,--trap, -nostdinc -iwithprefix include $(WFLAGS)
+export EXTRA_CFLAGS
+endif
+
+ifeq ($(PLATFORM),RMI_64)
+EXTRA_CFLAGS := -D__KERNEL__ -DMODULE=1 -I$(LINUX_SRC)/include -I$(LINUX_SRC)/include/asm-mips/mach-generic -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -DCONFIG_IFX_ALG_QOS -DCONFIG_WAN_VLAN_SUPPORT -fomit-frame-pointer -DIFX_PPPOE_FRAME -G 0 -fno-pic -mno-abicalls -mlong-calls -pipe -finline-limit=100000 -mabi=64 -G 0 -mno-abicalls -fno-pic -pipe -msoft-float -march=xlr -ffreestanding -march=xlr -Wa,--trap, -nostdinc -iwithprefix include $(WFLAGS)
+export EXTRA_CFLAGS
+endif
+
+ifeq ($(PLATFORM),IXP)
+ CFLAGS := -v -D__KERNEL__ -DMODULE -I$(LINUX_SRC)/include -mbig-endian -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -Uarm -fno-common -pipe -mapcs-32 -D__LINUX_ARM_ARCH__=5 -mcpu=xscale -mtune=xscale -malignment-traps -msoft-float $(WFLAGS)
+ EXTRA_CFLAGS := -v $(WFLAGS) -mbig-endian
+ export CFLAGS
+endif
+
+ifeq ($(PLATFORM),SMDK)
+ EXTRA_CFLAGS := $(WFLAGS)
+endif
+
+ifeq ($(PLATFORM),CAVM_OCTEON)
+ EXTRA_CFLAGS := $(WFLAGS) -mabi=64 $(WFLAGS)
+export CFLAGS
+endif
+
+ifeq ($(PLATFORM),DM6446)
+ CFLAGS := -nostdinc -iwithprefix include -D__KERNEL__ -I$(LINUX_SRC)/include -Wall -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Os -fno-omit-frame-pointer -fno-omit-frame-pointer -mapcs -mno-sched-prolog -mlittle-endian -mabi=apcs-gnu -D__LINUX_ARM_ARCH__=5 -march=armv5te -mtune=arm9tdmi -msoft-float -Uarm -Wdeclaration-after-statement -c -o $(WFLAGS)
+export CFLAGS
+endif
+
+ifeq ($(PLATFORM),BL2348)
+CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -I$(LINUX_SRC)/include/asm/gcc -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -DEM86XX_CHIP=EM86XX_CHIPID_TANGO2 -DEM86XX_REVISION=6 -I$(LINUX_SRC)/include/asm-mips/mach-generic -I$(RT2860_DIR)/include -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -ffreestanding -O2 -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe -mabi=32 -march=mips32r2 -Wa,-32 -Wa,-march=mips32r2 -Wa,-mips32r2 -Wa,--trap -DMODULE $(WFLAGS) -DSIGMA863X_PLATFORM -DEXPORT_SYMTAB -DPLATFORM_BL2348
+export CFLAGS
+endif
+
+ifeq ($(PLATFORM),BL23570)
+EXTRA_CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -I$(LINUX_SRC)/include/asm/gcc -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -DEM86XX_CHIP=EM86XX_CHIPID_TANGO2 -DEM86XX_REVISION=6 -I$(LINUX_SRC)/include/asm-mips/mach-generic -I$(RT2860_DIR)/include -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -ffreestanding -O2 -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe -mabi=32 -march=74kc -Wa,-32 -Wa,-march=mips32r2 -Wa,-mips32r2 -Wa,--trap -DMODULE $(WFLAGS) -DSIGMA863X_PLATFORM -DEXPORT_SYMTAB -DPLATFORM_BL23570
+export EXTRA_CFLAGS
+endif
+
+ifeq ($(PLATFORM),BLUBB)
+CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -I$(LINUX_SRC)/include/asm/gcc -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -DEM86XX_CHIP=EM86XX_CHIPID_TANGO2 -DEM86XX_REVISION=6 -I$(LINUX_SRC)/include/asm-mips/mach-generic -I$(RT2860_DIR)/include -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -ffreestanding -O2 -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe -mabi=32 -march=mips32r2 -Wa,-32 -Wa,-march=mips32r2 -Wa,-mips32r2 -Wa,--trap -DMODULE $(WFLAGS) -DSIGMA863X_PLATFORM -DEXPORT_SYMTAB -DPLATFORM_BL2348
+export CFLAGS
+endif
+
+ifeq ($(PLATFORM),BLPMP)
+CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -I$(LINUX_SRC)/include/asm/gcc -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -DEM86XX_CHIP=EM86XX_CHIPID_TANGO2 -DEM86XX_REVISION=6 -I$(LINUX_SRC)/include/asm-mips/mach-generic -I$(RT2860_DIR)/include -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -ffreestanding -O2 -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe -mabi=32 -march=mips32r2 -Wa,-32 -Wa,-march=mips32r2 -Wa,-mips32r2 -Wa,--trap -DMODULE $(WFLAGS) -DSIGMA863X_PLATFORM -DEXPORT_SYMTAB
+export CFLAGS
+endif
+
+ifeq ($(PLATFORM),MT85XX)
+ ifneq (,$(findstring 2.4,$(LINUX_SRC)))
+ # Linux 2.4
+ CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -O2 -fomit-frame-pointer -fno-strict-aliasing -fno-common -pipe -mpreferred-stack-boundary=2 -march=i686 -DMODULE -DMODVERSIONS -include $(LINUX_SRC)/include/linux/modversions.h $(WFLAGS)
+ export CFLAGS
+ else
+ # Linux 2.6
+ EXTRA_CFLAGS += $(WFLAGS)
+ EXTRA_CFLAGS += -D _NO_TYPEDEF_BOOL_ \
+ -D _NO_TYPEDEF_UCHAR_ \
+ -D _NO_TYPEDEF_UINT8_ \
+ -D _NO_TYPEDEF_UINT16_ \
+ -D _NO_TYPEDEF_UINT32_ \
+ -D _NO_TYPEDEF_UINT64_ \
+ -D _NO_TYPEDEF_CHAR_ \
+ -D _NO_TYPEDEF_INT32_ \
+ -D _NO_TYPEDEF_INT64_ \
+
+ endif
+endif
+
+ifeq ($(PLATFORM),NXP_TV550)
+ ifneq (,$(findstring 2.4,$(LINUX_SRC)))
+ # Linux 2.4
+ CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -O2 -fomit-frame-pointer -fno-strict-aliasing -fno-common -pipe -mpreferred-stack-boundary=2 -march=mips -DMODULE -DMODVERSIONS -include $(LINUX_SRC)/include/linux/modversions.h $(WFLAGS)
+ export CFLAGS
+ else
+ # Linux 2.6
+ EXTRA_CFLAGS := $(WFLAGS)
+ endif
+endif
+
+ifeq ($(PLATFORM),MVL5)
+CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -mlittle-endian -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -O3 -fno-omit-frame-pointer -fno-optimize-sibling-calls -fno-omit-frame-pointer -mapcs -mno-sched-prolog -mno-thumb-interwork -D__LINUX_ARM_ARCH__=5 -march=armv5te -mtune=arm926ej-s --param max-inline-insns-single=40000 -Uarm -Wdeclaration-after-statement -Wno-pointer-sign -DMODULE $(WFLAGS)
+export CFLAGS
+endif
+
+ifeq ($(PLATFORM),RALINK_3352)
+CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include/asm-mips/mach-generic -I$(LINUX_SRC)/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe -finline-limit=100000 -march=mips2 -mabi=32 -Wa,--trap -DLINUX -nostdinc -iwithprefix include $(WFLAGS)
+export CFLAGS
+endif
diff --git a/cleopatre/devkit/mt7601udrv/os/linux/inf_ppa.c b/cleopatre/devkit/mt7601udrv/os/linux/inf_ppa.c
new file mode 100644
index 0000000000..78a9f2b9b1
--- /dev/null
+++ b/cleopatre/devkit/mt7601udrv/os/linux/inf_ppa.c
@@ -0,0 +1,62 @@
+/****************************************************************************
+ * Ralink Tech Inc.
+ * 4F, No. 2 Technology 5th Rd.
+ * Science-based Industrial Park
+ * Hsin-chu, Taiwan, R.O.C.
+ * (c) Copyright 2002, Ralink Technology, Inc.
+ *
+ * All rights reserved. Ralink's source code is an unpublished work and the
+ * use of a copyright notice does not imply otherwise. This source code
+ * contains confidential trade secret material of Ralink Tech. Any attemp
+ * or participation in deciphering, decoding, reverse engineering or in any
+ * way altering the source code is stricitly prohibited, unless the prior
+ * written consent of Ralink Technology, Inc. is obtained.
+ ****************************************************************************
+
+ Module Name:
+ inf_ppa.c
+
+ Abstract:
+ Only for Infineon PPA Direct path feature.
+
+
+
+ Revision History:
+ Who When What
+ -------- ---------- ----------------------------------------------
+ carella 06-01-2010 Created
+
+ */
+
+#ifdef INF_PPA_SUPPORT
+
+#include "rt_config.h"
+#include <linux/skbuff.h>
+#include <linux/netdevice.h>
+
+extern INT rt28xx_send_packets(
+ IN struct sk_buff *skb_p,
+ IN struct net_device *net_dev);
+
+int ifx_ra_start_xmit(
+ struct net_device *rx_dev,
+ struct net_device *tx_dev,
+ struct sk_buff *skb, int len)
+{
+ if(tx_dev != NULL)
+ {
+ SET_OS_PKT_NETDEV(skb, tx_dev);
+ rt28xx_send_packets(skb, tx_dev);
+ }
+ else if(rx_dev != NULL)
+ {
+ skb->protocol = eth_type_trans(skb, skb->dev);
+ netif_rx(skb);
+ }
+ else
+ {
+ dev_kfree_skb_any(skb);
+ }
+ return 0;
+}
+#endif /* INF_PPA_SUPPORT */
diff --git a/cleopatre/devkit/mt7601udrv/os/linux/load b/cleopatre/devkit/mt7601udrv/os/linux/load
new file mode 100644
index 0000000000..5699ee4876
--- /dev/null
+++ b/cleopatre/devkit/mt7601udrv/os/linux/load
@@ -0,0 +1,6 @@
+#!/bin/sh
+ifconfig ra0 down
+rmmod rt2860ap
+insmod rt2860ap.o
+ifconfig ra0 up 192.168.100.77
+
diff --git a/cleopatre/devkit/mt7601udrv/os/linux/rt_linux.c b/cleopatre/devkit/mt7601udrv/os/linux/rt_linux.c
new file mode 100644
index 0000000000..3fa69be48b
--- /dev/null
+++ b/cleopatre/devkit/mt7601udrv/os/linux/rt_linux.c
@@ -0,0 +1,5258 @@
+/****************************************************************************
+
+ Module Name:
+ UTIL/rt_linux.c
+
+ Abstract:
+ All functions provided from OS module are put here.
+
+ Note:
+ 1. Can not use sizeof() for a structure with any parameter included
+ by any compile option, such as RTMP_ADAPTER.
+
+ Because the RTMP_ADAPTER size in the UTIL module is different with
+ DRIVER/NETIF.
+
+ 2. Do not use any structure with any parameter included by PCI/USB/RBUS/
+ AP/STA.
+
+ Because the structure size in the UTIL module is different with
+ DRIVER/NETIF.
+
+ 3. Do not use any structure defined in DRIVER module, EX: pAd.
+ So we can do module partition.
+
+ Revision History:
+ Who When What
+ --------- ---------- -------------------------------------------
+
+***************************************************************************/
+
+#define RTMP_MODULE_OS
+#define RTMP_MODULE_OS_UTIL
+
+
+#include "rtmp_comm.h"
+#include "rtmp_osabl.h"
+#include "rt_os_util.h"
+#include <linux/rtnetlink.h>
+
+#if defined(CONFIG_RA_HW_NAT) || defined(CONFIG_RA_HW_NAT_MODULE)
+#include "../../../../../../net/nat/hw_nat/ra_nat.h"
+#include "../../../../../../net/nat/hw_nat/frame_engine.h"
+#endif
+
+/* TODO */
+#undef RT_CONFIG_IF_OPMODE_ON_AP
+#undef RT_CONFIG_IF_OPMODE_ON_STA
+
+#if defined(CONFIG_AP_SUPPORT) && defined(CONFIG_STA_SUPPORT)
+#define RT_CONFIG_IF_OPMODE_ON_AP(__OpMode) if (__OpMode == OPMODE_AP)
+#define RT_CONFIG_IF_OPMODE_ON_STA(__OpMode) if (__OpMode == OPMODE_STA)
+#else
+#define RT_CONFIG_IF_OPMODE_ON_AP(__OpMode)
+#define RT_CONFIG_IF_OPMODE_ON_STA(__OpMode)
+#endif
+
+//ULONG RTDebugLevel = RT_DEBUG_TRACE;
+ULONG RTDebugLevel = RT_DEBUG_ERROR;
+ULONG RTDebugFunc = 0;
+
+#ifdef OS_ABL_FUNC_SUPPORT
+ULONG RTPktOffsetData = 0, RTPktOffsetLen = 0, RTPktOffsetCB = 0;
+#endif /* OS_ABL_FUNC_SUPPORT */
+
+
+#ifdef VENDOR_FEATURE4_SUPPORT
+ULONG OS_NumOfMemAlloc = 0, OS_NumOfMemFree = 0;
+#endif /* VENDOR_FEATURE4_SUPPORT */
+#ifdef VENDOR_FEATURE2_SUPPORT
+ULONG OS_NumOfPktAlloc = 0, OS_NumOfPktFree = 0;
+#endif /* VENDOR_FEATURE2_SUPPORT */
+
+/*
+ * the lock will not be used in TX/RX
+ * path so throughput should not be impacted
+ */
+BOOLEAN FlgIsUtilInit = FALSE;
+OS_NDIS_SPIN_LOCK UtilSemLock;
+
+
+BOOLEAN RTMP_OS_Alloc_RscOnly(VOID *pRscSrc, UINT32 RscLen);
+BOOLEAN RTMP_OS_Remove_Rsc(LIST_HEADER *pRscList, VOID *pRscSrc);
+
+/*
+========================================================================
+Routine Description:
+ Initialize something in UTIL module.
+
+Arguments:
+ None
+
+Return Value:
+ None
+
+Note:
+========================================================================
+*/
+VOID RtmpUtilInit(VOID)
+{
+ if (FlgIsUtilInit == FALSE) {
+ OS_NdisAllocateSpinLock(&UtilSemLock);
+ FlgIsUtilInit = TRUE;
+ }
+}
+
+/* timeout -- ms */
+static inline VOID __RTMP_SetPeriodicTimer(
+ IN OS_NDIS_MINIPORT_TIMER * pTimer,
+ IN unsigned long timeout)
+{
+ timeout = ((timeout * OS_HZ) / 1000);
+ pTimer->expires = jiffies + timeout;
+ add_timer(pTimer);
+}
+
+/* convert NdisMInitializeTimer --> RTMP_OS_Init_Timer */
+static inline VOID __RTMP_OS_Init_Timer(
+ IN VOID *pReserved,
+ IN OS_NDIS_MINIPORT_TIMER * pTimer,
+ IN TIMER_FUNCTION function,
+ IN PVOID data)
+{
+ if (!timer_pending(pTimer)) {
+ init_timer(pTimer);
+ pTimer->data = (unsigned long)data;
+ pTimer->function = function;
+ }
+}
+
+static inline VOID __RTMP_OS_Add_Timer(
+ IN OS_NDIS_MINIPORT_TIMER * pTimer,
+ IN unsigned long timeout)
+{
+ if (timer_pending(pTimer))
+ return;
+
+ timeout = ((timeout * OS_HZ) / 1000);
+ pTimer->expires = jiffies + timeout;
+ add_timer(pTimer);
+}
+
+static inline VOID __RTMP_OS_Mod_Timer(
+ IN OS_NDIS_MINIPORT_TIMER * pTimer,
+ IN unsigned long timeout)
+{
+ timeout = ((timeout * OS_HZ) / 1000);
+ mod_timer(pTimer, jiffies + timeout);
+}
+
+static inline VOID __RTMP_OS_Del_Timer(
+ IN OS_NDIS_MINIPORT_TIMER * pTimer,
+ OUT BOOLEAN *pCancelled)
+{
+ if (timer_pending(pTimer))
+ *pCancelled = del_timer_sync(pTimer);
+ else
+ *pCancelled = TRUE;
+}
+
+static inline VOID __RTMP_OS_Release_Timer(
+ IN OS_NDIS_MINIPORT_TIMER * pTimer)
+{
+ /* nothing to do */
+}
+
+
+/* Unify all delay routine by using udelay */
+VOID RTMPusecDelay(ULONG usec)
+{
+ ULONG i;
+
+ for (i = 0; i < (usec / 50); i++)
+ udelay(50);
+
+ if (usec % 50)
+ udelay(usec % 50);
+}
+
+
+/* Unify all delay routine by using udelay */
+VOID RtmpOsUsDelay(ULONG value)
+{
+ ULONG i;
+
+ udelay(value);
+}
+
+VOID RtmpOsMsDelay(ULONG msec)
+{
+ mdelay(msec);
+}
+
+void RTMP_GetCurrentSystemTime(LARGE_INTEGER * time)
+{
+ time->u.LowPart = jiffies;
+}
+
+void RTMP_GetCurrentSystemTick(ULONG *pNow)
+{
+ *pNow = jiffies;
+}
+
+/* pAd MUST allow to be NULL */
+
+NDIS_STATUS os_alloc_mem(
+ IN VOID *pReserved,
+ OUT UCHAR **mem,
+ IN ULONG size)
+{
+ *mem = (PUCHAR) kmalloc(size, GFP_ATOMIC);
+ if (*mem) {
+#ifdef VENDOR_FEATURE4_SUPPORT
+ OS_NumOfMemAlloc++;
+#endif /* VENDOR_FEATURE4_SUPPORT */
+
+ return NDIS_STATUS_SUCCESS;
+ } else
+ return NDIS_STATUS_FAILURE;
+}
+
+NDIS_STATUS os_alloc_mem_suspend(
+ IN VOID *pReserved,
+ OUT UCHAR **mem,
+ IN ULONG size)
+{
+ *mem = (PUCHAR) kmalloc(size, GFP_KERNEL);
+ if (*mem) {
+#ifdef VENDOR_FEATURE4_SUPPORT
+ OS_NumOfMemAlloc++;
+#endif /* VENDOR_FEATURE4_SUPPORT */
+
+ return NDIS_STATUS_SUCCESS;
+ } else
+ return NDIS_STATUS_FAILURE;
+}
+
+/* pAd MUST allow to be NULL */
+NDIS_STATUS os_free_mem(
+ IN VOID *pReserved,
+ IN PVOID mem)
+{
+ ASSERT(mem);
+ kfree(mem);
+
+#ifdef VENDOR_FEATURE4_SUPPORT
+ OS_NumOfMemFree++;
+#endif /* VENDOR_FEATURE4_SUPPORT */
+
+ return NDIS_STATUS_SUCCESS;
+}
+
+#if defined(RTMP_RBUS_SUPPORT) || defined (RTMP_FLASH_SUPPORT)
+/* The flag "CONFIG_RALINK_FLASH_API" is used for APSoC Linux SDK */
+#ifdef CONFIG_RALINK_FLASH_API
+
+int32_t FlashRead(
+ uint32_t *dst,
+ uint32_t *src,
+ uint32_t count);
+
+int32_t FlashWrite(
+ uint16_t *source,
+ uint16_t *destination,
+ uint32_t numBytes);
+#else /* CONFIG_RALINK_FLASH_API */
+
+#ifdef RA_MTD_RW_BY_NUM
+#if defined (CONFIG_RT2880_FLASH_32M)
+#define MTD_NUM_FACTORY 5
+#else
+#define MTD_NUM_FACTORY 2
+#endif
+extern int ra_mtd_write(int num, loff_t to, size_t len, const u_char *buf);
+extern int ra_mtd_read(int num, loff_t from, size_t len, u_char *buf);
+#else
+extern int ra_mtd_write_nm(char *name, loff_t to, size_t len, const u_char *buf);
+extern int ra_mtd_read_nm(char *name, loff_t from, size_t len, u_char *buf);
+#endif
+
+#endif /* CONFIG_RALINK_FLASH_API */
+
+void RtmpFlashRead(
+ UCHAR *p,
+ ULONG a,
+ ULONG b)
+{
+#ifdef CONFIG_RALINK_FLASH_API
+ FlashRead((uint32_t *) p, (uint32_t *) a, (uint32_t) b);
+#else
+#ifdef RA_MTD_RW_BY_NUM
+ ra_mtd_read(MTD_NUM_FACTORY, 0, (size_t) b, p);
+#else
+ ra_mtd_read_nm("Factory", a&0xFFFF, (size_t) b, p);
+#endif
+#endif /* CONFIG_RALINK_FLASH_API */
+}
+
+void RtmpFlashWrite(
+ UCHAR * p,
+ ULONG a,
+ ULONG b)
+{
+#ifdef CONFIG_RALINK_FLASH_API
+ FlashWrite((uint16_t *) p, (uint16_t *) a, (uint32_t) b);
+#else
+#ifdef RA_MTD_RW_BY_NUM
+ ra_mtd_write(MTD_NUM_FACTORY, 0, (size_t) b, p);
+#else
+ ra_mtd_write_nm("Factory", a&0xFFFF, (size_t) b, p);
+#endif
+#endif /* CONFIG_RALINK_FLASH_API */
+}
+#endif /* defined(RTMP_RBUS_SUPPORT) || defined (RTMP_FLASH_SUPPORT) */
+
+
+PNDIS_PACKET RtmpOSNetPktAlloc(VOID *dummy, int size)
+{
+ struct sk_buff *skb;
+ /* Add 2 more bytes for ip header alignment */
+ skb = dev_alloc_skb(size + 2);
+ if (skb != NULL)
+ MEM_DBG_PKT_ALLOC_INC(skb);
+
+ return ((PNDIS_PACKET) skb);
+}
+
+PNDIS_PACKET RTMP_AllocateFragPacketBuffer(VOID *dummy, ULONG len)
+{
+ struct sk_buff *pkt;
+
+ pkt = dev_alloc_skb(len);
+
+ if (pkt == NULL) {
+ DBGPRINT(RT_DEBUG_ERROR,
+ ("can't allocate frag rx %ld size packet\n", len));
+ }
+
+ if (pkt) {
+ MEM_DBG_PKT_ALLOC_INC(pkt);
+ RTMP_SET_PACKET_SOURCE(OSPKT_TO_RTPKT(pkt), PKTSRC_NDIS);
+ }
+
+ return (PNDIS_PACKET) pkt;
+}
+
+
+
+/*
+ The allocated NDIS PACKET must be freed via RTMPFreeNdisPacket()
+*/
+NDIS_STATUS RTMPAllocateNdisPacket(
+ IN VOID *pReserved,
+ OUT PNDIS_PACKET *ppPacket,
+ IN UCHAR *pHeader,
+ IN UINT HeaderLen,
+ IN UCHAR *pData,
+ IN UINT DataLen)
+{
+ struct sk_buff *pPacket;
+
+
+ ASSERT(pData);
+ ASSERT(DataLen);
+
+ pPacket = dev_alloc_skb(HeaderLen + DataLen + RTMP_PKT_TAIL_PADDING);
+ if (pPacket == NULL) {
+ *ppPacket = NULL;
+#ifdef DEBUG
+ printk(KERN_ERR "RTMPAllocateNdisPacket Fail\n\n");
+#endif
+ return NDIS_STATUS_FAILURE;
+ }
+ MEM_DBG_PKT_ALLOC_INC(pPacket);
+
+ /* Clone the frame content and update the length of packet */
+ if (HeaderLen > 0)
+ NdisMoveMemory(pPacket->data, pHeader, HeaderLen);
+ if (DataLen > 0)
+ NdisMoveMemory(pPacket->data + HeaderLen, pData, DataLen);
+ skb_put(pPacket, HeaderLen + DataLen);
+/* printk(KERN_ERR "%s : pPacket = %p, len = %d\n", __FUNCTION__, pPacket, GET_OS_PKT_LEN(pPacket));*/
+
+ RTMP_SET_PACKET_SOURCE(pPacket, PKTSRC_NDIS);
+ *ppPacket = (PNDIS_PACKET)pPacket;
+
+ return NDIS_STATUS_SUCCESS;
+}
+
+
+/*
+ ========================================================================
+ Description:
+ This routine frees a miniport internally allocated NDIS_PACKET and its
+ corresponding NDIS_BUFFER and allocated memory.
+ ========================================================================
+*/
+VOID RTMPFreeNdisPacket(
+ IN VOID *pReserved,
+ IN PNDIS_PACKET pPacket)
+{
+ dev_kfree_skb_any(RTPKT_TO_OSPKT(pPacket));
+ MEM_DBG_PKT_FREE_INC(pPacket);
+}
+
+
+/* IRQL = DISPATCH_LEVEL */
+/* NOTE: we do have an assumption here, that Byte0 and Byte1
+ * always reasid at the same scatter gather buffer
+ */
+NDIS_STATUS Sniff2BytesFromNdisBuffer(
+ IN PNDIS_BUFFER pFirstBuffer,
+ IN UCHAR DesiredOffset,
+ OUT PUCHAR pByte0,
+ OUT PUCHAR pByte1)
+{
+ *pByte0 = *(PUCHAR) (pFirstBuffer + DesiredOffset);
+ *pByte1 = *(PUCHAR) (pFirstBuffer + DesiredOffset + 1);
+
+ return NDIS_STATUS_SUCCESS;
+}
+
+
+void RTMP_QueryPacketInfo(
+ IN PNDIS_PACKET pPacket,
+ OUT PACKET_INFO *info,
+ OUT UCHAR **pSrcBufVA,
+ OUT UINT *pSrcBufLen)
+{
+ info->BufferCount = 1;
+ info->pFirstBuffer = (PNDIS_BUFFER) GET_OS_PKT_DATAPTR(pPacket);
+ info->PhysicalBufferCount = 1;
+ info->TotalPacketLength = GET_OS_PKT_LEN(pPacket);
+
+ *pSrcBufVA = GET_OS_PKT_DATAPTR(pPacket);
+ *pSrcBufLen = GET_OS_PKT_LEN(pPacket);
+
+#ifdef TX_PKT_SG
+ if (RTMP_GET_PKT_SG(pPacket)) {
+ struct sk_buff *skb = (struct sk_buff *)pPacket;
+ int i, nr_frags = skb_shinfo(skb)->nr_frags;
+
+ info->BufferCount = nr_frags + 1;
+ info->PhysicalBufferCount = info->BufferCount;
+ info->sg_list[0].data = (VOID *)GET_OS_PKT_DATAPTR(pPacket);
+ info->sg_list[0].len = skb_headlen(skb);
+ for (i = 0; i < nr_frags; i++) {
+ skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
+
+ info->sg_list[i+1].data = ((void *) page_address(frag->page) +
+ frag->page_offset);
+ info->sg_list[i+1].len = frag->size;
+ }
+ }
+#endif /* TX_PKT_SG */
+}
+
+
+
+
+PNDIS_PACKET DuplicatePacket(
+ IN PNET_DEV pNetDev,
+ IN PNDIS_PACKET pPacket,
+ IN UCHAR FromWhichBSSID)
+{
+ struct sk_buff *skb;
+ PNDIS_PACKET pRetPacket = NULL;
+ USHORT DataSize;
+ UCHAR *pData;
+
+ DataSize = (USHORT) GET_OS_PKT_LEN(pPacket);
+ pData = (PUCHAR) GET_OS_PKT_DATAPTR(pPacket);
+
+ skb = skb_clone(RTPKT_TO_OSPKT(pPacket), MEM_ALLOC_FLAG);
+ if (skb) {
+ MEM_DBG_PKT_ALLOC_INC(skb);
+ skb->dev = pNetDev; /*get_netdev_from_bssid(pAd, FromWhichBSSID); */
+ pRetPacket = OSPKT_TO_RTPKT(skb);
+ }
+
+ return pRetPacket;
+
+}
+
+
+PNDIS_PACKET duplicate_pkt(
+ IN PNET_DEV pNetDev,
+ IN PUCHAR pHeader802_3,
+ IN UINT HdrLen,
+ IN PUCHAR pData,
+ IN ULONG DataSize,
+ IN UCHAR FromWhichBSSID)
+{
+ struct sk_buff *skb;
+ PNDIS_PACKET pPacket = NULL;
+
+ if ((skb =
+ __dev_alloc_skb(HdrLen + DataSize + 2, MEM_ALLOC_FLAG)) != NULL) {
+ MEM_DBG_PKT_ALLOC_INC(skb);
+
+ skb_reserve(skb, 2);
+ NdisMoveMemory(skb->tail, pHeader802_3, HdrLen);
+ skb_put(skb, HdrLen);
+ NdisMoveMemory(skb->tail, pData, DataSize);
+ skb_put(skb, DataSize);
+ skb->dev = pNetDev; /*get_netdev_from_bssid(pAd, FromWhichBSSID); */
+ pPacket = OSPKT_TO_RTPKT(skb);
+ }
+
+ return pPacket;
+}
+
+
+#define TKIP_TX_MIC_SIZE 8
+PNDIS_PACKET duplicate_pkt_with_TKIP_MIC(
+ IN VOID *pReserved,
+ IN PNDIS_PACKET pPacket)
+{
+ struct sk_buff *skb, *newskb;
+
+ skb = RTPKT_TO_OSPKT(pPacket);
+ if (skb_tailroom(skb) < TKIP_TX_MIC_SIZE) {
+ /* alloc a new skb and copy the packet */
+ newskb = skb_copy_expand(skb, skb_headroom(skb), TKIP_TX_MIC_SIZE, GFP_ATOMIC);
+
+ dev_kfree_skb_any(skb);
+ MEM_DBG_PKT_FREE_INC(skb);
+
+ if (newskb == NULL) {
+ DBGPRINT(RT_DEBUG_ERROR, ("Extend Tx.MIC for packet failed!, dropping packet!\n"));
+ return NULL;
+ }
+ skb = newskb;
+ MEM_DBG_PKT_ALLOC_INC(skb);
+ }
+
+ return OSPKT_TO_RTPKT(skb);
+
+
+}
+
+#ifdef CONFIG_AP_SUPPORT
+PNDIS_PACKET duplicate_pkt_with_VLAN(
+ IN PNET_DEV pNetDev,
+ IN USHORT VLAN_VID,
+ IN USHORT VLAN_Priority,
+ IN PUCHAR pHeader802_3,
+ IN UINT HdrLen,
+ IN PUCHAR pData,
+ IN ULONG DataSize,
+ IN UCHAR FromWhichBSSID,
+ IN UCHAR *TPID)
+{
+ struct sk_buff *skb;
+ PNDIS_PACKET pPacket = NULL;
+ UINT16 VLAN_Size;
+
+ if ((skb = __dev_alloc_skb(HdrLen + DataSize + LENGTH_802_1Q + 2,
+ MEM_ALLOC_FLAG)) != NULL) {
+ MEM_DBG_PKT_ALLOC_INC(skb);
+
+ skb_reserve(skb, 2);
+
+ /* copy header (maybe +VLAN tag) */
+ VLAN_Size = VLAN_8023_Header_Copy(VLAN_VID, VLAN_Priority,
+ pHeader802_3, HdrLen,
+ skb->tail, FromWhichBSSID,
+ TPID);
+ skb_put(skb, HdrLen + VLAN_Size);
+
+ /* copy data body */
+ NdisMoveMemory(skb->tail, pData, DataSize);
+ skb_put(skb, DataSize);
+ skb->dev = pNetDev; /*get_netdev_from_bssid(pAd, FromWhichBSSID); */
+ pPacket = OSPKT_TO_RTPKT(skb);
+ }
+
+ return pPacket;
+}
+#endif /* CONFIG_AP_SUPPORT */
+
+/*
+ ========================================================================
+
+ Routine Description:
+ Send a L2 frame to upper daemon to trigger state machine
+
+ Arguments:
+ pAd - pointer to our pAdapter context
+
+ Return Value:
+
+ Note:
+
+ ========================================================================
+*/
+BOOLEAN RTMPL2FrameTxAction(
+ IN VOID * pCtrlBkPtr,
+ IN PNET_DEV pNetDev,
+ IN RTMP_CB_8023_PACKET_ANNOUNCE _announce_802_3_packet,
+ IN UCHAR apidx,
+ IN PUCHAR pData,
+ IN UINT32 data_len,
+ IN UCHAR OpMode)
+{
+ struct sk_buff *skb = dev_alloc_skb(data_len + 2);
+
+ if (!skb) {
+ DBGPRINT(RT_DEBUG_ERROR,
+ ("%s : Error! Can't allocate a skb.\n", __FUNCTION__));
+ return FALSE;
+ }
+
+ MEM_DBG_PKT_ALLOC_INC(skb);
+ /*get_netdev_from_bssid(pAd, apidx)); */
+ SET_OS_PKT_NETDEV(skb, pNetDev);
+
+ /* 16 byte align the IP header */
+ skb_reserve(skb, 2);
+
+ /* Insert the frame content */
+ NdisMoveMemory(GET_OS_PKT_DATAPTR(skb), pData, data_len);
+
+ /* End this frame */
+ skb_put(GET_OS_PKT_TYPE(skb), data_len);
+
+ DBGPRINT(RT_DEBUG_TRACE, ("%s doen\n", __FUNCTION__));
+
+ _announce_802_3_packet(pCtrlBkPtr, skb, OpMode);
+
+ return TRUE;
+
+}
+
+
+PNDIS_PACKET ExpandPacket(
+ IN VOID *pReserved,
+ IN PNDIS_PACKET pPacket,
+ IN UINT32 ext_head_len,
+ IN UINT32 ext_tail_len)
+{
+ struct sk_buff *skb, *newskb;
+
+ skb = RTPKT_TO_OSPKT(pPacket);
+ if (skb_cloned(skb) || (skb_headroom(skb) < ext_head_len)
+ || (skb_tailroom(skb) < ext_tail_len)) {
+ UINT32 head_len =
+ (skb_headroom(skb) <
+ ext_head_len) ? ext_head_len : skb_headroom(skb);
+ UINT32 tail_len =
+ (skb_tailroom(skb) <
+ ext_tail_len) ? ext_tail_len : skb_tailroom(skb);
+
+ /* alloc a new skb and copy the packet */
+ newskb = skb_copy_expand(skb, head_len, tail_len, GFP_ATOMIC);
+
+ dev_kfree_skb_any(skb);
+ MEM_DBG_PKT_FREE_INC(skb);
+
+ if (newskb == NULL) {
+ DBGPRINT(RT_DEBUG_ERROR,
+ ("Extend Tx buffer for WPI failed!, dropping packet!\n"));
+ return NULL;
+ }
+ skb = newskb;
+ MEM_DBG_PKT_ALLOC_INC(skb);
+ }
+
+ return OSPKT_TO_RTPKT(skb);
+
+}
+
+PNDIS_PACKET ClonePacket(
+ IN VOID *pReserved,
+ IN PNDIS_PACKET pPacket,
+ IN PUCHAR pData,
+ IN ULONG DataSize)
+{
+ struct sk_buff *pRxPkt;
+ struct sk_buff *pClonedPkt;
+
+ ASSERT(pPacket);
+ pRxPkt = RTPKT_TO_OSPKT(pPacket);
+
+ /* clone the packet */
+ pClonedPkt = skb_clone(pRxPkt, MEM_ALLOC_FLAG);
+
+ if (pClonedPkt) {
+ /* set the correct dataptr and data len */
+ MEM_DBG_PKT_ALLOC_INC(pClonedPkt);
+ pClonedPkt->dev = pRxPkt->dev;
+ pClonedPkt->data = pData;
+ pClonedPkt->len = DataSize;
+ pClonedPkt->tail = pClonedPkt->data + pClonedPkt->len;
+ ASSERT(DataSize < 1530);
+ }
+ return pClonedPkt;
+}
+
+VOID RtmpOsPktInit(
+ IN PNDIS_PACKET pNetPkt,
+ IN PNET_DEV pNetDev,
+ IN UCHAR *pData,
+ IN USHORT DataSize)
+{
+ PNDIS_PACKET pRxPkt;
+
+ pRxPkt = RTPKT_TO_OSPKT(pNetPkt);
+
+ SET_OS_PKT_NETDEV(pRxPkt, pNetDev);
+ SET_OS_PKT_DATAPTR(pRxPkt, pData);
+ SET_OS_PKT_LEN(pRxPkt, DataSize);
+ SET_OS_PKT_DATATAIL(pRxPkt, pData, DataSize);
+}
+
+
+void wlan_802_11_to_802_3_packet(
+ IN PNET_DEV pNetDev,
+ IN UCHAR OpMode,
+ IN USHORT VLAN_VID,
+ IN USHORT VLAN_Priority,
+ IN PNDIS_PACKET pRxPacket,
+ IN UCHAR *pData,
+ IN ULONG DataSize,
+ IN PUCHAR pHeader802_3,
+ IN UCHAR FromWhichBSSID,
+ IN UCHAR *TPID)
+{
+ struct sk_buff *pOSPkt;
+
+ ASSERT(pHeader802_3);
+
+ pOSPkt = RTPKT_TO_OSPKT(pRxPacket);
+
+ /*get_netdev_from_bssid(pAd, FromWhichBSSID); */
+ pOSPkt->dev = pNetDev;
+ pOSPkt->data = pData;
+ pOSPkt->len = DataSize;
+ pOSPkt->tail = pOSPkt->data + pOSPkt->len;
+
+ /* copy 802.3 header */
+#ifdef CONFIG_AP_SUPPORT
+ RT_CONFIG_IF_OPMODE_ON_AP(OpMode)
+ {
+ /* maybe insert VLAN tag to the received packet */
+ UCHAR VLAN_Size = 0;
+ UCHAR *data_p;
+
+ if (VLAN_VID != 0)
+ VLAN_Size = LENGTH_802_1Q;
+
+ data_p = skb_push(pOSPkt, LENGTH_802_3 + VLAN_Size);
+
+ VLAN_8023_Header_Copy(VLAN_VID, VLAN_Priority,
+ pHeader802_3, LENGTH_802_3,
+ data_p, FromWhichBSSID, TPID);
+ }
+#endif /* CONFIG_AP_SUPPORT */
+
+
+}
+
+
+#ifdef HDR_TRANS_SUPPORT
+VOID RtmpOsSetPacket(
+ IN PNET_DEV pNetDev,
+ IN PNDIS_PACKET pRxPacket,
+ IN UCHAR *pData,
+ IN ULONG DataSize)
+{
+
+ struct sk_buff *pOSPkt;
+
+ pOSPkt = RTPKT_TO_OSPKT(pRxPacket);
+
+ pOSPkt->dev = pNetDev;
+ pOSPkt->data = pData;
+ pOSPkt->len = DataSize;
+ pOSPkt->tail = pOSPkt->data + pOSPkt->len;
+}
+
+#endif /* HDR_TRANS_SUPPORT */
+
+
+void hex_dump(char *str, UCHAR *pSrcBufVA, UINT SrcBufLen)
+{
+#ifdef DBG
+ unsigned char *pt;
+ int x;
+
+ if (RTDebugLevel < RT_DEBUG_TRACE)
+ return;
+
+ pt = pSrcBufVA;
+ printk("%s: %p, len = %d\n", str, pSrcBufVA, SrcBufLen);
+ for (x = 0; x < SrcBufLen; x++) {
+ if (x % 16 == 0)
+ printk("0x%04x : ", x);
+ printk("%02x ", ((unsigned char)pt[x]));
+ if (x % 16 == 15)
+ printk("\n");
+ }
+ printk("\n");
+#endif /* DBG */
+}
+
+#ifdef SYSTEM_LOG_SUPPORT
+/*
+ ========================================================================
+
+ Routine Description:
+ Send log message through wireless event
+
+ Support standard iw_event with IWEVCUSTOM. It is used below.
+
+ iwreq_data.data.flags is used to store event_flag that is
+ defined by user. iwreq_data.data.length is the length of the
+ event log.
+
+ The format of the event log is composed of the entry's MAC
+ address and the desired log message (refer to
+ pWirelessEventText).
+
+ ex: 11:22:33:44:55:66 has associated successfully
+
+ p.s. The requirement of Wireless Extension is v15 or newer.
+
+ ========================================================================
+*/
+VOID RtmpOsSendWirelessEvent(
+ IN VOID *pAd,
+ IN USHORT Event_flag,
+ IN PUCHAR pAddr,
+ IN UCHAR BssIdx,
+ IN CHAR Rssi,
+ IN RTMP_OS_SEND_WLAN_EVENT pFunc)
+{
+#if WIRELESS_EXT >= 15
+ pFunc(pAd, Event_flag, pAddr, BssIdx, Rssi);
+#else
+ DBGPRINT(RT_DEBUG_ERROR,
+ ("%s : The Wireless Extension MUST be v15 or newer.\n",
+ __FUNCTION__));
+#endif /* WIRELESS_EXT >= 15 */
+}
+#endif /* SYSTEM_LOG_SUPPORT */
+
+#ifdef CONFIG_AP_SUPPORT
+VOID SendSignalToDaemon(
+ IN INT sig,
+ RTMP_OS_PID pid,
+ unsigned long pid_no)
+{
+}
+#endif /* CONFIG_AP_SUPPORT */
+
+
+
+/*******************************************************************************
+
+ File open/close related functions.
+
+ *******************************************************************************/
+RTMP_OS_FD RtmpOSFileOpen(char *pPath, int flag, int mode)
+{
+ struct file *filePtr;
+
+ if (flag == RTMP_FILE_RDONLY)
+ flag = O_RDONLY;
+ else if (flag == RTMP_FILE_WRONLY)
+ flag = O_WRONLY;
+ else if (flag == RTMP_FILE_CREAT)
+ flag = O_CREAT;
+ else if (flag == RTMP_FILE_TRUNC)
+ flag = O_TRUNC;
+
+ filePtr = filp_open(pPath, flag, 0);
+ if (IS_ERR(filePtr)) {
+ DBGPRINT(RT_DEBUG_ERROR,
+ ("%s(): Error %ld opening %s\n", __FUNCTION__,
+ -PTR_ERR(filePtr), pPath));
+ }
+
+ return (RTMP_OS_FD) filePtr;
+}
+
+int RtmpOSFileClose(RTMP_OS_FD osfd)
+{
+ filp_close(osfd, NULL);
+ return 0;
+}
+
+void RtmpOSFileSeek(RTMP_OS_FD osfd, int offset)
+{
+ osfd->f_pos = offset;
+}
+
+
+int RtmpOSFileRead(RTMP_OS_FD osfd, char *pDataPtr, int readLen)
+{
+ /* The object must have a read method */
+ if (osfd->f_op && osfd->f_op->read) {
+ return osfd->f_op->read(osfd, pDataPtr, readLen, &osfd->f_pos);
+ } else {
+ DBGPRINT(RT_DEBUG_ERROR, ("no file read method\n"));
+ return -1;
+ }
+}
+
+int RtmpOSFileWrite(RTMP_OS_FD osfd, char *pDataPtr, int writeLen)
+{
+ return osfd->f_op->write(osfd, pDataPtr, (size_t) writeLen, &osfd->f_pos);
+}
+
+static inline void __RtmpOSFSInfoChange(OS_FS_INFO * pOSFSInfo, BOOLEAN bSet)
+{
+ if (bSet) {
+ /* Save uid and gid used for filesystem access. */
+ /* Set user and group to 0 (root) */
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29)
+ pOSFSInfo->fsuid = current->fsuid;
+ pOSFSInfo->fsgid = current->fsgid;
+ current->fsuid = current->fsgid = 0;
+#else
+ pOSFSInfo->fsuid = current_fsuid();
+ pOSFSInfo->fsgid = current_fsgid();
+#endif
+ pOSFSInfo->fs = get_fs();
+ set_fs(KERNEL_DS);
+ } else {
+ set_fs(pOSFSInfo->fs);
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29)
+ current->fsuid = pOSFSInfo->fsuid;
+ current->fsgid = pOSFSInfo->fsgid;
+#endif
+ }
+}
+
+
+/*******************************************************************************
+
+ Task create/management/kill related functions.
+
+ *******************************************************************************/
+static inline NDIS_STATUS __RtmpOSTaskKill(OS_TASK *pTask)
+{
+ int ret = NDIS_STATUS_FAILURE;
+
+#ifdef KTHREAD_SUPPORT
+ if (pTask->kthread_task) {
+ kthread_stop(pTask->kthread_task);
+ ret = NDIS_STATUS_SUCCESS;
+ }
+#else
+ CHECK_PID_LEGALITY(pTask->taskPID) {
+ DBGPRINT(RT_DEBUG_TRACE,
+ ("Terminate the task(%s) with pid(%d)!\n",
+ pTask->taskName, GET_PID_NUMBER(pTask->taskPID)));
+ mb();
+ pTask->task_killed = 1;
+ mb();
+ ret = KILL_THREAD_PID(pTask->taskPID, SIGTERM, 1);
+ if (ret) {
+ printk(KERN_WARNING
+ "kill task(%s) with pid(%d) failed(retVal=%d)!\n",
+ pTask->taskName, GET_PID_NUMBER(pTask->taskPID),
+ ret);
+ } else {
+ wait_for_completion(&pTask->taskComplete);
+ pTask->taskPID = THREAD_PID_INIT_VALUE;
+ pTask->task_killed = 0;
+ RTMP_SEM_EVENT_DESTORY(&pTask->taskSema);
+ ret = NDIS_STATUS_SUCCESS;
+ }
+ }
+#endif
+
+ return ret;
+
+}
+
+static inline INT __RtmpOSTaskNotifyToExit(OS_TASK *pTask)
+{
+#ifndef KTHREAD_SUPPORT
+ pTask->taskPID = THREAD_PID_INIT_VALUE;
+ complete_and_exit(&pTask->taskComplete, 0);
+#endif
+
+ return 0;
+}
+
+static inline void __RtmpOSTaskCustomize(OS_TASK *pTask)
+{
+#ifndef KTHREAD_SUPPORT
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
+ daemonize((PSTRING) & pTask->taskName[0] /*"%s",pAd->net_dev->name */ );
+
+ allow_signal(SIGTERM);
+ allow_signal(SIGKILL);
+ current->flags |= PF_NOFREEZE;
+#else
+ unsigned long flags;
+
+ daemonize();
+ reparent_to_init();
+ strcpy(current->comm, &pTask->taskName[0]);
+
+ siginitsetinv(&current->blocked, sigmask(SIGTERM) | sigmask(SIGKILL));
+
+ /* Allow interception of SIGKILL only
+ * Don't allow other signals to interrupt the transmission */
+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,4,22)
+ spin_lock_irqsave(&current->sigmask_lock, flags);
+ flush_signals(current);
+ recalc_sigpending(current);
+ spin_unlock_irqrestore(&current->sigmask_lock, flags);
+#endif
+#endif
+
+ RTMP_GET_OS_PID(pTask->taskPID, current->pid);
+
+ /* signal that we've started the thread */
+ complete(&pTask->taskComplete);
+
+#endif
+}
+
+static inline NDIS_STATUS __RtmpOSTaskAttach(
+ IN OS_TASK *pTask,
+ IN RTMP_OS_TASK_CALLBACK fn,
+ IN ULONG arg)
+{
+ NDIS_STATUS status = NDIS_STATUS_SUCCESS;
+#ifndef KTHREAD_SUPPORT
+ pid_t pid_number = -1;
+#endif /* KTHREAD_SUPPORT */
+
+#ifdef KTHREAD_SUPPORT
+ pTask->task_killed = 0;
+ pTask->kthread_task = NULL;
+ pTask->kthread_task =
+ kthread_run((cast_fn) fn, (void *)arg, pTask->taskName);
+ if (IS_ERR(pTask->kthread_task))
+ status = NDIS_STATUS_FAILURE;
+#else
+ pid_number =
+ kernel_thread((cast_fn) fn, (void *)arg, RTMP_OS_MGMT_TASK_FLAGS);
+ if (pid_number < 0) {
+ DBGPRINT(RT_DEBUG_ERROR,
+ ("Attach task(%s) failed!\n", pTask->taskName));
+ status = NDIS_STATUS_FAILURE;
+ } else {
+ /* Wait for the thread to start */
+ wait_for_completion(&pTask->taskComplete);
+ status = NDIS_STATUS_SUCCESS;
+ }
+#endif
+ return status;
+}
+
+static inline NDIS_STATUS __RtmpOSTaskInit(
+ IN OS_TASK *pTask,
+ IN PSTRING pTaskName,
+ IN VOID *pPriv,
+ IN LIST_HEADER *pSemList)
+{
+ int len;
+
+ ASSERT(pTask);
+
+#ifndef KTHREAD_SUPPORT
+ NdisZeroMemory((PUCHAR) (pTask), sizeof (OS_TASK));
+#endif
+
+ len = strlen(pTaskName);
+ len = len > (RTMP_OS_TASK_NAME_LEN - 1) ? (RTMP_OS_TASK_NAME_LEN - 1) : len;
+ NdisMoveMemory(&pTask->taskName[0], pTaskName, len);
+ pTask->priv = pPriv;
+
+#ifndef KTHREAD_SUPPORT
+ RTMP_SEM_EVENT_INIT_LOCKED(&(pTask->taskSema), pSemList);
+ pTask->taskPID = THREAD_PID_INIT_VALUE;
+ init_completion(&pTask->taskComplete);
+#endif
+
+#ifdef KTHREAD_SUPPORT
+ init_waitqueue_head(&(pTask->kthread_q));
+#endif /* KTHREAD_SUPPORT */
+
+ return NDIS_STATUS_SUCCESS;
+}
+
+BOOLEAN __RtmpOSTaskWait(
+ IN VOID *pReserved,
+ IN OS_TASK *pTask,
+ IN INT32 *pStatus)
+{
+#ifdef KTHREAD_SUPPORT
+ RTMP_WAIT_EVENT_INTERRUPTIBLE((*pStatus), pTask);
+
+ if ((pTask->task_killed == 1) || ((*pStatus) != 0))
+ return FALSE;
+#else
+
+ RTMP_SEM_EVENT_WAIT(&(pTask->taskSema), (*pStatus));
+
+ /* unlock the device pointers */
+ if ((*pStatus) != 0) {
+/* RTMP_SET_FLAG_(*pFlags, fRTMP_ADAPTER_HALT_IN_PROGRESS); */
+ return FALSE;
+ }
+#endif /* KTHREAD_SUPPORT */
+
+ return TRUE;
+}
+
+
+#if LINUX_VERSION_CODE <= 0x20402 /* Red Hat 7.1 */
+struct net_device *alloc_netdev(
+ int sizeof_priv,
+ const char *mask,
+ void (*setup) (struct net_device *))
+{
+ struct net_device *dev;
+ INT alloc_size;
+
+ /* ensure 32-byte alignment of the private area */
+ alloc_size = sizeof (*dev) + sizeof_priv + 31;
+
+ dev = (struct net_device *)kmalloc(alloc_size, GFP_KERNEL);
+ if (dev == NULL) {
+ DBGPRINT(RT_DEBUG_ERROR,
+ ("alloc_netdev: Unable to allocate device memory.\n"));
+ return NULL;
+ }
+
+ memset(dev, 0, alloc_size);
+
+ if (sizeof_priv)
+ dev->priv = (void *)(((long)(dev + 1) + 31) & ~31);
+
+ setup(dev);
+ strcpy(dev->name, mask);
+
+ return dev;
+}
+#endif /* LINUX_VERSION_CODE */
+
+
+static UINT32 RtmpOSWirelessEventTranslate(IN UINT32 eventType)
+{
+ switch (eventType) {
+ case RT_WLAN_EVENT_CUSTOM:
+ eventType = IWEVCUSTOM;
+ break;
+
+ case RT_WLAN_EVENT_CGIWAP:
+ eventType = SIOCGIWAP;
+ break;
+
+#if WIRELESS_EXT > 17
+ case RT_WLAN_EVENT_ASSOC_REQ_IE:
+ eventType = IWEVASSOCREQIE;
+ break;
+#endif /* WIRELESS_EXT */
+
+#if WIRELESS_EXT >= 14
+ case RT_WLAN_EVENT_SCAN:
+ eventType = SIOCGIWSCAN;
+ break;
+#endif /* WIRELESS_EXT */
+
+ case RT_WLAN_EVENT_EXPIRED:
+ eventType = IWEVEXPIRED;
+ break;
+
+ default:
+ printk("Unknown event: 0x%x\n", eventType);
+ break;
+ }
+
+ return eventType;
+}
+
+int RtmpOSWrielessEventSend(
+ IN PNET_DEV pNetDev,
+ IN UINT32 eventType,
+ IN INT flags,
+ IN PUCHAR pSrcMac,
+ IN PUCHAR pData,
+ IN UINT32 dataLen)
+{
+ union iwreq_data wrqu;
+
+ /* translate event type */
+ eventType = RtmpOSWirelessEventTranslate(eventType);
+
+ memset(&wrqu, 0, sizeof (wrqu));
+
+ if (flags > -1)
+ wrqu.data.flags = flags;
+
+ if (pSrcMac)
+ memcpy(wrqu.ap_addr.sa_data, pSrcMac, MAC_ADDR_LEN);
+
+ if ((pData != NULL) && (dataLen > 0))
+ wrqu.data.length = dataLen;
+ else
+ wrqu.data.length = 0;
+
+ wireless_send_event(pNetDev, eventType, &wrqu, (char *)pData);
+ return 0;
+}
+
+int RtmpOSWrielessEventSendExt(
+ IN PNET_DEV pNetDev,
+ IN UINT32 eventType,
+ IN INT flags,
+ IN PUCHAR pSrcMac,
+ IN PUCHAR pData,
+ IN UINT32 dataLen,
+ IN UINT32 family)
+{
+ union iwreq_data wrqu;
+
+ /* translate event type */
+ eventType = RtmpOSWirelessEventTranslate(eventType);
+
+ /* translate event type */
+ memset(&wrqu, 0, sizeof (wrqu));
+
+ if (flags > -1)
+ wrqu.data.flags = flags;
+
+ if (pSrcMac)
+ memcpy(wrqu.ap_addr.sa_data, pSrcMac, MAC_ADDR_LEN);
+
+ if ((pData != NULL) && (dataLen > 0))
+ wrqu.data.length = dataLen;
+
+ wrqu.addr.sa_family = family;
+
+ wireless_send_event(pNetDev, eventType, &wrqu, (char *)pData);
+ return 0;
+}
+
+int RtmpOSNetDevAddrSet(
+ IN UCHAR OpMode,
+ IN PNET_DEV pNetDev,
+ IN PUCHAR pMacAddr,
+ IN PUCHAR dev_name)
+{
+ struct net_device *net_dev;
+
+ net_dev = pNetDev;
+/* GET_PAD_FROM_NET_DEV(pAd, net_dev); */
+
+
+ NdisMoveMemory(net_dev->dev_addr, pMacAddr, 6);
+
+ return 0;
+}
+
+/*
+ * Assign the network dev name for created Ralink WiFi interface.
+ */
+static int RtmpOSNetDevRequestName(
+ IN INT32 MC_RowID,
+ IN UINT32 *pIoctlIF,
+ IN PNET_DEV dev,
+ IN PSTRING pPrefixStr,
+ IN INT devIdx)
+{
+ PNET_DEV existNetDev;
+ STRING suffixName[IFNAMSIZ];
+ STRING desiredName[IFNAMSIZ];
+ int ifNameIdx,
+ prefixLen,
+ slotNameLen;
+ int Status;
+
+ prefixLen = strlen(pPrefixStr);
+ ASSERT((prefixLen < IFNAMSIZ));
+
+ for (ifNameIdx = devIdx; ifNameIdx < 32; ifNameIdx++) {
+ memset(suffixName, 0, IFNAMSIZ);
+ memset(desiredName, 0, IFNAMSIZ);
+ strncpy(&desiredName[0], pPrefixStr, prefixLen);
+
+#ifdef MULTIPLE_CARD_SUPPORT
+ if (MC_RowID >= 0)
+ sprintf(suffixName, "%02d_%d", MC_RowID, ifNameIdx);
+ else
+#endif /* MULTIPLE_CARD_SUPPORT */
+ sprintf(suffixName, "%d", ifNameIdx);
+
+ slotNameLen = strlen(suffixName);
+ ASSERT(((slotNameLen + prefixLen) < IFNAMSIZ));
+ strcat(desiredName, suffixName);
+
+ existNetDev = RtmpOSNetDevGetByName(dev, &desiredName[0]);
+ if (existNetDev == NULL)
+ break;
+ else
+ RtmpOSNetDeviceRefPut(existNetDev);
+ }
+
+ if (ifNameIdx < 32) {
+#ifdef HOSTAPD_SUPPORT
+ *pIoctlIF = ifNameIdx;
+#endif /*HOSTAPD_SUPPORT */
+ strcpy(&dev->name[0], &desiredName[0]);
+ Status = NDIS_STATUS_SUCCESS;
+ } else {
+ DBGPRINT(RT_DEBUG_ERROR,
+ ("Cannot request DevName with preifx(%s) and in range(0~32) as suffix from OS!\n",
+ pPrefixStr));
+ Status = NDIS_STATUS_FAILURE;
+ }
+
+ return Status;
+}
+
+void RtmpOSNetDevClose(PNET_DEV pNetDev)
+{
+ dev_close(pNetDev);
+}
+
+void RtmpOSNetDevFree(PNET_DEV pNetDev)
+{
+ DEV_PRIV_INFO *pDevInfo = NULL;
+
+
+ ASSERT(pNetDev);
+
+ /* free assocaited private information */
+ pDevInfo = _RTMP_OS_NETDEV_GET_PRIV(pNetDev);
+ if (pDevInfo != NULL)
+ os_free_mem(NULL, pDevInfo);
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
+ free_netdev(pNetDev);
+#else
+ kfree(pNetDev);
+#endif
+
+#ifdef VENDOR_FEATURE4_SUPPORT
+ printk("OS_NumOfMemAlloc = %ld, OS_NumOfMemFree = %ld\n",
+ OS_NumOfMemAlloc, OS_NumOfMemFree);
+#endif /* VENDOR_FEATURE4_SUPPORT */
+#ifdef VENDOR_FEATURE2_SUPPORT
+ printk("OS_NumOfPktAlloc = %ld, OS_NumOfPktFree = %ld\n",
+ OS_NumOfPktAlloc, OS_NumOfPktFree);
+#endif /* VENDOR_FEATURE2_SUPPORT */
+}
+
+INT RtmpOSNetDevAlloc(
+ IN PNET_DEV *new_dev_p,
+ IN UINT32 privDataSize)
+{
+ *new_dev_p = NULL;
+
+ DBGPRINT(RT_DEBUG_TRACE,
+ ("Allocate a net device with private data size=%d!\n",
+ privDataSize));
+#if LINUX_VERSION_CODE <= 0x20402 /* Red Hat 7.1 */
+ *new_dev_p = alloc_netdev(privDataSize, "eth%d", ether_setup);
+#else
+ *new_dev_p = alloc_etherdev(privDataSize);
+#endif /* LINUX_VERSION_CODE */
+
+ if (*new_dev_p)
+ return NDIS_STATUS_SUCCESS;
+ else
+ return NDIS_STATUS_FAILURE;
+}
+
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,31)
+INT RtmpOSNetDevOpsAlloc(PVOID *pNetDevOps)
+{
+ *pNetDevOps = (PVOID) vmalloc(sizeof (struct net_device_ops));
+ if (*pNetDevOps) {
+ NdisZeroMemory(*pNetDevOps, sizeof (struct net_device_ops));
+ return NDIS_STATUS_SUCCESS;
+ } else {
+ return NDIS_STATUS_FAILURE;
+ }
+}
+#endif
+
+
+PNET_DEV RtmpOSNetDevGetByName(PNET_DEV pNetDev, PSTRING pDevName)
+{
+ PNET_DEV pTargetNetDev = NULL;
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,26)
+ pTargetNetDev = dev_get_by_name(dev_net(pNetDev), pDevName);
+#else
+ ASSERT(pNetDev);
+ pTargetNetDev = dev_get_by_name(pNetDev->nd_net, pDevName);
+#endif
+#else
+ pTargetNetDev = dev_get_by_name(pDevName);
+#endif /* KERNEL_VERSION(2,6,24) */
+
+#else
+ int devNameLen;
+
+ devNameLen = strlen(pDevName);
+ ASSERT((devNameLen <= IFNAMSIZ));
+
+ for (pTargetNetDev = dev_base; pTargetNetDev != NULL;
+ pTargetNetDev = pTargetNetDev->next) {
+ if (strncmp(pTargetNetDev->name, pDevName, devNameLen) == 0)
+ break;
+ }
+#endif /* KERNEL_VERSION(2,5,0) */
+
+ return pTargetNetDev;
+}
+
+
+void RtmpOSNetDeviceRefPut(PNET_DEV pNetDev)
+{
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
+ /*
+ every time dev_get_by_name is called, and it has returned a valid struct
+ net_device*, dev_put should be called afterwards, because otherwise the
+ machine hangs when the device is unregistered (since dev->refcnt > 1).
+ */
+ if (pNetDev)
+ dev_put(pNetDev);
+#endif /* LINUX_VERSION_CODE */
+}
+
+
+INT RtmpOSNetDevDestory(VOID *pReserved, PNET_DEV pNetDev)
+{
+
+ /* TODO: Need to fix this */
+ printk("WARNING: This function(%s) not implement yet!!!\n",
+ __FUNCTION__);
+ return 0;
+}
+
+
+void RtmpOSNetDevDetach(PNET_DEV pNetDev)
+{
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,31)
+ struct net_device_ops *pNetDevOps = (struct net_device_ops *)pNetDev->netdev_ops;
+#endif
+ int ret;
+
+ ret = rtnl_trylock();
+
+ unregister_netdevice(pNetDev);
+
+ if ( ret )
+ rtnl_unlock();
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,31)
+ vfree(pNetDevOps);
+#endif
+}
+
+
+void RtmpOSNetDevProtect(BOOLEAN lock_it)
+{
+
+/*
+ if (lock_it)
+ rtnl_lock();
+ else
+ rtnl_unlock();
+*/
+}
+
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
+static void RALINK_ET_DrvInfoGet(
+ struct net_device *pDev,
+ struct ethtool_drvinfo *pInfo)
+{
+ strcpy(pInfo->driver, "RALINK WLAN");
+
+
+ sprintf(pInfo->bus_info, "CSR 0x%lx", pDev->base_addr);
+}
+
+static struct ethtool_ops RALINK_Ethtool_Ops = {
+ .get_drvinfo = RALINK_ET_DrvInfoGet,
+};
+#endif
+
+
+int RtmpOSNetDevAttach(
+ IN UCHAR OpMode,
+ IN PNET_DEV pNetDev,
+ IN RTMP_OS_NETDEV_OP_HOOK *pDevOpHook)
+{
+ int ret,
+ rtnl_locked = FALSE;
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,31)
+ struct net_device_ops *pNetDevOps = (struct net_device_ops *)pNetDev->netdev_ops;
+#endif
+
+ DBGPRINT(RT_DEBUG_TRACE, ("RtmpOSNetDevAttach()--->\n"));
+
+ /* If we need hook some callback function to the net device structrue, now do it. */
+ if (pDevOpHook) {
+/* PRTMP_ADAPTER pAd = NULL; */
+
+/* GET_PAD_FROM_NET_DEV(pAd, pNetDev); */
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,31)
+ pNetDevOps->ndo_open = pDevOpHook->open;
+ pNetDevOps->ndo_stop = pDevOpHook->stop;
+ pNetDevOps->ndo_start_xmit =
+ (HARD_START_XMIT_FUNC) (pDevOpHook->xmit);
+ pNetDevOps->ndo_do_ioctl = pDevOpHook->ioctl;
+#else
+ pNetDev->open = pDevOpHook->open;
+ pNetDev->stop = pDevOpHook->stop;
+ pNetDev->hard_start_xmit =
+ (HARD_START_XMIT_FUNC) (pDevOpHook->xmit);
+ pNetDev->do_ioctl = pDevOpHook->ioctl;
+#endif
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
+ pNetDev->ethtool_ops = &RALINK_Ethtool_Ops;
+#endif
+
+ /* if you don't implement get_stats, just leave the callback function as NULL, a dummy
+ function will make kernel panic.
+ */
+ if (pDevOpHook->get_stats)
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,31)
+ pNetDevOps->ndo_get_stats = pDevOpHook->get_stats;
+#else
+ pNetDev->get_stats = pDevOpHook->get_stats;
+#endif
+
+ /* OS specific flags, here we used to indicate if we are virtual interface */
+/* pNetDev->priv_flags = pDevOpHook->priv_flags; */
+ RT_DEV_PRIV_FLAGS_SET(pNetDev, pDevOpHook->priv_flags);
+
+#if (WIRELESS_EXT < 21) && (WIRELESS_EXT >= 12)
+/* pNetDev->get_wireless_stats = rt28xx_get_wireless_stats; */
+ pNetDev->get_wireless_stats = pDevOpHook->get_wstats;
+#endif
+
+
+#ifdef CONFIG_APSTA_MIXED_SUPPORT
+#if WIRELESS_EXT >= 12
+ if (OpMode == OPMODE_AP) {
+/* pNetDev->wireless_handlers = &rt28xx_ap_iw_handler_def; */
+ pNetDev->wireless_handlers = pDevOpHook->iw_handler;
+ }
+#endif /*WIRELESS_EXT >= 12 */
+#endif /* CONFIG_APSTA_MIXED_SUPPORT */
+
+ /* copy the net device mac address to the net_device structure. */
+ NdisMoveMemory(pNetDev->dev_addr, &pDevOpHook->devAddr[0],
+ MAC_ADDR_LEN);
+
+ rtnl_locked = pDevOpHook->needProtcted;
+
+ }
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,31)
+ pNetDevOps->ndo_validate_addr = NULL;
+ /*pNetDev->netdev_ops = ops; */
+#else
+ pNetDev->validate_addr = NULL;
+#endif
+#endif
+
+ if (rtnl_locked)
+ ret = register_netdevice(pNetDev);
+ else
+ ret = register_netdev(pNetDev);
+
+ netif_stop_queue(pNetDev);
+
+ DBGPRINT(RT_DEBUG_TRACE, ("<---RtmpOSNetDevAttach(), ret=%d\n", ret));
+ if (ret == 0)
+ return NDIS_STATUS_SUCCESS;
+ else
+ return NDIS_STATUS_FAILURE;
+}
+
+PNET_DEV RtmpOSNetDevCreate(
+ IN INT32 MC_RowID,
+ IN UINT32 *pIoctlIF,
+ IN INT devType,
+ IN INT devNum,
+ IN INT privMemSize,
+ IN PSTRING pNamePrefix)
+{
+ struct net_device *pNetDev = NULL;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,31)
+ struct net_device_ops *pNetDevOps = NULL;
+#endif
+ int status;
+
+ /* allocate a new network device */
+ status = RtmpOSNetDevAlloc(&pNetDev, 0 /*privMemSize */ );
+ if (status != NDIS_STATUS_SUCCESS) {
+ /* allocation fail, exit */
+ DBGPRINT(RT_DEBUG_ERROR, ("Allocate network device fail (%s)...\n", pNamePrefix));
+ return NULL;
+ }
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,31)
+ status = RtmpOSNetDevOpsAlloc((PVOID) & pNetDevOps);
+ if (status != NDIS_STATUS_SUCCESS) {
+ /* error! no any available ra name can be used! */
+ DBGPRINT(RT_DEBUG_TRACE, ("Allocate net device ops fail!\n"));
+ RtmpOSNetDevFree(pNetDev);
+
+ return NULL;
+ } else {
+ DBGPRINT(RT_DEBUG_TRACE, ("Allocate net device ops success!\n"));
+ pNetDev->netdev_ops = pNetDevOps;
+ }
+#endif
+ /* find a available interface name, max 32 interfaces */
+ status = RtmpOSNetDevRequestName(MC_RowID, pIoctlIF, pNetDev, pNamePrefix, devNum);
+ if (status != NDIS_STATUS_SUCCESS) {
+ /* error! no any available ra name can be used! */
+ DBGPRINT(RT_DEBUG_ERROR, ("Assign interface name (%s with suffix 0~32) failed...\n",
+ pNamePrefix));
+ RtmpOSNetDevFree(pNetDev);
+
+ return NULL;
+ } else {
+ DBGPRINT(RT_DEBUG_TRACE, ("The name of the new %s interface is %s...\n",
+ pNamePrefix, pNetDev->name));
+ }
+
+ return pNetDev;
+}
+
+
+
+#ifdef CONFIG_AP_SUPPORT
+UCHAR VLAN_8023_Header_Copy(
+ IN USHORT VLAN_VID,
+ IN USHORT VLAN_Priority,
+ IN PUCHAR pHeader802_3,
+ IN UINT HdrLen,
+ OUT PUCHAR pData,
+ IN UCHAR FromWhichBSSID,
+ IN UCHAR *TPID)
+{
+ UINT16 TCI;
+ UCHAR VLAN_Size = 0;
+
+ if (VLAN_VID != 0) {
+ /* need to insert VLAN tag */
+ VLAN_Size = LENGTH_802_1Q;
+
+ /* make up TCI field */
+ TCI = (VLAN_VID & 0x0fff) | ((VLAN_Priority & 0x7) << 13);
+
+#ifndef RT_BIG_ENDIAN
+ TCI = SWAP16(TCI);
+#endif /* RT_BIG_ENDIAN */
+
+ /* copy dst + src MAC (12B) */
+ memcpy(pData, pHeader802_3, LENGTH_802_3_NO_TYPE);
+
+ /* copy VLAN tag (4B) */
+ /* do NOT use memcpy to speed up */
+ *(UINT16 *) (pData + LENGTH_802_3_NO_TYPE) = *(UINT16 *) TPID;
+ *(UINT16 *) (pData + LENGTH_802_3_NO_TYPE + 2) = TCI;
+
+ /* copy type/len (2B) */
+ *(UINT16 *) (pData + LENGTH_802_3_NO_TYPE + LENGTH_802_1Q) =
+ *(UINT16 *) & pHeader802_3[LENGTH_802_3 -
+ LENGTH_802_3_TYPE];
+
+ /* copy tail if exist */
+ if (HdrLen > LENGTH_802_3)
+ memcpy(pData + LENGTH_802_3 + LENGTH_802_1Q, pHeader802_3 + LENGTH_802_3, HdrLen - LENGTH_802_3);
+ }
+ else
+ {
+ /* no VLAN tag is needed to insert */
+ memcpy(pData, pHeader802_3, HdrLen);
+ }
+
+ return VLAN_Size;
+}
+#endif /* CONFIG_AP_SUPPORT */
+
+
+/*
+========================================================================
+Routine Description:
+ Allocate memory for adapter control block.
+
+Arguments:
+ pAd Pointer to our adapter
+
+Return Value:
+ NDIS_STATUS_SUCCESS
+ NDIS_STATUS_FAILURE
+ NDIS_STATUS_RESOURCES
+
+Note:
+========================================================================
+*/
+NDIS_STATUS AdapterBlockAllocateMemory(VOID *handle, VOID **ppAd, UINT32 SizeOfpAd)
+{
+#ifdef OS_ABL_FUNC_SUPPORT
+ /* get offset for sk_buff */
+ {
+ struct sk_buff *pPkt = NULL;
+
+ pPkt = kmalloc(sizeof (struct sk_buff), GFP_ATOMIC);
+ if (pPkt == NULL) {
+ *ppAd = NULL;
+ return NDIS_STATUS_FAILURE;
+ }
+
+ RTPktOffsetData = (ULONG) (&(pPkt->data)) - (ULONG) pPkt;
+ RTPktOffsetLen = (ULONG) (&(pPkt->len)) - (ULONG) pPkt;
+ RTPktOffsetCB = (ULONG) (pPkt->cb) - (ULONG) pPkt;
+ kfree(pPkt);
+
+ DBGPRINT(RT_DEBUG_TRACE, ("packet> data offset = %lu\n", RTPktOffsetData));
+ DBGPRINT(RT_DEBUG_TRACE, ("packet> len offset = %lu\n", RTPktOffsetLen));
+ DBGPRINT(RT_DEBUG_TRACE, ("packet> cb offset = %lu\n", RTPktOffsetCB));
+ }
+#endif /* OS_ABL_FUNC_SUPPORT */
+
+/* *ppAd = (PVOID)vmalloc(sizeof(RTMP_ADAPTER)); //pci_alloc_consistent(pci_dev, sizeof(RTMP_ADAPTER), phy_addr); */
+ *ppAd = (PVOID) vmalloc(SizeOfpAd); /*pci_alloc_consistent(pci_dev, sizeof(RTMP_ADAPTER), phy_addr); */
+ if (*ppAd) {
+ NdisZeroMemory(*ppAd, SizeOfpAd);
+ return NDIS_STATUS_SUCCESS;
+ } else
+ return NDIS_STATUS_FAILURE;
+}
+
+
+/* ========================================================================== */
+
+UINT RtmpOsWirelessExtVerGet(VOID)
+{
+ return WIRELESS_EXT;
+}
+
+
+VOID RtmpDrvAllMacPrint(
+ IN VOID *pReserved,
+ IN UINT32 *pBufMac,
+ IN UINT32 AddrStart,
+ IN UINT32 AddrEnd,
+ IN UINT32 AddrStep)
+{
+ struct file *file_w;
+ PSTRING fileName = "MacDump.txt";
+ mm_segment_t orig_fs;
+ STRING *msg;
+ UINT32 macAddr = 0, macValue = 0;
+
+ os_alloc_mem(NULL, (UCHAR **)&msg, 1024);
+ if (!msg)
+ return;
+
+ orig_fs = get_fs();
+ set_fs(KERNEL_DS);
+
+ /* open file */
+ file_w = filp_open(fileName, O_WRONLY | O_CREAT, 0);
+ if (IS_ERR(file_w)) {
+ DBGPRINT(RT_DEBUG_TRACE,
+ ("-->2) %s: Error %ld opening %s\n", __FUNCTION__,
+ -PTR_ERR(file_w), fileName));
+ } else {
+ if (file_w->f_op && file_w->f_op->write) {
+ file_w->f_pos = 0;
+ macAddr = AddrStart;
+
+ while (macAddr <= AddrEnd) {
+/* RTMP_IO_READ32(pAd, macAddr, &macValue); // sample */
+ macValue = *pBufMac++;
+ sprintf(msg, "%04x = %08x\n", macAddr, macValue);
+
+ /* write data to file */
+ file_w->f_op->write(file_w, msg, strlen(msg), &file_w->f_pos);
+
+ printk("%s", msg);
+ macAddr += AddrStep;
+ }
+ sprintf(msg, "\nDump all MAC values to %s\n", fileName);
+ }
+ filp_close(file_w, NULL);
+ }
+ set_fs(orig_fs);
+ os_free_mem(NULL, msg);
+}
+
+
+VOID RtmpDrvAllE2PPrint(
+ IN VOID *pReserved,
+ IN USHORT *pMacContent,
+ IN UINT32 AddrEnd,
+ IN UINT32 AddrStep)
+{
+ struct file *file_w;
+ PSTRING fileName = "EEPROMDump.txt";
+ mm_segment_t orig_fs;
+ STRING *msg;
+ USHORT eepAddr = 0;
+ USHORT eepValue;
+
+ os_alloc_mem(NULL, (UCHAR **)&msg, 1024);
+ if (!msg)
+ return;
+
+ orig_fs = get_fs();
+ set_fs(KERNEL_DS);
+
+ /* open file */
+ file_w = filp_open(fileName, O_WRONLY | O_CREAT, 0);
+ if (IS_ERR(file_w)) {
+ DBGPRINT(RT_DEBUG_TRACE,
+ ("-->2) %s: Error %ld opening %s\n", __FUNCTION__,
+ -PTR_ERR(file_w), fileName));
+ } else {
+ if (file_w->f_op && file_w->f_op->write) {
+ file_w->f_pos = 0;
+ eepAddr = 0x00;
+
+ while (eepAddr <= AddrEnd) {
+ eepValue = *pMacContent;
+ sprintf(msg, "%08x = %04x\n", eepAddr, eepValue);
+
+ /* write data to file */
+ file_w->f_op->write(file_w, msg, strlen(msg), &file_w->f_pos);
+
+ printk("%s", msg);
+ eepAddr += AddrStep;
+ pMacContent += (AddrStep >> 1);
+ }
+ sprintf(msg, "\nDump all EEPROM values to %s\n",
+ fileName);
+ }
+ filp_close(file_w, NULL);
+ }
+ set_fs(orig_fs);
+ os_free_mem(NULL, msg);
+}
+
+
+VOID RtmpDrvAllRFPrint(
+ IN VOID *pReserved,
+ IN UINT32 *pBuf,
+ IN UINT32 BufLen)
+{
+ struct file *file_w;
+ PSTRING fileName = "RFDump.txt";
+ mm_segment_t orig_fs;
+ UINT32 macAddr = 0, macValue = 0;
+
+ orig_fs = get_fs();
+ set_fs(KERNEL_DS);
+
+ /* open file */
+ file_w = filp_open(fileName, O_WRONLY | O_CREAT, 0);
+ if (IS_ERR(file_w)) {
+ DBGPRINT(RT_DEBUG_TRACE,
+ ("-->2) %s: Error %ld opening %s\n", __FUNCTION__,
+ -PTR_ERR(file_w), fileName));
+ } else {
+ if (file_w->f_op && file_w->f_op->write) {
+ file_w->f_pos = 0;
+ /* write data to file */
+ file_w->f_op->write(file_w, pBuf, BufLen, &file_w->f_pos);
+ }
+ filp_close(file_w, NULL);
+ }
+ set_fs(orig_fs);
+}
+
+/*
+========================================================================
+Routine Description:
+ Check if the network interface is up.
+
+Arguments:
+ *pDev - Network Interface
+
+Return Value:
+ None
+
+Note:
+========================================================================
+*/
+BOOLEAN RtmpOSNetDevIsUp(VOID *pDev)
+{
+ struct net_device *pNetDev = (struct net_device *)pDev;
+
+ if ((pNetDev == NULL) || !(pNetDev->flags & IFF_UP))
+ return FALSE;
+
+ return TRUE;
+}
+
+
+/*
+========================================================================
+Routine Description:
+ Wake up the command thread.
+
+Arguments:
+ pAd - WLAN control block pointer
+
+Return Value:
+ None
+
+Note:
+========================================================================
+*/
+VOID RtmpOsCmdUp(RTMP_OS_TASK *pCmdQTask)
+{
+ OS_TASK *pTask = RTMP_OS_TASK_GET(pCmdQTask);
+#ifdef KTHREAD_SUPPORT
+ pTask->kthread_running = TRUE;
+ wake_up(&pTask->kthread_q);
+#else
+ CHECK_PID_LEGALITY(pTask->taskPID) {
+ RTMP_SEM_EVENT_UP(&(pTask->taskSema));
+ }
+#endif /* KTHREAD_SUPPORT */
+}
+
+
+/*
+========================================================================
+Routine Description:
+ Wake up USB Mlme thread.
+
+Arguments:
+ pAd - WLAN control block pointer
+
+Return Value:
+ None
+
+Note:
+========================================================================
+*/
+VOID RtmpOsMlmeUp(IN RTMP_OS_TASK *pMlmeQTask)
+{
+#ifdef RTMP_USB_SUPPORT
+ OS_TASK *pTask = RTMP_OS_TASK_GET(pMlmeQTask);
+
+#ifdef KTHREAD_SUPPORT
+ if ((pTask != NULL) && (pTask->kthread_task)) {
+ pTask->kthread_running = TRUE;
+ wake_up(&pTask->kthread_q);
+ }
+#else
+ if (pTask != NULL) {
+ CHECK_PID_LEGALITY(pTask->taskPID) {
+ RTMP_SEM_EVENT_UP(&(pTask->taskSema));
+ }
+ }
+#endif /* KTHREAD_SUPPORT */
+#endif /* RTMP_USB_SUPPORT */
+}
+
+
+/*
+========================================================================
+Routine Description:
+ Check if the file is error.
+
+Arguments:
+ pFile - the file
+
+Return Value:
+ OK or any error
+
+Note:
+ rt_linux.h, not rt_drv.h
+========================================================================
+*/
+INT32 RtmpOsFileIsErr(IN VOID *pFile)
+{
+ return IS_FILE_OPEN_ERR(pFile);
+}
+
+int RtmpOSIRQRelease(
+ IN PNET_DEV pNetDev,
+ IN UINT32 infType,
+ IN PPCI_DEV pci_dev,
+ IN BOOLEAN *pHaveMsi)
+{
+ struct net_device *net_dev = (struct net_device *)pNetDev;
+
+
+
+ return 0;
+}
+
+
+/*
+========================================================================
+Routine Description:
+ Enable or disable wireless event sent.
+
+Arguments:
+ pReserved - Reserved
+ FlgIsWEntSup - TRUE or FALSE
+
+Return Value:
+ None
+
+Note:
+========================================================================
+*/
+VOID RtmpOsWlanEventSet(
+ IN VOID *pReserved,
+ IN BOOLEAN *pCfgWEnt,
+ IN BOOLEAN FlgIsWEntSup)
+{
+#if WIRELESS_EXT >= 15
+/* pAd->CommonCfg.bWirelessEvent = FlgIsWEntSup; */
+ *pCfgWEnt = FlgIsWEntSup;
+#else
+ *pCfgWEnt = 0; /* disable */
+#endif
+}
+
+/*
+========================================================================
+Routine Description:
+ vmalloc
+
+Arguments:
+ Size - memory size
+
+Return Value:
+ the memory
+
+Note:
+========================================================================
+*/
+VOID *RtmpOsVmalloc(ULONG Size)
+{
+ return vmalloc(Size);
+}
+
+/*
+========================================================================
+Routine Description:
+ vfree
+
+Arguments:
+ pMem - the memory
+
+Return Value:
+ None
+
+Note:
+========================================================================
+*/
+VOID RtmpOsVfree(VOID *pMem)
+{
+ if (pMem != NULL)
+ vfree(pMem);
+}
+
+/*
+========================================================================
+Routine Description:
+ Get network interface name.
+
+Arguments:
+ pDev - the device
+
+Return Value:
+ the name
+
+Note:
+========================================================================
+*/
+char *RtmpOsGetNetDevName(VOID *pDev)
+{
+ return ((PNET_DEV) pDev)->name;
+}
+
+/*
+========================================================================
+Routine Description:
+ Assign protocol to the packet.
+
+Arguments:
+ pPkt - the packet
+
+Return Value:
+ None
+
+Note:
+========================================================================
+*/
+VOID RtmpOsPktProtocolAssign(PNDIS_PACKET pNetPkt)
+{
+ struct sk_buff *pRxPkt = RTPKT_TO_OSPKT(pNetPkt);
+ pRxPkt->protocol = eth_type_trans(pRxPkt, pRxPkt->dev);
+}
+
+
+BOOLEAN RtmpOsStatsAlloc(
+ IN VOID **ppStats,
+ IN VOID **ppIwStats)
+{
+ os_alloc_mem(NULL, (UCHAR **) ppStats, sizeof (struct net_device_stats));
+ if ((*ppStats) == NULL)
+ return FALSE;
+ NdisZeroMemory((UCHAR *) *ppStats, sizeof (struct net_device_stats));
+
+#if WIRELESS_EXT >= 12
+ os_alloc_mem(NULL, (UCHAR **) ppIwStats, sizeof (struct iw_statistics));
+ if ((*ppIwStats) == NULL) {
+ os_free_mem(NULL, *ppStats);
+ return FALSE;
+ }
+ NdisZeroMemory((UCHAR *)* ppIwStats, sizeof (struct iw_statistics));
+#endif
+
+ return TRUE;
+}
+
+/*
+========================================================================
+Routine Description:
+ Pass the received packet to OS.
+
+Arguments:
+ pPkt - the packet
+
+Return Value:
+ None
+
+Note:
+========================================================================
+*/
+VOID RtmpOsPktRcvHandle(PNDIS_PACKET pNetPkt)
+{
+ struct sk_buff *pRxPkt = RTPKT_TO_OSPKT(pNetPkt);
+
+#ifdef CONFIG_RX_CSO_SUPPORT
+
+ if (RTMP_GET_TCP_CHKSUM_FAIL(pNetPkt))
+ pRxPkt->ip_summed = CHECKSUM_NONE;
+ else
+ pRxPkt->ip_summed = CHECKSUM_UNNECESSARY;
+
+#endif
+
+ netif_rx(pRxPkt);
+}
+
+
+VOID RtmpOsTaskPidInit(RTMP_OS_PID *pPid)
+{
+ *pPid = THREAD_PID_INIT_VALUE;
+}
+
+/*
+========================================================================
+Routine Description:
+ Get the network interface for the packet.
+
+Arguments:
+ pPkt - the packet
+
+Return Value:
+ None
+
+Note:
+========================================================================
+*/
+PNET_DEV RtmpOsPktNetDevGet(VOID *pPkt)
+{
+ return GET_OS_PKT_NETDEV(pPkt);
+}
+
+
+#ifdef IAPP_SUPPORT
+/* Layer 2 Update frame to switch/bridge */
+/* For any Layer2 devices, e.g., bridges, switches and other APs, the frame
+ can update their forwarding tables with the correct port to reach the new
+ location of the STA */
+typedef struct GNU_PACKED _RT_IAPP_L2_UPDATE_FRAME {
+
+ UCHAR DA[ETH_ALEN]; /* broadcast MAC address */
+ UCHAR SA[ETH_ALEN]; /* the MAC address of the STA that has just associated
+ or reassociated */
+ USHORT Len; /* 8 octets */
+ UCHAR DSAP; /* null */
+ UCHAR SSAP; /* null */
+ UCHAR Control; /* reference to IEEE Std 802.2 */
+ UCHAR XIDInfo[3]; /* reference to IEEE Std 802.2 */
+} RT_IAPP_L2_UPDATE_FRAME, *PRT_IAPP_L2_UPDATE_FRAME;
+
+
+PNDIS_PACKET RtmpOsPktIappMakeUp(
+ IN PNET_DEV pNetDev,
+ IN UINT8 *pMac)
+{
+ RT_IAPP_L2_UPDATE_FRAME frame_body;
+ INT size = sizeof (RT_IAPP_L2_UPDATE_FRAME);
+ PNDIS_PACKET pNetBuf;
+
+ if (pNetDev == NULL)
+ return NULL;
+
+ pNetBuf = RtmpOSNetPktAlloc(NULL, size);
+ if (!pNetBuf) {
+ DBGPRINT(RT_DEBUG_ERROR, ("Error! Can't allocate a skb.\n"));
+ return NULL;
+ }
+
+ /* init the update frame body */
+ NdisZeroMemory(&frame_body, size);
+
+ memset(frame_body.DA, 0xFF, ETH_ALEN);
+ memcpy(frame_body.SA, pMac, ETH_ALEN);
+
+ frame_body.Len = OS_HTONS(ETH_ALEN);
+ frame_body.DSAP = 0;
+ frame_body.SSAP = 0x01;
+ frame_body.Control = 0xAF;
+
+ frame_body.XIDInfo[0] = 0x81;
+ frame_body.XIDInfo[1] = 1;
+ frame_body.XIDInfo[2] = 1 << 1;
+
+ SET_OS_PKT_NETDEV(pNetBuf, pNetDev);
+ skb_reserve(pNetBuf, 2);
+ memcpy(skb_put(pNetBuf, size), &frame_body, size);
+ return pNetBuf;
+}
+#endif /* IAPP_SUPPORT */
+
+
+VOID RtmpOsPktNatMagicTag(PNDIS_PACKET pNetPkt)
+{
+}
+
+VOID RtmpOsPktNatNone(PNDIS_PACKET pNetPkt)
+{
+}
+
+
+#ifdef RT_CFG80211_SUPPORT
+/* all available channels */
+UCHAR Cfg80211_Chan[] = {
+ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
+
+ /* 802.11 UNI / HyperLan 2 */
+ 36, 38, 40, 44, 46, 48, 52, 54, 56, 60, 62, 64,
+
+ /* 802.11 HyperLan 2 */
+ 100, 104, 108, 112, 116, 118, 120, 124, 126, 128, 132, 134, 136,
+
+ /* 802.11 UNII */
+ 140, 149, 151, 153, 157, 159, 161, 165, 167, 169, 171, 173,
+
+ /* Japan */
+ 184, 188, 192, 196, 208, 212, 216,
+};
+
+/*
+ Array of bitrates the hardware can operate with
+ in this band. Must be sorted to give a valid "supported
+ rates" IE, i.e. CCK rates first, then OFDM.
+
+ For HT, assign MCS in another structure, ieee80211_sta_ht_cap.
+*/
+const struct ieee80211_rate Cfg80211_SupRate[12] = {
+ {
+ .flags = IEEE80211_RATE_SHORT_PREAMBLE,
+ .bitrate = 10,
+ .hw_value = 0,
+ .hw_value_short = 0,
+ },
+ {
+ .flags = IEEE80211_RATE_SHORT_PREAMBLE,
+ .bitrate = 20,
+ .hw_value = 1,
+ .hw_value_short = 1,
+ },
+ {
+ .flags = IEEE80211_RATE_SHORT_PREAMBLE,
+ .bitrate = 55,
+ .hw_value = 2,
+ .hw_value_short = 2,
+ },
+ {
+ .flags = IEEE80211_RATE_SHORT_PREAMBLE,
+ .bitrate = 110,
+ .hw_value = 3,
+ .hw_value_short = 3,
+ },
+ {
+ .flags = 0,
+ .bitrate = 60,
+ .hw_value = 4,
+ .hw_value_short = 4,
+ },
+ {
+ .flags = 0,
+ .bitrate = 90,
+ .hw_value = 5,
+ .hw_value_short = 5,
+ },
+ {
+ .flags = 0,
+ .bitrate = 120,
+ .hw_value = 6,
+ .hw_value_short = 6,
+ },
+ {
+ .flags = 0,
+ .bitrate = 180,
+ .hw_value = 7,
+ .hw_value_short = 7,
+ },
+ {
+ .flags = 0,
+ .bitrate = 240,
+ .hw_value = 8,
+ .hw_value_short = 8,
+ },
+ {
+ .flags = 0,
+ .bitrate = 360,
+ .hw_value = 9,
+ .hw_value_short = 9,
+ },
+ {
+ .flags = 0,
+ .bitrate = 480,
+ .hw_value = 10,
+ .hw_value_short = 10,
+ },
+ {
+ .flags = 0,
+ .bitrate = 540,
+ .hw_value = 11,
+ .hw_value_short = 11,
+ },
+};
+
+static const UINT32 CipherSuites[] = {
+ WLAN_CIPHER_SUITE_WEP40,
+ WLAN_CIPHER_SUITE_WEP104,
+ WLAN_CIPHER_SUITE_TKIP,
+ WLAN_CIPHER_SUITE_CCMP,
+};
+
+/*
+========================================================================
+Routine Description:
+ UnRegister MAC80211 Module.
+
+Arguments:
+ pCB - CFG80211 control block pointer
+ pNetDev - Network device
+
+Return Value:
+ NONE
+
+Note:
+========================================================================
+*/
+VOID CFG80211OS_UnRegister(
+ IN VOID *pCB,
+ IN VOID *pNetDevOrg)
+{
+ CFG80211_CB *pCfg80211_CB = (CFG80211_CB *)pCB;
+ struct net_device *pNetDev = (struct net_device *)pNetDevOrg;
+
+
+ /* unregister */
+ if (pCfg80211_CB->pCfg80211_Wdev != NULL)
+ {
+ DBGPRINT(RT_DEBUG_ERROR, ("80211> unregister/free wireless device\n"));
+
+ /*
+ Must unregister, or you will suffer problem when you change
+ regulatory domain by using iw.
+ */
+
+#ifdef RFKILL_HW_SUPPORT
+ wiphy_rfkill_stop_polling(pCfg80211_CB->pCfg80211_Wdev->wiphy);
+#endif /* RFKILL_HW_SUPPORT */
+ wiphy_unregister(pCfg80211_CB->pCfg80211_Wdev->wiphy);
+ wiphy_free(pCfg80211_CB->pCfg80211_Wdev->wiphy);
+ kfree(pCfg80211_CB->pCfg80211_Wdev);
+
+ if (pCfg80211_CB->pCfg80211_Channels != NULL)
+ kfree(pCfg80211_CB->pCfg80211_Channels);
+
+ if (pCfg80211_CB->pCfg80211_Rates != NULL)
+ kfree(pCfg80211_CB->pCfg80211_Rates);
+
+ pCfg80211_CB->pCfg80211_Wdev = NULL;
+ pCfg80211_CB->pCfg80211_Channels = NULL;
+ pCfg80211_CB->pCfg80211_Rates = NULL;
+
+ /* must reset to NULL; or kernel will panic in unregister_netdev */
+ pNetDev->ieee80211_ptr = NULL;
+ SET_NETDEV_DEV(pNetDev, NULL);
+ }
+
+ os_free_mem(NULL, pCfg80211_CB);
+}
+
+
+/*
+========================================================================
+Routine Description:
+ Initialize wireless channel in 2.4GHZ and 5GHZ.
+
+Arguments:
+ pAd - WLAN control block pointer
+ pWiphy - WLAN PHY interface
+ pChannels - Current channel info
+ pRates - Current rate info
+
+Return Value:
+ TRUE - init successfully
+ FALSE - init fail
+
+Note:
+ TX Power related:
+
+ 1. Suppose we can send power to 15dBm in the board.
+ 2. A value 0x0 ~ 0x1F for a channel. We will adjust it based on 15dBm/
+ 54Mbps. So if value == 0x07, the TX power of 54Mbps is 15dBm and
+ the value is 0x07 in the EEPROM.
+ 3. Based on TX power value of 54Mbps/channel, adjust another value
+ 0x0 ~ 0xF for other data rate. (-6dBm ~ +6dBm)
+
+ Other related factors:
+ 1. TX power percentage from UI/users;
+ 2. Maximum TX power limitation in the regulatory domain.
+========================================================================
+*/
+BOOLEAN CFG80211_SupBandInit(
+ IN VOID *pCB,
+ IN CFG80211_BAND *pBandInfo,
+ IN VOID *pWiphyOrg,
+ IN VOID *pChannelsOrg,
+ IN VOID *pRatesOrg)
+{
+ CFG80211_CB *pCfg80211_CB = (CFG80211_CB *)pCB;
+ struct wiphy *pWiphy = (struct wiphy *)pWiphyOrg;
+ struct ieee80211_channel *pChannels = (struct ieee80211_channel *)pChannelsOrg;
+ struct ieee80211_rate *pRates = (struct ieee80211_rate *)pRatesOrg;
+ struct ieee80211_supported_band *pBand;
+ UINT32 NumOfChan, NumOfRate;
+ UINT32 IdLoop;
+ UINT32 CurTxPower;
+
+
+ /* sanity check */
+ if (pBandInfo->RFICType == 0)
+ pBandInfo->RFICType = RFIC_24GHZ | RFIC_5GHZ;
+
+ CFG80211DBG(RT_DEBUG_ERROR, ("80211> RFICType = %d\n",
+ pBandInfo->RFICType));
+
+ /* init */
+ if (pBandInfo->RFICType & RFIC_5GHZ)
+ NumOfChan = CFG80211_NUM_OF_CHAN_2GHZ + CFG80211_NUM_OF_CHAN_5GHZ;
+ else
+ NumOfChan = CFG80211_NUM_OF_CHAN_2GHZ;
+
+ if (pBandInfo->FlgIsBMode == TRUE)
+ NumOfRate = 4;
+ else
+ NumOfRate = 4 + 8;
+
+ if (pChannels == NULL)
+ {
+ pChannels = kzalloc(sizeof(*pChannels) * NumOfChan, GFP_KERNEL);
+ if (!pChannels)
+ {
+ DBGPRINT(RT_DEBUG_ERROR, ("80211> ieee80211_channel allocation fail!\n"));
+ return FALSE;
+ }
+ }
+
+ CFG80211DBG(RT_DEBUG_ERROR, ("80211> Number of channel = %d\n",
+ CFG80211_NUM_OF_CHAN_5GHZ));
+
+ if (pRates == NULL)
+ {
+ pRates = kzalloc(sizeof(*pRates) * NumOfRate, GFP_KERNEL);
+ if (!pRates)
+ {
+ os_free_mem(NULL, pChannels);
+ DBGPRINT(RT_DEBUG_ERROR, ("80211> ieee80211_rate allocation fail!\n"));
+ return FALSE;
+ }
+ }
+
+ CFG80211DBG(RT_DEBUG_ERROR, ("80211> Number of rate = %d\n", NumOfRate));
+
+ /* get TX power */
+#ifdef SINGLE_SKU
+ CurTxPower = pBandInfo->DefineMaxTxPwr; /* dBm */
+#else
+ CurTxPower = 0; /* unknown */
+#endif /* SINGLE_SKU */
+
+ CFG80211DBG(RT_DEBUG_ERROR, ("80211> CurTxPower = %d dBm\n", CurTxPower));
+
+ /* init channel */
+ for(IdLoop=0; IdLoop<NumOfChan; IdLoop++)
+ {
+ pChannels[IdLoop].center_freq = \
+ ieee80211_channel_to_frequency(Cfg80211_Chan[IdLoop]);
+ pChannels[IdLoop].hw_value = IdLoop;
+
+ if (IdLoop < CFG80211_NUM_OF_CHAN_2GHZ)
+ pChannels[IdLoop].max_power = CurTxPower;
+ else
+ pChannels[IdLoop].max_power = CurTxPower;
+
+ pChannels[IdLoop].max_antenna_gain = 0xff;
+ }
+
+ /* init rate */
+ for(IdLoop=0; IdLoop<NumOfRate; IdLoop++)
+ memcpy(&pRates[IdLoop], &Cfg80211_SupRate[IdLoop], sizeof(*pRates));
+
+ pBand = &pCfg80211_CB->Cfg80211_bands[IEEE80211_BAND_2GHZ];
+ if (pBandInfo->RFICType & RFIC_24GHZ)
+ {
+ pBand->n_channels = CFG80211_NUM_OF_CHAN_2GHZ;
+ pBand->n_bitrates = NumOfRate;
+ pBand->channels = pChannels;
+ pBand->bitrates = pRates;
+
+#ifdef DOT11_N_SUPPORT
+ /* for HT, assign pBand->ht_cap */
+ pBand->ht_cap.ht_supported = true;
+ pBand->ht_cap.cap = IEEE80211_HT_CAP_SUP_WIDTH_20_40 |
+ IEEE80211_HT_CAP_SM_PS |
+ IEEE80211_HT_CAP_SGI_40 |
+ IEEE80211_HT_CAP_DSSSCCK40;
+ pBand->ht_cap.ampdu_factor = 3; /* 2 ^ 16 */
+ pBand->ht_cap.ampdu_density = pBandInfo->MpduDensity;
+
+ memset(&pBand->ht_cap.mcs, 0, sizeof(pBand->ht_cap.mcs));
+ CFG80211DBG(RT_DEBUG_ERROR,
+ ("80211> TxStream = %d\n", pBandInfo->TxStream));
+
+ switch(pBandInfo->TxStream)
+ {
+ case 1:
+ default:
+ pBand->ht_cap.mcs.rx_mask[0] = 0xff;
+ break;
+
+ case 2:
+ pBand->ht_cap.mcs.rx_mask[0] = 0xff;
+ pBand->ht_cap.mcs.rx_mask[1] = 0xff;
+ break;
+
+ case 3:
+ pBand->ht_cap.mcs.rx_mask[0] = 0xff;
+ pBand->ht_cap.mcs.rx_mask[1] = 0xff;
+ pBand->ht_cap.mcs.rx_mask[2] = 0xff;
+ break;
+ }
+
+ pBand->ht_cap.mcs.tx_params = IEEE80211_HT_MCS_TX_DEFINED;
+#endif /* DOT11_N_SUPPORT */
+
+ pWiphy->bands[IEEE80211_BAND_2GHZ] = pBand;
+ }
+ else
+ {
+ pWiphy->bands[IEEE80211_BAND_2GHZ] = NULL;
+ pBand->channels = NULL;
+ pBand->bitrates = NULL;
+ }
+
+ pBand = &pCfg80211_CB->Cfg80211_bands[IEEE80211_BAND_5GHZ];
+ if (pBandInfo->RFICType & RFIC_5GHZ)
+ {
+ pBand->n_channels = CFG80211_NUM_OF_CHAN_5GHZ;
+ pBand->n_bitrates = NumOfRate - 4;
+ pBand->channels = &pChannels[CFG80211_NUM_OF_CHAN_2GHZ];
+ pBand->bitrates = &pRates[4];
+
+ /* for HT, assign pBand->ht_cap */
+#ifdef DOT11_N_SUPPORT
+ /* for HT, assign pBand->ht_cap */
+ pBand->ht_cap.ht_supported = true;
+ pBand->ht_cap.cap = IEEE80211_HT_CAP_SUP_WIDTH_20_40 |
+ IEEE80211_HT_CAP_SM_PS |
+ IEEE80211_HT_CAP_SGI_40 |
+ IEEE80211_HT_CAP_DSSSCCK40;
+ pBand->ht_cap.ampdu_factor = 3; /* 2 ^ 16 */
+ pBand->ht_cap.ampdu_density = pBandInfo->MpduDensity;
+
+ memset(&pBand->ht_cap.mcs, 0, sizeof(pBand->ht_cap.mcs));
+ switch(pBandInfo->RxStream)
+ {
+ case 1:
+ default:
+ pBand->ht_cap.mcs.rx_mask[0] = 0xff;
+ break;
+
+ case 2:
+ pBand->ht_cap.mcs.rx_mask[0] = 0xff;
+ pBand->ht_cap.mcs.rx_mask[1] = 0xff;
+ break;
+
+ case 3:
+ pBand->ht_cap.mcs.rx_mask[0] = 0xff;
+ pBand->ht_cap.mcs.rx_mask[1] = 0xff;
+ pBand->ht_cap.mcs.rx_mask[2] = 0xff;
+ break;
+ }
+
+ pBand->ht_cap.mcs.tx_params = IEEE80211_HT_MCS_TX_DEFINED;
+#endif /* DOT11_N_SUPPORT */
+
+ pWiphy->bands[IEEE80211_BAND_5GHZ] = pBand;
+ }
+ else
+ {
+ pWiphy->bands[IEEE80211_BAND_5GHZ] = NULL;
+ pBand->channels = NULL;
+ pBand->bitrates = NULL;
+ }
+
+ pCfg80211_CB->pCfg80211_Channels = pChannels;
+ pCfg80211_CB->pCfg80211_Rates = pRates;
+
+ return TRUE;
+}
+
+
+/*
+========================================================================
+Routine Description:
+ Re-Initialize wireless channel/PHY in 2.4GHZ and 5GHZ.
+
+Arguments:
+ pCB - CFG80211 control block pointer
+ pBandInfo - Band information
+
+Return Value:
+ TRUE - re-init successfully
+ FALSE - re-init fail
+
+Note:
+ CFG80211_SupBandInit() is called in xx_probe().
+ But we do not have complete chip information in xx_probe() so we
+ need to re-init bands in xx_open().
+========================================================================
+*/
+BOOLEAN CFG80211OS_SupBandReInit(
+ IN VOID *pCB,
+ IN CFG80211_BAND *pBandInfo)
+{
+ CFG80211_CB *pCfg80211_CB = (CFG80211_CB *)pCB;
+ struct wiphy *pWiphy;
+
+
+ if ((pCfg80211_CB == NULL) || (pCfg80211_CB->pCfg80211_Wdev == NULL))
+ return FALSE;
+
+ pWiphy = pCfg80211_CB->pCfg80211_Wdev->wiphy;
+
+ if (pWiphy != NULL)
+ {
+ CFG80211DBG(RT_DEBUG_ERROR, ("80211> re-init bands...\n"));
+
+ /* re-init bands */
+ CFG80211_SupBandInit(pCfg80211_CB, pBandInfo, pWiphy,
+ pCfg80211_CB->pCfg80211_Channels,
+ pCfg80211_CB->pCfg80211_Rates);
+
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,32))
+ /* re-init PHY */
+ pWiphy->rts_threshold = pBandInfo->RtsThreshold;
+ pWiphy->frag_threshold = pBandInfo->FragmentThreshold;
+ pWiphy->retry_short = pBandInfo->RetryMaxCnt & 0xff;
+ pWiphy->retry_long = (pBandInfo->RetryMaxCnt & 0xff00)>>8;
+#endif /* LINUX_VERSION_CODE */
+
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+
+/*
+========================================================================
+Routine Description:
+ Hint to the wireless core a regulatory domain from driver.
+
+Arguments:
+ pAd - WLAN control block pointer
+ pCountryIe - pointer to the country IE
+ CountryIeLen - length of the country IE
+
+Return Value:
+ NONE
+
+Note:
+ Must call the function in kernel thread.
+========================================================================
+*/
+VOID CFG80211OS_RegHint(
+ IN VOID *pCB,
+ IN UCHAR *pCountryIe,
+ IN ULONG CountryIeLen)
+{
+ CFG80211_CB *pCfg80211_CB = (CFG80211_CB *)pCB;
+
+
+ CFG80211DBG(RT_DEBUG_ERROR,
+ ("crda> regulatory domain hint: %c%c\n",
+ pCountryIe[0], pCountryIe[1]));
+
+ if ((pCfg80211_CB->pCfg80211_Wdev == NULL) || (pCountryIe == NULL))
+ {
+ CFG80211DBG(RT_DEBUG_ERROR, ("crda> regulatory domain hint not support!\n"));
+ return;
+ }
+
+ /* hints a country IE as a regulatory domain "without" channel/power info. */
+/* regulatory_hint(pCfg80211_CB->pMac80211_Hw->wiphy, pCountryIe); */
+ regulatory_hint(pCfg80211_CB->pCfg80211_Wdev->wiphy, (const char *)pCountryIe);
+}
+
+
+/*
+========================================================================
+Routine Description:
+ Hint to the wireless core a regulatory domain from country element.
+
+Arguments:
+ pAdCB - WLAN control block pointer
+ pCountryIe - pointer to the country IE
+ CountryIeLen - length of the country IE
+
+Return Value:
+ NONE
+
+Note:
+ Must call the function in kernel thread.
+========================================================================
+*/
+VOID CFG80211OS_RegHint11D(
+ IN VOID *pCB,
+ IN UCHAR *pCountryIe,
+ IN ULONG CountryIeLen)
+{
+ /* no regulatory_hint_11d() in 2.6.32 */
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,32))
+ CFG80211_CB *pCfg80211_CB = (CFG80211_CB *)pCB;
+
+
+ if ((pCfg80211_CB->pCfg80211_Wdev == NULL) || (pCountryIe == NULL))
+ {
+ CFG80211DBG(RT_DEBUG_ERROR, ("crda> regulatory domain hint not support!\n"));
+ return;
+ }
+
+ CFG80211DBG(RT_DEBUG_ERROR,
+ ("crda> regulatory domain hint: %c%c\n",
+ pCountryIe[0], pCountryIe[1]));
+
+ /*
+ hints a country IE as a regulatory domain "with" channel/power info.
+ but if you use regulatory_hint(), it only hint "regulatory domain".
+ */
+/* regulatory_hint_11d(pCfg80211_CB->pMac80211_Hw->wiphy, pCountryIe, CountryIeLen); */
+ regulatory_hint_11d(pCfg80211_CB->pCfg80211_Wdev->wiphy, pCountryIe, CountryIeLen);
+#endif /* LINUX_VERSION_CODE */
+}
+
+
+BOOLEAN CFG80211OS_BandInfoGet(
+ IN VOID *pCB,
+ IN VOID *pWiphyOrg,
+ OUT VOID **ppBand24,
+ OUT VOID **ppBand5)
+{
+ CFG80211_CB *pCfg80211_CB = (CFG80211_CB *)pCB;
+ struct wiphy *pWiphy = (struct wiphy *)pWiphyOrg;
+
+
+ if (pWiphy == NULL)
+ {
+ if ((pCfg80211_CB != NULL) && (pCfg80211_CB->pCfg80211_Wdev != NULL))
+ pWiphy = pCfg80211_CB->pCfg80211_Wdev->wiphy;
+ }
+
+ if (pWiphy == NULL)
+ return FALSE;
+
+ *ppBand24 = pWiphy->bands[IEEE80211_BAND_2GHZ];
+ *ppBand5 = pWiphy->bands[IEEE80211_BAND_5GHZ];
+ return TRUE;
+}
+
+
+UINT32 CFG80211OS_ChanNumGet(
+ IN VOID *pCB,
+ IN VOID *pWiphyOrg,
+ IN UINT32 IdBand)
+{
+ CFG80211_CB *pCfg80211_CB = (CFG80211_CB *)pCB;
+ struct wiphy *pWiphy = (struct wiphy *)pWiphyOrg;
+
+
+ if (pWiphy == NULL)
+ {
+ if ((pCfg80211_CB != NULL) && (pCfg80211_CB->pCfg80211_Wdev != NULL))
+ pWiphy = pCfg80211_CB->pCfg80211_Wdev->wiphy;
+ }
+
+ if (pWiphy == NULL)
+ return 0;
+
+ if (pWiphy->bands[IdBand] != NULL)
+ return pWiphy->bands[IdBand]->n_channels;
+
+ return 0;
+}
+
+
+BOOLEAN CFG80211OS_ChanInfoGet(
+ IN VOID *pCB,
+ IN VOID *pWiphyOrg,
+ IN UINT32 IdBand,
+ IN UINT32 IdChan,
+ OUT UINT32 *pChanId,
+ OUT UINT32 *pPower,
+ OUT BOOLEAN *pFlgIsRadar)
+{
+ CFG80211_CB *pCfg80211_CB = (CFG80211_CB *)pCB;
+ struct wiphy *pWiphy = (struct wiphy *)pWiphyOrg;
+ struct ieee80211_supported_band *pSband;
+ struct ieee80211_channel *pChan;
+
+
+ if (pWiphy == NULL)
+ {
+ if ((pCfg80211_CB != NULL) && (pCfg80211_CB->pCfg80211_Wdev != NULL))
+ pWiphy = pCfg80211_CB->pCfg80211_Wdev->wiphy;
+ }
+
+ if (pWiphy == NULL)
+ return FALSE;
+
+ pSband = pWiphy->bands[IdBand];
+ pChan = &pSband->channels[IdChan];
+
+ *pChanId = ieee80211_frequency_to_channel(pChan->center_freq);
+
+ if (pChan->flags & IEEE80211_CHAN_DISABLED)
+ {
+ CFG80211DBG(RT_DEBUG_ERROR,
+ ("Chan %03d (frq %d):\tnot allowed!\n",
+ (*pChanId), pChan->center_freq));
+ return FALSE;
+ }
+
+ *pPower = pChan->max_power;
+
+ if (pChan->flags & IEEE80211_CHAN_RADAR)
+ *pFlgIsRadar = TRUE;
+ else
+ *pFlgIsRadar = FALSE;
+
+ return TRUE;
+}
+
+
+/*
+========================================================================
+Routine Description:
+ Initialize a channel information used in scan inform.
+
+Arguments:
+
+Return Value:
+ TRUE - Successful
+ FALSE - Fail
+
+Note:
+========================================================================
+*/
+BOOLEAN CFG80211OS_ChanInfoInit(
+ IN VOID *pCB,
+ IN UINT32 InfoIndex,
+ IN UCHAR ChanId,
+ IN UCHAR MaxTxPwr,
+ IN BOOLEAN FlgIsNMode,
+ IN BOOLEAN FlgIsBW20M)
+{
+ CFG80211_CB *pCfg80211_CB = (CFG80211_CB *)pCB;
+ struct ieee80211_channel *pChan;
+
+
+ if (InfoIndex >= MAX_NUM_OF_CHANNELS)
+ return FALSE;
+
+ pChan = (struct ieee80211_channel *)&(pCfg80211_CB->ChanInfo[InfoIndex]);
+ memset(pChan, 0, sizeof(*pChan));
+
+ if (ChanId > 14)
+ pChan->band = IEEE80211_BAND_5GHZ;
+ else
+ pChan->band = IEEE80211_BAND_2GHZ;
+
+ pChan->center_freq = ieee80211_channel_to_frequency(ChanId);
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,32))
+ if (FlgIsNMode == TRUE)
+ {
+ if (FlgIsBW20M == TRUE)
+ pChan->max_bandwidth = 20; /* 20MHz */
+ else
+ pChan->max_bandwidth = 40; /* 40MHz */
+ }
+ else
+ pChan->max_bandwidth = 5; /* 5MHz for non-HT device */
+#endif /* LINUX_VERSION_CODE */
+
+ /* no use currently in 2.6.30 */
+/* if (ieee80211_is_beacon(((struct ieee80211_mgmt *)pFrame)->frame_control)) */
+/* pChan->beacon_found = 1; */
+
+ return TRUE;
+}
+
+
+/*
+========================================================================
+Routine Description:
+ Inform us that a scan is got.
+
+Arguments:
+ pAdCB - WLAN control block pointer
+
+Return Value:
+ NONE
+
+Note:
+ Call RT_CFG80211_SCANNING_INFORM, not CFG80211_Scaning
+========================================================================
+*/
+VOID CFG80211OS_Scaning(
+ IN VOID *pCB,
+ IN UINT32 ChanId,
+ IN UCHAR *pFrame,
+ IN UINT32 FrameLen,
+ IN INT32 RSSI,
+ IN BOOLEAN FlgIsNMode,
+ IN UINT8 BW)
+{
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,30))
+#endif /* LINUX_VERSION_CODE */
+}
+
+
+/*
+========================================================================
+Routine Description:
+ Inform us that scan ends.
+
+Arguments:
+ pAdCB - WLAN control block pointer
+ FlgIsAborted - 1: scan is aborted
+
+Return Value:
+ NONE
+
+Note:
+========================================================================
+*/
+VOID CFG80211OS_ScanEnd(
+ IN VOID *pCB,
+ IN BOOLEAN FlgIsAborted)
+{
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,30))
+#endif /* LINUX_VERSION_CODE */
+}
+
+
+/*
+========================================================================
+Routine Description:
+ Inform CFG80211 about association status.
+
+Arguments:
+ pAdCB - WLAN control block pointer
+ pBSSID - the BSSID of the AP
+ pReqIe - the element list in the association request frame
+ ReqIeLen - the request element length
+ pRspIe - the element list in the association response frame
+ RspIeLen - the response element length
+ FlgIsSuccess - 1: success; otherwise: fail
+
+Return Value:
+ None
+
+Note:
+========================================================================
+*/
+void CFG80211OS_ConnectResultInform(
+ IN VOID *pCB,
+ IN UCHAR *pBSSID,
+ IN UCHAR *pReqIe,
+ IN UINT32 ReqIeLen,
+ IN UCHAR *pRspIe,
+ IN UINT32 RspIeLen,
+ IN UCHAR FlgIsSuccess)
+{
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,32))
+ CFG80211_CB *pCfg80211_CB = (CFG80211_CB *)pCB;
+
+
+ if ((pCfg80211_CB->pCfg80211_Wdev->netdev == NULL) || (pBSSID == NULL))
+ return;
+
+ if (FlgIsSuccess)
+ {
+ cfg80211_connect_result(pCfg80211_CB->pCfg80211_Wdev->netdev,
+ pBSSID,
+ pReqIe,
+ ReqIeLen,
+ pRspIe,
+ RspIeLen,
+ WLAN_STATUS_SUCCESS,
+ GFP_KERNEL);
+ }
+ else
+ {
+ cfg80211_connect_result(pCfg80211_CB->pCfg80211_Wdev->netdev,
+ pBSSID,
+ NULL, 0, NULL, 0,
+ WLAN_STATUS_UNSPECIFIED_FAILURE,
+ GFP_KERNEL);
+ }
+#endif /* LINUX_VERSION_CODE */
+}
+#endif /* RT_CFG80211_SUPPORT */
+
+
+/*
+========================================================================
+Routine Description:
+ Flush a data cache line.
+
+Arguments:
+ AddrStart - the start address
+ Size - memory size
+
+Return Value:
+ None
+
+Note:
+========================================================================
+*/
+VOID RtmpOsDCacheFlush(
+ IN ULONG AddrStart,
+ IN ULONG Size)
+{
+ RTMP_UTIL_DCACHE_FLUSH(AddrStart, Size);
+}
+
+
+/*
+========================================================================
+Routine Description:
+ Assign private data pointer to the network interface.
+
+Arguments:
+ pDev - the device
+ pPriv - the pointer
+
+Return Value:
+ None
+
+Note:
+========================================================================
+*/
+VOID RtmpOsSetNetDevPriv(VOID *pDev, VOID *pPriv)
+{
+ DEV_PRIV_INFO *pDevInfo = NULL;
+
+
+ pDevInfo = (DEV_PRIV_INFO *) _RTMP_OS_NETDEV_GET_PRIV((PNET_DEV) pDev);
+ if (pDevInfo == NULL)
+ {
+ os_alloc_mem(NULL, (UCHAR **)&pDevInfo, sizeof(DEV_PRIV_INFO));
+ if (pDevInfo == NULL)
+ return;
+ }
+
+ pDevInfo->pPriv = (VOID *)pPriv;
+ pDevInfo->priv_flags = 0;
+
+ _RTMP_OS_NETDEV_SET_PRIV((PNET_DEV) pDev, pDevInfo);
+}
+
+
+/*
+========================================================================
+Routine Description:
+ Get private data pointer from the network interface.
+
+Arguments:
+ pDev - the device
+ pPriv - the pointer
+
+Return Value:
+ None
+
+Note:
+========================================================================
+*/
+VOID *RtmpOsGetNetDevPriv(VOID *pDev)
+{
+ DEV_PRIV_INFO *pDevInfo = NULL;
+
+
+ pDevInfo = (DEV_PRIV_INFO *) _RTMP_OS_NETDEV_GET_PRIV((PNET_DEV) pDev);
+ if (pDevInfo != NULL)
+ return pDevInfo->pPriv;
+ return NULL;
+}
+
+
+/*
+========================================================================
+Routine Description:
+ Get private flags from the network interface.
+
+Arguments:
+ pDev - the device
+
+Return Value:
+ pPriv - the pointer
+
+Note:
+========================================================================
+*/
+USHORT RtmpDevPrivFlagsGet(VOID *pDev)
+{
+
+ DEV_PRIV_INFO *pDevInfo = NULL;
+
+
+ pDevInfo = (DEV_PRIV_INFO *) _RTMP_OS_NETDEV_GET_PRIV((PNET_DEV) pDev);
+ if (pDevInfo != NULL)
+ return pDevInfo->priv_flags;
+ return 0;
+}
+
+
+/*
+========================================================================
+Routine Description:
+ Get private flags from the network interface.
+
+Arguments:
+ pDev - the device
+
+Return Value:
+ pPriv - the pointer
+
+Note:
+========================================================================
+*/
+VOID RtmpDevPrivFlagsSet(VOID *pDev, USHORT PrivFlags)
+{
+ DEV_PRIV_INFO *pDevInfo = NULL;
+
+
+ pDevInfo = (DEV_PRIV_INFO *) _RTMP_OS_NETDEV_GET_PRIV((PNET_DEV) pDev);
+ if (pDevInfo != NULL)
+ pDevInfo->priv_flags = PrivFlags;
+}
+
+
+
+
+#ifdef OS_ABL_FUNC_SUPPORT
+/*
+========================================================================
+Routine Description:
+ Change/Recover file UID/GID.
+
+Arguments:
+ pOSFSInfoOrg - the file
+ bSet - Change (TRUE) or Recover (FALSE)
+
+Return Value:
+ None
+
+Note:
+ rt_linux.h, not rt_drv.h
+========================================================================
+*/
+void RtmpOSFSInfoChange(RTMP_OS_FS_INFO *pOSFSInfoOrg, BOOLEAN bSet)
+{
+ OS_FS_INFO *pOSFSInfo;
+
+ if (bSet == TRUE) {
+ os_alloc_mem(NULL, (UCHAR **) & (pOSFSInfoOrg->pContent),
+ sizeof (OS_FS_INFO));
+ if (pOSFSInfoOrg->pContent == NULL) {
+ DBGPRINT(RT_DEBUG_ERROR, ("%s: alloc file info fail!\n", __FUNCTION__));
+ return;
+ } else
+ memset(pOSFSInfoOrg->pContent, 0, sizeof (OS_FS_INFO));
+ }
+
+ pOSFSInfo = (OS_FS_INFO *) (pOSFSInfoOrg->pContent);
+ if (pOSFSInfo == NULL) {
+ DBGPRINT(RT_DEBUG_ERROR, ("%s: pOSFSInfo == NULL!\n", __FUNCTION__));
+ return;
+ }
+
+ __RtmpOSFSInfoChange(pOSFSInfo, bSet);
+
+ if (bSet == FALSE) {
+ if (pOSFSInfoOrg->pContent != NULL) {
+ os_free_mem(NULL, pOSFSInfoOrg->pContent);
+ pOSFSInfoOrg->pContent = NULL;
+ }
+ }
+}
+
+
+/*
+========================================================================
+Routine Description:
+ Activate a tasklet.
+
+Arguments:
+ pTasklet - the tasklet
+
+Return Value:
+ TRUE or FALSE
+
+Note:
+========================================================================
+*/
+BOOLEAN RtmpOsTaskletSche(RTMP_NET_TASK_STRUCT *pTasklet)
+{
+ if (pTasklet->pContent == NULL)
+ return FALSE;
+
+#ifdef WORKQUEUE_BH
+ schedule_work((struct work_struct *)(pTasklet->pContent));
+#else
+ tasklet_hi_schedule((OS_NET_TASK_STRUCT *) (pTasklet->pContent));
+#endif /* WORKQUEUE_BH */
+
+ return TRUE;
+}
+
+
+/*
+========================================================================
+Routine Description:
+ Initialize a tasklet.
+
+Arguments:
+ pTasklet - the tasklet
+
+Return Value:
+ TRUE or FALSE
+
+Note:
+========================================================================
+*/
+BOOLEAN RtmpOsTaskletInit(
+ RTMP_NET_TASK_STRUCT *pTasklet,
+ VOID (*pFunc) (unsigned long data),
+ ULONG Data,
+ LIST_HEADER *pTaskletList)
+{
+#ifdef WORKQUEUE_BH
+ if (RTMP_OS_Alloc_RscOnly(pTasklet, sizeof (struct work_struct)) == FALSE)
+ return FALSE;
+
+ INIT_WORK((struct work_struct *)(pTasklet->pContent), pFunc);
+#else
+
+ if (RTMP_OS_Alloc_RscOnly(pTasklet, sizeof (OS_NET_TASK_STRUCT)) == FALSE)
+ return FALSE;
+
+ tasklet_init((OS_NET_TASK_STRUCT *) (pTasklet->pContent), pFunc, Data);
+#endif /* WORKQUEUE_BH */
+
+ return TRUE;
+}
+
+
+/*
+========================================================================
+Routine Description:
+ Delete a tasklet.
+
+Arguments:
+ pTasklet - the tasklet
+
+Return Value:
+ TRUE or FALSE
+
+Note:
+========================================================================
+*/
+BOOLEAN RtmpOsTaskletKill(RTMP_NET_TASK_STRUCT *pTasklet)
+{
+ if (pTasklet->pContent != NULL) {
+#ifndef WORKQUEUE_BH
+ tasklet_kill((OS_NET_TASK_STRUCT *) (pTasklet->pContent));
+#endif /* WORKQUEUE_BH */
+
+ os_free_mem(NULL, pTasklet->pContent);
+ pTasklet->pContent = NULL;
+ }
+
+ return TRUE;
+}
+
+
+VOID RtmpOsTaskletDataAssign(RTMP_NET_TASK_STRUCT *pTasklet, ULONG Data)
+{
+#ifndef WORKQUEUE_BH
+ if (pTasklet->pContent != NULL)
+ ((OS_NET_TASK_STRUCT *) (pTasklet->pContent))->data = Data;
+#endif /* WORKQUEUE_BH */
+}
+
+
+INT32 RtmpOsTaskIsKilled(RTMP_OS_TASK *pTaskOrg)
+{
+ OS_TASK *pTask;
+
+ pTask = (OS_TASK *) (pTaskOrg->pContent);
+ if (pTask == NULL)
+ return 1;
+ return pTask->task_killed;
+}
+
+
+VOID RtmpOsTaskWakeUp(RTMP_OS_TASK *pTaskOrg)
+{
+ OS_TASK *pTask;
+
+ pTask = (OS_TASK *) (pTaskOrg->pContent);
+ if (pTask == NULL)
+ return;
+
+#ifdef KTHREAD_SUPPORT
+ WAKE_UP(pTask);
+#else
+ RTMP_SEM_EVENT_UP(&pTask->taskSema);
+#endif
+}
+
+
+/*
+========================================================================
+Routine Description:
+ Check if the task is legal.
+
+Arguments:
+ pPkt - the packet
+ pDev - the device
+
+Return Value:
+ None
+
+Note:
+========================================================================
+*/
+BOOLEAN RtmpOsCheckTaskLegality(RTMP_OS_TASK *pTaskOrg)
+{
+ OS_TASK *pTask;
+
+ pTask = (OS_TASK *) (pTaskOrg->pContent);
+ if (!pTask)
+ return FALSE;
+
+#ifdef KTHREAD_SUPPORT
+ if (pTask->kthread_task == NULL)
+#else
+ CHECK_PID_LEGALITY(pTask->taskPID);
+ else
+#endif
+ return FALSE;
+
+ return TRUE;
+}
+
+
+/* timeout -- ms */
+VOID RTMP_SetPeriodicTimer(NDIS_MINIPORT_TIMER *pTimerOrg, ULONG timeout)
+{
+ OS_NDIS_MINIPORT_TIMER *pTimer;
+
+ pTimer = (OS_NDIS_MINIPORT_TIMER *) (pTimerOrg->pContent);
+ if (pTimer)
+ __RTMP_SetPeriodicTimer(pTimer, timeout);
+}
+
+
+/* convert NdisMInitializeTimer --> RTMP_OS_Init_Timer */
+VOID RTMP_OS_Init_Timer(
+ VOID *pReserved,
+ NDIS_MINIPORT_TIMER *pTimerOrg,
+ TIMER_FUNCTION function,
+ PVOID data,
+ LIST_HEADER *pTimerList)
+{
+ OS_NDIS_MINIPORT_TIMER *pTimer;
+
+ if (RTMP_OS_Alloc_RscOnly(pTimerOrg, sizeof (OS_NDIS_MINIPORT_TIMER)) == FALSE)
+ return;
+
+ pTimer = (OS_NDIS_MINIPORT_TIMER *) (pTimerOrg->pContent);
+ if (pTimer)
+ __RTMP_OS_Init_Timer(pReserved, pTimer, function, data);
+}
+
+
+VOID RTMP_OS_Add_Timer(NDIS_MINIPORT_TIMER *pTimerOrg, ULONG timeout)
+{
+ OS_NDIS_MINIPORT_TIMER *pTimer;
+
+ pTimer = (OS_NDIS_MINIPORT_TIMER *) (pTimerOrg->pContent);
+
+ if (pTimer) {
+ if (timer_pending(pTimer))
+ return;
+
+ __RTMP_OS_Add_Timer(pTimer, timeout);
+ }
+}
+
+
+VOID RTMP_OS_Mod_Timer(NDIS_MINIPORT_TIMER *pTimerOrg, ULONG timeout)
+{
+ OS_NDIS_MINIPORT_TIMER *pTimer;
+
+ pTimer = (OS_NDIS_MINIPORT_TIMER *) (pTimerOrg->pContent);
+ if (pTimer)
+ __RTMP_OS_Mod_Timer(pTimer, timeout);
+}
+
+
+VOID RTMP_OS_Del_Timer(NDIS_MINIPORT_TIMER *pTimerOrg, BOOLEAN *pCancelled)
+{
+ OS_NDIS_MINIPORT_TIMER *pTimer;
+
+ pTimer = (OS_NDIS_MINIPORT_TIMER *) (pTimerOrg->pContent);
+ if (pTimer)
+ __RTMP_OS_Del_Timer(pTimer, pCancelled);
+}
+
+
+VOID RTMP_OS_Release_Timer(NDIS_MINIPORT_TIMER *pTimerOrg)
+{
+ OS_NDIS_MINIPORT_TIMER *pTimer;
+
+ pTimer = (OS_NDIS_MINIPORT_TIMER *) (pTimerOrg->pContent);
+ if (pTimer) {
+ __RTMP_OS_Release_Timer(pTimer);
+
+ os_free_mem(NULL, pTimer);
+ pTimerOrg->pContent = NULL;
+ }
+}
+
+
+/*
+========================================================================
+Routine Description:
+ Allocate a OS resource.
+
+Arguments:
+ pAd - WLAN control block pointer
+ pRsc - the resource
+ RscLen - resource length
+
+Return Value:
+ TRUE or FALSE
+
+Note:
+========================================================================
+*/
+BOOLEAN RTMP_OS_Alloc_Rsc(
+ LIST_HEADER *pRscList,
+ VOID *pRscSrc,
+ UINT32 RscLen)
+{
+ OS_RSTRUC *pRsc = (OS_RSTRUC *) pRscSrc;
+
+ if (pRsc->pContent == NULL) {
+ /* new entry */
+ os_alloc_mem(NULL, (UCHAR **) & (pRsc->pContent), RscLen);
+ if (pRsc->pContent == NULL) {
+ DBGPRINT(RT_DEBUG_ERROR,
+ ("%s: alloc timer fail!\n", __FUNCTION__));
+ return FALSE;
+ } else {
+ LIST_RESOURCE_OBJ_ENTRY *pObj;
+
+ /* allocate resource record entry */
+ os_alloc_mem(NULL, (UCHAR **) & (pObj),
+ sizeof (LIST_RESOURCE_OBJ_ENTRY));
+ if (pObj == NULL) {
+ DBGPRINT(RT_DEBUG_ERROR,
+ ("%s: alloc timer obj fail!\n",
+ __FUNCTION__));
+ os_free_mem(NULL, pRsc->pContent);
+ pRsc->pContent = NULL;
+ return FALSE;
+ } else {
+ memset(pRsc->pContent, 0, RscLen);
+ pObj->pRscObj = (VOID *) pRsc;
+
+ OS_SEM_LOCK(&UtilSemLock);
+ insertTailList(pRscList, (LIST_ENTRY *) pObj);
+ OS_SEM_UNLOCK(&UtilSemLock);
+ }
+ }
+ }
+
+ return TRUE;
+}
+
+
+/*
+========================================================================
+Routine Description:
+ Allocate a OS resource.
+
+Arguments:
+ pAd - WLAN control block pointer
+ pRsc - the resource
+ RscLen - resource length
+
+Return Value:
+ TRUE or FALSE
+
+Note:
+========================================================================
+*/
+BOOLEAN RTMP_OS_Alloc_RscOnly(VOID *pRscSrc, UINT32 RscLen)
+{
+ OS_RSTRUC *pRsc = (OS_RSTRUC *) pRscSrc;
+
+ if (pRsc->pContent == NULL) {
+ /* new entry */
+ os_alloc_mem(NULL, (UCHAR **) & (pRsc->pContent), RscLen);
+ if (pRsc->pContent == NULL) {
+ DBGPRINT(RT_DEBUG_ERROR,
+ ("%s: alloc timer fail!\n", __FUNCTION__));
+ return FALSE;
+ }
+ memset(pRsc->pContent, 0, RscLen);
+ }
+
+ return TRUE;
+}
+
+
+/*
+========================================================================
+Routine Description:
+ Remove a OS resource.
+
+Arguments:
+ pAd - WLAN control block pointer
+ pRsc - the resource
+
+Return Value:
+ TRUE or FALSE
+
+Note:
+========================================================================
+*/
+BOOLEAN RTMP_OS_Remove_Rsc(
+ LIST_HEADER *pRscList,
+ VOID *pRscSrc)
+{
+ LIST_RESOURCE_OBJ_ENTRY *pObj;
+ OS_RSTRUC *pRscHead, *pRsc, *pRscRev = (OS_RSTRUC *) pRscSrc;
+ pRscHead = NULL;
+
+ OS_SEM_LOCK(&UtilSemLock);
+ while(TRUE)
+ {
+ pObj = (LIST_RESOURCE_OBJ_ENTRY *) removeHeadList(pRscList);
+ if (pRscHead == NULL)
+ pRscHead = pObj->pRscObj; /* backup first entry */
+ else if (((ULONG)pRscHead) == ((ULONG)(pObj->pRscObj)))
+ break; /* has searched all entries */
+
+ pRsc = (OS_RSTRUC *) (pObj->pRscObj);
+ if ((ULONG)pRsc == (ULONG)pRscRev)
+ break; /* find it */
+
+ /* re-insert it */
+ insertTailList(pRscList, (LIST_ENTRY *) pObj);
+ }
+ OS_SEM_UNLOCK(&UtilSemLock);
+
+ return TRUE;
+}
+
+
+/*
+========================================================================
+Routine Description:
+ Free all timers.
+
+Arguments:
+ pAd - WLAN control block pointer
+
+Return Value:
+ None
+
+Note:
+========================================================================
+*/
+VOID RTMP_OS_Free_Rscs(LIST_HEADER *pRscList)
+{
+ LIST_RESOURCE_OBJ_ENTRY *pObj;
+ OS_RSTRUC *pRsc;
+
+ OS_SEM_LOCK(&UtilSemLock);
+ while (TRUE) {
+ pObj = (LIST_RESOURCE_OBJ_ENTRY *) removeHeadList(pRscList);
+ if (pObj == NULL)
+ break;
+ pRsc = (OS_RSTRUC *) (pObj->pRscObj);
+
+ if (pRsc->pContent != NULL) {
+ /* free the timer memory */
+ os_free_mem(NULL, pRsc->pContent);
+ pRsc->pContent = NULL;
+ } else {
+ /*
+ The case is possible because some timers are released during
+ the driver life time, EX: we will release some timers in
+ MacTableDeleteEntry().
+ But we do not recommend the behavior, i.e. not to release
+ timers in the driver life time; Or we can not cancel the
+ timer for timer preemption problem.
+ */
+ }
+
+ os_free_mem(NULL, pObj); /* free the timer record entry */
+ }
+ OS_SEM_UNLOCK(&UtilSemLock);
+}
+
+
+/*
+========================================================================
+Routine Description:
+ Allocate a kernel task.
+
+Arguments:
+ pTask - the task
+
+Return Value:
+ None
+
+Note:
+========================================================================
+*/
+BOOLEAN RtmpOSTaskAlloc(RTMP_OS_TASK *pTask, LIST_HEADER *pTaskList)
+{
+ if (RTMP_OS_Alloc_RscOnly(pTask, sizeof (OS_TASK)) == FALSE) {
+ DBGPRINT(RT_DEBUG_ERROR,
+ ("%s: alloc task fail!\n", __FUNCTION__));
+ return FALSE; /* allocate fail */
+ }
+
+ return TRUE;
+}
+
+
+/*
+========================================================================
+Routine Description:
+ Free a kernel task.
+
+Arguments:
+ pTask - the task
+
+Return Value:
+ None
+
+Note:
+========================================================================
+*/
+VOID RtmpOSTaskFree(RTMP_OS_TASK *pTaskOrg)
+{
+ OS_TASK *pTask;
+
+ pTask = (OS_TASK *) (pTaskOrg->pContent);
+ if (pTask != NULL) {
+ os_free_mem(NULL, pTask);
+ pTaskOrg->pContent = NULL;
+ }
+}
+
+
+/*
+========================================================================
+Routine Description:
+ Kill a kernel task.
+
+Arguments:
+ pTaskOrg - the task
+
+Return Value:
+ None
+
+Note:
+========================================================================
+*/
+NDIS_STATUS RtmpOSTaskKill(RTMP_OS_TASK *pTaskOrg)
+{
+ OS_TASK *pTask;
+ NDIS_STATUS Status;
+
+ pTask = (OS_TASK *) (pTaskOrg->pContent);
+ if (pTask != NULL) {
+ Status = __RtmpOSTaskKill(pTask);
+ RtmpOSTaskFree(pTaskOrg);
+ return Status;
+ }
+
+ return NDIS_STATUS_FAILURE;
+}
+
+
+/*
+========================================================================
+Routine Description:
+ Notify kernel the task exit.
+
+Arguments:
+ pTaskOrg - the task
+
+Return Value:
+ None
+
+Note:
+========================================================================
+*/
+INT RtmpOSTaskNotifyToExit(RTMP_OS_TASK *pTaskOrg)
+{
+ OS_TASK *pTask;
+
+ pTask = (OS_TASK *) (pTaskOrg->pContent);
+ if (pTask == NULL)
+ return 0;
+ return __RtmpOSTaskNotifyToExit(pTask);
+}
+
+
+/*
+========================================================================
+Routine Description:
+ Customize the task.
+
+Arguments:
+ pTaskOrg - the task
+
+Return Value:
+ None
+
+Note:
+========================================================================
+*/
+VOID RtmpOSTaskCustomize(RTMP_OS_TASK *pTaskOrg)
+{
+ OS_TASK *pTask;
+
+ pTask = (OS_TASK *) (pTaskOrg->pContent);
+ if (pTask)
+ __RtmpOSTaskCustomize(pTask);
+}
+
+
+/*
+========================================================================
+Routine Description:
+ Activate a kernel task.
+
+Arguments:
+ pTaskOrg - the task
+ fn - task handler
+ arg - task input argument
+
+Return Value:
+ None
+
+Note:
+========================================================================
+*/
+NDIS_STATUS RtmpOSTaskAttach(
+ RTMP_OS_TASK *pTaskOrg,
+ RTMP_OS_TASK_CALLBACK fn,
+ ULONG arg)
+{
+ OS_TASK *pTask;
+
+ pTask = (OS_TASK *) (pTaskOrg->pContent);
+ if (pTask == NULL)
+ return NDIS_STATUS_FAILURE;
+ return __RtmpOSTaskAttach(pTask, fn, arg);
+}
+
+
+/*
+========================================================================
+Routine Description:
+ Initialize a kernel task.
+
+Arguments:
+ pTaskOrg - the task
+ pTaskName - task name
+ pPriv - task input argument
+
+Return Value:
+ None
+
+Note:
+========================================================================
+*/
+NDIS_STATUS RtmpOSTaskInit(
+ RTMP_OS_TASK *pTaskOrg,
+ PSTRING pTaskName,
+ VOID *pPriv,
+ LIST_HEADER *pTaskList,
+ LIST_HEADER *pSemList)
+{
+ OS_TASK *pTask;
+
+ if (RtmpOSTaskAlloc(pTaskOrg, pTaskList) == FALSE)
+ return NDIS_STATUS_FAILURE;
+
+ pTask = (OS_TASK *) (pTaskOrg->pContent);
+ if (pTask == NULL)
+ return NDIS_STATUS_FAILURE;
+
+ return __RtmpOSTaskInit(pTask, pTaskName, pPriv, pSemList);
+}
+
+
+/*
+========================================================================
+Routine Description:
+ Wait for a event in the task.
+
+Arguments:
+ pAd - WLAN control block pointer
+ pTaskOrg - the task
+
+Return Value:
+ TRUE
+ FALSE
+
+Note:
+========================================================================
+*/
+BOOLEAN RtmpOSTaskWait(VOID *pReserved, RTMP_OS_TASK *pTaskOrg, INT32 *pStatus)
+{
+ OS_TASK *pTask;
+
+ pTask = (OS_TASK *) (pTaskOrg->pContent);
+ if (pTask == NULL)
+ return FALSE;
+
+ return __RtmpOSTaskWait(pReserved, pTask, pStatus);
+}
+
+
+/*
+========================================================================
+Routine Description:
+ Get private data for the task.
+
+Arguments:
+ pTaskOrg - the task
+
+Return Value:
+ None
+
+Note:
+========================================================================
+*/
+VOID *RtmpOsTaskDataGet(RTMP_OS_TASK *pTaskOrg)
+{
+ if (pTaskOrg->pContent == NULL)
+ return NULL;
+
+ return (((OS_TASK *) (pTaskOrg->pContent))->priv);
+}
+
+
+/*
+========================================================================
+Routine Description:
+ Allocate a lock.
+
+Arguments:
+ pLock - the lock
+
+Return Value:
+ None
+
+Note:
+========================================================================
+*/
+BOOLEAN RtmpOsAllocateLock(NDIS_SPIN_LOCK *pLock, LIST_HEADER *pLockList)
+{
+ if (RTMP_OS_Alloc_RscOnly(pLock, sizeof (OS_NDIS_SPIN_LOCK)) == FALSE) {
+ DBGPRINT(RT_DEBUG_ERROR,
+ ("%s: alloc lock fail!\n", __FUNCTION__));
+ return FALSE; /* allocate fail */
+ }
+
+ OS_NdisAllocateSpinLock(pLock->pContent);
+ return TRUE;
+}
+
+
+/*
+========================================================================
+Routine Description:
+ Free a lock.
+
+Arguments:
+ pLockOrg - the lock
+
+Return Value:
+ None
+
+Note:
+========================================================================
+*/
+VOID RtmpOsFreeSpinLock(NDIS_SPIN_LOCK *pLockOrg)
+{
+ /* we will free all locks memory in RTMP_OS_FREE_LOCK() */
+ OS_NDIS_SPIN_LOCK *pLock;
+
+ pLock = (OS_NDIS_MINIPORT_TIMER *) (pLockOrg->pContent);
+ if (pLock != NULL) {
+ OS_NdisFreeSpinLock(pLock);
+
+ os_free_mem(NULL, pLock);
+ pLockOrg->pContent = NULL;
+ }
+}
+
+
+/*
+========================================================================
+Routine Description:
+ Spin lock bh.
+
+Arguments:
+ pLockOrg - the lock
+
+Return Value:
+ None
+
+Note:
+========================================================================
+*/
+VOID RtmpOsSpinLockBh(NDIS_SPIN_LOCK *pLockOrg)
+{
+ OS_NDIS_SPIN_LOCK *pLock;
+
+ pLock = (OS_NDIS_SPIN_LOCK *) (pLockOrg->pContent);
+ if (pLock != NULL) {
+ OS_SEM_LOCK(pLock);
+ } else
+ printk("lock> warning! the lock was freed!\n");
+}
+
+
+/*
+========================================================================
+Routine Description:
+ Spin unlock bh.
+
+Arguments:
+ pLockOrg - the lock
+
+Return Value:
+ None
+
+Note:
+========================================================================
+*/
+VOID RtmpOsSpinUnLockBh(NDIS_SPIN_LOCK *pLockOrg)
+{
+ OS_NDIS_SPIN_LOCK *pLock;
+
+ pLock = (OS_NDIS_SPIN_LOCK *) (pLockOrg->pContent);
+ if (pLock != NULL) {
+ OS_SEM_UNLOCK(pLock);
+ } else
+ printk("lock> warning! the lock was freed!\n");
+}
+
+
+/*
+========================================================================
+Routine Description:
+ Interrupt lock.
+
+Arguments:
+ pLockOrg - the lock
+ pIrqFlags - the lock flags
+
+Return Value:
+ None
+
+Note:
+========================================================================
+*/
+VOID RtmpOsIntLock(NDIS_SPIN_LOCK *pLockOrg, ULONG *pIrqFlags)
+{
+ OS_NDIS_SPIN_LOCK *pLock;
+
+ pLock = (OS_NDIS_SPIN_LOCK *) (pLockOrg->pContent);
+ if (pLock != NULL) {
+ OS_INT_LOCK(pLock, *pIrqFlags);
+ } else
+ printk("lock> warning! the lock was freed!\n");
+}
+
+
+/*
+========================================================================
+Routine Description:
+ Interrupt unlock.
+
+Arguments:
+ pLockOrg - the lock
+ IrqFlags - the lock flags
+
+Return Value:
+ None
+
+Note:
+========================================================================
+*/
+VOID RtmpOsIntUnLock(NDIS_SPIN_LOCK *pLockOrg, ULONG IrqFlags)
+{
+ OS_NDIS_SPIN_LOCK *pLock;
+
+ pLock = (OS_NDIS_SPIN_LOCK *) (pLockOrg->pContent);
+ if (pLock != NULL) {
+ OS_INT_UNLOCK(pLock, IrqFlags);
+ } else
+ printk("lock> warning! the lock was freed!\n");
+}
+
+
+/*
+========================================================================
+Routine Description:
+ Get MAC address for the network interface.
+
+Arguments:
+ pDev - the device
+
+Return Value:
+ None
+
+Note:
+========================================================================
+*/
+unsigned char *RtmpOsNetDevGetPhyAddr(VOID *pDev)
+{
+ return RTMP_OS_NETDEV_GET_PHYADDR((PNET_DEV) pDev);
+}
+
+
+/*
+========================================================================
+Routine Description:
+ Start network interface TX queue.
+
+Arguments:
+ pDev - the device
+
+Return Value:
+ None
+
+Note:
+========================================================================
+*/
+VOID RtmpOsNetQueueStart(PNET_DEV pDev)
+{
+ RTMP_OS_NETDEV_START_QUEUE(pDev);
+}
+
+
+/*
+========================================================================
+Routine Description:
+ Stop network interface TX queue.
+
+Arguments:
+ pDev - the device
+
+Return Value:
+ None
+
+Note:
+========================================================================
+*/
+VOID RtmpOsNetQueueStop(PNET_DEV pDev)
+{
+ RTMP_OS_NETDEV_STOP_QUEUE(pDev);
+}
+
+
+/*
+========================================================================
+Routine Description:
+ Wake up network interface TX queue.
+
+Arguments:
+ pDev - the device
+
+Return Value:
+ None
+
+Note:
+========================================================================
+*/
+VOID RtmpOsNetQueueWake(PNET_DEV pDev)
+{
+ RTMP_OS_NETDEV_WAKE_QUEUE(pDev);
+}
+
+
+/*
+========================================================================
+Routine Description:
+ Assign network interface to the packet.
+
+Arguments:
+ pPkt - the packet
+ pDev - the device
+
+Return Value:
+ None
+
+Note:
+========================================================================
+*/
+VOID RtmpOsSetPktNetDev(VOID *pPkt, VOID *pDev)
+{
+ SET_OS_PKT_NETDEV(pPkt, (PNET_DEV) pDev);
+}
+
+
+/*
+========================================================================
+Routine Description:
+ Assign network interface type.
+
+Arguments:
+ pDev - the device
+ Type - the type
+
+Return Value:
+ None
+
+Note:
+========================================================================
+*/
+VOID RtmpOsSetNetDevType(VOID *pDev, USHORT Type)
+{
+ RTMP_OS_NETDEV_SET_TYPE((PNET_DEV) pDev, Type);
+}
+
+
+/*
+========================================================================
+Routine Description:
+ Assign network interface type for monitor mode.
+
+Arguments:
+ pDev - the device
+ Type - the type
+
+Return Value:
+ None
+
+Note:
+========================================================================
+*/
+VOID RtmpOsSetNetDevTypeMonitor(VOID *pDev)
+{
+ RTMP_OS_NETDEV_SET_TYPE((PNET_DEV) pDev, ARPHRD_IEEE80211_PRISM);
+}
+
+
+/*
+========================================================================
+Routine Description:
+ Get PID.
+
+Arguments:
+ pPkt - the packet
+ pDev - the device
+
+Return Value:
+ None
+
+Note:
+========================================================================
+*/
+VOID RtmpOsGetPid(IN ULONG *pDst,
+ IN ULONG PID)
+{
+ RT_GET_OS_PID(*pDst, PID);
+}
+
+
+/*
+========================================================================
+Routine Description:
+ Wait for a moment.
+
+Arguments:
+ Time - micro second
+
+Return Value:
+ None
+
+Note:
+========================================================================
+*/
+VOID RtmpOsWait(UINT32 Time)
+{
+ OS_WAIT(Time);
+}
+
+
+/*
+========================================================================
+Routine Description:
+ Check if b is smaller than a.
+
+Arguments:
+ Time - micro second
+
+Return Value:
+ None
+
+Note:
+========================================================================
+*/
+UINT32 RtmpOsTimerAfter(ULONG a, ULONG b)
+{
+ return RTMP_TIME_AFTER(a, b);
+}
+
+
+/*
+========================================================================
+Routine Description:
+ Check if b is not smaller than a.
+
+Arguments:
+ Time - micro second
+
+Return Value:
+ None
+
+Note:
+========================================================================
+*/
+UINT32 RtmpOsTimerBefore(ULONG a, ULONG b)
+{
+ return RTMP_TIME_BEFORE(a, b);
+}
+
+
+/*
+========================================================================
+Routine Description:
+ Get current system time.
+
+Arguments:
+ pTime - system time (tick)
+
+Return Value:
+ None
+
+Note:
+========================================================================
+*/
+VOID RtmpOsGetSystemUpTime(ULONG *pTime)
+{
+ NdisGetSystemUpTime(pTime);
+}
+
+/*
+========================================================================
+Routine Description:
+ Get OS tick unit.
+
+Arguments:
+ pOps - Utility table
+
+Return Value:
+ None
+
+Note:
+========================================================================
+*/
+UINT32 RtmpOsTickUnitGet(VOID)
+{
+ return HZ;
+}
+
+
+/*
+========================================================================
+Routine Description:
+ ntohs
+
+Arguments:
+ Value - the value
+
+Return Value:
+ the value
+
+Note:
+========================================================================
+*/
+UINT16 RtmpOsNtohs(UINT16 Value)
+{
+ return OS_NTOHS(Value);
+}
+
+
+/*
+========================================================================
+Routine Description:
+ htons
+
+Arguments:
+ Value - the value
+
+Return Value:
+ the value
+
+Note:
+========================================================================
+*/
+UINT16 RtmpOsHtons(UINT16 Value)
+{
+ return OS_HTONS(Value);
+}
+
+
+/*
+========================================================================
+Routine Description:
+ ntohl
+
+Arguments:
+ Value - the value
+
+Return Value:
+ the value
+
+Note:
+========================================================================
+*/
+UINT32 RtmpOsNtohl(UINT32 Value)
+{
+ return OS_NTOHL(Value);
+}
+
+/*
+========================================================================
+Routine Description:
+ htonl
+
+Arguments:
+ Value - the value
+
+Return Value:
+ the value
+
+Note:
+========================================================================
+*/
+UINT32 RtmpOsHtonl(UINT32 Value)
+{
+ return OS_HTONL(Value);
+}
+
+
+/*
+========================================================================
+Routine Description:
+ get_unaligned for 16-bit value.
+
+Arguments:
+ pWord - the value
+
+Return Value:
+ the value
+
+Note:
+========================================================================
+*/
+UINT16 RtmpOsGetUnaligned(UINT16 *pWord)
+{
+ return get_unaligned(pWord);
+}
+
+/*
+========================================================================
+Routine Description:
+ get_unaligned for 32-bit value.
+
+Arguments:
+ pWord - the value
+
+Return Value:
+ the value
+
+Note:
+========================================================================
+*/
+UINT32 RtmpOsGetUnaligned32(UINT32 *pWord)
+{
+ return get_unaligned(pWord);
+}
+
+/*
+========================================================================
+Routine Description:
+ get_unaligned for long-bit value.
+
+Arguments:
+ pWord - the value
+
+Return Value:
+ the value
+
+Note:
+========================================================================
+*/
+ULONG RtmpOsGetUnalignedlong(ULONG *pWord)
+{
+ return get_unaligned(pWord);
+}
+
+
+/*
+========================================================================
+Routine Description:
+ Get maximum scan data length.
+
+Arguments:
+ None
+
+Return Value:
+ length
+
+Note:
+ Used in site servey.
+========================================================================
+*/
+ULONG RtmpOsMaxScanDataGet(VOID)
+{
+ return IW_SCAN_MAX_DATA;
+}
+
+
+/*
+========================================================================
+Routine Description:
+ copy_from_user
+
+Arguments:
+ to -
+ from -
+ n - size
+
+Return Value:
+ copy size
+
+Note:
+========================================================================
+*/
+ULONG RtmpOsCopyFromUser(VOID *to, const void *from, ULONG n)
+{
+ return (copy_from_user(to, from, n));
+}
+
+
+/*
+========================================================================
+Routine Description:
+ copy_to_user
+
+Arguments:
+ to -
+ from -
+ n - size
+
+Return Value:
+ copy size
+
+Note:
+========================================================================
+*/
+ULONG RtmpOsCopyToUser(VOID *to, const void *from, ULONG n)
+{
+ return (copy_to_user(to, from, n));
+}
+
+
+/*
+========================================================================
+Routine Description:
+ Initialize a semaphore.
+
+Arguments:
+ pSem - the semaphore
+
+Return Value:
+ TRUE - Successfully
+ FALSE - Fail
+
+Note:
+========================================================================
+*/
+BOOLEAN RtmpOsSemaInitLocked(RTMP_OS_SEM *pSem, LIST_HEADER *pSemList)
+{
+ if (RTMP_OS_Alloc_RscOnly(pSem, sizeof (OS_SEM)) == FALSE) {
+ DBGPRINT(RT_DEBUG_ERROR, ("%s: alloc semaphore fail!\n", __FUNCTION__));
+ return FALSE;
+ }
+
+ OS_SEM_EVENT_INIT_LOCKED((OS_SEM *) (pSem->pContent));
+ return TRUE;
+}
+
+
+
+/*
+========================================================================
+Routine Description:
+ Initialize a semaphore.
+
+Arguments:
+ pSemOrg - the semaphore
+
+Return Value:
+ TRUE - Successfully
+ FALSE - Fail
+
+Note:
+========================================================================
+*/
+BOOLEAN RtmpOsSemaInit(RTMP_OS_SEM *pSem, LIST_HEADER *pSemList)
+{
+ if (RTMP_OS_Alloc_RscOnly(pSem, sizeof (OS_SEM)) == FALSE) {
+ DBGPRINT(RT_DEBUG_ERROR,
+ ("%s: alloc semaphore fail!\n", __FUNCTION__));
+ return FALSE;
+ }
+
+ OS_SEM_EVENT_INIT((OS_SEM *) (pSem->pContent));
+ return TRUE;
+}
+
+
+/*
+========================================================================
+Routine Description:
+ Destroy a semaphore.
+
+Arguments:
+ pSemOrg - the semaphore
+
+Return Value:
+ TRUE - Successfully
+ FALSE - Fail
+
+Note:
+========================================================================
+*/
+BOOLEAN RtmpOsSemaDestory(RTMP_OS_SEM *pSemOrg)
+{
+ OS_SEM *pSem;
+
+ pSem = (OS_SEM *) (pSemOrg->pContent);
+ if (pSem != NULL) {
+ OS_SEM_EVENT_DESTORY(pSem);
+
+ os_free_mem(NULL, pSem);
+ pSemOrg->pContent = NULL;
+ } else
+ printk("sem> warning! double-free sem!\n");
+ return TRUE;
+}
+
+
+/*
+========================================================================
+Routine Description:
+ Wait a semaphore.
+
+Arguments:
+ pSemOrg - the semaphore
+
+Return Value:
+ 0 - Successfully
+ Otherwise - Fail
+
+Note:
+========================================================================
+*/
+INT32 RtmpOsSemaWaitInterruptible(RTMP_OS_SEM *pSemOrg)
+{
+ OS_SEM *pSem;
+ INT Status = -1;
+
+ pSem = (OS_SEM *) (pSemOrg->pContent);
+ if (pSem != NULL)
+ OS_SEM_EVENT_WAIT(pSem, Status);
+ return Status;
+}
+
+
+/*
+========================================================================
+Routine Description:
+ Wake up a semaphore.
+
+Arguments:
+ pSemOrg - the semaphore
+
+Return Value:
+ None
+
+Note:
+========================================================================
+*/
+VOID RtmpOsSemaWakeUp(RTMP_OS_SEM *pSemOrg)
+{
+ OS_SEM *pSem;
+
+ pSem = (OS_SEM *) (pSemOrg->pContent);
+ if (pSem != NULL)
+ OS_SEM_EVENT_UP(pSem);
+}
+
+
+/*
+========================================================================
+Routine Description:
+ Check if we are in a interrupt.
+
+Arguments:
+ None
+
+Return Value:
+ 0 - No
+ Otherwise - Yes
+
+Note:
+========================================================================
+*/
+INT32 RtmpOsIsInInterrupt(VOID)
+{
+ return (in_interrupt());
+}
+
+
+/*
+========================================================================
+Routine Description:
+ Copy the data buffer to the packet frame body.
+
+Arguments:
+ pAd - WLAN control block pointer
+ pNetPkt - the packet
+ ThisFrameLen - copy length
+ pData - the data buffer
+
+Return Value:
+ None
+
+Note:
+========================================================================
+*/
+VOID RtmpOsPktBodyCopy(
+ PNET_DEV pNetDev,
+ PNDIS_PACKET pNetPkt,
+ ULONG ThisFrameLen,
+ PUCHAR pData)
+{
+ memcpy(skb_put(pNetPkt, ThisFrameLen), pData, ThisFrameLen);
+ SET_OS_PKT_NETDEV(pNetPkt, pNetDev);
+ RTMP_SET_PACKET_SOURCE(OSPKT_TO_RTPKT(pNetPkt), PKTSRC_NDIS);
+}
+
+
+/*
+========================================================================
+Routine Description:
+ Check if the packet is cloned.
+
+Arguments:
+ pNetPkt - the packet
+
+Return Value:
+ TRUE - Yes
+ Otherwise - No
+
+Note:
+========================================================================
+*/
+INT RtmpOsIsPktCloned(PNDIS_PACKET pNetPkt)
+{
+ return OS_PKT_CLONED(pNetPkt);
+}
+
+
+/*
+========================================================================
+Routine Description:
+ Duplicate a packet.
+
+Arguments:
+ pNetPkt - the packet
+
+Return Value:
+ the new packet
+
+Note:
+========================================================================
+*/
+PNDIS_PACKET RtmpOsPktCopy(PNDIS_PACKET pNetPkt)
+{
+ return skb_copy(RTPKT_TO_OSPKT(pNetPkt), GFP_ATOMIC);
+}
+
+
+/*
+========================================================================
+Routine Description:
+ Clone a packet.
+
+Arguments:
+ pNetPkt - the packet
+
+Return Value:
+ the cloned packet
+
+Note:
+========================================================================
+*/
+PNDIS_PACKET RtmpOsPktClone(PNDIS_PACKET pNetPkt)
+{
+ return skb_clone(RTPKT_TO_OSPKT(pNetPkt), MEM_ALLOC_FLAG);
+}
+
+
+/*
+========================================================================
+Routine Description:
+ Assign the data pointer for the packet.
+
+Arguments:
+ pNetPkt - the packet
+ *pData - the data buffer
+
+Return Value:
+ None
+
+Note:
+========================================================================
+*/
+VOID RtmpOsPktDataPtrAssign(PNDIS_PACKET pNetPkt, UCHAR *pData)
+{
+ SET_OS_PKT_DATAPTR(pNetPkt, pData);
+}
+
+
+/*
+========================================================================
+Routine Description:
+ Assign the data length for the packet.
+
+Arguments:
+ pNetPkt - the packet
+ Len - the data length
+
+Return Value:
+ None
+
+Note:
+========================================================================
+*/
+VOID RtmpOsPktLenAssign(PNDIS_PACKET pNetPkt, LONG Len)
+{
+ SET_OS_PKT_LEN(pNetPkt, Len);
+}
+
+
+/*
+========================================================================
+Routine Description:
+ Adjust the tail pointer for the packet.
+
+Arguments:
+ pNetPkt - the packet
+ removedTagLen - the size for adjustment
+
+Return Value:
+ None
+
+Note:
+========================================================================
+*/
+VOID RtmpOsPktTailAdjust(PNDIS_PACKET pNetPkt, UINT removedTagLen)
+{
+ OS_PKT_TAIL_ADJUST(pNetPkt, removedTagLen);
+}
+
+
+/*
+========================================================================
+Routine Description:
+ Adjust the data pointer for the packet.
+
+Arguments:
+ pNetPkt - the packet
+ Len - the size for adjustment
+
+Return Value:
+ the new data pointer for the packet
+
+Note:
+========================================================================
+*/
+PUCHAR RtmpOsPktTailBufExtend(PNDIS_PACKET pNetPkt, UINT Len)
+{
+ return OS_PKT_TAIL_BUF_EXTEND(pNetPkt, Len);
+}
+
+
+/*
+========================================================================
+Routine Description:
+ adjust headroom for the packet.
+
+Arguments:
+ pNetPkt - the packet
+ Len - the size for adjustment
+
+Return Value:
+ the new data pointer for the packet
+
+Note:
+========================================================================
+*/
+VOID RtmpOsPktReserve(PNDIS_PACKET pNetPkt, UINT Len)
+{
+ OS_PKT_RESERVE(pNetPkt, Len);
+}
+
+
+/*
+========================================================================
+Routine Description:
+ Adjust the data pointer for the packet.
+
+Arguments:
+ pNetPkt - the packet
+ Len - the size for adjustment
+
+Return Value:
+ the new data pointer for the packet
+
+Note:
+========================================================================
+*/
+PUCHAR RtmpOsPktHeadBufExtend(PNDIS_PACKET pNetPkt, UINT Len)
+{
+ return OS_PKT_HEAD_BUF_EXTEND(pNetPkt, Len);
+}
+
+
+/*
+========================================================================
+Routine Description:
+
+
+Arguments:
+ pPkt - the packet
+
+Return Value:
+ None
+
+Note:
+========================================================================
+*/
+VOID RtmpOsPktInfPpaSend(PNDIS_PACKET pNetPkt)
+{
+#ifdef INF_PPA_SUPPORT
+ struct sk_buff *pRxPkt = RTPKT_TO_OSPKT(pNetPkt);
+ int ret = 0;
+ unsigned int ppa_flags = 0; /* reserved for now */
+
+ pRxPkt->protocol = eth_type_trans(pRxPkt, pRxPkt->dev);
+
+ memset(pRxPkt->head, 0, pRxPkt->data - pRxPkt->head - 14);
+ DBGPRINT(RT_DEBUG_TRACE,
+ ("ppa_hook_directpath_send_fn rx :ret:%d headroom:%d dev:%s pktlen:%d<===\n",
+ ret, skb_headroom(pRxPkt) , pRxPkt->dev->name, pRxPkt->len));
+ hex_dump("rx packet", pRxPkt->data, 32);
+ ret = ppa_hook_directpath_send_fn(pAd->g_if_id, pRxPkt, pRxPkt->len, ppa_flags);
+#endif /* INF_PPA_SUPPORT */
+}
+
+
+INT32 RtmpThreadPidKill(RTMP_OS_PID PID)
+{
+ return KILL_THREAD_PID(PID, SIGTERM, 1);
+}
+
+
+long RtmpOsSimpleStrtol(const char *cp, char **endp, unsigned int base)
+{
+ return simple_strtol(cp, endp, base);
+}
+
+
+BOOLEAN RtmpOsPktOffsetInit(VOID)
+{
+ struct sk_buff *pPkt = NULL;
+
+ if ((RTPktOffsetData == 0) && (RTPktOffsetLen == 0)
+ && (RTPktOffsetCB == 0)) {
+ pPkt = kmalloc(sizeof (struct sk_buff), GFP_ATOMIC);
+ if (pPkt == NULL)
+ return FALSE;
+
+ RTPktOffsetData = (ULONG) (&(pPkt->data)) - (ULONG) pPkt;
+ RTPktOffsetLen = (ULONG) (&(pPkt->len)) - (ULONG) pPkt;
+ RTPktOffsetCB = (ULONG) (pPkt->cb) - (ULONG) pPkt;
+ kfree(pPkt);
+
+ DBGPRINT(RT_DEBUG_TRACE,
+ ("packet> data offset = %lu\n", RTPktOffsetData));
+ DBGPRINT(RT_DEBUG_TRACE,
+ ("packet> len offset = %lu\n", RTPktOffsetLen));
+ DBGPRINT(RT_DEBUG_TRACE,
+ ("packet> cb offset = %lu\n", RTPktOffsetCB));
+ }
+
+ return TRUE;
+}
+
+
+/*
+========================================================================
+Routine Description:
+ Initialize the OS atomic_t.
+
+Arguments:
+ pAtomic - the atomic
+
+Return Value:
+ TRUE - allocation successfully
+ FALSE - allocation fail
+
+Note:
+========================================================================
+*/
+BOOLEAN RtmpOsAtomicInit(RTMP_OS_ATOMIC *pAtomic, LIST_HEADER *pAtomicList)
+{
+ if (RTMP_OS_Alloc_RscOnly(pAtomic, sizeof (atomic_t)) == FALSE) {
+ DBGPRINT(RT_DEBUG_ERROR, ("%s: alloc atomic fail!\n", __FUNCTION__));
+ return FALSE; /* allocate fail */
+ }
+
+ return TRUE;
+}
+
+/*
+========================================================================
+Routine Description:
+ Initialize the OS atomic_t.
+
+Arguments:
+ pAtomic - the atomic
+
+Return Value:
+ TRUE - allocation successfully
+ FALSE - allocation fail
+
+Note:
+========================================================================
+*/
+VOID RtmpOsAtomicDestroy(RTMP_OS_ATOMIC *pAtomic)
+{
+ if (pAtomic->pContent) {
+ os_free_mem(NULL, pAtomic->pContent);
+ pAtomic->pContent = NULL;
+ }
+}
+
+/*
+========================================================================
+Routine Description:
+ Atomic read a variable.
+
+Arguments:
+ pAtomic - the atomic
+
+Return Value:
+ content
+
+Note:
+========================================================================
+*/
+LONG RtmpOsAtomicRead(RTMP_OS_ATOMIC *pAtomicSrc)
+{
+ if (pAtomicSrc->pContent)
+ return atomic_read((atomic_t *) (pAtomicSrc->pContent));
+ else
+ return 0;
+}
+
+
+/*
+========================================================================
+Routine Description:
+ Atomic dec a variable.
+
+Arguments:
+ pAtomic - the atomic
+
+Return Value:
+ content
+
+Note:
+========================================================================
+*/
+VOID RtmpOsAtomicDec(RTMP_OS_ATOMIC *pAtomicSrc)
+{
+ if (pAtomicSrc->pContent)
+ atomic_dec((atomic_t *) (pAtomicSrc->pContent));
+}
+
+
+/*
+========================================================================
+Routine Description:
+ Sets a 32-bit variable to the specified value as an atomic operation.
+
+Arguments:
+ pAtomic - the atomic
+ Value - the value to be exchanged
+
+Return Value:
+ the initial value of the pAtomicSrc parameter
+
+Note:
+========================================================================
+*/
+VOID RtmpOsAtomicInterlockedExchange(
+ RTMP_OS_ATOMIC *pAtomicSrc,
+ LONG Value)
+{
+ if (pAtomicSrc->pContent)
+ InterlockedExchange((atomic_t *) (pAtomicSrc->pContent), Value);
+}
+
+
+/*
+========================================================================
+Routine Description:
+ Initialize the OS utilities.
+
+Arguments:
+ pOps - Utility table
+
+Return Value:
+ None
+
+Note:
+========================================================================
+*/
+VOID RtmpOsOpsInit(RTMP_OS_ABL_OPS *pOps)
+{
+ pOps->ra_printk = (RTMP_PRINTK)printk;
+ pOps->ra_snprintf = (RTMP_SNPRINTF)snprintf;
+}
+
+#else /* OS_ABL_FUNC_SUPPORT */
+
+
+void RtmpOSFSInfoChange(RTMP_OS_FS_INFO *pOSFSInfoOrg, BOOLEAN bSet)
+{
+ __RtmpOSFSInfoChange(pOSFSInfoOrg, bSet);
+}
+
+
+/* timeout -- ms */
+VOID RTMP_SetPeriodicTimer(NDIS_MINIPORT_TIMER *pTimerOrg, unsigned long timeout)
+{
+ __RTMP_SetPeriodicTimer(pTimerOrg, timeout);
+}
+
+
+/* convert NdisMInitializeTimer --> RTMP_OS_Init_Timer */
+VOID RTMP_OS_Init_Timer(
+ VOID *pReserved,
+ NDIS_MINIPORT_TIMER *pTimerOrg,
+ TIMER_FUNCTION function,
+ PVOID data,
+ LIST_HEADER *pTimerList)
+{
+ __RTMP_OS_Init_Timer(pReserved, pTimerOrg, function, data);
+}
+
+
+VOID RTMP_OS_Add_Timer(NDIS_MINIPORT_TIMER *pTimerOrg, unsigned long timeout)
+{
+ __RTMP_OS_Add_Timer(pTimerOrg, timeout);
+}
+
+
+VOID RTMP_OS_Mod_Timer(NDIS_MINIPORT_TIMER *pTimerOrg, unsigned long timeout)
+{
+ __RTMP_OS_Mod_Timer(pTimerOrg, timeout);
+}
+
+
+VOID RTMP_OS_Del_Timer(NDIS_MINIPORT_TIMER *pTimerOrg, BOOLEAN *pCancelled)
+{
+ __RTMP_OS_Del_Timer(pTimerOrg, pCancelled);
+}
+
+
+VOID RTMP_OS_Release_Timer(NDIS_MINIPORT_TIMER *pTimerOrg)
+{
+ __RTMP_OS_Release_Timer(pTimerOrg);
+}
+
+
+NDIS_STATUS RtmpOSTaskKill(RTMP_OS_TASK *pTask)
+{
+ return __RtmpOSTaskKill(pTask);
+}
+
+
+INT RtmpOSTaskNotifyToExit(RTMP_OS_TASK *pTask)
+{
+ return __RtmpOSTaskNotifyToExit(pTask);
+}
+
+
+void RtmpOSTaskCustomize(RTMP_OS_TASK *pTask)
+{
+ __RtmpOSTaskCustomize(pTask);
+}
+
+
+NDIS_STATUS RtmpOSTaskAttach(
+ RTMP_OS_TASK *pTask,
+ RTMP_OS_TASK_CALLBACK fn,
+ ULONG arg)
+{
+ return __RtmpOSTaskAttach(pTask, fn, arg);
+}
+
+
+NDIS_STATUS RtmpOSTaskInit(
+ RTMP_OS_TASK *pTask,
+ PSTRING pTaskName,
+ VOID *pPriv,
+ LIST_HEADER *pTaskList,
+ LIST_HEADER *pSemList)
+{
+ return __RtmpOSTaskInit(pTask, pTaskName, pPriv, pSemList);
+}
+
+
+BOOLEAN RtmpOSTaskWait(VOID *pReserved, RTMP_OS_TASK * pTask, INT32 *pStatus)
+{
+ return __RtmpOSTaskWait(pReserved, pTask, pStatus);
+}
+
+
+VOID RtmpOsTaskWakeUp(RTMP_OS_TASK *pTask)
+{
+#ifdef KTHREAD_SUPPORT
+ WAKE_UP(pTask);
+#else
+ RTMP_SEM_EVENT_UP(&pTask->taskSema);
+#endif
+}
+
+#endif /* OS_ABL_FUNC_SUPPORT */
+
diff --git a/cleopatre/devkit/mt7601udrv/os/linux/rt_linux_symb.c b/cleopatre/devkit/mt7601udrv/os/linux/rt_linux_symb.c
new file mode 100644
index 0000000000..a74ceff3b6
--- /dev/null
+++ b/cleopatre/devkit/mt7601udrv/os/linux/rt_linux_symb.c
@@ -0,0 +1,287 @@
+/****************************************************************************
+
+ Module Name:
+ UTIL/rt_linux_symb.c
+
+ Abstract:
+ All symbols provided from UTIL module are put here.
+
+ Revision History:
+ Who When What
+ --------- ---------- ----------------------------------------------
+
+***************************************************************************/
+
+#define RTMP_MODULE_OS
+#define RTMP_MODULE_OS_UTIL
+
+/*#include "rt_config.h" */
+#include "rtmp_comm.h"
+#include "rtmp_osabl.h"
+#include "rt_os_util.h"
+
+
+#ifdef OS_ABL_FUNC_SUPPORT
+
+EXPORT_SYMBOL(RTDebugLevel);
+EXPORT_SYMBOL(RTDebugFunc);
+
+/* utility */
+EXPORT_SYMBOL(RtmpUtilInit);
+EXPORT_SYMBOL(RTMPFreeNdisPacket);
+EXPORT_SYMBOL(AdapterBlockAllocateMemory);
+
+EXPORT_SYMBOL(RTMP_SetPeriodicTimer);
+EXPORT_SYMBOL(RTMP_OS_Add_Timer);
+EXPORT_SYMBOL(RTMP_OS_Mod_Timer);
+EXPORT_SYMBOL(RTMP_OS_Del_Timer);
+EXPORT_SYMBOL(RTMP_OS_Init_Timer);
+EXPORT_SYMBOL(RTMP_OS_Release_Timer);
+
+EXPORT_SYMBOL(RTMP_OS_Alloc_Rsc);
+EXPORT_SYMBOL(RTMP_OS_Free_Rscs);
+
+EXPORT_SYMBOL(os_alloc_mem);
+EXPORT_SYMBOL(os_alloc_mem_suspend);
+EXPORT_SYMBOL(os_free_mem);
+
+EXPORT_SYMBOL(ExpandPacket);
+EXPORT_SYMBOL(ClonePacket);
+EXPORT_SYMBOL(RTMP_AllocateFragPacketBuffer);
+EXPORT_SYMBOL(Sniff2BytesFromNdisBuffer);
+EXPORT_SYMBOL(RtmpOSNetPktAlloc);
+EXPORT_SYMBOL(duplicate_pkt_with_TKIP_MIC);
+EXPORT_SYMBOL(RTMPAllocateNdisPacket);
+EXPORT_SYMBOL(RTMP_QueryPacketInfo);
+EXPORT_SYMBOL(DuplicatePacket);
+EXPORT_SYMBOL(duplicate_pkt);
+EXPORT_SYMBOL(RTMPL2FrameTxAction);
+EXPORT_SYMBOL(RtmpOsPktBodyCopy);
+EXPORT_SYMBOL(RtmpOsIsPktCloned);
+EXPORT_SYMBOL(RtmpOsPktCopy);
+EXPORT_SYMBOL(RtmpOsPktClone);
+EXPORT_SYMBOL(RtmpOsPktDataPtrAssign);
+EXPORT_SYMBOL(RtmpOsPktLenAssign);
+EXPORT_SYMBOL(RtmpOsPktTailAdjust);
+EXPORT_SYMBOL(RtmpOsPktTailBufExtend);
+EXPORT_SYMBOL(RtmpOsPktHeadBufExtend);
+EXPORT_SYMBOL(RtmpOsPktReserve);
+EXPORT_SYMBOL(RtmpOsPktProtocolAssign);
+EXPORT_SYMBOL(RtmpOsPktInfPpaSend);
+EXPORT_SYMBOL(RtmpThreadPidKill);
+EXPORT_SYMBOL(RtmpOsPktRcvHandle);
+#ifdef IAPP_SUPPORT
+EXPORT_SYMBOL(RtmpOsPktIappMakeUp);
+#endif /* IAPP_SUPPORT */
+EXPORT_SYMBOL(RtmpOsPktInit);
+#ifdef CONFIG_AP_SUPPORT
+EXPORT_SYMBOL(VLAN_8023_Header_Copy);
+#endif /* CONFIG_AP_SUPPORT */
+EXPORT_SYMBOL(wlan_802_11_to_802_3_packet);
+EXPORT_SYMBOL(RtmpOsPktOffsetInit);
+
+#ifdef HDR_TRANS_SUPPORT
+EXPORT_SYMBOL(RtmpOsSetPacket);
+#endif /* HDR_TRANS_SUPPORT */
+
+EXPORT_SYMBOL(RtmpOSNetDevCreate);
+EXPORT_SYMBOL(RtmpOSNetDevClose);
+EXPORT_SYMBOL(RtmpOSNetDevAttach);
+EXPORT_SYMBOL(RtmpOSNetDevDetach);
+EXPORT_SYMBOL(RtmpOSNetDevProtect);
+EXPORT_SYMBOL(RtmpOSNetDevFree);
+EXPORT_SYMBOL(RtmpOSNetDevIsUp);
+EXPORT_SYMBOL(RtmpOsNetDevGetPhyAddr);
+EXPORT_SYMBOL(RtmpOsNetQueueStart);
+EXPORT_SYMBOL(RtmpOsNetQueueStop);
+EXPORT_SYMBOL(RtmpOsNetQueueWake);
+EXPORT_SYMBOL(RtmpOsSetPktNetDev);
+EXPORT_SYMBOL(RtmpOsPktNetDevGet);
+EXPORT_SYMBOL(RtmpOsGetNetDevName);
+EXPORT_SYMBOL(RtmpOsSetNetDevPriv);
+EXPORT_SYMBOL(RtmpOsGetNetDevPriv);
+EXPORT_SYMBOL(RtmpDevPrivFlagsGet);
+EXPORT_SYMBOL(RtmpOsSetNetDevType);
+EXPORT_SYMBOL(RtmpOsSetNetDevTypeMonitor);
+EXPORT_SYMBOL(RtmpOSNetDevAddrSet);
+
+EXPORT_SYMBOL(RtmpOSFileOpen);
+EXPORT_SYMBOL(RtmpOSFSInfoChange);
+EXPORT_SYMBOL(RtmpOSFileWrite);
+EXPORT_SYMBOL(RtmpOSFileRead);
+EXPORT_SYMBOL(RtmpOSFileClose);
+EXPORT_SYMBOL(RtmpOSFileSeek);
+EXPORT_SYMBOL(RtmpOsFileIsErr);
+
+EXPORT_SYMBOL(RtmpOSTaskNotifyToExit);
+EXPORT_SYMBOL(RtmpOSTaskInit);
+EXPORT_SYMBOL(RtmpOSTaskAttach);
+EXPORT_SYMBOL(RtmpOSTaskCustomize);
+EXPORT_SYMBOL(RtmpOSTaskKill);
+EXPORT_SYMBOL(RtmpOSTaskAlloc);
+EXPORT_SYMBOL(RtmpOSTaskFree);
+EXPORT_SYMBOL(RtmpOSTaskWait);
+EXPORT_SYMBOL(RtmpOsCheckTaskLegality);
+EXPORT_SYMBOL(RtmpOsTaskDataGet);
+EXPORT_SYMBOL(RtmpOsTaskIsKilled);
+EXPORT_SYMBOL(RtmpOsTaskWakeUp);
+
+EXPORT_SYMBOL(RtmpOsTaskletSche);
+EXPORT_SYMBOL(RtmpOsTaskletInit);
+EXPORT_SYMBOL(RtmpOsTaskletKill);
+EXPORT_SYMBOL(RtmpOsTaskletDataAssign);
+EXPORT_SYMBOL(RtmpOsTaskPidInit);
+
+EXPORT_SYMBOL(RtmpOsAllocateLock);
+EXPORT_SYMBOL(RtmpOsFreeSpinLock);
+EXPORT_SYMBOL(RtmpOsSpinLockBh);
+EXPORT_SYMBOL(RtmpOsSpinUnLockBh);
+EXPORT_SYMBOL(RtmpOsIntLock);
+EXPORT_SYMBOL(RtmpOsIntUnLock);
+
+EXPORT_SYMBOL(RtmpOsSemaInitLocked);
+EXPORT_SYMBOL(RtmpOsSemaInit);
+EXPORT_SYMBOL(RtmpOsSemaDestory);
+EXPORT_SYMBOL(RtmpOsSemaWaitInterruptible);
+EXPORT_SYMBOL(RtmpOsSemaWakeUp);
+EXPORT_SYMBOL(RtmpOsMlmeUp);
+
+EXPORT_SYMBOL(RtmpOsGetPid);
+
+EXPORT_SYMBOL(RtmpOsWait);
+EXPORT_SYMBOL(RtmpOsTimerAfter);
+EXPORT_SYMBOL(RtmpOsTimerBefore);
+EXPORT_SYMBOL(RtmpOsGetSystemUpTime);
+
+EXPORT_SYMBOL(RtmpOsDCacheFlush);
+
+
+EXPORT_SYMBOL(RtmpOsNtohs);
+EXPORT_SYMBOL(RtmpOsHtons);
+EXPORT_SYMBOL(RtmpOsNtohl);
+EXPORT_SYMBOL(RtmpOsHtonl);
+
+EXPORT_SYMBOL(RtmpOsVmalloc);
+EXPORT_SYMBOL(RtmpOsVfree);
+EXPORT_SYMBOL(RtmpOsCopyFromUser);
+EXPORT_SYMBOL(RtmpOsCopyToUser);
+
+EXPORT_SYMBOL(RtmpOsCmdUp);
+EXPORT_SYMBOL(RtmpOsCmdDisplayLenCheck);
+
+EXPORT_SYMBOL(hex_dump);
+EXPORT_SYMBOL(RtmpOsSendWirelessEvent);
+EXPORT_SYMBOL(RTMP_GetCurrentSystemTime);
+EXPORT_SYMBOL(RTMP_GetCurrentSystemTick);
+EXPORT_SYMBOL(RTMPusecDelay);
+EXPORT_SYMBOL(RtmpOsMsDelay);
+EXPORT_SYMBOL(RtmpOSWrielessEventSend);
+EXPORT_SYMBOL(RtmpOSWrielessEventSendExt);
+EXPORT_SYMBOL(RtmpOsTickUnitGet);
+EXPORT_SYMBOL(RtmpOsOpsInit);
+EXPORT_SYMBOL(RtmpOsGetUnaligned);
+EXPORT_SYMBOL(RtmpOsGetUnaligned32);
+EXPORT_SYMBOL(RtmpOsGetUnalignedlong);
+EXPORT_SYMBOL(RtmpOsMaxScanDataGet);
+EXPORT_SYMBOL(RtmpDrvMaxRateGet);
+EXPORT_SYMBOL(RtmpOsWirelessExtVerGet);
+EXPORT_SYMBOL(rtstrchr);
+EXPORT_SYMBOL(RtmpOsIsInInterrupt);
+EXPORT_SYMBOL(RtmpOsSimpleStrtol);
+EXPORT_SYMBOL(RtmpOsStatsAlloc);
+
+EXPORT_SYMBOL(RtmpOsAtomicInit);
+EXPORT_SYMBOL(RtmpOsAtomicDestroy);
+EXPORT_SYMBOL(RtmpOsAtomicRead);
+EXPORT_SYMBOL(RtmpOsAtomicDec);
+EXPORT_SYMBOL(RtmpOsAtomicInterlockedExchange);
+
+EXPORT_SYMBOL(RtmpDrvAllMacPrint);
+EXPORT_SYMBOL(RtmpDrvAllE2PPrint);
+
+EXPORT_SYMBOL(RtmpMeshDown);
+EXPORT_SYMBOL(RtmpOSIRQRelease);
+EXPORT_SYMBOL(RtmpOsWlanEventSet);
+
+/* cfg80211 */
+#ifdef RT_CFG80211_SUPPORT
+extern UCHAR Cfg80211_Chan[];
+EXPORT_SYMBOL(CFG80211OS_UnRegister);
+EXPORT_SYMBOL(CFG80211_SupBandInit);
+EXPORT_SYMBOL(Cfg80211_Chan);
+EXPORT_SYMBOL(CFG80211OS_RegHint);
+EXPORT_SYMBOL(CFG80211OS_RegHint11D);
+EXPORT_SYMBOL(CFG80211OS_BandInfoGet);
+EXPORT_SYMBOL(CFG80211OS_ChanNumGet);
+EXPORT_SYMBOL(CFG80211OS_ChanInfoGet);
+EXPORT_SYMBOL(CFG80211OS_ChanInfoInit);
+EXPORT_SYMBOL(CFG80211OS_Scaning);
+EXPORT_SYMBOL(CFG80211OS_ScanEnd);
+EXPORT_SYMBOL(CFG80211OS_ConnectResultInform);
+EXPORT_SYMBOL(CFG80211OS_SupBandReInit);
+#endif /* RT_CFG80211_SUPPORT */
+
+/* global variables */
+EXPORT_SYMBOL(RTPktOffsetData);
+EXPORT_SYMBOL(RTPktOffsetLen);
+EXPORT_SYMBOL(RTPktOffsetCB);
+
+#ifdef VENDOR_FEATURE4_SUPPORT
+EXPORT_SYMBOL(OS_NumOfMemAlloc);
+EXPORT_SYMBOL(OS_NumOfMemFree);
+#endif /* VENDOR_FEATURE4_SUPPORT */
+
+#ifdef VENDOR_FEATURE2_SUPPORT
+EXPORT_SYMBOL(OS_NumOfPktAlloc);
+EXPORT_SYMBOL(OS_NumOfPktFree);
+#endif /* VENDOR_FEATURE2_SUPPORT */
+
+/* only for AP */
+#ifdef CONFIG_AP_SUPPORT
+EXPORT_SYMBOL(duplicate_pkt_with_VLAN);
+#ifdef BG_FT_SUPPORT
+EXPORT_SYMBOL(BG_FTPH_Init);
+EXPORT_SYMBOL(BG_FTPH_Remove);
+#endif /* BG_FT_SUPPORT */
+#endif /* CONFIG_AP_SUPPORT */
+
+
+
+/* only for PCI */
+
+/* only for USB */
+#ifdef RTMP_MAC_USB
+EXPORT_SYMBOL(dump_urb);
+EXPORT_SYMBOL(RtmpOsUsbUrbDataGet);
+EXPORT_SYMBOL(RtmpOsUsbUrbStatusGet);
+EXPORT_SYMBOL(RtmpOsUsbUrbLenGet);
+EXPORT_SYMBOL(RtmpOsUsbEmptyUrbCheck);
+EXPORT_SYMBOL(RtmpOsUsbInitHTTxDesc);
+EXPORT_SYMBOL(RtmpOsUsbInitRxDesc);
+EXPORT_SYMBOL(RtmpOsUsbContextGet);
+EXPORT_SYMBOL(RtmpOsUsbStatusGet);
+EXPORT_SYMBOL(RtmpOsUsbDmaMapping);
+EXPORT_SYMBOL(RtmpOsGetUsbDevVendorID);
+EXPORT_SYMBOL(RtmpOsGetUsbDevProductID);
+#endif /* RTMP_MAC_USB */
+
+/* only for RBUS or flash-capable concurrent devices */
+#if defined(RTMP_RBUS_SUPPORT) || defined (RTMP_FLASH_SUPPORT)
+EXPORT_SYMBOL(RtmpFlashRead);
+EXPORT_SYMBOL(RtmpFlashWrite);
+#endif /* defined(RTMP_RBUS_SUPPORT) || defined (RTMP_FLASH_SUPPORT) */
+
+
+EXPORT_SYMBOL(RtPrivIoctlSetVal);
+
+#ifdef RTMP_USB_SUPPORT
+EXPORT_SYMBOL(RtmpInitCompletion);
+EXPORT_SYMBOL(RtmpWaitForCompletionTimeout);
+EXPORT_SYMBOL(RtmpComplete);
+#endif /* RTMP_USB_SUPPORT */
+EXPORT_SYMBOL(RtmpMsecsToJiffies);
+
+
+EXPORT_SYMBOL(RtmpDrvAllRFPrint);
+#endif /* OS_ABL_SUPPORT */
+
diff --git a/cleopatre/devkit/mt7601udrv/os/linux/rt_main_dev.c b/cleopatre/devkit/mt7601udrv/os/linux/rt_main_dev.c
new file mode 100644
index 0000000000..42c42cef21
--- /dev/null
+++ b/cleopatre/devkit/mt7601udrv/os/linux/rt_main_dev.c
@@ -0,0 +1,840 @@
+/*
+ ***************************************************************************
+ * Ralink Tech Inc.
+ * 4F, No. 2 Technology 5th Rd.
+ * Science-based Industrial Park
+ * Hsin-chu, Taiwan, R.O.C.
+ *
+ * (c) Copyright 2002, Ralink Technology, Inc.
+ *
+ * All rights reserved. Ralink's source code is an unpublished work and the
+ * use of a copyright notice does not imply otherwise. This source code
+ * contains confidential trade secret material of Ralink Tech. Any attemp
+ * or participation in deciphering, decoding, reverse engineering or in any
+ * way altering the source code is stricitly prohibited, unless the prior
+ * written consent of Ralink Technology, Inc. is obtained.
+ ***************************************************************************
+
+ Module Name:
+ rt_main_dev.c
+
+ Abstract:
+ Create and register network interface.
+
+ Revision History:
+ Who When What
+ -------- ---------- ----------------------------------------------
+*/
+
+
+#define RTMP_MODULE_OS
+
+/*#include "rt_config.h" */
+#include "rtmp_comm.h"
+#include "rt_os_util.h"
+#include "rt_os_net.h"
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)
+#ifndef SA_SHIRQ
+#define SA_SHIRQ IRQF_SHARED
+#endif
+#endif
+
+// TODO: shiang-6590, remove it when MP
+// TODO: End---
+
+#ifdef RTMP_MAC_USB
+#ifdef OS_ABL_SUPPORT
+MODULE_LICENSE("GPL");
+#endif /* OS_ABL_SUPPORT */
+#endif /* RTMP_MAC_USB */
+
+#ifdef CONFIG_APSTA_MIXED_SUPPORT
+/*UINT32 CW_MAX_IN_BITS;*/
+#endif /* CONFIG_APSTA_MIXED_SUPPORT */
+
+/*---------------------------------------------------------------------*/
+/* Private Variables Used */
+/*---------------------------------------------------------------------*/
+
+PSTRING mac = ""; /* default 00:00:00:00:00:00 */
+PSTRING hostname = ""; /* default CMPC */
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,12)
+MODULE_PARM (mac, "s");
+#else
+module_param (mac, charp, 0);
+#endif
+MODULE_PARM_DESC (mac, "rt28xx: wireless mac addr");
+
+#ifdef OS_ABL_SUPPORT
+RTMP_DRV_ABL_OPS RtmpDrvOps, *pRtmpDrvOps = &RtmpDrvOps;
+RTMP_NET_ABL_OPS RtmpDrvNetOps, *pRtmpDrvNetOps = &RtmpDrvNetOps;
+#endif /* OS_ABL_SUPPORT */
+
+
+/*---------------------------------------------------------------------*/
+/* Prototypes of Functions Used */
+/*---------------------------------------------------------------------*/
+
+/* public function prototype */
+int rt28xx_close(VOID *net_dev);
+int rt28xx_open(VOID *net_dev);
+
+/* private function prototype */
+static INT rt28xx_send_packets(IN struct sk_buff *skb_p, IN struct net_device *net_dev);
+
+
+
+
+struct net_device_stats *RT28xx_get_ether_stats(
+ IN struct net_device *net_dev);
+
+
+/*
+========================================================================
+Routine Description:
+ Close raxx interface.
+
+Arguments:
+ *net_dev the raxx interface pointer
+
+Return Value:
+ 0 Open OK
+ otherwise Open Fail
+
+Note:
+ 1. if open fail, kernel will not call the close function.
+ 2. Free memory for
+ (1) Mlme Memory Handler: MlmeHalt()
+ (2) TX & RX: RTMPFreeTxRxRingMemory()
+ (3) BA Reordering: ba_reordering_resource_release()
+========================================================================
+*/
+int MainVirtualIF_close(IN struct net_device *net_dev)
+{
+ VOID *pAd = NULL;
+
+ GET_PAD_FROM_NET_DEV(pAd, net_dev);
+
+ /* Sanity check for pAd */
+ if (pAd == NULL)
+ return 0; /* close ok */
+
+ netif_carrier_off(net_dev);
+ netif_stop_queue(net_dev);
+
+ RTMPInfClose(pAd);
+
+
+#ifdef IFUP_IN_PROBE
+#else
+ VIRTUAL_IF_DOWN(pAd);
+#endif /* IFUP_IN_PROBE */
+
+ RT_MOD_DEC_USE_COUNT();
+
+ return 0; /* close ok */
+}
+
+/*
+========================================================================
+Routine Description:
+ Open raxx interface.
+
+Arguments:
+ *net_dev the raxx interface pointer
+
+Return Value:
+ 0 Open OK
+ otherwise Open Fail
+
+Note:
+ 1. if open fail, kernel will not call the close function.
+ 2. Free memory for
+ (1) Mlme Memory Handler: MlmeHalt()
+ (2) TX & RX: RTMPFreeTxRxRingMemory()
+ (3) BA Reordering: ba_reordering_resource_release()
+========================================================================
+*/
+int MainVirtualIF_open(IN struct net_device *net_dev)
+{
+ VOID *pAd = NULL;
+
+ GET_PAD_FROM_NET_DEV(pAd, net_dev);
+
+ /* Sanity check for pAd */
+ if (pAd == NULL)
+ return 0; /* close ok */
+
+#ifdef CONFIG_AP_SUPPORT
+/* pAd->ApCfg.MBSSID[MAIN_MBSSID].bBcnSntReq = TRUE; */
+ RTMP_DRIVER_AP_MAIN_OPEN(pAd);
+#endif /* CONFIG_AP_SUPPORT */
+
+#ifdef IFUP_IN_PROBE
+ while (RTMP_DRIVER_IOCTL_SANITY_CHECK(pAd, NULL) != NDIS_STATUS_SUCCESS)
+ {
+ OS_WAIT(10);
+ DBGPRINT(RT_DEBUG_TRACE, ("Card not ready, NDIS_STATUS_SUCCESS!\n"));
+ }
+#else
+ if (VIRTUAL_IF_UP(pAd) != 0)
+ return -1;
+#endif /* IFUP_IN_PROBE */
+
+ /* increase MODULE use count */
+ RT_MOD_INC_USE_COUNT();
+
+ netif_start_queue(net_dev);
+ netif_carrier_on(net_dev);
+ netif_wake_queue(net_dev);
+
+ return 0;
+}
+
+/*
+========================================================================
+Routine Description:
+ Close raxx interface.
+
+Arguments:
+ *net_dev the raxx interface pointer
+
+Return Value:
+ 0 Open OK
+ otherwise Open Fail
+
+Note:
+ 1. if open fail, kernel will not call the close function.
+ 2. Free memory for
+ (1) Mlme Memory Handler: MlmeHalt()
+ (2) TX & RX: RTMPFreeTxRxRingMemory()
+ (3) BA Reordering: ba_reordering_resource_release()
+========================================================================
+*/
+int rt28xx_close(VOID *dev)
+{
+ struct net_device * net_dev = (struct net_device *)dev;
+ VOID *pAd = NULL;
+
+ GET_PAD_FROM_NET_DEV(pAd, net_dev);
+
+ DBGPRINT(RT_DEBUG_TRACE, ("===> rt28xx_close\n"));
+
+ /* Sanity check for pAd */
+ if (pAd == NULL)
+ return 0; /* close ok */
+
+ RTMPDrvClose(pAd, net_dev);
+
+ DBGPRINT(RT_DEBUG_TRACE, ("<=== rt28xx_close\n"));
+ return 0;
+}
+
+
+/*
+========================================================================
+Routine Description:
+ Open raxx interface.
+
+Arguments:
+ *net_dev the raxx interface pointer
+
+Return Value:
+ 0 Open OK
+ otherwise Open Fail
+
+Note:
+========================================================================
+*/
+int rt28xx_open(VOID *dev)
+{
+ struct net_device * net_dev = (struct net_device *)dev;
+ VOID *pAd = NULL;
+ int retval = 0;
+ ULONG OpMode;
+
+
+
+ /* sanity check */
+ if (sizeof(ra_dma_addr_t) < sizeof(dma_addr_t))
+ DBGPRINT(RT_DEBUG_ERROR, ("Fatal error for DMA address size!!!\n"));
+
+ GET_PAD_FROM_NET_DEV(pAd, net_dev);
+
+ /* Sanity check for pAd */
+ if (pAd == NULL)
+ {
+ /* if 1st open fail, pAd will be free;
+ So the net_dev->priv will be NULL in 2rd open */
+ return -1;
+ }
+
+ RTMP_DRIVER_MCU_SLEEP_CLEAR(pAd);
+
+ RTMP_DRIVER_OP_MODE_GET(pAd, &OpMode);
+
+
+
+#ifdef CONFIG_APSTA_MIXED_SUPPORT
+ if (OpMode == OPMODE_AP)
+ {
+ /*CW_MAX_IN_BITS = 6; */
+ RTMP_DRIVER_MAX_IN_BITS_SET(pAd, 6);
+ }
+ else if (OpMode == OPMODE_STA)
+ {
+ /*CW_MAX_IN_BITS = 10; */
+ RTMP_DRIVER_MAX_IN_BITS_SET(pAd, 10);
+ }
+#endif /* CONFIG_APSTA_MIXED_SUPPORT */
+
+#if WIRELESS_EXT >= 12
+/* if (RT_DEV_PRIV_FLAGS_GET(net_dev) == INT_MAIN) */
+ if (RTMP_DRIVER_MAIN_INF_CHECK(pAd, RT_DEV_PRIV_FLAGS_GET(net_dev)) == NDIS_STATUS_SUCCESS)
+ {
+#ifdef CONFIG_APSTA_MIXED_SUPPORT
+ if (OpMode == OPMODE_AP)
+ net_dev->wireless_handlers = (struct iw_handler_def *) &rt28xx_ap_iw_handler_def;
+#endif /* CONFIG_APSTA_MIXED_SUPPORT */
+ }
+#endif /* WIRELESS_EXT >= 12 */
+
+ /* Request interrupt service routine for PCI device */
+ /* register the interrupt routine with the os */
+ /*
+ AP Channel auto-selection will be run in rt28xx_init(),
+ so we must reqister IRQ hander here.
+ */
+ RtmpOSIRQRequest(net_dev);
+
+ /* Init IRQ parameters stored in pAd */
+/* RTMP_IRQ_INIT(pAd); */
+ RTMP_DRIVER_IRQ_INIT(pAd);
+
+ /* Chip & other init */
+ if (rt28xx_init(pAd, mac, hostname) == FALSE)
+ goto err;
+
+#ifdef MBSS_SUPPORT
+ /* the function can not be moved to RT2860_probe() even register_netdev()
+ is changed as register_netdevice().
+ Or in some PC, kernel will panic (Fedora 4) */
+ RT28xx_MBSS_Init(pAd, net_dev);
+#endif /* MBSS_SUPPORT */
+
+#ifdef WDS_SUPPORT
+ RT28xx_WDS_Init(pAd, net_dev);
+#endif /* WDS_SUPPORT */
+
+#ifdef APCLI_SUPPORT
+ RT28xx_ApCli_Init(pAd, net_dev);
+#endif /* APCLI_SUPPORT */
+
+
+
+#ifdef LINUX
+#ifdef RT_CFG80211_SUPPORT
+/* RT_CFG80211_REINIT(pAd); */
+/* RT_CFG80211_CRDA_REG_RULE_APPLY(pAd); */
+ RTMP_DRIVER_CFG80211_START(pAd);
+#endif /* RT_CFG80211_SUPPORT */
+#endif /* LINUX */
+
+ RTMPDrvOpen(pAd);
+
+
+#ifdef VENDOR_FEATURE2_SUPPORT
+ printk("Number of Packet Allocated in open = %lu\n", OS_NumOfPktAlloc);
+ printk("Number of Packet Freed in open = %lu\n", OS_NumOfPktFree);
+#endif /* VENDOR_FEATURE2_SUPPORT */
+
+ return (retval);
+
+err:
+/*+++move from rt28xx_init() to here. */
+/* RtmpOSIRQRelease(net_dev); */
+ RTMP_DRIVER_IRQ_RELEASE(pAd);
+/*---move from rt28xx_init() to here. */
+
+ return (-1);
+}
+
+
+PNET_DEV RtmpPhyNetDevInit(
+ IN VOID *pAd,
+ IN RTMP_OS_NETDEV_OP_HOOK *pNetDevHook)
+{
+ struct net_device *net_dev = NULL;
+ ULONG InfId, OpMode;
+
+ RTMP_DRIVER_MAIN_INF_GET(pAd, &InfId);
+
+/* net_dev = RtmpOSNetDevCreate(pAd, INT_MAIN, 0, sizeof(PRTMP_ADAPTER), INF_MAIN_DEV_NAME); */
+ RTMP_DRIVER_MAIN_INF_CREATE(pAd, &net_dev);
+ if (net_dev == NULL)
+ {
+ printk("RtmpPhyNetDevInit(): creation failed for main physical net device!\n");
+ return NULL;
+ }
+
+ NdisZeroMemory((unsigned char *)pNetDevHook, sizeof(RTMP_OS_NETDEV_OP_HOOK));
+ pNetDevHook->open = MainVirtualIF_open;
+ pNetDevHook->stop = MainVirtualIF_close;
+ pNetDevHook->xmit = rt28xx_send_packets;
+#ifdef IKANOS_VX_1X0
+ pNetDevHook->xmit = IKANOS_DataFramesTx;
+#endif /* IKANOS_VX_1X0 */
+ pNetDevHook->ioctl = rt28xx_ioctl;
+ pNetDevHook->priv_flags = InfId; /*INT_MAIN; */
+ pNetDevHook->get_stats = RT28xx_get_ether_stats;
+
+ pNetDevHook->needProtcted = FALSE;
+
+#if (WIRELESS_EXT < 21) && (WIRELESS_EXT >= 12)
+ pNetDevHook->get_wstats = rt28xx_get_wireless_stats;
+#endif
+
+ RTMP_DRIVER_OP_MODE_GET(pAd, &OpMode);
+
+
+#ifdef CONFIG_APSTA_MIXED_SUPPORT
+#if WIRELESS_EXT >= 12
+ if (OpMode == OPMODE_AP)
+ {
+ pNetDevHook->iw_handler = &rt28xx_ap_iw_handler_def;
+ }
+#endif /*WIRELESS_EXT >= 12 */
+#endif /* CONFIG_APSTA_MIXED_SUPPORT */
+
+ /* put private data structure */
+ RTMP_OS_NETDEV_SET_PRIV(net_dev, pAd);
+
+ /* double-check if pAd is associated with the net_dev */
+ if (RTMP_OS_NETDEV_GET_PRIV(net_dev) == NULL)
+ {
+ RtmpOSNetDevFree(net_dev);
+ return NULL;
+ }
+
+ RTMP_DRIVER_NET_DEV_SET(pAd, net_dev);
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)
+ SET_MODULE_OWNER(net_dev);
+#endif
+
+
+
+ return net_dev;
+
+}
+
+
+VOID *RtmpNetEthConvertDevSearch(
+ IN VOID *net_dev_,
+ IN UCHAR *pData)
+{
+ struct net_device *pNetDev;
+
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,26)
+ struct net_device *net_dev = (struct net_device *)net_dev_;
+ struct net *net;
+ net = dev_net(net_dev);
+
+ BUG_ON(!net);
+ for_each_netdev(net, pNetDev)
+#else
+ struct net *net;
+
+ struct net_device *net_dev = (struct net_device *)net_dev_;
+ BUG_ON(!net_dev->nd_net);
+ net = net_dev->nd_net;
+ for_each_netdev(net, pNetDev)
+#endif
+#else
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22)
+ for_each_netdev(pNetDev)
+#else
+ for (pNetDev = dev_base; pNetDev; pNetDev = pNetDev->next)
+#endif
+#endif
+ {
+ if ((pNetDev->type == ARPHRD_ETHER)
+ && NdisEqualMemory(pNetDev->dev_addr, &pData[6], pNetDev->addr_len))
+ break;
+ }
+
+ return (VOID *)pNetDev;
+}
+
+
+
+
+/*
+========================================================================
+Routine Description:
+ The entry point for Linux kernel sent packet to our driver.
+
+Arguments:
+ sk_buff *skb the pointer refer to a sk_buffer.
+
+Return Value:
+ 0
+
+Note:
+ This function is the entry point of Tx Path for Os delivery packet to
+ our driver. You only can put OS-depened & STA/AP common handle procedures
+ in here.
+========================================================================
+*/
+int rt28xx_packet_xmit(void *skbsrc)
+{
+ struct sk_buff *skb = (struct sk_buff *)skbsrc;
+ struct net_device *net_dev = skb->dev;
+ VOID *pAd = NULL;
+ PNDIS_PACKET pPacket = (PNDIS_PACKET) skb;
+
+ GET_PAD_FROM_NET_DEV(pAd, net_dev);
+
+
+ return RTMPSendPackets((NDIS_HANDLE)pAd, (PPNDIS_PACKET) &pPacket, 1,
+ skb->len, RtmpNetEthConvertDevSearch);
+
+}
+
+
+/*
+========================================================================
+Routine Description:
+ Send a packet to WLAN.
+
+Arguments:
+ skb_p points to our adapter
+ dev_p which WLAN network interface
+
+Return Value:
+ 0: transmit successfully
+ otherwise: transmit fail
+
+Note:
+========================================================================
+*/
+static int rt28xx_send_packets(
+ IN struct sk_buff *skb_p,
+ IN struct net_device *net_dev)
+{
+ if (!(RTMP_OS_NETDEV_STATE_RUNNING(net_dev)))
+ {
+ RELEASE_NDIS_PACKET(NULL, (PNDIS_PACKET)skb_p, NDIS_STATUS_FAILURE);
+ return 0;
+ }
+
+ NdisZeroMemory((PUCHAR)&skb_p->cb[CB_OFF], 15);
+ RTMP_SET_PACKET_NET_DEVICE_MBSSID(skb_p, MAIN_MBSSID);
+ MEM_DBG_PKT_ALLOC_INC(skb_p);
+
+ return rt28xx_packet_xmit(skb_p);
+}
+
+
+#if WIRELESS_EXT >= 12
+/* This function will be called when query /proc */
+struct iw_statistics *rt28xx_get_wireless_stats(struct net_device *net_dev)
+{
+ VOID *pAd = NULL;
+ struct iw_statistics *pStats;
+ RT_CMD_IW_STATS DrvIwStats, *pDrvIwStats = &DrvIwStats;
+
+
+ GET_PAD_FROM_NET_DEV(pAd, net_dev);
+
+
+ DBGPRINT(RT_DEBUG_TRACE, ("rt28xx_get_wireless_stats --->\n"));
+
+
+ pDrvIwStats->priv_flags = RT_DEV_PRIV_FLAGS_GET(net_dev);
+ pDrvIwStats->dev_addr = (PUCHAR)net_dev->dev_addr;
+
+ if (RTMP_DRIVER_IW_STATS_GET(pAd, pDrvIwStats) != NDIS_STATUS_SUCCESS)
+ return NULL;
+
+ pStats = (struct iw_statistics *)(pDrvIwStats->pStats);
+ pStats->status = 0; /* Status - device dependent for now */
+
+
+ pStats->qual.updated = 1; /* Flags to know if updated */
+#ifdef IW_QUAL_DBM
+ pStats->qual.updated |= IW_QUAL_DBM; /* Level + Noise are dBm */
+#endif /* IW_QUAL_DBM */
+ pStats->qual.qual = pDrvIwStats->qual;
+ pStats->qual.level = pDrvIwStats->level;
+ pStats->qual.noise = pDrvIwStats->noise;
+ pStats->discard.nwid = 0; /* Rx : Wrong nwid/essid */
+ pStats->miss.beacon = 0; /* Missed beacons/superframe */
+
+ DBGPRINT(RT_DEBUG_TRACE, ("<--- rt28xx_get_wireless_stats\n"));
+ return pStats;
+}
+#endif /* WIRELESS_EXT */
+
+
+INT rt28xx_ioctl(
+ IN PNET_DEV net_dev,
+ INOUT struct ifreq *rq,
+ IN INT cmd)
+{
+ VOID *pAd = NULL;
+ INT ret = 0;
+ ULONG OpMode;
+
+ GET_PAD_FROM_NET_DEV(pAd, net_dev);
+
+ if (pAd == NULL)
+ {
+ /* if 1st open fail, pAd will be free;
+ So the net_dev->priv will be NULL in 2rd open */
+ return -ENETDOWN;
+ }
+
+ RTMP_DRIVER_OP_MODE_GET(pAd, &OpMode);
+
+#ifdef CONFIG_AP_SUPPORT
+/* IF_DEV_CONFIG_OPMODE_ON_AP(pAd) */
+ RT_CONFIG_IF_OPMODE_ON_AP(OpMode)
+ {
+ ret = rt28xx_ap_ioctl(net_dev, rq, cmd);
+ }
+#endif /* CONFIG_AP_SUPPORT */
+
+
+ return ret;
+}
+
+
+/*
+ ========================================================================
+
+ Routine Description:
+ return ethernet statistics counter
+
+ Arguments:
+ net_dev Pointer to net_device
+
+ Return Value:
+ net_device_stats*
+
+ Note:
+
+ ========================================================================
+*/
+struct net_device_stats *RT28xx_get_ether_stats(
+ IN struct net_device *net_dev)
+{
+ VOID *pAd = NULL;
+ struct net_device_stats *pStats;
+
+ if (net_dev)
+ GET_PAD_FROM_NET_DEV(pAd, net_dev);
+
+ if (pAd)
+ {
+ RT_CMD_STATS DrvStats, *pDrvStats = &DrvStats;
+
+
+ //assign net device for RTMP_DRIVER_INF_STATS_GET()
+ pDrvStats->pNetDev = net_dev;
+ RTMP_DRIVER_INF_STATS_GET(pAd, pDrvStats);
+
+ pStats = (struct net_device_stats *)(pDrvStats->pStats);
+ pStats->rx_packets = pDrvStats->rx_packets;
+ pStats->tx_packets = pDrvStats->tx_packets;
+
+ pStats->rx_bytes = pDrvStats->rx_bytes;
+ pStats->tx_bytes = pDrvStats->tx_bytes;
+
+ pStats->rx_errors = pDrvStats->rx_errors;
+ pStats->tx_errors = pDrvStats->tx_errors;
+
+ pStats->rx_dropped = 0;
+ pStats->tx_dropped = 0;
+
+ pStats->multicast = pDrvStats->multicast;
+ pStats->collisions = pDrvStats->collisions;
+
+ pStats->rx_length_errors = 0;
+ pStats->rx_over_errors = pDrvStats->rx_over_errors;
+ pStats->rx_crc_errors = 0;/*pAd->WlanCounters.FCSErrorCount; // recved pkt with crc error */
+ pStats->rx_frame_errors = pDrvStats->rx_frame_errors;
+ pStats->rx_fifo_errors = pDrvStats->rx_fifo_errors;
+ pStats->rx_missed_errors = 0; /* receiver missed packet */
+
+ /* detailed tx_errors */
+ pStats->tx_aborted_errors = 0;
+ pStats->tx_carrier_errors = 0;
+ pStats->tx_fifo_errors = 0;
+ pStats->tx_heartbeat_errors = 0;
+ pStats->tx_window_errors = 0;
+
+ /* for cslip etc */
+ pStats->rx_compressed = 0;
+ pStats->tx_compressed = 0;
+
+ return pStats;
+ }
+ else
+ return NULL;
+}
+
+
+BOOLEAN RtmpPhyNetDevExit(
+ IN VOID *pAd,
+ IN PNET_DEV net_dev)
+{
+
+
+#ifdef CONFIG_AP_SUPPORT
+#ifdef APCLI_SUPPORT
+ /* remove all AP-client virtual interfaces. */
+ RT28xx_ApCli_Remove(pAd);
+#endif /* APCLI_SUPPORT */
+
+#ifdef WDS_SUPPORT
+ /* remove all WDS virtual interfaces. */
+ RT28xx_WDS_Remove(pAd);
+#endif /* WDS_SUPPORT */
+
+#ifdef MBSS_SUPPORT
+ RT28xx_MBSS_Remove(pAd);
+#endif /* MBSS_SUPPORT */
+#endif /* CONFIG_AP_SUPPORT */
+
+
+#ifdef INF_PPA_SUPPORT
+
+ RTMP_DRIVER_INF_PPA_EXIT(pAd);
+#endif /* INF_PPA_SUPPORT */
+
+ /* Unregister network device */
+ if (net_dev != NULL)
+ {
+ printk("RtmpOSNetDevDetach(): RtmpOSNetDeviceDetach(), dev->name=%s!\n", net_dev->name);
+ RtmpOSNetDevDetach(net_dev);
+ }
+
+ return TRUE;
+
+}
+
+
+/*******************************************************************************
+
+ Device IRQ related functions.
+
+ *******************************************************************************/
+int RtmpOSIRQRequest(IN PNET_DEV pNetDev)
+{
+ ULONG infType;
+ VOID *pAd = NULL;
+ int retval = 0;
+
+ GET_PAD_FROM_NET_DEV(pAd, pNetDev);
+
+ ASSERT(pAd);
+
+ RTMP_DRIVER_INF_TYPE_GET(pAd, &infType);
+
+
+
+ return retval;
+
+}
+
+#ifdef WDS_SUPPORT
+/*
+ ========================================================================
+
+ Routine Description:
+ return ethernet statistics counter
+
+ Arguments:
+ net_dev Pointer to net_device
+
+ Return Value:
+ net_device_stats*
+
+ Note:
+
+ ========================================================================
+*/
+struct net_device_stats *RT28xx_get_wds_ether_stats(
+ IN PNET_DEV net_dev)
+{
+ VOID *pAd = NULL;
+/* INT WDS_apidx = 0,index; */
+ struct net_device_stats *pStats;
+ RT_CMD_STATS WdsStats, *pWdsStats = &WdsStats;
+
+ if (net_dev) {
+ GET_PAD_FROM_NET_DEV(pAd, net_dev);
+ }
+
+/* if (RT_DEV_PRIV_FLAGS_GET(net_dev) == INT_WDS) */
+ {
+ if (pAd)
+ {
+
+ pWdsStats->pNetDev = net_dev;
+ if (RTMP_COM_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_WDS_STATS_GET,
+ 0, pWdsStats, RT_DEV_PRIV_FLAGS_GET(net_dev)) != NDIS_STATUS_SUCCESS)
+ return NULL;
+
+ pStats = (struct net_device_stats *)pWdsStats->pStats; /*pAd->stats; */
+
+ pStats->rx_packets = pWdsStats->rx_packets; /*pAd->WdsTab.WdsEntry[WDS_apidx].WdsCounter.ReceivedFragmentCount.QuadPart; */
+ pStats->tx_packets = pWdsStats->tx_packets; /*pAd->WdsTab.WdsEntry[WDS_apidx].WdsCounter.TransmittedFragmentCount.QuadPart; */
+
+ pStats->rx_bytes = pWdsStats->rx_bytes; /*pAd->WdsTab.WdsEntry[WDS_apidx].WdsCounter.ReceivedByteCount; */
+ pStats->tx_bytes = pWdsStats->tx_bytes; /*pAd->WdsTab.WdsEntry[WDS_apidx].WdsCounter.TransmittedByteCount; */
+
+ pStats->rx_errors = pWdsStats->rx_errors; /*pAd->WdsTab.WdsEntry[WDS_apidx].WdsCounter.RxErrors; */
+ pStats->tx_errors = pWdsStats->tx_errors; /*pAd->WdsTab.WdsEntry[WDS_apidx].WdsCounter.TxErrors; */
+
+ pStats->rx_dropped = 0;
+ pStats->tx_dropped = 0;
+
+ pStats->multicast = pWdsStats->multicast; /*pAd->WdsTab.WdsEntry[WDS_apidx].WdsCounter.MulticastReceivedFrameCount.QuadPart; // multicast packets received */
+ pStats->collisions = pWdsStats->collisions; /*pAd->WdsTab.WdsEntry[WDS_apidx].WdsCounter.OneCollision + pAd->WdsTab.WdsEntry[index].WdsCounter.MoreCollisions; // Collision packets */
+
+ pStats->rx_length_errors = 0;
+ pStats->rx_over_errors = pWdsStats->rx_over_errors; /*pAd->WdsTab.WdsEntry[WDS_apidx].WdsCounter.RxNoBuffer; // receiver ring buff overflow */
+ pStats->rx_crc_errors = 0;/*pAd->WlanCounters.FCSErrorCount; // recved pkt with crc error */
+ pStats->rx_frame_errors = pWdsStats->rx_frame_errors; /*pAd->WdsTab.WdsEntry[WDS_apidx].WdsCounter.RcvAlignmentErrors; // recv'd frame alignment error */
+ pStats->rx_fifo_errors = pWdsStats->rx_fifo_errors; /*pAd->WdsTab.WdsEntry[WDS_apidx].WdsCounter.RxNoBuffer; // recv'r fifo overrun */
+ pStats->rx_missed_errors = 0; /* receiver missed packet */
+
+ /* detailed tx_errors */
+ pStats->tx_aborted_errors = 0;
+ pStats->tx_carrier_errors = 0;
+ pStats->tx_fifo_errors = 0;
+ pStats->tx_heartbeat_errors = 0;
+ pStats->tx_window_errors = 0;
+
+ /* for cslip etc */
+ pStats->rx_compressed = 0;
+ pStats->tx_compressed = 0;
+
+ return pStats;
+ }
+ else
+ return NULL;
+ }
+/* else */
+/* return NULL; */
+}
+#endif /* WDS_SUPPORT */
+
+
+
+
diff --git a/cleopatre/devkit/mt7601udrv/os/linux/rt_proc.c b/cleopatre/devkit/mt7601udrv/os/linux/rt_proc.c
new file mode 100644
index 0000000000..aeebcd1ecf
--- /dev/null
+++ b/cleopatre/devkit/mt7601udrv/os/linux/rt_proc.c
@@ -0,0 +1,539 @@
+/*
+ ***************************************************************************
+ * Ralink Tech Inc.
+ * 4F, No. 2 Technology 5th Rd.
+ * Science-based Industrial Park
+ * Hsin-chu, Taiwan, R.O.C.
+ *
+ * (c) Copyright 2002, Ralink Technology, Inc.
+ *
+ * All rights reserved. Ralink's source code is an unpublished work and the
+ * use of a copyright notice does not imply otherwise. This source code
+ * contains confidential trade secret material of Ralink Tech. Any attemp
+ * or participation in deciphering, decoding, reverse engineering or in any
+ * way altering the source code is stricitly prohibited, unless the prior
+ * written consent of Ralink Technology, Inc. is obtained.
+ ***************************************************************************
+
+ Module Name:
+ rt_proc.c
+
+ Abstract:
+ Create and register proc file system for ralink device
+
+ Revision History:
+ Who When What
+ -------- ---------- ----------------------------------------------
+*/
+
+#include <linux/kernel.h>
+#include <linux/types.h>
+#include <linux/proc_fs.h>
+#include <asm/uaccess.h>
+
+#include "rt_config.h"
+
+int wl_proc_init(void);
+int wl_proc_exit(void);
+
+#ifdef CONFIG_RALINK_RT2880
+#define PROCREG_DIR "rt2880"
+#endif /* CONFIG_RALINK_RT2880 */
+
+#ifdef CONFIG_RALINK_RT3052
+#define PROCREG_DIR "rt3052"
+#endif /* CONFIG_RALINK_RT3052 */
+
+#ifdef CONFIG_RALINK_RT2883
+#define PROCREG_DIR "rt2883"
+#endif /* CONFIG_RALINK_RT2883 */
+
+#ifdef CONFIG_RALINK_RT3883
+#define PROCREG_DIR "rt3883"
+#endif /* CONFIG_RALINK_RT3883 */
+
+#ifdef CONFIG_RALINK_RT5350
+#define PROCREG_DIR "rt5350"
+#endif /* CONFIG_RALINK_RT5350 */
+
+#ifndef PROCREG_DIR
+#define PROCREG_DIR "rt2880"
+#endif /* PROCREG_DIR */
+
+#ifdef CONFIG_PROC_FS
+extern struct proc_dir_entry *procRegDir;
+
+#ifdef VIDEO_TURBINE_SUPPORT
+extern BOOLEAN UpdateFromGlobal;
+AP_VIDEO_STRUCT GLOBAL_AP_VIDEO_CONFIG;
+/*struct proc_dir_entry *proc_ralink_platform, *proc_ralink_wl, *proc_ralink_wl_video; */
+struct proc_dir_entry *proc_ralink_wl, *proc_ralink_wl_video;
+static struct proc_dir_entry *entry_wl_video_Update, *entry_wl_video_Enable, *entry_wl_video_ClassifierEnable, *entry_wl_video_HighTxMode, *entry_wl_video_TxPwr, *entry_wl_video_VideoMCSEnable, *entry_wl_video_VideoMCS, *entry_wl_video_TxBASize, *entry_wl_video_TxLifeTimeMode, *entry_wl_video_TxLifeTime, *entry_wl_video_TxRetryLimit;
+
+
+ssize_t video_Update_get(char *page, char **start, off_t off, int count,
+ int *eof, void *data_unused)
+{
+ sprintf(page, "%d\n", UpdateFromGlobal);
+ *eof = 1;
+ return strlen(page);
+}
+
+ssize_t video_Update_set(struct file *file, const char __user * buffer,
+ size_t count, loff_t *ppos)
+{
+ char *buf = kmalloc(count, GFP_KERNEL);
+
+ if (buf) {
+ unsigned long val;
+
+ if (copy_from_user(buf, buffer, count))
+ return -EFAULT;
+
+ if (buf)
+ val = simple_strtoul(buf, NULL, 10);
+
+ UpdateFromGlobal = val;
+ }
+ return count;
+}
+
+ssize_t video_Enable_get(char *page, char **start, off_t off, int count,
+ int *eof, void *data_unused)
+{
+ sprintf(page, "%d\n", GLOBAL_AP_VIDEO_CONFIG.Enable);
+ *eof = 1;
+ return strlen(page);
+}
+
+ssize_t video_Enable_set(struct file *file, const char __user * buffer,
+ size_t count, loff_t *ppos)
+{
+ char *buf = kmalloc(count, GFP_KERNEL);
+
+ if (buf) {
+ unsigned long val;
+
+ if (copy_from_user(buf, buffer, count))
+ return -EFAULT;
+
+ if (buf)
+ val = simple_strtoul(buf, NULL, 10);
+
+ GLOBAL_AP_VIDEO_CONFIG.Enable = val;
+ }
+ return count;
+}
+
+ssize_t video_ClassifierEnable_get(char *page, char **start, off_t off, int count,
+ int *eof, void *data_unused)
+{
+ sprintf(page, "%d\n", GLOBAL_AP_VIDEO_CONFIG.ClassifierEnable);
+ *eof = 1;
+ return strlen(page);
+}
+
+ssize_t video_ClassifierEnable_set(struct file *file, const char __user * buffer,
+ size_t count, loff_t *ppos)
+{
+ char *buf = kmalloc(count, GFP_KERNEL);
+
+ if (buf) {
+ unsigned long val;
+
+ if (copy_from_user(buf, buffer, count))
+ return -EFAULT;
+
+ if (buf)
+ val = simple_strtoul(buf, NULL, 10);
+
+ GLOBAL_AP_VIDEO_CONFIG.ClassifierEnable = val;
+ }
+ return count;
+}
+
+ssize_t video_HighTxMode_get(char *page, char **start, off_t off, int count,
+ int *eof, void *data_unused)
+{
+ sprintf(page, "%d\n", GLOBAL_AP_VIDEO_CONFIG.HighTxMode);
+ *eof = 1;
+ return strlen(page);
+}
+
+ssize_t video_HighTxMode_set(struct file *file, const char __user * buffer,
+ size_t count, loff_t *ppos)
+{
+ char *buf = kmalloc(count, GFP_KERNEL);
+
+ if (buf) {
+ unsigned long val;
+
+ if (copy_from_user(buf, buffer, count))
+ return -EFAULT;
+
+ if (buf)
+ val = simple_strtoul(buf, NULL, 10);
+
+ GLOBAL_AP_VIDEO_CONFIG.HighTxMode = val;
+ }
+ return count;
+}
+
+ssize_t video_TxPwr_get(char *page, char **start, off_t off, int count,
+ int *eof, void *data_unused)
+{
+ sprintf(page, "%d\n", GLOBAL_AP_VIDEO_CONFIG.TxPwr);
+ *eof = 1;
+ return strlen(page);
+}
+
+ssize_t video_TxPwr_set(struct file *file, const char __user * buffer,
+ size_t count, loff_t *ppos)
+{
+ char *buf = kmalloc(count, GFP_KERNEL);
+
+ if (buf) {
+ unsigned long val;
+
+ if (copy_from_user(buf, buffer, count))
+ return -EFAULT;
+
+ if (buf)
+ val = simple_strtoul(buf, NULL, 10);
+
+ GLOBAL_AP_VIDEO_CONFIG.TxPwr = val;
+ }
+ return count;
+}
+
+ssize_t video_VideoMCSEnable_get(char *page, char **start, off_t off, int count,
+ int *eof, void *data_unused)
+{
+ sprintf(page, "%d\n", GLOBAL_AP_VIDEO_CONFIG.VideoMCSEnable);
+ *eof = 1;
+ return strlen(page);
+}
+
+ssize_t video_VideoMCSEnable_set(struct file *file, const char __user * buffer,
+ size_t count, loff_t *ppos)
+{
+ char *buf = kmalloc(count, GFP_KERNEL);
+
+ if (buf) {
+ unsigned long val;
+
+ if (copy_from_user(buf, buffer, count))
+ return -EFAULT;
+
+ if (buf)
+ val = simple_strtoul(buf, NULL, 10);
+
+ GLOBAL_AP_VIDEO_CONFIG.VideoMCSEnable = val;
+ }
+ return count;
+}
+
+ssize_t video_VideoMCS_get(char *page, char **start, off_t off, int count,
+ int *eof, void *data_unused)
+{
+ sprintf(page, "%d\n", GLOBAL_AP_VIDEO_CONFIG.VideoMCS);
+ *eof = 1;
+ return strlen(page);
+}
+
+ssize_t video_VideoMCS_set(struct file *file, const char __user * buffer,
+ size_t count, loff_t *ppos)
+{
+ char *buf = kmalloc(count, GFP_KERNEL);
+
+ if (buf) {
+ unsigned long val;
+
+ if (copy_from_user(buf, buffer, count))
+ return -EFAULT;
+
+ if (buf)
+ val = simple_strtoul(buf, NULL, 10);
+
+ GLOBAL_AP_VIDEO_CONFIG.VideoMCS = val;
+ }
+ return count;
+}
+
+ssize_t video_TxBASize_get(char *page, char **start, off_t off, int count,
+ int *eof, void *data_unused)
+{
+ sprintf(page, "%d\n", GLOBAL_AP_VIDEO_CONFIG.TxBASize);
+ *eof = 1;
+ return strlen(page);
+}
+
+ssize_t video_TxBASize_set(struct file *file, const char __user * buffer,
+ size_t count, loff_t *ppos)
+{
+ char *buf = kmalloc(count, GFP_KERNEL);
+
+ if (buf) {
+ unsigned long val;
+
+ if (copy_from_user(buf, buffer, count))
+ return -EFAULT;
+
+ if (buf)
+ val = simple_strtoul(buf, NULL, 10);
+
+ GLOBAL_AP_VIDEO_CONFIG.TxBASize = val;
+ }
+ return count;
+}
+
+ssize_t video_TxLifeTimeMode_get(char *page, char **start, off_t off, int count,
+ int *eof, void *data_unused)
+{
+ sprintf(page, "%d\n", GLOBAL_AP_VIDEO_CONFIG.TxLifeTimeMode);
+ *eof = 1;
+ return strlen(page);
+}
+
+ssize_t video_TxLifeTimeMode_set(struct file *file, const char __user * buffer,
+ size_t count, loff_t *ppos)
+{
+ char *buf = kmalloc(count, GFP_KERNEL);
+
+ if (buf) {
+ unsigned long val;
+
+ if (copy_from_user(buf, buffer, count))
+ return -EFAULT;
+
+ if (buf)
+ val = simple_strtoul(buf, NULL, 10);
+
+ GLOBAL_AP_VIDEO_CONFIG.TxLifeTimeMode = val;
+ }
+ return count;
+}
+
+ssize_t video_TxLifeTime_get(char *page, char **start, off_t off, int count,
+ int *eof, void *data_unused)
+{
+ sprintf(page, "%d\n", GLOBAL_AP_VIDEO_CONFIG.TxLifeTime);
+ *eof = 1;
+ return strlen(page);
+}
+
+ssize_t video_TxLifeTime_set(struct file *file, const char __user * buffer,
+ size_t count, loff_t *ppos)
+{
+ char *buf = kmalloc(count, GFP_KERNEL);
+
+ if (buf) {
+ unsigned long val;
+
+ if (copy_from_user(buf, buffer, count))
+ return -EFAULT;
+
+ if (buf)
+ val = simple_strtoul(buf, NULL, 10);
+
+ GLOBAL_AP_VIDEO_CONFIG.TxLifeTime = val;
+ }
+ return count;
+}
+
+ssize_t video_TxRetryLimit_get(char *page, char **start, off_t off, int count,
+ int *eof, void *data_unused)
+{
+ sprintf(page, "0x%x\n", GLOBAL_AP_VIDEO_CONFIG.TxRetryLimit);
+ *eof = 1;
+ return strlen(page);
+}
+
+ssize_t video_TxRetryLimit_set(struct file *file, const char __user * buffer,
+ size_t count, loff_t *ppos)
+{
+ char *buf = kmalloc(count, GFP_KERNEL);
+
+ if (buf) {
+ unsigned long val;
+
+ if (copy_from_user(buf, buffer, count))
+ return -EFAULT;
+
+ if (buf)
+ val = simple_strtoul(buf, NULL, 16);
+
+ GLOBAL_AP_VIDEO_CONFIG.TxRetryLimit = val;
+ }
+ return count;
+}
+
+int wl_video_proc_init(void)
+{
+ GLOBAL_AP_VIDEO_CONFIG.Enable = FALSE;
+ GLOBAL_AP_VIDEO_CONFIG.ClassifierEnable = FALSE;
+ GLOBAL_AP_VIDEO_CONFIG.HighTxMode = FALSE;
+ GLOBAL_AP_VIDEO_CONFIG.TxPwr = 0;
+ GLOBAL_AP_VIDEO_CONFIG.VideoMCSEnable = FALSE;
+ GLOBAL_AP_VIDEO_CONFIG.VideoMCS = 0;
+ GLOBAL_AP_VIDEO_CONFIG.TxBASize = 0;
+ GLOBAL_AP_VIDEO_CONFIG.TxLifeTimeMode = FALSE;
+ GLOBAL_AP_VIDEO_CONFIG.TxLifeTime = 0;
+ GLOBAL_AP_VIDEO_CONFIG.TxRetryLimit = 0;
+
+ proc_ralink_wl = proc_mkdir("wl", procRegDir);
+
+ if (proc_ralink_wl)
+ proc_ralink_wl_video = proc_mkdir("VideoTurbine", proc_ralink_wl);
+
+ if (proc_ralink_wl_video) {
+ entry_wl_video_Update = create_proc_entry("UpdateFromGlobal", 0, proc_ralink_wl_video);
+ if (entry_wl_video_Update) {
+ entry_wl_video_Update->read_proc = (read_proc_t*)&video_Update_get;
+ entry_wl_video_Update->write_proc = (write_proc_t*)&video_Update_set;
+ }
+
+ entry_wl_video_Enable = create_proc_entry("Enable", 0, proc_ralink_wl_video);
+ if (entry_wl_video_Enable) {
+ entry_wl_video_Enable->read_proc = (read_proc_t*)&video_Enable_get;
+ entry_wl_video_Enable->write_proc = (write_proc_t*)&video_Enable_set;
+ }
+
+ entry_wl_video_ClassifierEnable = create_proc_entry("ClassifierEnable", 0, proc_ralink_wl_video);
+ if (entry_wl_video_ClassifierEnable) {
+ entry_wl_video_ClassifierEnable->read_proc = (read_proc_t*)&video_ClassifierEnable_get;
+ entry_wl_video_ClassifierEnable->write_proc = (write_proc_t*)&video_ClassifierEnable_set;
+ }
+
+ entry_wl_video_HighTxMode = create_proc_entry("HighTxMode", 0, proc_ralink_wl_video);
+ if (entry_wl_video_HighTxMode) {
+ entry_wl_video_HighTxMode->read_proc = (read_proc_t*)&video_HighTxMode_get;
+ entry_wl_video_HighTxMode->write_proc = (write_proc_t*)&video_HighTxMode_set;
+ }
+
+ entry_wl_video_TxPwr = create_proc_entry("TxPwr", 0, proc_ralink_wl_video);
+ if (entry_wl_video_TxPwr) {
+ entry_wl_video_TxPwr->read_proc = (read_proc_t*)&video_TxPwr_get;
+ entry_wl_video_TxPwr->write_proc = (write_proc_t*)&video_TxPwr_set;
+ }
+
+ entry_wl_video_VideoMCSEnable = create_proc_entry("VideoMCSEnable", 0, proc_ralink_wl_video);
+ if (entry_wl_video_VideoMCSEnable) {
+ entry_wl_video_VideoMCSEnable->read_proc = (read_proc_t*)&video_VideoMCSEnable_get;
+ entry_wl_video_VideoMCSEnable->write_proc = (write_proc_t*)&video_VideoMCSEnable_set;
+ }
+
+ entry_wl_video_VideoMCS = create_proc_entry("VideoMCS", 0, proc_ralink_wl_video);
+ if (entry_wl_video_VideoMCS) {
+ entry_wl_video_VideoMCS->read_proc = (read_proc_t*)&video_VideoMCS_get;
+ entry_wl_video_VideoMCS->write_proc = (write_proc_t*)&video_VideoMCS_set;
+ }
+
+ entry_wl_video_TxBASize = create_proc_entry("TxBASize", 0, proc_ralink_wl_video);
+ if (entry_wl_video_TxBASize) {
+ entry_wl_video_TxBASize->read_proc = (read_proc_t*)&video_TxBASize_get;
+ entry_wl_video_TxBASize->write_proc = (write_proc_t*)&video_TxBASize_set;
+ }
+ entry_wl_video_TxLifeTimeMode = create_proc_entry("TxLifeTimeMode", 0, proc_ralink_wl_video);
+ if (entry_wl_video_TxLifeTimeMode) {
+ entry_wl_video_TxLifeTimeMode->read_proc = (read_proc_t*)&video_TxLifeTimeMode_get;
+ entry_wl_video_TxLifeTimeMode->write_proc = (write_proc_t*)&video_TxLifeTimeMode_set;
+ }
+
+ entry_wl_video_TxLifeTime = create_proc_entry("TxLifeTime", 0, proc_ralink_wl_video);
+ if (entry_wl_video_TxLifeTime) {
+ entry_wl_video_TxLifeTime->read_proc = (read_proc_t*)&video_TxLifeTime_get;
+ entry_wl_video_TxLifeTime->write_proc = (write_proc_t*)&video_TxLifeTime_set;
+ }
+
+ entry_wl_video_TxRetryLimit = create_proc_entry("TxRetryLimit", 0, proc_ralink_wl_video);
+ if (entry_wl_video_TxRetryLimit) {
+ entry_wl_video_TxRetryLimit->read_proc = (read_proc_t*)&video_TxRetryLimit_get;
+ entry_wl_video_TxRetryLimit->write_proc = (write_proc_t*)&video_TxRetryLimit_set;
+ }
+ }
+
+ return 0;
+}
+
+int wl_video_proc_exit(void)
+{
+
+ if (entry_wl_video_Enable)
+ remove_proc_entry("Enable", proc_ralink_wl_video);
+
+ if (entry_wl_video_ClassifierEnable)
+ remove_proc_entry("ClassifierEnabl", proc_ralink_wl_video);
+
+ if (entry_wl_video_HighTxMode)
+ remove_proc_entry("HighTxMode", proc_ralink_wl_video);
+
+ if (entry_wl_video_TxPwr)
+ remove_proc_entry("TxPwr", proc_ralink_wl_video);
+
+ if (entry_wl_video_VideoMCSEnable)
+ remove_proc_entry("VideoMCSEnable", proc_ralink_wl_video);
+
+ if (entry_wl_video_VideoMCS)
+ remove_proc_entry("VideoMCS", proc_ralink_wl_video);
+
+ if (entry_wl_video_TxBASize)
+ remove_proc_entry("TxBASize", proc_ralink_wl_video);
+
+ if (entry_wl_video_TxLifeTimeMode)
+ remove_proc_entry("TxLifeTimeMode", proc_ralink_wl_video);
+
+ if (entry_wl_video_TxLifeTime)
+ remove_proc_entry("TxLifeTime", proc_ralink_wl_video);
+
+ if (entry_wl_video_TxRetryLimit)
+ remove_proc_entry("TxRetryLimit", proc_ralink_wl_video);
+
+ if (proc_ralink_wl_video)
+ remove_proc_entry("Video", proc_ralink_wl);
+
+ return 0;
+}
+#endif /* VIDEO_TURBINE_SUPPORT */
+
+int wl_proc_init(void)
+{
+ if (procRegDir == NULL)
+ procRegDir = proc_mkdir(PROCREG_DIR, NULL);
+
+ if (procRegDir) {
+#ifdef VIDEO_TURBINE_SUPPORT
+ wl_video_proc_init();
+#endif /* VIDEO_TURBINE_SUPPORT */
+ }
+
+ return 0;
+}
+
+int wl_proc_exit(void)
+{
+#ifdef VIDEO_TURBINE_SUPPORT
+ if (proc_ralink_wl_video) {
+ wl_video_proc_exit();
+ remove_proc_entry("Video", proc_ralink_wl);
+ }
+ if (proc_ralink_wl)
+ remove_proc_entry("wl", procRegDir);
+#endif /* VIDEO_TURBINE_SUPPORT */
+
+
+ return 0;
+}
+#else
+int wl_proc_init(void)
+{
+ return 0;
+}
+
+int wl_proc_exit(void)
+{
+
+ return 0;
+}
+#endif /* CONFIG_PROC_FS */
+
diff --git a/cleopatre/devkit/mt7601udrv/os/linux/rt_profile.c b/cleopatre/devkit/mt7601udrv/os/linux/rt_profile.c
new file mode 100644
index 0000000000..cadf457028
--- /dev/null
+++ b/cleopatre/devkit/mt7601udrv/os/linux/rt_profile.c
@@ -0,0 +1,857 @@
+/****************************************************************************
+ * Ralink Tech Inc.
+ * 4F, No. 2 Technology 5th Rd.
+ * Science-based Industrial Park
+ * Hsin-chu, Taiwan, R.O.C.
+ * (c) Copyright 2002, Ralink Technology, Inc.
+ *
+ * All rights reserved. Ralink's source code is an unpublished work and the
+ * use of a copyright notice does not imply otherwise. This source code
+ * contains confidential trade secret material of Ralink Tech. Any attemp
+ * or participation in deciphering, decoding, reverse engineering or in any
+ * way altering the source code is stricitly prohibited, unless the prior
+ * written consent of Ralink Technology, Inc. is obtained.
+ ****************************************************************************
+
+ Module Name:
+ rt_profile.c
+
+ Abstract:
+
+ Revision History:
+ Who When What
+ --------- ---------- ----------------------------------------------
+ */
+
+#include "rt_config.h"
+
+
+
+#ifdef SYSTEM_LOG_SUPPORT
+/* for wireless system event message */
+char const *pWirelessSysEventText[IW_SYS_EVENT_TYPE_NUM] = {
+ /* system status event */
+ "had associated successfully", /* IW_ASSOC_EVENT_FLAG */
+ "had disassociated", /* IW_DISASSOC_EVENT_FLAG */
+ "had deauthenticated", /* IW_DEAUTH_EVENT_FLAG */
+ "had been aged-out and disassociated", /* IW_AGEOUT_EVENT_FLAG */
+ "occurred CounterMeasures attack", /* IW_COUNTER_MEASURES_EVENT_FLAG */
+ "occurred replay counter different in Key Handshaking", /* IW_REPLAY_COUNTER_DIFF_EVENT_FLAG */
+ "occurred RSNIE different in Key Handshaking", /* IW_RSNIE_DIFF_EVENT_FLAG */
+ "occurred MIC different in Key Handshaking", /* IW_MIC_DIFF_EVENT_FLAG */
+ "occurred ICV error in RX", /* IW_ICV_ERROR_EVENT_FLAG */
+ "occurred MIC error in RX", /* IW_MIC_ERROR_EVENT_FLAG */
+ "Group Key Handshaking timeout", /* IW_GROUP_HS_TIMEOUT_EVENT_FLAG */
+ "Pairwise Key Handshaking timeout", /* IW_PAIRWISE_HS_TIMEOUT_EVENT_FLAG */
+ "RSN IE sanity check failure", /* IW_RSNIE_SANITY_FAIL_EVENT_FLAG */
+ "set key done in WPA/WPAPSK", /* IW_SET_KEY_DONE_WPA1_EVENT_FLAG */
+ "set key done in WPA2/WPA2PSK", /* IW_SET_KEY_DONE_WPA2_EVENT_FLAG */
+ "connects with our wireless client", /* IW_STA_LINKUP_EVENT_FLAG */
+ "disconnects with our wireless client", /* IW_STA_LINKDOWN_EVENT_FLAG */
+ "scan completed", /* IW_SCAN_COMPLETED_EVENT_FLAG */
+ "scan terminate!! Busy!! Enqueue fail!!", /* IW_SCAN_ENQUEUE_FAIL_EVENT_FLAG */
+ "channel switch to ", /* IW_CHANNEL_CHANGE_EVENT_FLAG */
+ "wireless mode is not support", /* IW_STA_MODE_EVENT_FLAG */
+ "blacklisted in MAC filter list", /* IW_MAC_FILTER_LIST_EVENT_FLAG */
+ "Authentication rejected because of challenge failure", /* IW_AUTH_REJECT_CHALLENGE_FAILURE */
+ "Scanning", /* IW_SCANNING_EVENT_FLAG */
+ "Start a new IBSS", /* IW_START_IBSS_FLAG */
+ "Join the IBSS", /* IW_JOIN_IBSS_FLAG */
+ "Shared WEP fail", /* IW_SHARED_WEP_FAIL*/
+ };
+
+#ifdef IDS_SUPPORT
+/* for wireless IDS_spoof_attack event message */
+char const *pWirelessSpoofEventText[IW_SPOOF_EVENT_TYPE_NUM] = {
+ "detected conflict SSID", /* IW_CONFLICT_SSID_EVENT_FLAG */
+ "detected spoofed association response", /* IW_SPOOF_ASSOC_RESP_EVENT_FLAG */
+ "detected spoofed reassociation responses", /* IW_SPOOF_REASSOC_RESP_EVENT_FLAG */
+ "detected spoofed probe response", /* IW_SPOOF_PROBE_RESP_EVENT_FLAG */
+ "detected spoofed beacon", /* IW_SPOOF_BEACON_EVENT_FLAG */
+ "detected spoofed disassociation", /* IW_SPOOF_DISASSOC_EVENT_FLAG */
+ "detected spoofed authentication", /* IW_SPOOF_AUTH_EVENT_FLAG */
+ "detected spoofed deauthentication", /* IW_SPOOF_DEAUTH_EVENT_FLAG */
+ "detected spoofed unknown management frame", /* IW_SPOOF_UNKNOWN_MGMT_EVENT_FLAG */
+ "detected replay attack" /* IW_REPLAY_ATTACK_EVENT_FLAG */
+ };
+
+/* for wireless IDS_flooding_attack event message */
+char const *pWirelessFloodEventText[IW_FLOOD_EVENT_TYPE_NUM] = {
+ "detected authentication flooding", /* IW_FLOOD_AUTH_EVENT_FLAG */
+ "detected association request flooding", /* IW_FLOOD_ASSOC_REQ_EVENT_FLAG */
+ "detected reassociation request flooding", /* IW_FLOOD_REASSOC_REQ_EVENT_FLAG */
+ "detected probe request flooding", /* IW_FLOOD_PROBE_REQ_EVENT_FLAG */
+ "detected disassociation flooding", /* IW_FLOOD_DISASSOC_EVENT_FLAG */
+ "detected deauthentication flooding", /* IW_FLOOD_DEAUTH_EVENT_FLAG */
+ "detected 802.1x eap-request flooding" /* IW_FLOOD_EAP_REQ_EVENT_FLAG */
+ };
+#endif /* IDS_SUPPORT */
+
+#ifdef WSC_INCLUDED
+/* for WSC wireless event message */
+char const *pWirelessWscEventText[IW_WSC_EVENT_TYPE_NUM] = {
+ "PBC Session Overlap", /* IW_WSC_PBC_SESSION_OVERLAP */
+ "This WPS Registrar supports PBC", /* IW_WSC_REGISTRAR_SUPPORT_PBC */
+ "This WPS Registrar supports PIN", /* IW_WSC_REGISTRAR_SUPPORT_PIN */
+ "WPS status success", /* IW_WSC_STATUS_SUCCESS */
+ "WPS status fail", /* IW_WSC_STATUS_FAIL */
+ "WPS 2 mins time out!", /* IW_WSC_2MINS_TIMEOUT */
+ "WPS Send EAPOL_Start!", /* IW_WSC_SEND_EAPOL_START */
+ "WPS Send WscStart!", /* IW_WSC_SEND_WSC_START */
+ "WPS Send M1!", /* IW_WSC_SEND_M1 */
+ "WPS Send M2!", /* IW_WSC_SEND_M2 */
+ "WPS Send M3!", /* IW_WSC_SEND_M3 */
+ "WPS Send M4!", /* IW_WSC_SEND_M4 */
+ "WPS Send M5!", /* IW_WSC_SEND_M5 */
+ "WPS Send M6!", /* IW_WSC_SEND_M6 */
+ "WPS Send M7!", /* IW_WSC_SEND_M7 */
+ "WPS Send M8!", /* IW_WSC_SEND_M8 */
+ "WPS Send WscDone!", /* IW_WSC_SEND_DONE */
+ "WPS Send WscAck!", /* IW_WSC_SEND_ACK */
+ "WPS Send WscNack!", /* IW_WSC_SEND_NACK */
+ "WPS Receive WscStart!", /* IW_WSC_RECEIVE_WSC_START */
+ "WPS Receive M1!", /* IW_WSC_RECEIVE_M1 */
+ "WPS Receive M2!", /* IW_WSC_RECEIVE_M2 */
+ "WPS Receive M3!", /* IW_WSC_RECEIVE_M3 */
+ "WPS Receive M4!", /* IW_WSC_RECEIVE_M4 */
+ "WPS Receive M5!", /* IW_WSC_RECEIVE_M5 */
+ "WPS Receive M6!", /* IW_WSC_RECEIVE_M6 */
+ "WPS Receive M7!", /* IW_WSC_RECEIVE_M7 */
+ "WPS Receive M8!", /* IW_WSC_RECEIVE_M8 */
+ "WPS Receive WscDone!", /* IW_WSC_RECEIVE_DONE */
+ "WPS Receive WscAck!", /* IW_WSC_RECEIVE_ACK */
+ "WPS Receive WscNack!", /* IW_WSC_RECEIVE_NACK */
+ "Not only one candidate found" /* IW_WSC_MANY_CANDIDATE */
+ };
+#endif /* WSC_INCLUDED */
+
+#endif /* SYSTEM_LOG_SUPPORT */
+
+
+NDIS_STATUS RTMPReadParametersHook(
+ IN PRTMP_ADAPTER pAd)
+{
+ PSTRING src = NULL;
+ RTMP_OS_FD srcf;
+ RTMP_OS_FS_INFO osFSInfo;
+ INT retval = NDIS_STATUS_FAILURE;
+ PSTRING buffer;
+
+#ifdef HOSTAPD_SUPPORT
+ int i;
+#endif /*HOSTAPD_SUPPORT */
+
+/* buffer = kmalloc(MAX_INI_BUFFER_SIZE, MEM_ALLOC_FLAG); */
+ os_alloc_mem(pAd, (UCHAR **)&buffer, MAX_INI_BUFFER_SIZE);
+ if(buffer == NULL)
+ return NDIS_STATUS_FAILURE;
+ memset(buffer, 0x00, MAX_INI_BUFFER_SIZE);
+
+ {
+#ifdef CONFIG_AP_SUPPORT
+ IF_DEV_CONFIG_OPMODE_ON_AP(pAd)
+ {
+ src = AP_PROFILE_PATH;
+ }
+#endif /* CONFIG_AP_SUPPORT */
+
+#ifdef MULTIPLE_CARD_SUPPORT
+ src = (PSTRING)pAd->MC_FileName;
+#endif /* MULTIPLE_CARD_SUPPORT */
+ }
+
+ if (src && *src)
+ {
+ RtmpOSFSInfoChange(&osFSInfo, TRUE);
+ srcf = RtmpOSFileOpen(src, O_RDONLY, 0);
+ if (IS_FILE_OPEN_ERR(srcf))
+ {
+ DBGPRINT(RT_DEBUG_ERROR, ("Open file \"%s\" failed!\n", src));
+ }
+ else
+ {
+ retval =RtmpOSFileRead(srcf, buffer, MAX_INI_BUFFER_SIZE);
+ if (retval > 0)
+ {
+ RTMPSetProfileParameters(pAd, buffer);
+ retval = NDIS_STATUS_SUCCESS;
+ }
+ else
+ DBGPRINT(RT_DEBUG_ERROR, ("Read file \"%s\" failed(errCode=%d)!\n", src, retval));
+
+ retval = RtmpOSFileClose(srcf);
+ if ( retval != 0)
+ {
+ retval = NDIS_STATUS_FAILURE;
+ DBGPRINT(RT_DEBUG_ERROR, ("Close file \"%s\" failed(errCode=%d)!\n", src, retval));
+ }
+ }
+
+ RtmpOSFSInfoChange(&osFSInfo, FALSE);
+ }
+
+#ifdef HOSTAPD_SUPPORT
+ for (i = 0; i < pAd->ApCfg.BssidNum; i++)
+ {
+ pAd->ApCfg.MBSSID[i].Hostapd=FALSE;
+ DBGPRINT(RT_DEBUG_TRACE, ("Reset ra%d hostapd support=FLASE", i));
+
+ }
+#endif /*HOSTAPD_SUPPORT */
+
+#ifdef SINGLE_SKU_V2
+ RTMPSetSingleSKUParameters(pAd);
+#endif /* SINGLE_SKU_V2 */
+
+/* kfree(buffer); */
+ os_free_mem(NULL, buffer);
+
+ return (retval);
+
+}
+
+
+#ifdef SYSTEM_LOG_SUPPORT
+/*
+ ========================================================================
+
+ Routine Description:
+ Send log message through wireless event
+
+ Support standard iw_event with IWEVCUSTOM. It is used below.
+
+ iwreq_data.data.flags is used to store event_flag that is defined by user.
+ iwreq_data.data.length is the length of the event log.
+
+ The format of the event log is composed of the entry's MAC address and
+ the desired log message (refer to pWirelessEventText).
+
+ ex: 11:22:33:44:55:66 has associated successfully
+
+ p.s. The requirement of Wireless Extension is v15 or newer.
+
+ ========================================================================
+*/
+VOID RtmpDrvSendWirelessEvent(
+ IN VOID *pAdSrc,
+ IN USHORT Event_flag,
+ IN PUCHAR pAddr,
+ IN UCHAR BssIdx,
+ IN CHAR Rssi)
+{
+ PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdSrc;
+ PSTRING pBuf = NULL, pBufPtr = NULL;
+ USHORT event, type, BufLen;
+ UCHAR event_table_len = 0;
+
+ if (pAd->CommonCfg.bWirelessEvent == FALSE)
+ return;
+
+ type = Event_flag & 0xFF00;
+ event = Event_flag & 0x00FF;
+
+ switch (type)
+ {
+ case IW_SYS_EVENT_FLAG_START:
+ event_table_len = IW_SYS_EVENT_TYPE_NUM;
+ break;
+#ifdef IDS_SUPPORT
+ case IW_SPOOF_EVENT_FLAG_START:
+ event_table_len = IW_SPOOF_EVENT_TYPE_NUM;
+ break;
+
+ case IW_FLOOD_EVENT_FLAG_START:
+ event_table_len = IW_FLOOD_EVENT_TYPE_NUM;
+ break;
+#endif /* IDS_SUPPORT */
+#ifdef WSC_INCLUDED
+ case IW_WSC_EVENT_FLAG_START:
+ event_table_len = IW_WSC_EVENT_TYPE_NUM;
+ break;
+#endif /* WSC_INCLUDED */
+ }
+
+ if (event_table_len == 0)
+ {
+ DBGPRINT(RT_DEBUG_ERROR, ("%s : The type(%0x02x) is not valid.\n", __FUNCTION__, type));
+ return;
+ }
+
+ if (event >= event_table_len)
+ {
+ DBGPRINT(RT_DEBUG_ERROR, ("%s : The event(%0x02x) is not valid.\n", __FUNCTION__, event));
+ return;
+ }
+
+ /*Allocate memory and copy the msg. */
+/* if((pBuf = kmalloc(IW_CUSTOM_MAX_LEN, GFP_ATOMIC)) != NULL) */
+ os_alloc_mem(NULL, (UCHAR **)&pBuf, IW_CUSTOM_MAX_LEN);
+ if(pBuf != NULL)
+ {
+ /*Prepare the payload */
+ memset(pBuf, 0, IW_CUSTOM_MAX_LEN);
+
+ pBufPtr = pBuf;
+
+ if (pAddr)
+ pBufPtr += sprintf(pBufPtr, "(RT2860) STA(%02x:%02x:%02x:%02x:%02x:%02x) ", PRINT_MAC(pAddr));
+ else if (BssIdx < MAX_MBSSID_NUM(pAd))
+ pBufPtr += sprintf(pBufPtr, "(RT2860) BSS(ra%d) ", BssIdx);
+ else
+ pBufPtr += sprintf(pBufPtr, "(RT2860) ");
+
+ if (type == IW_SYS_EVENT_FLAG_START)
+ {
+ pBufPtr += sprintf(pBufPtr, "%s", pWirelessSysEventText[event]);
+
+ if (Event_flag == IW_CHANNEL_CHANGE_EVENT_FLAG)
+ {
+ pBufPtr += sprintf(pBufPtr, "%3d", Rssi);
+ }
+ }
+#ifdef IDS_SUPPORT
+ else if (type == IW_SPOOF_EVENT_FLAG_START)
+ pBufPtr += sprintf(pBufPtr, "%s (RSSI=%d)", pWirelessSpoofEventText[event], Rssi);
+ else if (type == IW_FLOOD_EVENT_FLAG_START)
+ pBufPtr += sprintf(pBufPtr, "%s", pWirelessFloodEventText[event]);
+#endif /* IDS_SUPPORT */
+#ifdef WSC_INCLUDED
+ else if (type == IW_WSC_EVENT_FLAG_START)
+ pBufPtr += sprintf(pBufPtr, "%s", pWirelessWscEventText[event]);
+#endif /* WSC_INCLUDED */
+ else
+ pBufPtr += sprintf(pBufPtr, "%s", "unknown event");
+
+ pBufPtr[pBufPtr - pBuf] = '\0';
+ BufLen = pBufPtr - pBuf;
+
+ RtmpOSWrielessEventSend(pAd->net_dev, RT_WLAN_EVENT_CUSTOM, Event_flag, NULL, (PUCHAR)pBuf, BufLen);
+ /*DBGPRINT(RT_DEBUG_TRACE, ("%s : %s\n", __FUNCTION__, pBuf)); */
+
+/* kfree(pBuf); */
+ os_free_mem(NULL, pBuf);
+ }
+ else
+ DBGPRINT(RT_DEBUG_ERROR, ("%s : Can't allocate memory for wireless event.\n", __FUNCTION__));
+}
+#endif /* SYSTEM_LOG_SUPPORT */
+
+
+void RTMP_IndicateMediaState(
+ IN PRTMP_ADAPTER pAd,
+ IN NDIS_MEDIA_STATE media_state)
+{
+ pAd->IndicateMediaState = media_state;
+
+#ifdef SYSTEM_LOG_SUPPORT
+ if (pAd->IndicateMediaState == NdisMediaStateConnected)
+ {
+ RTMPSendWirelessEvent(pAd, IW_STA_LINKUP_EVENT_FLAG, pAd->MacTab.Content[BSSID_WCID].Addr, BSS0, 0);
+ }
+ else
+ {
+ RTMPSendWirelessEvent(pAd, IW_STA_LINKDOWN_EVENT_FLAG, pAd->MacTab.Content[BSSID_WCID].Addr, BSS0, 0);
+ }
+#endif /* SYSTEM_LOG_SUPPORT */
+}
+
+
+void tbtt_tasklet(unsigned long data)
+{
+#ifdef CONFIG_AP_SUPPORT
+#ifdef WORKQUEUE_BH
+ struct work_struct *work = (struct work_struct *)data;
+ POS_COOKIE pObj = container_of(work, struct os_cookie, tbtt_task);
+ RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)pObj->pAd_va;
+#else
+ PRTMP_ADAPTER pAd = (RTMP_ADAPTER *)data;
+#endif /* WORKQUEUE_BH */
+
+
+ if (pAd->OpMode == OPMODE_AP)
+ {
+ /* step 7 - if DTIM, then move backlogged bcast/mcast frames from PSQ to TXQ whenever DtimCount==0 */
+#ifdef RTMP_MAC_USB
+ if ((pAd->ApCfg.DtimCount + 1) == pAd->ApCfg.DtimPeriod)
+#endif /* RTMP_MAC_USB */
+ {
+ PQUEUE_ENTRY pEntry;
+ BOOLEAN bPS = FALSE;
+ UINT count = 0;
+ unsigned long IrqFlags;
+
+/* NdisAcquireSpinLock(&pAd->MacTabLock); */
+/* NdisAcquireSpinLock(&pAd->TxSwQueueLock); */
+
+ RTMP_IRQ_LOCK(&pAd->irq_lock, IrqFlags);
+ while (pAd->MacTab.McastPsQueue.Head)
+ {
+ bPS = TRUE;
+ if (pAd->TxSwQueue[QID_AC_BE].Number <= (pAd->TxSwQMaxLen + MAX_PACKETS_IN_MCAST_PS_QUEUE))
+ {
+ pEntry = RemoveHeadQueue(&pAd->MacTab.McastPsQueue);
+ /*if(pAd->MacTab.McastPsQueue.Number) */
+ if (count)
+ {
+ RTMP_SET_PACKET_MOREDATA(pEntry, TRUE);
+ }
+ InsertHeadQueue(&pAd->TxSwQueue[QID_AC_BE], pEntry);
+ count++;
+ }
+ else
+ {
+ break;
+ }
+ }
+ RTMP_IRQ_UNLOCK(&pAd->irq_lock, IrqFlags);
+
+
+/* NdisReleaseSpinLock(&pAd->TxSwQueueLock); */
+/* NdisReleaseSpinLock(&pAd->MacTabLock); */
+ if (pAd->MacTab.McastPsQueue.Number == 0)
+ {
+ UINT bss_index;
+
+ /* clear MCAST/BCAST backlog bit for all BSS */
+ for(bss_index=BSS0; bss_index<pAd->ApCfg.BssidNum; bss_index++)
+ WLAN_MR_TIM_BCMC_CLEAR(bss_index);
+ }
+ pAd->MacTab.PsQIdleCount = 0;
+
+ /* Dequeue outgoing framea from TxSwQueue0..3 queue and process it */
+ if (bPS == TRUE)
+ {
+ RTMPDeQueuePacket(pAd, FALSE, NUM_OF_TX_RING, /*MAX_TX_IN_TBTT*/MAX_PACKETS_IN_MCAST_PS_QUEUE);
+ }
+ }
+ }
+#endif /* CONFIG_AP_SUPPORT */
+}
+
+
+void announce_802_3_packet(
+ IN VOID *pAdSrc,
+ IN PNDIS_PACKET pPacket,
+ IN UCHAR OpMode)
+{
+ RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)pAdSrc;
+ PNDIS_PACKET pRxPkt = pPacket;
+
+ ASSERT(pPacket);
+ MEM_DBG_PKT_FREE_INC(pPacket);
+
+
+#ifdef CONFIG_AP_SUPPORT
+#ifdef APCLI_SUPPORT
+ IF_DEV_CONFIG_OPMODE_ON_AP(pAd)
+ {
+ if (RTMP_MATPktRxNeedConvert(pAd, RtmpOsPktNetDevGet(pRxPkt)))
+ RTMP_MATEngineRxHandle(pAd, pRxPkt, 0);
+ }
+#endif /* APCLI_SUPPORT */
+#endif /* CONFIG_AP_SUPPORT */
+
+
+ /* Push up the protocol stack */
+#ifdef CONFIG_AP_SUPPORT
+#ifdef PLATFORM_BL2348
+{
+ extern int (*pToUpperLayerPktSent)(PNDIS_PACKET *pSkb);
+ RtmpOsPktProtocolAssign(pRxPkt);
+ pToUpperLayerPktSent(pRxPkt);
+ return;
+}
+#endif /* PLATFORM_BL2348 */
+#endif /* CONFIG_AP_SUPPORT */
+
+#ifdef IKANOS_VX_1X0
+{
+ IKANOS_DataFrameRx(pAd, pRxPkt);
+ return;
+}
+#endif /* IKANOS_VX_1X0 */
+
+#ifdef INF_PPA_SUPPORT
+ if (ppa_hook_directpath_send_fn && pAd->PPAEnable==TRUE )
+ {
+ RtmpOsPktInfPpaSend(pRxPkt);
+ pRxPkt=NULL;
+ return;
+ }
+#endif /* INF_PPA_SUPPORT */
+
+
+
+#ifdef CONFIG_AP_SUPPORT
+#ifdef BG_FT_SUPPORT
+ if (BG_FTPH_PacketFromApHandle(pRxPkt) == 0)
+ return;
+#endif /* BG_FT_SUPPORT */
+#endif /* CONFIG_AP_SUPPORT */
+
+//+++Add by shiang for debug
+if (0) {
+ hex_dump("announce_802_3_packet", GET_OS_PKT_DATAPTR(pRxPkt), GET_OS_PKT_LEN(pRxPkt));
+}
+//---Add by shiang for debug
+
+ RtmpOsPktProtocolAssign(pRxPkt);
+ RtmpOsPktRcvHandle(pRxPkt);
+}
+
+
+
+
+extern NDIS_SPIN_LOCK TimerSemLock;
+
+VOID RTMPFreeAdapter(
+ IN VOID *pAdSrc)
+{
+ PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdSrc;
+ POS_COOKIE os_cookie;
+ int index;
+
+ os_cookie=(POS_COOKIE)pAd->OS_Cookie;
+
+ if (pAd->BeaconBuf)
+ os_free_mem(NULL, pAd->BeaconBuf);
+
+
+ NdisFreeSpinLock(&pAd->MgmtRingLock);
+
+
+ for (index =0 ; index < NUM_OF_TX_RING; index++)
+ {
+ NdisFreeSpinLock(&pAd->TxSwQueueLock[index]);
+ NdisFreeSpinLock(&pAd->DeQueueLock[index]);
+ pAd->DeQueueRunning[index] = FALSE;
+ }
+
+ NdisFreeSpinLock(&pAd->irq_lock);
+
+
+
+#ifdef UAPSD_SUPPORT
+ NdisFreeSpinLock(&pAd->UAPSDEOSPLock); /* OS_ABL_SUPPORT */
+#endif /* UAPSD_SUPPORT */
+
+#ifdef DOT11_N_SUPPORT
+ NdisFreeSpinLock(&pAd->mpdu_blk_pool.lock);
+#endif /* DOT11_N_SUPPORT */
+
+ if (pAd->iw_stats)
+ {
+ os_free_mem(NULL, pAd->iw_stats);
+ pAd->iw_stats = NULL;
+ }
+ if (pAd->stats)
+ {
+ os_free_mem(NULL, pAd->stats);
+ pAd->stats = NULL;
+ }
+
+ NdisFreeSpinLock(&TimerSemLock);
+
+#ifdef RALINK_ATE
+#ifdef RTMP_MAC_USB
+ RTMP_OS_ATMOIC_DESTROY(&pAd->BulkOutRemained);
+ RTMP_OS_ATMOIC_DESTROY(&pAd->BulkInRemained);
+#endif /* RTMP_MAC_USB */
+#endif /* RALINK_ATE */
+
+ RTMP_OS_FREE_TIMER(pAd);
+ RTMP_OS_FREE_LOCK(pAd);
+ RTMP_OS_FREE_TASKLET(pAd);
+ RTMP_OS_FREE_TASK(pAd);
+ RTMP_OS_FREE_SEM(pAd);
+ RTMP_OS_FREE_ATOMIC(pAd);
+
+ RtmpOsVfree(pAd); /* pci_free_consistent(os_cookie->pci_dev,sizeof(RTMP_ADAPTER),pAd,os_cookie->pAd_pa); */
+ if (os_cookie)
+ os_free_mem(NULL, os_cookie);
+}
+
+
+int RTMPSendPackets(
+ IN NDIS_HANDLE dev_hnd,
+ IN PPNDIS_PACKET ppPacketArray,
+ IN UINT NumberOfPackets,
+ IN UINT32 PktTotalLen,
+ IN RTMP_NET_ETH_CONVERT_DEV_SEARCH Func)
+{
+ RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)dev_hnd;
+ PNDIS_PACKET pPacket = ppPacketArray[0];
+
+
+ INC_COUNTER64(pAd->WlanCounters.TransmitCountFrmOs);
+
+ if (pPacket == NULL)
+ goto done;
+
+ /* RT2870STA does this in RTMPSendPackets() */
+#ifdef RALINK_ATE
+ if (ATE_ON(pAd))
+ {
+ RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_RESOURCES);
+ return 0;
+ }
+#endif /* RALINK_ATE */
+
+
+ /* EapolStart size is 18 */
+ if (PktTotalLen < 14)
+ {
+ /*printk("bad packet size: %d\n", pkt->len); */
+ hex_dump("bad packet", GET_OS_PKT_DATAPTR(pPacket), PktTotalLen);
+ RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE);
+ return 0;
+ }
+
+
+
+ RTMP_SET_PACKET_5VT(pPacket, 0);
+/* MiniportMMRequest(pAd, pkt->data, pkt->len); */
+#ifdef CONFIG_5VT_ENHANCE
+ if (*(int*)(GET_OS_PKT_CB(pPacket)) == BRIDGE_TAG) {
+ RTMP_SET_PACKET_5VT(pPacket, 1);
+ }
+#endif
+
+#ifdef CONFIG_AP_SUPPORT
+ IF_DEV_CONFIG_OPMODE_ON_AP(pAd)
+ APSendPackets((NDIS_HANDLE)pAd, (PPNDIS_PACKET) &pPacket, 1);
+#endif /* CONFIG_AP_SUPPORT */
+
+
+done:
+ return 0;
+}
+
+
+PNET_DEV get_netdev_from_bssid(
+ IN PRTMP_ADAPTER pAd,
+ IN UCHAR FromWhichBSSID)
+{
+ PNET_DEV dev_p = NULL;
+#ifdef CONFIG_AP_SUPPORT
+ UCHAR infRealIdx;
+#endif /* CONFIG_AP_SUPPORT */
+
+ do
+ {
+#ifdef CONFIG_AP_SUPPORT
+ infRealIdx = FromWhichBSSID & (NET_DEVICE_REAL_IDX_MASK);
+#ifdef APCLI_SUPPORT
+ if(FromWhichBSSID >= MIN_NET_DEVICE_FOR_APCLI)
+ {
+ dev_p = (infRealIdx >= MAX_APCLI_NUM ? NULL : pAd->ApCfg.ApCliTab[infRealIdx].dev);
+ break;
+ }
+#endif /* APCLI_SUPPORT */
+#ifdef WDS_SUPPORT
+ if(FromWhichBSSID >= MIN_NET_DEVICE_FOR_WDS)
+ {
+ dev_p = ((infRealIdx >= MAX_WDS_ENTRY) ? NULL : pAd->WdsTab.WdsEntry[infRealIdx].dev);
+ break;
+ }
+#endif /* WDS_SUPPORT */
+
+ if ((FromWhichBSSID > 0) &&
+ (FromWhichBSSID < pAd->ApCfg.BssidNum) &&
+ (FromWhichBSSID < MAX_MBSSID_NUM(pAd)) &&
+ (FromWhichBSSID < HW_BEACON_MAX_NUM))
+ {
+ dev_p = pAd->ApCfg.MBSSID[FromWhichBSSID].MSSIDDev;
+ }
+ else
+#endif /* CONFIG_AP_SUPPORT */
+ {
+ dev_p = pAd->net_dev;
+ }
+
+ } while (FALSE);
+
+ ASSERT(dev_p);
+ return dev_p; /* return one of MBSS */
+}
+
+
+#ifdef CONFIG_AP_SUPPORT
+/*
+========================================================================
+Routine Description:
+ Driver pre-Ioctl for AP.
+
+Arguments:
+ pAdSrc - WLAN control block pointer
+ pCB - the IOCTL parameters
+
+Return Value:
+ NDIS_STATUS_SUCCESS - IOCTL OK
+ Otherwise - IOCTL fail
+
+Note:
+========================================================================
+*/
+INT RTMP_AP_IoctlPrepare(
+ IN RTMP_ADAPTER *pAd,
+ IN VOID *pCB)
+{
+ RT_CMD_AP_IOCTL_CONFIG *pConfig = (RT_CMD_AP_IOCTL_CONFIG *)pCB;
+ POS_COOKIE pObj;
+ USHORT index;
+ INT Status = NDIS_STATUS_SUCCESS;
+#ifdef CONFIG_APSTA_MIXED_SUPPORT
+ INT cmd = 0xff;
+#endif /* CONFIG_APSTA_MIXED_SUPPORT */
+
+
+ pObj = (POS_COOKIE) pAd->OS_Cookie;
+
+ if((pConfig->priv_flags == INT_MAIN) && !RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE))
+ {
+ if (pConfig->pCmdData == NULL)
+ return Status;
+
+ if (RtPrivIoctlSetVal() == pConfig->CmdId_RTPRIV_IOCTL_SET)
+ {
+ if (TRUE
+#ifdef CONFIG_APSTA_MIXED_SUPPORT
+ && (strstr(pConfig->pCmdData, "OpMode") == NULL)
+#endif /* CONFIG_APSTA_MIXED_SUPPORT */
+#ifdef SINGLE_SKU
+ && (strstr(pConfig->pCmdData, "ModuleTxpower") == NULL)
+#endif /* SINGLE_SKU */
+ )
+
+ {
+ return -ENETDOWN;
+ }
+ }
+ else
+ return -ENETDOWN;
+ }
+
+ /* determine this ioctl command is comming from which interface. */
+ if (pConfig->priv_flags == INT_MAIN)
+ {
+ pObj->ioctl_if_type = INT_MAIN;
+ pObj->ioctl_if = MAIN_MBSSID;
+/* DBGPRINT(RT_DEBUG_INFO, ("rt28xx_ioctl I/F(ra%d)(flags=%d): cmd = 0x%08x\n", pObj->ioctl_if, RT_DEV_PRIV_FLAGS_GET(net_dev), cmd)); */
+ }
+ else if (pConfig->priv_flags == INT_MBSSID)
+ {
+ pObj->ioctl_if_type = INT_MBSSID;
+/* if (!RTMPEqualMemory(net_dev->name, pAd->net_dev->name, 3)) // for multi-physical card, no MBSSID */
+ if (strcmp(pConfig->name, RtmpOsGetNetDevName(pAd->net_dev)) != 0) /* sample */
+ {
+ for (index = 1; index < pAd->ApCfg.BssidNum; index++)
+ {
+ if (pAd->ApCfg.MBSSID[index].MSSIDDev == pConfig->net_dev)
+ {
+ pObj->ioctl_if = index;
+
+/* DBGPRINT(RT_DEBUG_INFO, ("rt28xx_ioctl I/F(ra%d)(flags=%d): cmd = 0x%08x\n", index, RT_DEV_PRIV_FLAGS_GET(net_dev), cmd)); */
+ break;
+ }
+ }
+ /* Interface not found! */
+ if(index == pAd->ApCfg.BssidNum)
+ {
+/* DBGPRINT(RT_DEBUG_ERROR, ("rt28xx_ioctl can not find I/F\n")); */
+ return -ENETDOWN;
+ }
+ }
+ else /* ioctl command from I/F(ra0) */
+ {
+/* GET_PAD_FROM_NET_DEV(pAd, net_dev); */
+ pObj->ioctl_if = MAIN_MBSSID;
+/* DBGPRINT(RT_DEBUG_ERROR, ("rt28xx_ioctl can not find I/F and use default: cmd = 0x%08x\n", cmd)); */
+ }
+ MBSS_MR_APIDX_SANITY_CHECK(pAd, pObj->ioctl_if);
+ }
+#ifdef WDS_SUPPORT
+ else if (pConfig->priv_flags == INT_WDS)
+ {
+ pObj->ioctl_if_type = INT_WDS;
+ for(index = 0; index < MAX_WDS_ENTRY; index++)
+ {
+ if (pAd->WdsTab.WdsEntry[index].dev == pConfig->net_dev)
+ {
+ pObj->ioctl_if = index;
+
+ break;
+ }
+
+ if(index == MAX_WDS_ENTRY)
+ {
+ DBGPRINT(RT_DEBUG_ERROR, ("rt28xx_ioctl can not find wds I/F\n"));
+ return -ENETDOWN;
+ }
+ }
+ }
+#endif /* WDS_SUPPORT */
+#ifdef APCLI_SUPPORT
+ else if (pConfig->priv_flags == INT_APCLI)
+ {
+ pObj->ioctl_if_type = INT_APCLI;
+ for (index = 0; index < MAX_APCLI_NUM; index++)
+ {
+ if (pAd->ApCfg.ApCliTab[index].dev == pConfig->net_dev)
+ {
+ pObj->ioctl_if = index;
+
+ break;
+ }
+
+ if(index == MAX_APCLI_NUM)
+ {
+ DBGPRINT(RT_DEBUG_ERROR, ("rt28xx_ioctl can not find Apcli I/F\n"));
+ return -ENETDOWN;
+ }
+ }
+ APCLI_MR_APIDX_SANITY_CHECK(pObj->ioctl_if);
+ }
+#endif /* APCLI_SUPPORT */
+ else
+ {
+/* DBGPRINT(RT_DEBUG_WARN, ("IOCTL is not supported in WDS interface\n")); */
+ return -EOPNOTSUPP;
+ }
+
+ pConfig->apidx = pObj->ioctl_if;
+ return Status;
+}
+
+
+VOID AP_E2PROM_IOCTL_PostCtrl(
+ IN RTMP_IOCTL_INPUT_STRUCT *wrq,
+ IN PSTRING msg)
+{
+ wrq->u.data.length = strlen(msg);
+ if (copy_to_user(wrq->u.data.pointer, msg, wrq->u.data.length))
+ {
+ DBGPRINT(RT_DEBUG_TRACE, ("%s: copy_to_user() fail\n", __FUNCTION__));
+ }
+}
+
+
+VOID IAPP_L2_UpdatePostCtrl(
+ IN PRTMP_ADAPTER pAd,
+ IN UINT8 *mac_p,
+ IN INT bssid)
+{
+}
+#endif /* CONFIG_AP_SUPPORT */
+
+
+//#ifdef WDS_SUPPORT
+VOID AP_WDS_KeyNameMakeUp(
+ IN STRING *pKey,
+ IN UINT32 KeyMaxSize,
+ IN INT KeyId)
+{
+ snprintf(pKey, KeyMaxSize, "Wds%dKey", KeyId);
+}
+//#endif /* WDS_SUPPORT */
+
diff --git a/cleopatre/devkit/mt7601udrv/os/linux/rt_rbus_pci_drv.c b/cleopatre/devkit/mt7601udrv/os/linux/rt_rbus_pci_drv.c
new file mode 100644
index 0000000000..9b216e3270
--- /dev/null
+++ b/cleopatre/devkit/mt7601udrv/os/linux/rt_rbus_pci_drv.c
@@ -0,0 +1,16 @@
+/****************************************************************************
+ * Ralink Tech Inc.
+ * Taiwan, R.O.C.
+ *
+ * (c) Copyright 2002, Ralink Technology, Inc.
+ *
+ * All rights reserved. Ralink's source code is an unpublished work and the
+ * use of a copyright notice does not imply otherwise. This source code
+ * contains confidential trade secret material of Ralink Tech. Any attemp
+ * or participation in deciphering, decoding, reverse engineering or in any
+ * way altering the source code is stricitly prohibited, unless the prior
+ * written consent of Ralink Technology, Inc. is obtained.
+ ***************************************************************************/
+
+
+
diff --git a/cleopatre/devkit/mt7601udrv/os/linux/rt_symb.c b/cleopatre/devkit/mt7601udrv/os/linux/rt_symb.c
new file mode 100644
index 0000000000..9b2b1e71f4
--- /dev/null
+++ b/cleopatre/devkit/mt7601udrv/os/linux/rt_symb.c
@@ -0,0 +1,9 @@
+#ifdef OS_ABL_SUPPORT
+
+#include <linux/module.h>
+#include "rt_config.h"
+
+EXPORT_SYMBOL(RTMP_DRV_OPS_FUNCTION);
+
+#endif /* OS_ABL_SUPPORT */
+
diff --git a/cleopatre/devkit/mt7601udrv/os/linux/rt_usb.c b/cleopatre/devkit/mt7601udrv/os/linux/rt_usb.c
new file mode 100644
index 0000000000..bbc7fefde3
--- /dev/null
+++ b/cleopatre/devkit/mt7601udrv/os/linux/rt_usb.c
@@ -0,0 +1,1314 @@
+/*
+ ***************************************************************************
+ * Ralink Tech Inc.
+ * 4F, No. 2 Technology 5th Rd.
+ * Science-based Industrial Park
+ * Hsin-chu, Taiwan, R.O.C.
+ *
+ * (c) Copyright 2002-2006, Ralink Technology, Inc.
+ *
+ * All rights reserved. Ralink's source code is an unpublished work and the
+ * use of a copyright notice does not imply otherwise. This source code
+ * contains confidential trade secret material of Ralink Tech. Any attemp
+ * or participation in deciphering, decoding, reverse engineering or in any
+ * way altering the source code is stricitly prohibited, unless the prior
+ * written consent of Ralink Technology, Inc. is obtained.
+ ***************************************************************************
+
+ Module Name:
+ rtusb_bulk.c
+
+ Abstract:
+
+ Revision History:
+ Who When What
+ -------- ---------- ----------------------------------------------
+ Name Date Modification logs
+
+*/
+
+#include "rt_config.h"
+
+
+/*
+========================================================================
+Routine Description:
+ Create kernel threads & tasklets.
+
+Arguments:
+ *net_dev Pointer to wireless net device interface
+
+Return Value:
+ NDIS_STATUS_SUCCESS
+ NDIS_STATUS_FAILURE
+
+Note:
+========================================================================
+*/
+NDIS_STATUS RtmpMgmtTaskInit(
+ IN RTMP_ADAPTER *pAd)
+{
+ RTMP_OS_TASK *pTask;
+ NDIS_STATUS status;
+
+ /*
+ Creat TimerQ Thread, We need init timerQ related structure before create the timer thread.
+ */
+ RtmpTimerQInit(pAd);
+
+ pTask = &pAd->timerTask;
+ RTMP_OS_TASK_INIT(pTask, "RtmpTimerTask", pAd);
+ status = RtmpOSTaskAttach(pTask, RtmpTimerQThread, (ULONG)pTask);
+ if (status == NDIS_STATUS_FAILURE)
+ {
+ printk (KERN_WARNING "%s: unable to start RtmpTimerQThread\n", RTMP_OS_NETDEV_GET_DEVNAME(pAd->net_dev));
+ return NDIS_STATUS_FAILURE;
+ }
+
+ /* Creat MLME Thread */
+ pTask = &pAd->mlmeTask;
+ RTMP_OS_TASK_INIT(pTask, "RtmpMlmeTask", pAd);
+ status = RtmpOSTaskAttach(pTask, MlmeThread, (ULONG)pTask);
+ if (status == NDIS_STATUS_FAILURE)
+ {
+ printk (KERN_WARNING "%s: unable to start MlmeThread\n", RTMP_OS_NETDEV_GET_DEVNAME(pAd->net_dev));
+ return NDIS_STATUS_FAILURE;
+ }
+
+ /* Creat Command Thread */
+ pTask = &pAd->cmdQTask;
+ RTMP_OS_TASK_INIT(pTask, "RtmpCmdQTask", pAd);
+ status = RtmpOSTaskAttach(pTask, RTUSBCmdThread, (ULONG)pTask);
+ if (status == NDIS_STATUS_FAILURE)
+ {
+ printk (KERN_WARNING "%s: unable to start RTUSBCmdThread\n", RTMP_OS_NETDEV_GET_DEVNAME(pAd->net_dev));
+ return NDIS_STATUS_FAILURE;
+ }
+
+#ifdef WSC_INCLUDED
+ /* start the crediential write task first. */
+ WscThreadInit(pAd);
+#endif /* WSC_INCLUDED */
+
+ return NDIS_STATUS_SUCCESS;
+}
+
+
+
+/*
+========================================================================
+Routine Description:
+ Close kernel threads.
+
+Arguments:
+ *pAd the raxx interface data pointer
+
+Return Value:
+ NONE
+
+Note:
+========================================================================
+*/
+VOID RtmpMgmtTaskExit(
+ IN RTMP_ADAPTER *pAd)
+{
+ INT ret;
+ RTMP_OS_TASK *pTask;
+
+ /* Sleep 50 milliseconds so pending io might finish normally */
+ RTMPusecDelay(50000);
+
+ /* We want to wait until all pending receives and sends to the */
+ /* device object. We cancel any */
+ /* irps. Wait until sends and receives have stopped. */
+ RTUSBCancelPendingIRPs(pAd);
+
+ /* We need clear timerQ related structure before exits of the timer thread. */
+ RtmpTimerQExit(pAd);
+
+ /* Terminate Mlme Thread */
+ pTask = &pAd->mlmeTask;
+ ret = RtmpOSTaskKill(pTask);
+ if (ret == NDIS_STATUS_FAILURE)
+ {
+/* DBGPRINT(RT_DEBUG_ERROR, ("%s: kill task(%s) failed!\n", */
+/* RTMP_OS_NETDEV_GET_DEVNAME(pAd->net_dev), pTask->taskName)); */
+ DBGPRINT(RT_DEBUG_ERROR, ("kill mlme task failed!\n"));
+ }
+
+ /* Terminate cmdQ thread */
+ pTask = &pAd->cmdQTask;
+ RTMP_OS_TASK_LEGALITY(pTask)
+ {
+ NdisAcquireSpinLock(&pAd->CmdQLock);
+ pAd->CmdQ.CmdQState = RTMP_TASK_STAT_STOPED;
+ NdisReleaseSpinLock(&pAd->CmdQLock);
+
+ /*RTUSBCMDUp(&pAd->cmdQTask); */
+ ret = RtmpOSTaskKill(pTask);
+ if (ret == NDIS_STATUS_FAILURE)
+ {
+/* DBGPRINT(RT_DEBUG_ERROR, ("%s: kill task(%s) failed!\n", */
+/* RTMP_OS_NETDEV_GET_DEVNAME(pAd->net_dev), pTask->taskName)); */
+ DBGPRINT(RT_DEBUG_ERROR, ("kill command task failed!\n"));
+ }
+ pAd->CmdQ.CmdQState = RTMP_TASK_STAT_UNKNOWN;
+ }
+
+ /* Terminate timer thread */
+ pTask = &pAd->timerTask;
+ ret = RtmpOSTaskKill(pTask);
+ if (ret == NDIS_STATUS_FAILURE)
+ {
+/* DBGPRINT(RT_DEBUG_ERROR, ("%s: kill task(%s) failed!\n", */
+/* RTMP_OS_NETDEV_GET_DEVNAME(pAd->net_dev), pTask->taskName)); */
+ DBGPRINT(RT_DEBUG_ERROR, ("kill timer task failed!\n"));
+ }
+
+#ifdef WSC_INCLUDED
+ WscThreadExit(pAd);
+#endif /* WSC_INCLUDED */
+
+}
+
+
+static void rtusb_dataout_complete(unsigned long data)
+{
+ PRTMP_ADAPTER pAd;
+ purbb_t pUrb;
+ POS_COOKIE pObj;
+ PHT_TX_CONTEXT pHTTXContext;
+ UCHAR BulkOutPipeId;
+ NTSTATUS Status;
+ unsigned long IrqFlags;
+
+
+ pUrb = (purbb_t)data;
+/* pHTTXContext = (PHT_TX_CONTEXT)pUrb->context; */
+ pHTTXContext = (PHT_TX_CONTEXT)RTMP_USB_URB_DATA_GET(pUrb);
+ Status = RTMP_USB_URB_STATUS_GET(pUrb);
+ pAd = pHTTXContext->pAd;
+ pObj = (POS_COOKIE) pAd->OS_Cookie;
+/* Status = pUrb->status; */
+
+ /* Store BulkOut PipeId */
+ BulkOutPipeId = pHTTXContext->BulkOutPipeId;
+ pAd->BulkOutDataOneSecCount++;
+
+ /*DBGPRINT(RT_DEBUG_LOUD, ("Done-B(%d):I=0x%lx, CWPos=%ld, NBPos=%ld, ENBPos=%ld, bCopy=%d!\n", BulkOutPipeId, in_interrupt(), pHTTXContext->CurWritePosition, */
+ /* pHTTXContext->NextBulkOutPosition, pHTTXContext->ENextBulkOutPosition, pHTTXContext->bCopySavePad)); */
+
+ RTMP_IRQ_LOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);
+ pAd->BulkOutPending[BulkOutPipeId] = FALSE;
+ pHTTXContext->IRPPending = FALSE;
+ pAd->watchDogTxPendingCnt[BulkOutPipeId] = 0;
+
+ if (Status == USB_ST_NOERROR)
+ {
+ pAd->BulkOutComplete++;
+
+ RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);
+
+ pAd->Counters8023.GoodTransmits++;
+ /*RTMP_IRQ_LOCK(&pAd->TxContextQueueLock[BulkOutPipeId], IrqFlags); */
+ FREE_HTTX_RING(pAd, BulkOutPipeId, pHTTXContext);
+ /*RTMP_IRQ_UNLOCK(&pAd->TxContextQueueLock[BulkOutPipeId], IrqFlags); */
+
+#ifdef UAPSD_SUPPORT
+#ifdef CONFIG_AP_SUPPORT
+ IF_DEV_CONFIG_OPMODE_ON_AP(pAd)
+ {
+ UAPSD_UnTagFrame(pAd, BulkOutPipeId, pHTTXContext->NextBulkOutPosition, pHTTXContext->ENextBulkOutPosition);
+ }
+#endif /* CONFIG_AP_SUPPORT */
+#endif /* UAPSD_SUPPORT */
+
+ }
+ else /* STATUS_OTHER */
+ {
+ PUCHAR pBuf;
+
+ pAd->BulkOutCompleteOther++;
+
+ pBuf = &pHTTXContext->TransferBuffer->field.WirelessPacket[pHTTXContext->NextBulkOutPosition];
+
+ if (!RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS |
+ fRTMP_ADAPTER_HALT_IN_PROGRESS |
+ fRTMP_ADAPTER_NIC_NOT_EXIST |
+ fRTMP_ADAPTER_BULKOUT_RESET)))
+ {
+ RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET);
+ pAd->bulkResetPipeid = BulkOutPipeId;
+ pAd->bulkResetReq[BulkOutPipeId] = pAd->BulkOutReq;
+ }
+ RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);
+
+ DBGPRINT_RAW(RT_DEBUG_ERROR, ("BulkOutDataPacket failed: ReasonCode=%d!\n", Status));
+ DBGPRINT_RAW(RT_DEBUG_ERROR, ("\t>>BulkOut Req=0x%lx, Complete=0x%lx, Other=0x%lx\n", pAd->BulkOutReq, pAd->BulkOutComplete, pAd->BulkOutCompleteOther));
+ DBGPRINT_RAW(RT_DEBUG_ERROR, ("\t>>BulkOut Header:%x %x %x %x %x %x %x %x\n", pBuf[0], pBuf[1], pBuf[2], pBuf[3], pBuf[4], pBuf[5], pBuf[6], pBuf[7]));
+ /*DBGPRINT_RAW(RT_DEBUG_ERROR, (">>BulkOutCompleteCancel=0x%x, BulkOutCompleteOther=0x%x\n", pAd->BulkOutCompleteCancel, pAd->BulkOutCompleteOther)); */
+
+ }
+#ifdef CONFIG_MULTI_CHANNEL
+ if ((pAd->MultiChannelFlowCtl & (1 << BulkOutPipeId)) == (1 << BulkOutPipeId))
+ return;
+#endif /* CONFIG_MULTI_CHANNEL */
+
+ /* */
+ /* bInUse = TRUE, means some process are filling TX data, after that must turn on bWaitingBulkOut */
+ /* bWaitingBulkOut = TRUE, means the TX data are waiting for bulk out. */
+ /* */
+ /*RTMP_IRQ_LOCK(&pAd->TxContextQueueLock[BulkOutPipeId], IrqFlags); */
+ if (((pHTTXContext->ENextBulkOutPosition != pHTTXContext->CurWritePosition) &&
+ (pHTTXContext->ENextBulkOutPosition != (pHTTXContext->CurWritePosition+8)) &&
+ !RTUSB_TEST_BULK_FLAG(pAd, (fRTUSB_BULK_OUT_DATA_FRAG << BulkOutPipeId)))
+#ifdef USB_BULK_BUF_ALIGMENT
+ || (pHTTXContext->NextBulkIdx != pHTTXContext->CurWriteIdx)
+#endif /* USB_BULK_BUF_ALIGMENT */
+ )
+ {
+ /* Indicate There is data avaliable */
+ RTUSB_SET_BULK_FLAG(pAd, (fRTUSB_BULK_OUT_DATA_NORMAL << BulkOutPipeId));
+ }
+ /*RTMP_IRQ_UNLOCK(&pAd->TxContextQueueLock[BulkOutPipeId], IrqFlags); */
+
+ /* Always call Bulk routine, even reset bulk. */
+ /* The protection of rest bulk should be in BulkOut routine */
+ RTUSBKickBulkOut(pAd);
+}
+
+
+static void rtusb_null_frame_done_tasklet(unsigned long data)
+{
+ PRTMP_ADAPTER pAd;
+ PTX_CONTEXT pNullContext;
+ purbb_t pUrb;
+ NTSTATUS Status;
+ unsigned long irqFlag;
+
+
+ pUrb = (purbb_t)data;
+/* pNullContext = (PTX_CONTEXT)pUrb->context; */
+ pNullContext = (PTX_CONTEXT)RTMP_USB_URB_DATA_GET(pUrb);
+ Status = RTMP_USB_URB_STATUS_GET(pUrb);
+ pAd = pNullContext->pAd;
+/* Status = pUrb->status; */
+
+ /* Reset Null frame context flags */
+ RTMP_IRQ_LOCK(&pAd->BulkOutLock[0], irqFlag);
+ pNullContext->IRPPending = FALSE;
+ pNullContext->InUse = FALSE;
+ pAd->BulkOutPending[0] = FALSE;
+ pAd->watchDogTxPendingCnt[0] = 0;
+
+ if (Status == USB_ST_NOERROR)
+ {
+ RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[0], irqFlag);
+
+ RTMPDeQueuePacket(pAd, FALSE, NUM_OF_TX_RING, MAX_TX_PROCESS);
+ }
+ else /* STATUS_OTHER */
+ {
+ if ((!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS)) &&
+ (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS)) &&
+ (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) &&
+ (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET)))
+ {
+ DBGPRINT_RAW(RT_DEBUG_ERROR, ("Bulk Out Null Frame Failed, ReasonCode=%d!\n", Status));
+ RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET);
+#ifdef CONFIG_MULTI_CHANNEL
+ if (pAd->Multi_Channel_Enable == TRUE)
+ pAd->bulkResetPipeid = (0 | BULKOUT_MGMT_RESET_FLAG);
+ else
+#endif /* CONFIG_MULTI_CHANNEL */
+ pAd->bulkResetPipeid = (MGMTPIPEIDX | BULKOUT_MGMT_RESET_FLAG);
+ RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[0], irqFlag);
+ RTEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_OUT, NULL, 0);
+ }
+ else
+ {
+ RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[0], irqFlag);
+ }
+ }
+
+ /* Always call Bulk routine, even reset bulk. */
+ /* The protectioon of rest bulk should be in BulkOut routine */
+ RTUSBKickBulkOut(pAd);
+}
+
+
+#ifdef CONFIG_MULTI_CHANNEL
+static void rtusb_hcca_null_frame_done_tasklet(unsigned long data)
+{
+ PRTMP_ADAPTER pAd;
+ PTX_CONTEXT pNullContext;
+ purbb_t pUrb;
+ NTSTATUS Status;
+ unsigned long irqFlag;
+ UCHAR BulkOutPipeId;
+
+ pUrb = (purbb_t)data;
+ pNullContext = (PTX_CONTEXT)RTMP_USB_URB_DATA_GET(pUrb);
+ Status = RTMP_USB_URB_STATUS_GET(pUrb);
+ pAd = pNullContext->pAd;
+ BulkOutPipeId = pNullContext->BulkOutPipeId;
+/* Status = pUrb->status; */
+
+ /* Reset Null frame context flags */
+ RTMP_IRQ_LOCK(&pAd->BulkOutLock[BulkOutPipeId], irqFlag);
+ pNullContext->IRPPending = FALSE;
+ pNullContext->InUse = FALSE;
+ pAd->BulkOutPending[BulkOutPipeId] = FALSE;
+ pAd->watchDogTxPendingCnt[BulkOutPipeId] = 0;
+
+ if (Status == USB_ST_NOERROR)
+ {
+ RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[BulkOutPipeId], irqFlag);
+
+ RTMPDeQueuePacket(pAd, FALSE, NUM_OF_TX_RING, MAX_TX_PROCESS);
+ }
+ else /* STATUS_OTHER */
+ {
+ if ((!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS)) &&
+ (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS)) &&
+ (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) &&
+ (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET)))
+ {
+ DBGPRINT_RAW(RT_DEBUG_ERROR, ("Bulk Out Null Frame Failed, ReasonCode=%d!\n", Status));
+ RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET);
+ pAd->bulkResetPipeid = (BulkOutPipeId | BULKOUT_MGMT_RESET_FLAG);
+ RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[BulkOutPipeId], irqFlag);
+ RTEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_OUT, NULL, 0);
+ }
+ else
+ RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[BulkOutPipeId], irqFlag);
+ }
+
+ /* Always call Bulk routine, even reset bulk. */
+ /* The protectioon of rest bulk should be in BulkOut routine */
+ RTUSBKickBulkOut(pAd);
+}
+
+#endif /* CONFIG_MULTI_CHANNEL */
+
+
+static void rtusb_pspoll_frame_done_tasklet(unsigned long data)
+{
+ PRTMP_ADAPTER pAd;
+ PTX_CONTEXT pPsPollContext;
+ purbb_t pUrb;
+ NTSTATUS Status;
+
+
+
+ pUrb = (purbb_t)data;
+/* pPsPollContext = (PTX_CONTEXT)pUrb->context; */
+ pPsPollContext = (PTX_CONTEXT)RTMP_USB_URB_DATA_GET(pUrb);
+ Status = RTMP_USB_URB_STATUS_GET(pUrb);
+ pAd = pPsPollContext->pAd;
+/* Status = pUrb->status; */
+
+ /* Reset PsPoll context flags */
+ pPsPollContext->IRPPending = FALSE;
+ pPsPollContext->InUse = FALSE;
+ pAd->watchDogTxPendingCnt[0] = 0;
+
+ if (Status == USB_ST_NOERROR)
+ {
+ RTMPDeQueuePacket(pAd, FALSE, NUM_OF_TX_RING, MAX_TX_PROCESS);
+ }
+ else /* STATUS_OTHER */
+ {
+ if ((!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS)) &&
+ (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS)) &&
+ (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) &&
+ (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET)))
+ {
+ DBGPRINT_RAW(RT_DEBUG_ERROR, ("Bulk Out PSPoll Failed\n"));
+ RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET);
+#ifdef CONFIG_MULTI_CHANNEL
+ if (pAd->Multi_Channel_Enable == TRUE)
+ pAd->bulkResetPipeid = (0 | BULKOUT_MGMT_RESET_FLAG);
+ else
+#endif /* CONFIG_MULTI_CHANNEL */
+ pAd->bulkResetPipeid = (MGMTPIPEIDX | BULKOUT_MGMT_RESET_FLAG);
+ RTEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_OUT, NULL, 0);
+ }
+ }
+
+ RTMP_SEM_LOCK(&pAd->BulkOutLock[0]);
+ pAd->BulkOutPending[0] = FALSE;
+ RTMP_SEM_UNLOCK(&pAd->BulkOutLock[0]);
+
+ /* Always call Bulk routine, even reset bulk. */
+ /* The protectioon of rest bulk should be in BulkOut routine */
+ RTUSBKickBulkOut(pAd);
+
+}
+
+
+/*
+========================================================================
+Routine Description:
+ Handle received packets.
+
+Arguments:
+ data - URB information pointer
+
+Return Value:
+ None
+
+Note:
+========================================================================
+*/
+static void rx_done_tasklet(unsigned long data)
+{
+ purbb_t pUrb;
+ PRX_CONTEXT pRxContext;
+ PRTMP_ADAPTER pAd;
+ NTSTATUS Status;
+ unsigned int IrqFlags;
+
+ pUrb = (purbb_t)data;
+/* pRxContext = (PRX_CONTEXT)pUrb->context; */
+ pRxContext = (PRX_CONTEXT)RTMP_USB_URB_DATA_GET(pUrb);
+ Status = RTMP_USB_URB_STATUS_GET(pUrb);
+ pAd = pRxContext->pAd;
+/* Status = pUrb->status; */
+
+
+ RTMP_IRQ_LOCK(&pAd->BulkInLock, IrqFlags);
+ pRxContext->InUse = FALSE;
+ pRxContext->IRPPending = FALSE;
+ pRxContext->BulkInOffset += RTMP_USB_URB_LEN_GET(pUrb); /*pUrb->actual_length; */
+ /*NdisInterlockedDecrement(&pAd->PendingRx); */
+ if ( pAd->PendingRx > 0 )
+ pAd->PendingRx--;
+
+ if (Status == USB_ST_NOERROR)
+ {
+ pAd->BulkInComplete++;
+ pAd->NextRxBulkInPosition = 0;
+ if (pRxContext->BulkInOffset) /* As jan's comment, it may bulk-in success but size is zero. */
+ {
+ pRxContext->Readable = TRUE;
+ INC_RING_INDEX(pAd->NextRxBulkInIndex, RX_RING_SIZE);
+ }
+ RTMP_IRQ_UNLOCK(&pAd->BulkInLock, IrqFlags);
+ }
+ else /* STATUS_OTHER */
+ {
+ pAd->BulkInCompleteFail++;
+ /* Still read this packet although it may comtain wrong bytes. */
+ pRxContext->Readable = FALSE;
+ RTMP_IRQ_UNLOCK(&pAd->BulkInLock, IrqFlags);
+
+ /* Parsing all packets. because after reset, the index will reset to all zero. */
+ if ((!RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS |
+ fRTMP_ADAPTER_BULKIN_RESET |
+ fRTMP_ADAPTER_HALT_IN_PROGRESS |
+ fRTMP_ADAPTER_NIC_NOT_EXIST))))
+ {
+
+ DBGPRINT_RAW(RT_DEBUG_ERROR, ("Bulk In Failed. Status=%d, BIIdx=0x%x, BIRIdx=0x%x, actual_length= 0x%x\n",
+ Status, pAd->NextRxBulkInIndex, pAd->NextRxBulkInReadIndex, RTMP_USB_URB_LEN_GET(pRxContext->pUrb))); /*->actual_length)); */
+
+ RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_BULKIN_RESET);
+ RTEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_IN, NULL, 0);
+ }
+ }
+
+ ASSERT((pRxContext->InUse == pRxContext->IRPPending));
+
+#ifdef RALINK_ATE
+ if (ATE_ON(pAd))
+ {
+ /* If the driver is in ATE mode and Rx frame is set into here. */
+ if (pAd->ContinBulkIn == TRUE)
+ {
+ RTUSBBulkReceive(pAd);
+ }
+ }
+ else
+#endif /* RALINK_ATE */
+ RTUSBBulkReceive(pAd);
+
+
+ return;
+
+}
+
+
+#ifdef RLT_MAC
+static void cmd_rsp_event_tasklet(unsigned long data)
+{
+ purbb_t pUrb;
+ PCMD_RSP_CONTEXT pCmdRspEventContext;
+ PRTMP_ADAPTER pAd;
+ NTSTATUS Status;
+ unsigned int IrqFlags;
+
+ pUrb = (purbb_t)data;
+ pCmdRspEventContext = (PRX_CONTEXT)RTMP_USB_URB_DATA_GET(pUrb);
+ Status = RTMP_USB_URB_STATUS_GET(pUrb);
+ pAd = pCmdRspEventContext->pAd;
+
+ RTMP_IRQ_LOCK(&pAd->CmdRspLock, IrqFlags);
+ pCmdRspEventContext->IRPPending = FALSE;
+ pCmdRspEventContext->InUse = FALSE;
+ RTMP_IRQ_UNLOCK(&pAd->CmdRspLock, IrqFlags);
+
+ if (Status == USB_ST_NOERROR)
+ {
+ RTMP_IRQ_LOCK(&pAd->CmdRspLock, IrqFlags);
+ pCmdRspEventContext->Readable = TRUE;
+ RTMP_IRQ_UNLOCK(&pAd->CmdRspLock, IrqFlags);
+
+ }
+ else
+ {
+ RTMP_IRQ_LOCK(&pAd->CmdRspLock, IrqFlags);
+ pCmdRspEventContext->Readable = FALSE;
+ RTMP_IRQ_UNLOCK(&pAd->CmdRspLock, IrqFlags);
+ }
+
+ RTUSBBulkCmdRspEventReceive(pAd);
+}
+#endif /* RLT_MAC */
+
+
+static void rtusb_mgmt_dma_done_tasklet(unsigned long data)
+{
+ PRTMP_ADAPTER pAd;
+ PTX_CONTEXT pMLMEContext;
+ int index;
+ PNDIS_PACKET pPacket;
+ purbb_t pUrb;
+ NTSTATUS Status;
+ unsigned long IrqFlags;
+
+
+ pUrb = (purbb_t)data;
+/* pMLMEContext = (PTX_CONTEXT)pUrb->context; */
+ pMLMEContext = (PTX_CONTEXT)RTMP_USB_URB_DATA_GET(pUrb);
+ Status = RTMP_USB_URB_STATUS_GET(pUrb);
+ pAd = pMLMEContext->pAd;
+/* Status = pUrb->status; */
+ index = pMLMEContext->SelfIdx;
+
+ ASSERT((pAd->MgmtRing.TxDmaIdx == index));
+
+ RTMP_IRQ_LOCK(&pAd->BulkOutLock[MGMTPIPEIDX], IrqFlags);
+
+
+#ifdef UAPSD_SUPPORT
+ /* Qos Null frame with EOSP shall have valid Wcid value. reference RtmpUSBMgmtKickOut() API. */
+ /* otherwise will be value of MCAST_WCID. */
+#ifdef CONFIG_AP_SUPPORT
+ IF_DEV_CONFIG_OPMODE_ON_AP(pAd)
+ {
+ /* Qos Null frame with EOSP shall have valid Wcid value. reference RtmpUSBMgmtKickOut() API. */
+ /* otherwise will be value of MCAST_WCID. */
+ if ((pMLMEContext->Wcid != MCAST_WCID) && (pMLMEContext->Wcid < MAX_LEN_OF_MAC_TABLE))
+ {
+ MAC_TABLE_ENTRY *pEntry = &pAd->MacTab.Content[pMLMEContext->Wcid];
+
+ UAPSD_SP_Close(pAd, pEntry);
+ pMLMEContext->Wcid = MCAST_WCID;
+ }
+ }
+#endif /* CONFIG_AP_SUPPORT */
+#endif /* UAPSD_SUPPORT */
+
+
+ if (Status != USB_ST_NOERROR)
+ {
+ /*Bulk-Out fail status handle */
+ if ((!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS)) &&
+ (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS)) &&
+ (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) &&
+ (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET)))
+ {
+ DBGPRINT_RAW(RT_DEBUG_ERROR, ("Bulk Out MLME Failed, Status=%d!\n", Status));
+ /* TODO: How to handle about the MLMEBulkOut failed issue. Need to resend the mgmt pkt? */
+ RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET);
+ pAd->bulkResetPipeid = (MGMTPIPEIDX | BULKOUT_MGMT_RESET_FLAG);
+ }
+ }
+
+ pAd->BulkOutPending[MGMTPIPEIDX] = FALSE;
+ RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[MGMTPIPEIDX], IrqFlags);
+
+ RTMP_IRQ_LOCK(&pAd->MLMEBulkOutLock, IrqFlags);
+ /* Reset MLME context flags */
+ pMLMEContext->IRPPending = FALSE;
+ pMLMEContext->InUse = FALSE;
+ pMLMEContext->bWaitingBulkOut = FALSE;
+ pMLMEContext->BulkOutSize = 0;
+
+ pPacket = pAd->MgmtRing.Cell[index].pNdisPacket;
+ pAd->MgmtRing.Cell[index].pNdisPacket = NULL;
+
+ /* Increase MgmtRing Index */
+ INC_RING_INDEX(pAd->MgmtRing.TxDmaIdx, MGMT_RING_SIZE);
+ pAd->MgmtRing.TxSwFreeIdx++;
+ RTMP_IRQ_UNLOCK(&pAd->MLMEBulkOutLock, IrqFlags);
+
+
+ /* No-matter success or fail, we free the mgmt packet. */
+ if (pPacket)
+ RTMPFreeNdisPacket(pAd, pPacket);
+
+ if ((RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS |
+ fRTMP_ADAPTER_HALT_IN_PROGRESS |
+ fRTMP_ADAPTER_NIC_NOT_EXIST))))
+ {
+ /* do nothing and return directly. */
+ }
+ else
+ {
+ if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET) &&
+ ((pAd->bulkResetPipeid & BULKOUT_MGMT_RESET_FLAG) == BULKOUT_MGMT_RESET_FLAG))
+ { /* For Mgmt Bulk-Out failed, ignore it now. */
+ RTEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_OUT, NULL, 0);
+ }
+ else
+ {
+
+ /* Always call Bulk routine, even reset bulk. */
+ /* The protectioon of rest bulk should be in BulkOut routine */
+ if (pAd->MgmtRing.TxSwFreeIdx < MGMT_RING_SIZE /* pMLMEContext->bWaitingBulkOut == TRUE */)
+ {
+ RTUSB_SET_BULK_FLAG(pAd, fRTUSB_BULK_OUT_MLME);
+ }
+ RTUSBKickBulkOut(pAd);
+ }
+ }
+
+
+}
+
+
+static void rtusb_hcca_dma_done_tasklet(unsigned long data)
+{
+ PRTMP_ADAPTER pAd;
+ PHT_TX_CONTEXT pHTTXContext;
+ UCHAR BulkOutPipeId = 4;
+ purbb_t pUrb;
+
+
+ DBGPRINT_RAW(RT_DEBUG_ERROR, ("--->hcca_dma_done_tasklet\n"));
+
+
+ pUrb = (purbb_t)data;
+/* pHTTXContext = (PHT_TX_CONTEXT)pUrb->context; */
+ pHTTXContext = (PHT_TX_CONTEXT)RTMP_USB_URB_DATA_GET(pUrb);
+ pAd = pHTTXContext->pAd;
+
+ rtusb_dataout_complete((unsigned long)pUrb);
+
+ if ((RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS |
+ fRTMP_ADAPTER_HALT_IN_PROGRESS |
+ fRTMP_ADAPTER_NIC_NOT_EXIST))))
+ {
+ /* do nothing and return directly. */
+ }
+ else
+ {
+ if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET))
+ {
+ RTEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_OUT, NULL, 0);
+ }
+ else
+ { pHTTXContext = &pAd->TxContext[BulkOutPipeId];
+ if ((pAd->TxSwQueue[BulkOutPipeId].Number > 0) &&
+ /*((pHTTXContext->CurWritePosition > (pHTTXContext->NextBulkOutPosition + 0x6000)) || (pHTTXContext->NextBulkOutPosition > pHTTXContext->CurWritePosition + 0x6000)) && */
+ (pAd->DeQueueRunning[BulkOutPipeId] == FALSE) &&
+ (pHTTXContext->bCurWriting == FALSE))
+ {
+ RTMPDeQueuePacket(pAd, FALSE, BulkOutPipeId, MAX_TX_PROCESS);
+ }
+
+#ifdef CONFIG_MULTI_CHANNEL
+ if ((pAd->MultiChannelFlowCtl & (1 << BulkOutPipeId)) == (1 << BulkOutPipeId))
+ return;
+#endif /* CONFIG_MULTI_CHANNEL */
+
+ RTUSB_SET_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NORMAL);
+ RTUSBKickBulkOut(pAd);
+ }
+ }
+
+ DBGPRINT_RAW(RT_DEBUG_ERROR, ("<---hcca_dma_done_tasklet\n"));
+
+ return;
+}
+
+
+static void rtusb_ac3_dma_done_tasklet(unsigned long data)
+{
+ PRTMP_ADAPTER pAd;
+ PHT_TX_CONTEXT pHTTXContext;
+ UCHAR BulkOutPipeId = 3;
+ purbb_t pUrb;
+
+
+ pUrb = (purbb_t)data;
+/* pHTTXContext = (PHT_TX_CONTEXT)pUrb->context; */
+ pHTTXContext = (PHT_TX_CONTEXT)RTMP_USB_URB_DATA_GET(pUrb);
+ pAd = pHTTXContext->pAd;
+
+ rtusb_dataout_complete((unsigned long)pUrb);
+
+ if ((RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS |
+ fRTMP_ADAPTER_HALT_IN_PROGRESS |
+ fRTMP_ADAPTER_NIC_NOT_EXIST))))
+ {
+ /* do nothing and return directly. */
+ }
+ else
+ {
+ if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET))
+ {
+ RTEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_OUT, NULL, 0);
+ }
+ else
+ { pHTTXContext = &pAd->TxContext[BulkOutPipeId];
+ if ((pAd->TxSwQueue[BulkOutPipeId].Number > 0) &&
+ /*((pHTTXContext->CurWritePosition > (pHTTXContext->NextBulkOutPosition + 0x6000)) || (pHTTXContext->NextBulkOutPosition > pHTTXContext->CurWritePosition + 0x6000)) && */
+ (pAd->DeQueueRunning[BulkOutPipeId] == FALSE) &&
+ (pHTTXContext->bCurWriting == FALSE))
+ {
+ RTMPDeQueuePacket(pAd, FALSE, BulkOutPipeId, MAX_TX_PROCESS);
+ }
+#ifdef CONFIG_MULTI_CHANNEL
+ if ((pAd->MultiChannelFlowCtl & (1 << BulkOutPipeId)) == (1 << BulkOutPipeId))
+ return;
+#endif /* CONFIG_MULTI_CHANNEL */
+
+ RTUSB_SET_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NORMAL<<3);
+ RTUSBKickBulkOut(pAd);
+ }
+ }
+
+
+ return;
+}
+
+
+static void rtusb_ac2_dma_done_tasklet(unsigned long data)
+{
+ PRTMP_ADAPTER pAd;
+ PHT_TX_CONTEXT pHTTXContext;
+ UCHAR BulkOutPipeId = 2;
+ purbb_t pUrb;
+
+
+ pUrb = (purbb_t)data;
+/* pHTTXContext = (PHT_TX_CONTEXT)pUrb->context; */
+ pHTTXContext = (PHT_TX_CONTEXT)RTMP_USB_URB_DATA_GET(pUrb);
+ pAd = pHTTXContext->pAd;
+
+ rtusb_dataout_complete((unsigned long)pUrb);
+
+ if ((RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS |
+ fRTMP_ADAPTER_HALT_IN_PROGRESS |
+ fRTMP_ADAPTER_NIC_NOT_EXIST))))
+ {
+ /* do nothing and return directly. */
+ }
+ else
+ {
+ if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET))
+ {
+ RTEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_OUT, NULL, 0);
+ }
+ else
+ { pHTTXContext = &pAd->TxContext[BulkOutPipeId];
+ if ((pAd->TxSwQueue[BulkOutPipeId].Number > 0) &&
+ /*((pHTTXContext->CurWritePosition > (pHTTXContext->NextBulkOutPosition + 0x6000)) || (pHTTXContext->NextBulkOutPosition > pHTTXContext->CurWritePosition + 0x6000)) && */
+ (pAd->DeQueueRunning[BulkOutPipeId] == FALSE) &&
+ (pHTTXContext->bCurWriting == FALSE))
+ {
+ RTMPDeQueuePacket(pAd, FALSE, BulkOutPipeId, MAX_TX_PROCESS);
+ }
+
+ RTUSB_SET_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NORMAL<<2);
+ RTUSBKickBulkOut(pAd);
+ }
+ }
+
+
+ return;
+}
+
+
+static void rtusb_ac1_dma_done_tasklet(unsigned long data)
+{
+ PRTMP_ADAPTER pAd;
+ PHT_TX_CONTEXT pHTTXContext;
+ UCHAR BulkOutPipeId = 1;
+ purbb_t pUrb;
+
+
+ pUrb = (purbb_t)data;
+/* pHTTXContext = (PHT_TX_CONTEXT)pUrb->context; */
+ pHTTXContext = (PHT_TX_CONTEXT)RTMP_USB_URB_DATA_GET(pUrb);
+ pAd = pHTTXContext->pAd;
+
+ rtusb_dataout_complete((unsigned long)pUrb);
+
+ if ((RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS |
+ fRTMP_ADAPTER_HALT_IN_PROGRESS |
+ fRTMP_ADAPTER_NIC_NOT_EXIST))))
+ {
+ /* do nothing and return directly. */
+ }
+ else
+ {
+ if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET))
+ {
+ RTEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_OUT, NULL, 0);
+ }
+ else
+ { pHTTXContext = &pAd->TxContext[BulkOutPipeId];
+ if ((pAd->TxSwQueue[BulkOutPipeId].Number > 0) &&
+ /*((pHTTXContext->CurWritePosition > (pHTTXContext->NextBulkOutPosition + 0x6000)) || (pHTTXContext->NextBulkOutPosition > pHTTXContext->CurWritePosition + 0x6000)) && */
+ (pAd->DeQueueRunning[BulkOutPipeId] == FALSE) &&
+ (pHTTXContext->bCurWriting == FALSE))
+ {
+ RTMPDeQueuePacket(pAd, FALSE, BulkOutPipeId, MAX_TX_PROCESS);
+ }
+
+ RTUSB_SET_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NORMAL<<1);
+ RTUSBKickBulkOut(pAd);
+ }
+ }
+ return;
+
+}
+
+
+static void rtusb_ac0_dma_done_tasklet(unsigned long data)
+{
+ PRTMP_ADAPTER pAd;
+ PHT_TX_CONTEXT pHTTXContext;
+ UCHAR BulkOutPipeId = 0;
+ purbb_t pUrb;
+
+
+ pUrb = (purbb_t)data;
+/* pHTTXContext = (PHT_TX_CONTEXT)pUrb->context; */
+ pHTTXContext = (PHT_TX_CONTEXT)RTMP_USB_URB_DATA_GET(pUrb);
+ pAd = pHTTXContext->pAd;
+
+ rtusb_dataout_complete((unsigned long)pUrb);
+
+ if ((RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS |
+ fRTMP_ADAPTER_HALT_IN_PROGRESS |
+ fRTMP_ADAPTER_NIC_NOT_EXIST))))
+ {
+ /* do nothing and return directly. */
+ }
+ else
+ {
+ if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET))
+ {
+ RTEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_OUT, NULL, 0);
+ }
+ else
+ { pHTTXContext = &pAd->TxContext[BulkOutPipeId];
+ if ((pAd->TxSwQueue[BulkOutPipeId].Number > 0) &&
+ /* ((pHTTXContext->CurWritePosition > (pHTTXContext->NextBulkOutPosition + 0x6000)) || (pHTTXContext->NextBulkOutPosition > pHTTXContext->CurWritePosition + 0x6000)) && */
+ (pAd->DeQueueRunning[BulkOutPipeId] == FALSE) &&
+ (pHTTXContext->bCurWriting == FALSE))
+ {
+ RTMPDeQueuePacket(pAd, FALSE, BulkOutPipeId, MAX_TX_PROCESS);
+ }
+
+#ifdef CONFIG_MULTI_CHANNEL
+ if ((pAd->MultiChannelFlowCtl & (1 << BulkOutPipeId)) == (1 << BulkOutPipeId))
+ return;
+#endif /* CONFIG_MULTI_CHANNEL */
+
+ RTUSB_SET_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NORMAL);
+ RTUSBKickBulkOut(pAd);
+ }
+ }
+
+
+ return;
+
+}
+
+#ifdef RALINK_ATE
+static void rtusb_ate_ac0_dma_done_tasklet(unsigned long data)
+{
+ PRTMP_ADAPTER pAd;
+ PTX_CONTEXT pNullContext;
+ UCHAR BulkOutPipeId;
+ NTSTATUS Status;
+ ULONG IrqFlags;
+ ULONG OldValue;
+ purbb_t pURB;
+
+ pURB = (purbb_t)data;
+ /*pNullContext = (PTX_CONTEXT)pURB->rtusb_urb_context; */
+ pNullContext = (PTX_CONTEXT)RTMP_USB_URB_DATA_GET(pURB);
+ pAd = pNullContext->pAd;
+
+ /* Reset Null frame context flags */
+ pNullContext->IRPPending = FALSE;
+ pNullContext->InUse = FALSE;
+ Status = RTMP_USB_URB_STATUS_GET(pURB);/*pURB->rtusb_urb_status; */
+
+ /* Store BulkOut PipeId. */
+ BulkOutPipeId = pNullContext->BulkOutPipeId;
+ pAd->BulkOutDataOneSecCount++;
+
+ if (Status == USB_ST_NOERROR)
+ {
+#ifdef RALINK_QA
+ if ((ATE_ON(pAd)) && (pAd->ate.bQATxStart == TRUE))
+ {
+ if (pAd->ate.QID == BulkOutPipeId)
+ {
+#ifdef RELASE_EXCLUDE
+ /*
+ Let Rx can have a chance to break in during Tx process,
+ especially for loopback mode in QA ATE.
+
+ To trade off between tx performance and loopback mode integrity.
+
+ Q : Now Rx is handled by tasklet, do we still need this delay ?
+ Ans : Even tasklet is used, Rx/Tx < 1 if we do not delay for a while right here.
+ */
+#endif /* RELASE_EXCLUDE */
+ RTMPusecDelay(10);
+ pAd->ate.TxDoneCount++;
+#ifdef RELASE_EXCLUDE
+ DBGPRINT(RT_DEBUG_INFO, ("pAd->ate.TxDoneCount == %d\n", pAd->ate.TxDoneCount));
+#endif /* RELASE_EXCLUDE */
+ pAd->RalinkCounters.KickTxCount++;
+ ASSERT(pAd->ate.QID == 0);
+ pAd->ate.TxAc0++;
+ }
+ }
+#endif /* RALINK_QA */
+ pAd->BulkOutComplete++;
+
+ pAd->Counters8023.GoodTransmits++;
+
+ /* Don't worry about the queue is empty or not. This function will check itself. */
+ /* In RT28xx, SendTxWaitQueue == TxSwQueue */
+ RTMPDeQueuePacket(pAd, TRUE, BulkOutPipeId, MAX_TX_PROCESS);
+
+ }
+ else
+ {
+ pAd->BulkOutCompleteOther++;
+
+ DBGPRINT(RT_DEBUG_ERROR, ("BulkOutDataPacket Failed STATUS_OTHER = 0x%x . \n", Status));
+ DBGPRINT(RT_DEBUG_ERROR, (">>BulkOutReq=0x%lx, BulkOutComplete=0x%lx\n", pAd->BulkOutReq, pAd->BulkOutComplete));
+
+ if ((!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS)) &&
+ (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS)) &&
+ (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) &&
+ (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET)))
+ {
+ RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET);
+
+ /* In 28xx, RT_OID_USB_RESET_BULK_OUT ==> CMDTHREAD_RESET_BULK_OUT */
+ RTEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_OUT, NULL, 0);
+
+ /* check */
+ BULK_OUT_LOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);
+ pAd->BulkOutPending[BulkOutPipeId] = FALSE;
+ pAd->bulkResetPipeid = BulkOutPipeId;
+ BULK_OUT_UNLOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);
+
+ return;
+ }
+ }
+
+#ifdef RELASE_EXCLUDE
+ DBGPRINT(RT_DEBUG_INFO, ("pNullContext->pAd = 0x%lx\n", (ULONG)&pNullContext->pAd));
+ DBGPRINT(RT_DEBUG_INFO, ("pNullContext->pUrb = 0x%lx\n", (ULONG)&pNullContext->pUrb));
+ DBGPRINT(RT_DEBUG_INFO, ("pNullContext->TransferBuffer = 0x%lx\n", (ULONG)&pNullContext->TransferBuffer));
+ DBGPRINT(RT_DEBUG_INFO, ("pNullContext->BulkOutPipeId = %d\n", pNullContext->BulkOutPipeId));
+ DBGPRINT(RT_DEBUG_INFO, ("pNullContext->BulkOutSize = %ld\n", pNullContext->BulkOutSize));
+ DBGPRINT(RT_DEBUG_INFO, ("pNullContext->InUse = %d\n", (pNullContext->InUse==TRUE)));
+ DBGPRINT(RT_DEBUG_INFO, ("pNullContext->bWaitingBulkOut = %d\n", (pNullContext->bWaitingBulkOut==TRUE)));
+ DBGPRINT(RT_DEBUG_INFO, ("pNullContext->IRPPending = %d\n", (pNullContext->IRPPending==TRUE)));
+ DBGPRINT(RT_DEBUG_INFO, ("pNullContext->LastOne = %d\n", (pNullContext->LastOne==TRUE)));
+#endif /* RELASE_EXCLUDE */
+
+
+ if (atomic_read(&pAd->BulkOutRemained) > 0)
+ {
+ atomic_dec(&pAd->BulkOutRemained);
+#ifdef RELASE_EXCLUDE
+ DBGPRINT(RT_DEBUG_INFO, ("Bulk Out Remained = %d\n", atomic_read(&pAd->BulkOutRemained)));
+#endif /* RELASE_EXCLUDE */
+ }
+
+ /* 1st - Transmit Success */
+ OldValue = pAd->WlanCounters.TransmittedFragmentCount.u.LowPart;
+ pAd->WlanCounters.TransmittedFragmentCount.u.LowPart++;
+
+ if (pAd->WlanCounters.TransmittedFragmentCount.u.LowPart < OldValue)
+ {
+ pAd->WlanCounters.TransmittedFragmentCount.u.HighPart++;
+ }
+
+ if (((pAd->ContinBulkOut == TRUE ) ||(atomic_read(&pAd->BulkOutRemained) > 0))
+ && (pAd->ate.Mode & ATE_TXFRAME))
+ {
+#ifdef RELASE_EXCLUDE
+ DBGPRINT(RT_DEBUG_INFO, ("Continue to BulkOut ! \n"));
+#endif /* RELASE_EXCLUDE */
+ RTUSB_SET_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_ATE);
+ }
+ else
+ {
+ RTUSB_CLEAR_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_ATE);
+#ifdef RALINK_QA
+ pAd->ate.TxStatus = 0;
+#endif /* RALINK_QA */
+ }
+
+ BULK_OUT_LOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);
+ pAd->BulkOutPending[BulkOutPipeId] = FALSE;
+ BULK_OUT_UNLOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);
+
+ /* Always call Bulk routine, even reset bulk. */
+ /* The protection of rest bulk should be in BulkOut routine. */
+ RTUSBKickBulkOut(pAd);
+}
+#endif /* RALINK_ATE */
+
+
+NDIS_STATUS RtmpNetTaskInit(
+ IN RTMP_ADAPTER *pAd)
+{
+ POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
+
+ /* Create receive tasklet */
+ RTMP_OS_TASKLET_INIT(pAd, &pObj->rx_done_task, rx_done_tasklet, (ULONG)pAd);
+#ifdef RLT_MAC
+ RTMP_OS_TASKLET_INIT(pAd, &pObj->cmd_rsp_event_task, cmd_rsp_event_tasklet, (ULONG)pAd);
+#endif /* RLT_MAC */
+ RTMP_OS_TASKLET_INIT(pAd, &pObj->mgmt_dma_done_task, rtusb_mgmt_dma_done_tasklet, (unsigned long)pAd);
+ RTMP_OS_TASKLET_INIT(pAd, &pObj->ac0_dma_done_task, rtusb_ac0_dma_done_tasklet, (unsigned long)pAd);
+#ifdef RALINK_ATE
+ RTMP_OS_TASKLET_INIT(pAd, &pObj->ate_ac0_dma_done_task, rtusb_ate_ac0_dma_done_tasklet, (unsigned long)pAd);
+#endif /* RALINK_ATE */
+ RTMP_OS_TASKLET_INIT(pAd, &pObj->ac1_dma_done_task, rtusb_ac1_dma_done_tasklet, (unsigned long)pAd);
+ RTMP_OS_TASKLET_INIT(pAd, &pObj->ac2_dma_done_task, rtusb_ac2_dma_done_tasklet, (unsigned long)pAd);
+ RTMP_OS_TASKLET_INIT(pAd, &pObj->ac3_dma_done_task, rtusb_ac3_dma_done_tasklet, (unsigned long)pAd);
+ RTMP_OS_TASKLET_INIT(pAd, &pObj->hcca_dma_done_task, rtusb_hcca_dma_done_tasklet, (unsigned long)pAd);
+ RTMP_OS_TASKLET_INIT(pAd, &pObj->tbtt_task, tbtt_tasklet, (unsigned long)pAd);
+ RTMP_OS_TASKLET_INIT(pAd, &pObj->null_frame_complete_task, rtusb_null_frame_done_tasklet, (unsigned long)pAd);
+ RTMP_OS_TASKLET_INIT(pAd, &pObj->pspoll_frame_complete_task, rtusb_pspoll_frame_done_tasklet, (unsigned long)pAd);
+#ifdef CONFIG_MULTI_CHANNEL
+ RTMP_OS_TASKLET_INIT(pAd, &pObj->hcca_null_frame_complete_task, rtusb_hcca_null_frame_done_tasklet, (unsigned long)pAd);
+#endif /* CONFIG_MULTI_CHANNEL */
+
+
+ return NDIS_STATUS_SUCCESS;
+}
+
+
+void RtmpNetTaskExit(IN RTMP_ADAPTER *pAd)
+{
+ POS_COOKIE pObj;
+
+ pObj = (POS_COOKIE) pAd->OS_Cookie;
+
+ RTMP_OS_TASKLET_KILL(&pObj->rx_done_task);
+#ifdef RLT_MAC
+ RTMP_OS_TASKLET_KILL(&pObj->cmd_rsp_event_task);
+#endif /* RLT_MAC */
+ RTMP_OS_TASKLET_KILL(&pObj->mgmt_dma_done_task);
+ RTMP_OS_TASKLET_KILL(&pObj->ac0_dma_done_task);
+#ifdef RALINK_ATE
+ RTMP_OS_TASKLET_KILL(&pObj->ate_ac0_dma_done_task);
+#endif
+ RTMP_OS_TASKLET_KILL(&pObj->ac1_dma_done_task);
+ RTMP_OS_TASKLET_KILL(&pObj->ac2_dma_done_task);
+ RTMP_OS_TASKLET_KILL(&pObj->ac3_dma_done_task);
+ RTMP_OS_TASKLET_KILL(&pObj->hcca_dma_done_task);
+ RTMP_OS_TASKLET_KILL(&pObj->tbtt_task);
+ RTMP_OS_TASKLET_KILL(&pObj->null_frame_complete_task);
+#ifdef CONFIG_MULTI_CHANNEL
+ RTMP_OS_TASKLET_KILL(&pObj->hcca_null_frame_complete_task);
+#endif /* CONFIG_MULTI_CHANNEL */
+
+ RTMP_OS_TASKLET_KILL(&pObj->pspoll_frame_complete_task);
+}
+
+
+/*
+========================================================================
+Routine Description:
+ MLME kernel thread.
+
+Arguments:
+ *Context the pAd, driver control block pointer
+
+Return Value:
+ 0 close the thread
+
+Note:
+========================================================================
+*/
+INT MlmeThread(
+ IN ULONG Context)
+{
+ RTMP_ADAPTER *pAd;
+ RTMP_OS_TASK *pTask;
+ int status;
+ status = 0;
+
+ pTask = (RTMP_OS_TASK *)Context;
+ pAd = (PRTMP_ADAPTER)RTMP_OS_TASK_DATA_GET(pTask);
+ if (pAd == NULL)
+ goto LabelExit; /* avoid compile warning */
+
+ RtmpOSTaskCustomize(pTask);
+
+ while(!RTMP_OS_TASK_IS_KILLED(pTask))
+ {
+ if (RtmpOSTaskWait(pAd, pTask, &status) == FALSE)
+ {
+ RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS);
+ break;
+ }
+
+ /* lock the device pointers , need to check if required*/
+ /*down(&(pAd->usbdev_semaphore)); */
+
+ if (!pAd->PM_FlgSuspend)
+ MlmeHandler(pAd);
+ }
+
+ /* notify the exit routine that we're actually exiting now
+ *
+ * complete()/wait_for_completion() is similar to up()/down(),
+ * except that complete() is safe in the case where the structure
+ * is getting deleted in a parallel mode of execution (i.e. just
+ * after the down() -- that's necessary for the thread-shutdown
+ * case.
+ *
+ * complete_and_exit() goes even further than this -- it is safe in
+ * the case that the thread of the caller is going away (not just
+ * the structure) -- this is necessary for the module-remove case.
+ * This is important in preemption kernels, which transfer the flow
+ * of execution immediately upon a complete().
+ */
+LabelExit:
+ DBGPRINT(RT_DEBUG_TRACE,( "<---%s\n",__FUNCTION__));
+ RtmpOSTaskNotifyToExit(pTask);
+ return 0;
+
+}
+
+
+/*
+========================================================================
+Routine Description:
+ USB command kernel thread.
+
+Arguments:
+ *Context the pAd, driver control block pointer
+
+Return Value:
+ 0 close the thread
+
+Note:
+========================================================================
+*/
+INT RTUSBCmdThread(
+ IN ULONG Context)
+{
+ RTMP_ADAPTER *pAd;
+ RTMP_OS_TASK *pTask;
+ int status;
+ status = 0;
+
+ pTask = (RTMP_OS_TASK *)Context;
+ pAd = (PRTMP_ADAPTER)RTMP_OS_TASK_DATA_GET(pTask);
+
+ if (pAd == NULL)
+ return 0;
+
+ RtmpOSTaskCustomize(pTask);
+
+ NdisAcquireSpinLock(&pAd->CmdQLock);
+ pAd->CmdQ.CmdQState = RTMP_TASK_STAT_RUNNING;
+ NdisReleaseSpinLock(&pAd->CmdQLock);
+
+ while (pAd->CmdQ.CmdQState == RTMP_TASK_STAT_RUNNING)
+ {
+ if (RtmpOSTaskWait(pAd, pTask, &status) == FALSE)
+ {
+ RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS);
+ break;
+ }
+
+ if (pAd->CmdQ.CmdQState == RTMP_TASK_STAT_STOPED)
+ break;
+
+ if (!pAd->PM_FlgSuspend)
+ CMDHandler(pAd);
+ }
+
+ if (!pAd->PM_FlgSuspend)
+ { /* Clear the CmdQElements. */
+ CmdQElmt *pCmdQElmt = NULL;
+
+ NdisAcquireSpinLock(&pAd->CmdQLock);
+ pAd->CmdQ.CmdQState = RTMP_TASK_STAT_STOPED;
+ while(pAd->CmdQ.size)
+ {
+ RTThreadDequeueCmd(&pAd->CmdQ, &pCmdQElmt);
+ if (pCmdQElmt)
+ {
+ if (pCmdQElmt->CmdFromNdis == TRUE)
+ {
+ if (pCmdQElmt->buffer != NULL)
+ os_free_mem(pAd, pCmdQElmt->buffer);
+ os_free_mem(pAd, (PUCHAR)pCmdQElmt);
+ }
+ else
+ {
+ if ((pCmdQElmt->buffer != NULL) && (pCmdQElmt->bufferlength != 0))
+ os_free_mem(pAd, pCmdQElmt->buffer);
+ os_free_mem(pAd, (PUCHAR)pCmdQElmt);
+ }
+ }
+ }
+
+ NdisReleaseSpinLock(&pAd->CmdQLock);
+ }
+ /* notify the exit routine that we're actually exiting now
+ *
+ * complete()/wait_for_completion() is similar to up()/down(),
+ * except that complete() is safe in the case where the structure
+ * is getting deleted in a parallel mode of execution (i.e. just
+ * after the down() -- that's necessary for the thread-shutdown
+ * case.
+ *
+ * complete_and_exit() goes even further than this -- it is safe in
+ * the case that the thread of the caller is going away (not just
+ * the structure) -- this is necessary for the module-remove case.
+ * This is important in preemption kernels, which transfer the flow
+ * of execution immediately upon a complete().
+ */
+ DBGPRINT(RT_DEBUG_TRACE,( "<---RTUSBCmdThread\n"));
+
+ RtmpOSTaskNotifyToExit(pTask);
+ return 0;
+
+}
+
diff --git a/cleopatre/devkit/mt7601udrv/os/linux/rt_usb_util.c b/cleopatre/devkit/mt7601udrv/os/linux/rt_usb_util.c
new file mode 100644
index 0000000000..de7a785f10
--- /dev/null
+++ b/cleopatre/devkit/mt7601udrv/os/linux/rt_usb_util.c
@@ -0,0 +1,603 @@
+/****************************************************************************
+
+ Module Name:
+ rt_usb_util.c
+
+ Abstract:
+ Any utility is used in UTIL module for USB function.
+
+ Revision History:
+ Who When What
+ --------- ---------- ----------------------------------------------
+
+***************************************************************************/
+
+#define RTMP_MODULE_OS
+#define RTMP_MODULE_OS_UTIL
+
+#include "rtmp_comm.h"
+#include "rtmp_osabl.h"
+#include "rt_os_util.h"
+
+#ifdef RTMP_MAC_USB
+#ifdef OS_ABL_SUPPORT
+MODULE_LICENSE("GPL");
+#endif /* OS_ABL_SUPPORT */
+
+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
+/*
+========================================================================
+Routine Description:
+ Dump URB information.
+
+Arguments:
+ purb_org - the URB
+
+Return Value:
+ None
+
+Note:
+========================================================================
+*/
+void dump_urb(VOID *purb_org)
+{
+ struct urb *purb = (struct urb *)purb_org;
+
+ printk("urb :0x%08lx\n", (unsigned long)purb);
+ printk("\tdev :0x%08lx\n", (unsigned long)purb->dev);
+ printk("\t\tdev->state :0x%d\n", purb->dev->state);
+ printk("\tpipe :0x%08x\n", purb->pipe);
+ printk("\tstatus :%d\n", purb->status);
+ printk("\ttransfer_flags :0x%08x\n", purb->transfer_flags);
+ printk("\ttransfer_buffer :0x%08lx\n", (unsigned long)purb->transfer_buffer);
+ printk("\ttransfer_buffer_length:%d\n", purb->transfer_buffer_length);
+ printk("\tactual_length :%d\n", purb->actual_length);
+ printk("\tsetup_packet :0x%08lx\n", (unsigned long)purb->setup_packet);
+ printk("\tstart_frame :%d\n", purb->start_frame);
+ printk("\tnumber_of_packets :%d\n", purb->number_of_packets);
+ printk("\tinterval :%d\n", purb->interval);
+ printk("\terror_count :%d\n", purb->error_count);
+ printk("\tcontext :0x%08lx\n", (unsigned long)purb->context);
+ printk("\tcomplete :0x%08lx\n\n", (unsigned long)purb->complete);
+}
+#else
+void dump_urb(VOID *purb_org)
+{
+ return;
+}
+#endif /* LINUX_VERSION_CODE */
+
+
+
+
+
+
+#ifdef OS_ABL_SUPPORT
+/*
+========================================================================
+Routine Description:
+ Register a USB driver.
+
+Arguments:
+ new_driver - the driver
+
+Return Value:
+ 0 - successfully
+ Otherwise - fail
+
+Note:
+========================================================================
+*/
+int rausb_register(VOID * new_driver)
+{
+ return usb_register((struct usb_driver *)new_driver);
+}
+EXPORT_SYMBOL(rausb_register);
+
+
+/*
+========================================================================
+Routine Description:
+ De-Register a USB driver.
+
+Arguments:
+ new_driver - the driver
+
+Return Value:
+ None
+
+Note:
+========================================================================
+*/
+void rausb_deregister(VOID * driver)
+{
+ usb_deregister((struct usb_driver *)driver);
+}
+EXPORT_SYMBOL(rausb_deregister);
+
+
+/*
+========================================================================
+Routine Description:
+ Create a new urb for a USB driver to use.
+
+Arguments:
+ iso_packets - number of iso packets for this urb
+
+Return Value:
+ the URB
+
+Note:
+========================================================================
+*/
+struct urb *rausb_alloc_urb(int iso_packets)
+{
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
+ return usb_alloc_urb(iso_packets, GFP_ATOMIC);
+#else
+ return usb_alloc_urb(iso_packets);
+#endif /* LINUX_VERSION_CODE */
+}
+EXPORT_SYMBOL(rausb_alloc_urb);
+
+
+/*
+========================================================================
+Routine Description:
+ Free the memory used by a urb.
+
+Arguments:
+ urb - the URB
+
+Return Value:
+ None
+
+Note:
+========================================================================
+*/
+void rausb_free_urb(VOID *urb)
+{
+ usb_free_urb((struct urb *)urb);
+}
+EXPORT_SYMBOL(rausb_free_urb);
+
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
+/*
+========================================================================
+Routine Description:
+ Release a use of the usb device structure.
+
+Arguments:
+ dev - the USB device
+
+Return Value:
+ None
+
+Note:
+========================================================================
+*/
+void rausb_put_dev(VOID *dev)
+{
+ usb_put_dev((struct usb_device *)dev);
+}
+EXPORT_SYMBOL(rausb_put_dev);
+
+
+/*
+========================================================================
+Routine Description:
+ Increments the reference count of the usb device structure.
+
+Arguments:
+ dev - the USB device
+
+Return Value:
+ the device with the incremented reference counter
+
+Note:
+========================================================================
+*/
+struct usb_device *rausb_get_dev(VOID *dev)
+{
+ return usb_get_dev((struct usb_device *)dev);
+}
+EXPORT_SYMBOL(rausb_get_dev);
+#endif /* LINUX_VERSION_CODE */
+
+
+/*
+========================================================================
+Routine Description:
+ Issue an asynchronous transfer request for an endpoint.
+
+Arguments:
+ urb - the URB
+
+Return Value:
+ 0 - successfully
+ Otherwise - fail
+
+Note:
+========================================================================
+*/
+int rausb_submit_urb(VOID *urb)
+{
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
+ return usb_submit_urb((struct urb *)urb, GFP_ATOMIC);
+#else
+ return usb_submit_urb((struct urb *)urb);
+#endif /* LINUX_VERSION_CODE */
+}
+EXPORT_SYMBOL(rausb_submit_urb);
+
+/*
+========================================================================
+Routine Description:
+ Allocate dma-consistent buffer.
+
+Arguments:
+ dev - the USB device
+ size - buffer size
+ dma - used to return DMA address of buffer
+
+Return Value:
+ a buffer that may be used to perform DMA to the specified device
+
+Note:
+========================================================================
+*/
+void *rausb_buffer_alloc(VOID *dev,
+ size_t size,
+ ra_dma_addr_t *dma)
+{
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
+ dma_addr_t DmaAddr = (dma_addr_t)(*dma);
+ void *buf;
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35)
+ buf = usb_alloc_coherent(dev, size, GFP_ATOMIC, &DmaAddr);
+#else
+ buf = usb_buffer_alloc(dev, size, GFP_ATOMIC, &DmaAddr);
+#endif
+ *dma = (ra_dma_addr_t)DmaAddr;
+ return buf;
+
+#else
+ return kmalloc(size, GFP_ATOMIC);
+#endif
+}
+EXPORT_SYMBOL(rausb_buffer_alloc);
+
+
+/*
+========================================================================
+Routine Description:
+ Free memory allocated with usb_buffer_alloc.
+
+Arguments:
+ dev - the USB device
+ size - buffer size
+ addr - CPU address of buffer
+ dma - used to return DMA address of buffer
+
+Return Value:
+ None
+
+Note:
+========================================================================
+*/
+void rausb_buffer_free(VOID *dev,
+ size_t size,
+ void *addr,
+ ra_dma_addr_t dma)
+{
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
+ dma_addr_t DmaAddr = (dma_addr_t)(dma);
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35)
+ usb_free_coherent(dev, size, addr, DmaAddr);
+#else
+ usb_buffer_free(dev, size, addr, DmaAddr);
+#endif
+#else
+ kfree(addr);
+#endif
+}
+EXPORT_SYMBOL(rausb_buffer_free);
+
+/*
+========================================================================
+Routine Description:
+ Send a control message to a device.
+
+Arguments:
+ dev - the USB device
+
+Return Value:
+ 0 - successfully
+ Otherwise - fail
+
+Note:
+========================================================================
+*/
+int rausb_control_msg(VOID *dev,
+ unsigned int pipe,
+ __u8 request,
+ __u8 requesttype,
+ __u16 value,
+ __u16 index,
+ void *data,
+ __u16 size,
+ int timeout)
+{
+ int ret;
+
+ ret = usb_control_msg((struct usb_device *)dev, pipe, request, requesttype, value, index,
+ data, size, timeout);
+ if (ret == -ENODEV)
+ return RTMP_USB_CONTROL_MSG_ENODEV;
+ if (ret < 0)
+ return RTMP_USB_CONTROL_MSG_FAIL;
+ return ret;
+}
+EXPORT_SYMBOL(rausb_control_msg);
+
+unsigned int rausb_sndctrlpipe(VOID *dev, ULONG address)
+{
+ return usb_sndctrlpipe(dev, address);
+}
+EXPORT_SYMBOL(rausb_sndctrlpipe);
+
+unsigned int rausb_rcvctrlpipe(VOID *dev, ULONG address)
+{
+ return usb_rcvctrlpipe(dev, address);
+}
+EXPORT_SYMBOL(rausb_rcvctrlpipe);
+
+
+/*
+========================================================================
+Routine Description:
+ Cancel a transfer request and wait for it to finish.
+
+Arguments:
+ urb - the URB
+
+Return Value:
+ None
+
+Note:
+========================================================================
+*/
+void rausb_kill_urb(VOID *urb)
+{
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,7)
+ usb_kill_urb((struct urb *)urb);
+#else
+ usb_unlink_urb((struct urb *)urb);
+#endif /* LINUX_VERSION_CODE */
+}
+EXPORT_SYMBOL(rausb_kill_urb);
+
+#endif /* OS_ABL_SUPPORT */
+
+
+VOID RtmpOsUsbEmptyUrbCheck(
+ IN VOID **ppWait,
+ IN NDIS_SPIN_LOCK *pBulkInLock,
+ IN UCHAR *pPendingRx)
+{
+ UINT32 i = 0;
+ DECLARE_WAIT_QUEUE_HEAD(unlink_wakeup);
+ DECLARE_WAITQUEUE(wait, current);
+
+
+ /* ensure there are no more active urbs. */
+ add_wait_queue (&unlink_wakeup, &wait);
+ *ppWait = &unlink_wakeup;
+
+ /* maybe wait for deletions to finish. */
+ i = 0;
+ /*while((i < 25) && atomic_read(&pAd->PendingRx) > 0) */
+ while(i < 25)
+ {
+/* unsigned long IrqFlags; */
+
+ RTMP_SEM_LOCK(pBulkInLock);
+ if (*pPendingRx == 0)
+ {
+ RTMP_SEM_UNLOCK(pBulkInLock);
+ break;
+ }
+ RTMP_SEM_UNLOCK(pBulkInLock);
+
+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,9)
+ msleep(UNLINK_TIMEOUT_MS); /*Time in millisecond */
+#else
+ RTMPusecDelay(UNLINK_TIMEOUT_MS*1000); /*Time in microsecond */
+#endif
+ i++;
+ }
+ *ppWait = NULL;
+ remove_wait_queue (&unlink_wakeup, &wait);
+}
+
+
+VOID RtmpOsUsbInitHTTxDesc(
+ IN VOID *pUrbSrc,
+ IN VOID *pUsb_Dev,
+ IN UINT BulkOutEpAddr,
+ IN PUCHAR pSrc,
+ IN ULONG BulkOutSize,
+ IN USB_COMPLETE_HANDLER Func,
+ IN VOID *pTxContext,
+ IN ra_dma_addr_t TransferDma)
+{
+ PURB pUrb = (PURB)pUrbSrc;
+ dma_addr_t DmaAddr = (dma_addr_t)(TransferDma);
+
+
+ ASSERT(pUrb);
+
+ /*Initialize a tx bulk urb */
+ RTUSB_FILL_HTTX_BULK_URB(pUrb,
+ pUsb_Dev,
+ BulkOutEpAddr,
+ pSrc,
+ BulkOutSize,
+ (usb_complete_t)Func,
+ pTxContext,
+ DmaAddr);
+}
+
+
+VOID RtmpOsUsbInitRxDesc(
+ IN VOID *pUrbSrc,
+ IN VOID *pUsb_Dev,
+ IN UINT BulkInEpAddr,
+ IN UCHAR *pTransferBuffer,
+ IN UINT32 BufSize,
+ IN USB_COMPLETE_HANDLER Func,
+ IN VOID *pRxContext,
+ IN ra_dma_addr_t TransferDma)
+{
+ PURB pUrb = (PURB)pUrbSrc;
+ dma_addr_t DmaAddr = (dma_addr_t)(TransferDma);
+
+
+ ASSERT(pUrb);
+
+ /*Initialize a rx bulk urb */
+ RTUSB_FILL_RX_BULK_URB(pUrb,
+ pUsb_Dev,
+ BulkInEpAddr,
+ pTransferBuffer,
+ BufSize,
+ (usb_complete_t)Func,
+ pRxContext,
+ DmaAddr);
+}
+
+
+VOID *RtmpOsUsbContextGet(
+ IN VOID *pUrb)
+{
+ return ((purbb_t)pUrb)->rtusb_urb_context;
+}
+
+
+NTSTATUS RtmpOsUsbStatusGet(
+ IN VOID *pUrb)
+{
+ return ((purbb_t)pUrb)->rtusb_urb_status;
+}
+
+
+VOID RtmpOsUsbDmaMapping(
+ IN VOID *pUrb)
+{
+ RTUSB_URB_DMA_MAPPING(((purbb_t)pUrb));
+}
+
+
+/*
+========================================================================
+Routine Description:
+ Get the data pointer from the URB.
+
+Arguments:
+ pUrb - USB URB
+
+Return Value:
+ the data pointer
+
+Note:
+========================================================================
+*/
+VOID *RtmpOsUsbUrbDataGet(
+ IN VOID *pUrb)
+{
+ return RTMP_USB_URB_DATA_GET(pUrb);
+}
+
+
+/*
+========================================================================
+Routine Description:
+ Get the status from the URB.
+
+Arguments:
+ pUrb - USB URB
+
+Return Value:
+ the status
+
+Note:
+========================================================================
+*/
+NTSTATUS RtmpOsUsbUrbStatusGet(
+ IN VOID *pUrb)
+{
+ return RTMP_USB_URB_STATUS_GET(pUrb);
+}
+
+
+/*
+========================================================================
+Routine Description:
+ Get the data length from the URB.
+
+Arguments:
+ pUrb - USB URB
+
+Return Value:
+ the data length
+
+Note:
+========================================================================
+*/
+ULONG RtmpOsUsbUrbLenGet(
+ IN VOID *pUrb)
+{
+ return RTMP_USB_URB_LEN_GET(pUrb);
+}
+
+/*
+========================================================================
+Routine Description:
+ Get USB Vendor ID.
+
+Arguments:
+ pUsbDev - the usb device
+
+Return Value:
+ the name
+
+Note:
+========================================================================
+*/
+UINT32 RtmpOsGetUsbDevVendorID(IN VOID *pUsbDev) {
+ return ((struct usb_device *) pUsbDev)->descriptor.idVendor;
+}
+
+/*
+========================================================================
+Routine Description:
+ Get USB Product ID.
+
+Arguments:
+ pUsbDev - the usb device
+
+Return Value:
+ the name
+
+Note:
+========================================================================
+*/
+UINT32 RtmpOsGetUsbDevProductID(IN VOID *pUsbDev) {
+ return ((struct usb_device *) pUsbDev)->descriptor.idProduct;
+}
+
+#endif /* RTMP_MAC_USB */
+
diff --git a/cleopatre/devkit/mt7601udrv/os/linux/unload b/cleopatre/devkit/mt7601udrv/os/linux/unload
new file mode 100644
index 0000000000..cf698b0cd6
--- /dev/null
+++ b/cleopatre/devkit/mt7601udrv/os/linux/unload
@@ -0,0 +1,2 @@
+ifconfig ra0 down
+rmmod rt2860ap
diff --git a/cleopatre/devkit/mt7601udrv/os/linux/usb_main_dev.c b/cleopatre/devkit/mt7601udrv/os/linux/usb_main_dev.c
new file mode 100644
index 0000000000..401a7bd51d
--- /dev/null
+++ b/cleopatre/devkit/mt7601udrv/os/linux/usb_main_dev.c
@@ -0,0 +1,846 @@
+/****************************************************************************
+ * Ralink Tech Inc.
+ * Taiwan, R.O.C.
+ *
+ * (c) Copyright 2002, Ralink Technology, Inc.
+ *
+ * All rights reserved. Ralink's source code is an unpublished work and the
+ * use of a copyright notice does not imply otherwise. This source code
+ * contains confidential trade secret material of Ralink Tech. Any attemp
+ * or participation in deciphering, decoding, reverse engineering or in any
+ * way altering the source code is stricitly prohibited, unless the prior
+ * written consent of Ralink Technology, Inc. is obtained.
+ ***************************************************************************/
+
+#define RTMP_MODULE_OS
+
+/*#include "rt_config.h" */
+#include "rtmp_comm.h"
+#include "rt_os_util.h"
+#include "rt_os_net.h"
+
+
+/* Following information will be show when you run 'modinfo' */
+/* *** If you have a solution for the bug in current version of driver, please mail to me. */
+/* Otherwise post to forum in ralinktech's web site(www.ralinktech.com) and let all users help you. *** */
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Paul Lin <paul_lin@ralinktech.com>");
+MODULE_DESCRIPTION("RT2870 Wireless Lan Linux Driver");
+
+
+
+extern USB_DEVICE_ID rtusb_dev_id[];
+extern INT const rtusb_usb_id_len;
+
+static void rt2870_disconnect(
+ IN struct usb_device *dev,
+ IN VOID *pAd);
+
+static int rt2870_probe(
+ IN struct usb_interface *intf,
+ IN struct usb_device *usb_dev,
+ IN const USB_DEVICE_ID *dev_id,
+ IN VOID **ppAd);
+
+#ifndef PF_NOFREEZE
+#define PF_NOFREEZE 0
+#endif
+
+
+/*extern int rt28xx_close(IN struct net_device *net_dev); */
+/*extern int rt28xx_open(struct net_device *net_dev); */
+
+static BOOLEAN USBDevConfigInit(
+ IN struct usb_device *dev,
+ IN struct usb_interface *intf,
+ IN VOID *pAd);
+
+
+VOID RT28XXVendorSpecificCheck(
+ IN struct usb_device *dev,
+ IN VOID *pAd)
+{
+
+
+ RT_CMD_USB_MORE_FLAG_CONFIG Config = { dev->descriptor.idVendor,
+ dev->descriptor.idProduct };
+ RTMP_DRIVER_USB_MORE_FLAG_SET(pAd, &Config);
+}
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
+
+/**************************************************************************/
+/**************************************************************************/
+/*tested for kernel 2.4 series */
+/**************************************************************************/
+/**************************************************************************/
+static void *rtusb_probe(struct usb_device *dev, UINT interface,
+ const USB_DEVICE_ID *id_table);
+static void rtusb_disconnect(struct usb_device *dev, void *ptr);
+
+struct usb_driver rtusb_driver = {
+ name:RTMP_DRV_NAME,
+ probe:rtusb_probe,
+ disconnect:rtusb_disconnect,
+ id_table:rtusb_dev_id,
+ };
+
+
+static BOOLEAN USBDevConfigInit(
+ IN struct usb_device *dev,
+ IN struct usb_interface *intf,
+ IN VOID *pAd)
+{
+ struct usb_interface_descriptor *iface_desc;
+ struct usb_endpoint_descriptor *endpoint;
+ ULONG BulkOutIdx;
+ ULONG BulkInIdx;
+ UINT32 i;
+ RT_CMD_USB_DEV_CONFIG Config, *pConfig = &Config;
+
+
+ iface_desc = &intf->altsetting[0];
+
+ /* get # of enpoints */
+ pConfig->NumberOfPipes = iface_desc->bNumEndpoints;
+ DBGPRINT(RT_DEBUG_TRACE, ("NumEndpoints=%d\n", iface_desc->bNumEndpoints));
+
+ /* Configure Pipes */
+ endpoint = &iface_desc->endpoint[0];
+ BulkOutIdx = 0;
+ BulkInIdx = 0;
+
+ for(i=0; i<pConfig->NumberOfPipes; i++)
+ {
+ if ((endpoint[i].bmAttributes == USB_ENDPOINT_XFER_BULK) &&
+ ((endpoint[i].bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN))
+ {
+ pConfig->BulkInEpAddr[BulkInIdx++] = endpoint[i].bEndpointAddress;
+ pConfig->BulkInMaxPacketSize = endpoint[i].wMaxPacketSize;
+
+ DBGPRINT_RAW(RT_DEBUG_TRACE, ("BULK IN MaximumPacketSize = %d\n", pConfig->BulkInMaxPacketSize));
+ DBGPRINT_RAW(RT_DEBUG_TRACE, ("EP address = 0x%2x \n", endpoint[i].bEndpointAddress));
+ }
+ else if ((endpoint[i].bmAttributes == USB_ENDPOINT_XFER_BULK) &&
+ ((endpoint[i].bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_OUT))
+ {
+ /* There are 6 bulk out EP. EP6 highest priority. */
+ /* EP1-4 is EDCA. EP5 is HCCA. */
+ pConfig->BulkOutEpAddr[BulkOutIdx++] = endpoint[i].bEndpointAddress;
+ pConfig->BulkOutMaxPacketSize = endpoint[i].wMaxPacketSize;
+
+ DBGPRINT_RAW(RT_DEBUG_TRACE, ("BULK OUT MaximumPacketSize = %d\n", pConfig->BulkOutMaxPacketSize));
+ DBGPRINT_RAW(RT_DEBUG_TRACE, ("EP address = 0x%2x \n", endpoint[i].bEndpointAddress));
+ }
+ }
+
+ if (!(pConfig->BulkInEpAddr && pConfig->BulkOutEpAddr[0]))
+ {
+ printk("Could not find both bulk-in and bulk-out endpoints\n");
+ return FALSE;
+ }
+
+ pConfig->pConfig = dev->config;
+ RTMP_DRIVER_USB_CONFIG_INIT(pAd, pConfig);
+ RT28XXVendorSpecificCheck(dev, pAd);
+
+ return TRUE;
+
+}
+
+static void *rtusb_probe(struct usb_device *dev, UINT interface,
+ const USB_DEVICE_ID *id)
+{
+ struct usb_interface *intf;
+ VOID *pAd;
+ int rv;
+
+
+ /* get the active interface descriptor */
+ intf = &dev->actconfig->interface[interface];
+
+ /* call generic probe procedure. */
+ rv = rt2870_probe(intf, dev, id, &pAd);
+ if (rv != 0)
+ pAd = NULL;
+
+ return (void *)pAd;
+}
+
+/*Disconnect function is called within exit routine */
+static void rtusb_disconnect(struct usb_device *dev, void *ptr)
+{
+ rt2870_disconnect(dev, ptr);
+}
+
+
+#else /* else if we are kernel 2.6 series */
+
+
+/**************************************************************************/
+/**************************************************************************/
+/*tested for kernel 2.6series */
+/**************************************************************************/
+/**************************************************************************/
+
+#ifdef CONFIG_PM
+
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,10)
+#define pm_message_t u32
+#endif
+
+static int rt2870_suspend(struct usb_interface *intf, pm_message_t state);
+static int rt2870_resume(struct usb_interface *intf);
+#endif /* CONFIG_PM */
+
+static int rtusb_probe (struct usb_interface *intf,
+ const USB_DEVICE_ID *id);
+static void rtusb_disconnect(struct usb_interface *intf);
+
+static BOOLEAN USBDevConfigInit(
+ IN struct usb_device *dev,
+ IN struct usb_interface *intf,
+ IN VOID *pAd)
+{
+ struct usb_host_interface *iface_desc;
+ ULONG BulkOutIdx;
+ ULONG BulkInIdx;
+ UINT32 i;
+ RT_CMD_USB_DEV_CONFIG Config, *pConfig = &Config;
+
+ /* get the active interface descriptor */
+ iface_desc = intf->cur_altsetting;
+
+ /* get # of enpoints */
+ pConfig->NumberOfPipes = iface_desc->desc.bNumEndpoints;
+ DBGPRINT(RT_DEBUG_TRACE, ("NumEndpoints=%d\n", iface_desc->desc.bNumEndpoints));
+
+ /* Configure Pipes */
+ BulkOutIdx = 0;
+ BulkInIdx = 0;
+
+ for (i = 0; i < pConfig->NumberOfPipes; i++)
+ {
+ if ((iface_desc->endpoint[i].desc.bmAttributes == USB_ENDPOINT_XFER_BULK) &&
+ ((iface_desc->endpoint[i].desc.bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN))
+ {
+ if (BulkInIdx < 2)
+ {
+ pConfig->BulkInEpAddr[BulkInIdx++] = iface_desc->endpoint[i].desc.bEndpointAddress;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,11)
+ pConfig->BulkInMaxPacketSize = le2cpu16(iface_desc->endpoint[i].desc.wMaxPacketSize);
+#else
+ pConfig->BulkInMaxPacketSize = iface_desc->endpoint[i].desc.wMaxPacketSize;
+#endif /* LINUX_VERSION_CODE */
+
+ DBGPRINT_RAW(RT_DEBUG_TRACE, ("BULK IN MaxPacketSize = %d\n", pConfig->BulkInMaxPacketSize));
+ DBGPRINT_RAW(RT_DEBUG_TRACE, ("EP address = 0x%2x\n", iface_desc->endpoint[i].desc.bEndpointAddress));
+ }
+ else
+ {
+ DBGPRINT(RT_DEBUG_ERROR, ("Bulk IN endpoint nums large than 2\n"));
+ }
+ }
+ else if ((iface_desc->endpoint[i].desc.bmAttributes == USB_ENDPOINT_XFER_BULK) &&
+ ((iface_desc->endpoint[i].desc.bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_OUT))
+ {
+ if (BulkOutIdx < 6)
+ {
+ /* there are 6 bulk out EP. EP6 highest priority. */
+ /* EP1-4 is EDCA. EP5 is HCCA. */
+ pConfig->BulkOutEpAddr[BulkOutIdx++] = iface_desc->endpoint[i].desc.bEndpointAddress;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,11)
+ pConfig->BulkOutMaxPacketSize = le2cpu16(iface_desc->endpoint[i].desc.wMaxPacketSize);
+#else
+ pConfig->BulkOutMaxPacketSize = iface_desc->endpoint[i].desc.wMaxPacketSize;
+#endif
+
+ DBGPRINT_RAW(RT_DEBUG_TRACE, ("BULK OUT MaxPacketSize = %d\n", pConfig->BulkOutMaxPacketSize));
+ DBGPRINT_RAW(RT_DEBUG_TRACE, ("EP address = 0x%2x \n", iface_desc->endpoint[i].desc.bEndpointAddress));
+ }
+ else
+ {
+ DBGPRINT(RT_DEBUG_ERROR, ("Bulk Out endpoint nums large than 6\n"));
+ }
+ }
+ }
+
+ if (!(pConfig->BulkInEpAddr && pConfig->BulkOutEpAddr[0]))
+ {
+ printk("%s: Could not find both bulk-in and bulk-out endpoints\n", __FUNCTION__);
+ return FALSE;
+ }
+
+ pConfig->pConfig = &dev->config->desc;
+ usb_set_intfdata(intf, pAd);
+ RTMP_DRIVER_USB_CONFIG_INIT(pAd, pConfig);
+ RT28XXVendorSpecificCheck(dev, pAd);
+
+ return TRUE;
+
+}
+
+
+
+static int rtusb_probe (struct usb_interface *intf,
+ const USB_DEVICE_ID *id)
+{
+ VOID *pAd;
+ struct usb_device *dev;
+ int rv;
+
+ dev = interface_to_usbdev(intf);
+ dev = usb_get_dev(dev);
+
+ rv = rt2870_probe(intf, dev, id, &pAd);
+ if (rv != 0)
+ {
+ usb_put_dev(dev);
+ }
+#ifdef IFUP_IN_PROBE
+ else
+ {
+ if (VIRTUAL_IF_UP(pAd) != 0)
+ {
+ pAd = usb_get_intfdata(intf);
+ usb_set_intfdata(intf, NULL);
+ rt2870_disconnect(dev, pAd);
+ rv = -ENOMEM;
+ }
+ }
+#endif /* IFUP_IN_PROBE */
+ return rv;
+}
+
+
+static void rtusb_disconnect(struct usb_interface *intf)
+{
+ struct usb_device *dev = interface_to_usbdev(intf);
+ VOID *pAd;
+
+
+ pAd = usb_get_intfdata(intf);
+#ifdef IFUP_IN_PROBE
+ VIRTUAL_IF_DOWN(pAd);
+#endif /* IFUP_IN_PROBE */
+ usb_set_intfdata(intf, NULL);
+
+ rt2870_disconnect(dev, pAd);
+
+#ifdef CONFIG_PM
+#ifdef USB_SUPPORT_SELECTIVE_SUSPEND
+ printk("rtusb_disconnect usb_autopm_put_interface \n");
+ usb_autopm_put_interface(intf);
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,32)
+ printk(" ^^rt2870_disconnect ====> pm_usage_cnt %d \n", atomic_read(&intf->pm_usage_cnt));
+#else
+ printk(" rt2870_disconnect ====> pm_usage_cnt %d \n", intf->pm_usage_cnt);
+#endif
+#endif /* USB_SUPPORT_SELECTIVE_SUSPEND */
+#endif /* CONFIG_PM */
+
+}
+
+
+struct usb_driver rtusb_driver = {
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,15)
+ .owner = THIS_MODULE,
+#endif
+ .name=RTMP_DRV_NAME,
+ .probe=rtusb_probe,
+ .disconnect=rtusb_disconnect,
+ .id_table=rtusb_dev_id,
+
+#ifdef CONFIG_PM
+#ifdef USB_SUPPORT_SELECTIVE_SUSPEND
+ .supports_autosuspend = 1,
+#endif /* USB_SUPPORT_SELECTIVE_SUSPEND */
+ suspend: rt2870_suspend,
+ resume: rt2870_resume,
+#endif /* CONFIG_PM */
+ .supports_autosuspend = 1,
+ };
+
+#ifdef CONFIG_PM
+
+VOID RT2870RejectPendingPackets(
+ IN VOID *pAd)
+{
+ /* clear PS packets */
+ /* clear TxSw packets */
+}
+
+static int rt2870_suspend(
+ struct usb_interface *intf,
+ pm_message_t state)
+{
+ struct net_device *net_dev;
+ VOID *pAd = usb_get_intfdata(intf);
+#if (defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || defined(NEW_WOW_SUPPORT)
+ UCHAR Flag;
+
+ RTMP_DRIVER_ADAPTER_RT28XX_WOW_STATUS(pAd, &Flag);
+#endif /* (defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || defined(NEW_WOW_SUPPORT) */
+
+ DBGPRINT(RT_DEBUG_TRACE, ("===> rt2870_suspend()\n"));
+
+#ifdef USB_SUPPORT_SELECTIVE_SUSPEND
+ UCHAR Flag;
+ DBGPRINT(RT_DEBUG_ERROR, ("autosuspend===> rt2870_suspend()\n"));
+
+#if (defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || defined(NEW_WOW_SUPPORT)
+ if (Flag == FALSE)
+#endif /* (defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || defined(NEW_WOW_SUPPORT) */
+ {
+/* if(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_IDLE_RADIO_OFF)) */
+ RTMP_DRIVER_ADAPTER_END_DISSASSOCIATE(pAd);
+ RTMP_DRIVER_ADAPTER_IDLE_RADIO_OFF_TEST(pAd, &Flag);
+ if(!Flag)
+ {
+ /*RT28xxUsbAsicRadioOff(pAd); */
+ RTMP_DRIVER_ADAPTER_RT28XX_USB_ASICRADIO_OFF(pAd);
+ }
+ }
+ /*RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_SUSPEND); */
+ RTMP_DRIVER_ADAPTER_SUSPEND_SET(pAd);
+ return 0;
+#endif /* USB_SUPPORT_SELECTIVE_SUSPEND */
+
+
+
+#if (defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || defined(NEW_WOW_SUPPORT)
+ if (Flag == TRUE)
+ RTMP_DRIVER_ADAPTER_RT28XX_WOW_ENABLE(pAd);
+ else
+#endif /* (defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || defined(NEW_WOW_SUPPORT) */
+ {
+ RTMP_DRIVER_ADAPTER_RT28XX_USB_ASICRADIO_OFF(pAd);
+ RTMP_DRIVER_ADAPTER_SUSPEND_SET(pAd);
+ }
+
+
+
+ DBGPRINT(RT_DEBUG_TRACE, ("<=== rt2870_suspend()\n"));
+ return 0;
+}
+
+static int rt2870_resume(
+ struct usb_interface *intf)
+{
+ struct net_device *net_dev;
+ VOID *pAd = usb_get_intfdata(intf);
+#if (defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || defined(NEW_WOW_SUPPORT)
+ UCHAR Flag;
+#endif /* (defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || defined(NEW_WOW_SUPPORT) */
+
+#ifdef USB_SUPPORT_SELECTIVE_SUSPEND
+ INT pm_usage_cnt;
+ UCHAR Flag;
+#endif /* USB_SUPPORT_SELECTIVE_SUSPEND */
+
+#if (defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || defined(NEW_WOW_SUPPORT)
+ RTMP_DRIVER_ADAPTER_RT28XX_WOW_STATUS(pAd, &Flag);
+#endif /* (defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || defined(NEW_WOW_SUPPORT) */
+
+#ifdef USB_SUPPORT_SELECTIVE_SUSPEND
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,32)
+ pm_usage_cnt = atomic_read(&intf->pm_usage_cnt);
+#else
+ pm_usage_cnt = intf->pm_usage_cnt;
+#endif
+
+ if(pm_usage_cnt <= 0)
+ usb_autopm_get_interface(intf);
+
+ DBGPRINT(RT_DEBUG_ERROR, ("autosuspend===> rt2870_resume()\n"));
+
+ /*RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_SUSPEND); */
+ RTMP_DRIVER_ADAPTER_SUSPEND_CLEAR(pAd);
+
+#if (defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || defined(NEW_WOW_SUPPORT)
+ if (Flag == FALSE)
+#endif /* (defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || defined(NEW_WOW_SUPPORT) */
+ /*RT28xxUsbAsicRadioOn(pAd); */
+ RTMP_DRIVER_ADAPTER_RT28XX_USB_ASICRADIO_ON(pAd);
+
+ DBGPRINT(RT_DEBUG_ERROR, ("autosuspend<=== rt2870_resume()\n"));
+
+ return 0;
+#endif /* USB_SUPPORT_SELECTIVE_SUSPEND */
+
+
+ DBGPRINT(RT_DEBUG_TRACE, ("===> rt2870_resume()\n"));
+
+
+#if (defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || defined(NEW_WOW_SUPPORT)
+ if (Flag == TRUE)
+ RTMP_DRIVER_ADAPTER_RT28XX_WOW_DISABLE(pAd);
+ else
+#endif /* (defined(WOW_SUPPORT) && defined(RTMP_MAC_USB)) || defined(NEW_WOW_SUPPORT) */
+ {
+ RTMP_DRIVER_ADAPTER_SUSPEND_CLEAR(pAd);
+ RTMP_DRIVER_ADAPTER_RT28XX_USB_ASICRADIO_ON(pAd);
+ }
+
+
+
+
+
+ DBGPRINT(RT_DEBUG_TRACE, ("<=== rt2870_resume()\n"));
+ return 0;
+}
+#endif /* CONFIG_PM */
+#endif /* LINUX_VERSION_CODE */
+
+
+/* Init driver module */
+INT __init rtusb_init(void)
+{
+ printk("rtusb init %s --->\n", RTMP_DRV_NAME);
+ return usb_register(&rtusb_driver);
+}
+
+/* Deinit driver module */
+VOID __exit rtusb_exit(void)
+{
+ usb_deregister(&rtusb_driver);
+ printk("<--- rtusb exit\n");
+}
+
+module_init(rtusb_init);
+module_exit(rtusb_exit);
+
+
+
+
+/*--------------------------------------------------------------------- */
+/* function declarations */
+/*--------------------------------------------------------------------- */
+
+
+
+/*
+========================================================================
+Routine Description:
+ Release allocated resources.
+
+Arguments:
+ *dev Point to the PCI or USB device
+ pAd driver control block pointer
+
+Return Value:
+ None
+
+Note:
+========================================================================
+*/
+static void rt2870_disconnect(struct usb_device *dev, VOID *pAd)
+{
+ struct net_device *net_dev;
+
+
+ DBGPRINT(RT_DEBUG_ERROR, ("rtusb_disconnect: unregister usbnet usb-%s-%s\n",
+ dev->bus->bus_name, dev->devpath));
+ if (!pAd)
+ {
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) /* kernel 2.4 series */
+ while(MOD_IN_USE > 0)
+ {
+ MOD_DEC_USE_COUNT;
+ }
+#else
+ usb_put_dev(dev);
+#endif /* LINUX_VERSION_CODE */
+
+ printk("rtusb_disconnect: pAd == NULL!\n");
+ return;
+ }
+/* RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST); */
+ RTMP_DRIVER_NIC_NOT_EXIST_SET(pAd);
+
+ /* for debug, wait to show some messages to /proc system */
+ udelay(1);
+
+
+ RTMP_DRIVER_NET_DEV_GET(pAd, &net_dev);
+
+ RtmpPhyNetDevExit(pAd, net_dev);
+
+ /* FIXME: Shall we need following delay and flush the schedule?? */
+ udelay(1);
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) /* kernel 2.4 series */
+#else
+ flush_scheduled_work();
+#endif /* LINUX_VERSION_CODE */
+ udelay(1);
+
+#ifdef RT_CFG80211_SUPPORT
+ RTMP_DRIVER_80211_UNREGISTER(pAd, net_dev);
+#endif /* RT_CFG80211_SUPPORT */
+
+ /* free the root net_device */
+// RtmpOSNetDevFree(net_dev);
+
+ RtmpRaDevCtrlExit(pAd);
+
+ /* free the root net_device */
+ RtmpOSNetDevFree(net_dev);
+
+ /* release a use of the usb device structure */
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) /* kernel 2.4 series */
+ while(MOD_IN_USE > 0)
+ {
+ MOD_DEC_USE_COUNT;
+ }
+#else
+ usb_put_dev(dev);
+#endif /* LINUX_VERSION_CODE */
+ udelay(1);
+
+ DBGPRINT(RT_DEBUG_ERROR, (" RTUSB disconnect successfully\n"));
+}
+
+
+static int rt2870_probe(
+ IN struct usb_interface *intf,
+ IN struct usb_device *usb_dev,
+ IN const USB_DEVICE_ID *dev_id,
+ IN VOID **ppAd)
+{
+ struct net_device *net_dev = NULL;
+ VOID *pAd = (VOID *) NULL;
+ INT status, rv;
+ PVOID handle;
+ RTMP_OS_NETDEV_OP_HOOK netDevHook;
+ ULONG OpMode;
+#ifdef CONFIG_PM
+#ifdef USB_SUPPORT_SELECTIVE_SUSPEND
+/* INT pm_usage_cnt; */
+ INT res =1 ;
+#endif /* USB_SUPPORT_SELECTIVE_SUSPEND */
+#endif /* CONFIG_PM */
+
+ DBGPRINT(RT_DEBUG_TRACE, ("===>rt2870_probe()!\n"));
+
+#ifdef CONFIG_PM
+#ifdef USB_SUPPORT_SELECTIVE_SUSPEND
+
+ res = usb_autopm_get_interface(intf);
+ if (res)
+ {
+ DBGPRINT(RT_DEBUG_ERROR, ("rt2870_probe autopm_resume fail ------\n"));
+ return -EIO;
+ }
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,32)
+ atomic_set(&intf->pm_usage_cnt, 1);
+ printk(" rt2870_probe ====> pm_usage_cnt %d \n", atomic_read(&intf->pm_usage_cnt));
+#else
+ intf->pm_usage_cnt = 1;
+ printk(" rt2870_probe ====> pm_usage_cnt %d \n", intf->pm_usage_cnt);
+#endif
+#endif /* USB_SUPPORT_SELECTIVE_SUSPEND */
+#endif /* CONFIG_PM */
+
+/*RtmpDevInit============================================= */
+ /* Allocate RTMP_ADAPTER adapter structure */
+/* handle = kmalloc(sizeof(struct os_cookie), GFP_KERNEL); */
+ os_alloc_mem(NULL, (UCHAR **)&handle, sizeof(struct os_cookie));
+ if (handle == NULL)
+ {
+ printk("rt2870_probe(): Allocate memory for os handle failed!\n");
+ return -ENOMEM;
+ }
+ memset(handle, 0, sizeof(struct os_cookie));
+
+ ((POS_COOKIE)handle)->pUsb_Dev = usb_dev;
+
+
+ /* set/get operators to/from DRIVER module */
+#ifdef OS_ABL_FUNC_SUPPORT
+ /* get DRIVER operations */
+ RtmpNetOpsInit(pRtmpDrvNetOps);
+ RTMP_DRV_OPS_FUNCTION(pRtmpDrvOps, pRtmpDrvNetOps, NULL, NULL);
+ RtmpNetOpsSet(pRtmpDrvNetOps);
+#endif /* OS_ABL_FUNC_SUPPORT */
+
+ rv = RTMPAllocAdapterBlock(handle, &pAd);
+ if (rv != NDIS_STATUS_SUCCESS)
+ {
+/* kfree(handle); */
+ os_free_mem(NULL, handle);
+ goto err_out;
+ }
+
+/*USBDevInit============================================== */
+ if (USBDevConfigInit(usb_dev, intf, pAd) == FALSE)
+ goto err_out_free_radev;
+
+ RtmpRaDevCtrlInit(pAd, RTMP_DEV_INF_USB);
+
+/*NetDevInit============================================== */
+ net_dev = RtmpPhyNetDevInit(pAd, &netDevHook);
+ if (net_dev == NULL)
+ goto err_out_free_radev;
+
+ /* Here are the net_device structure with usb specific parameters. */
+
+
+/*All done, it's time to register the net device to linux kernel. */
+ /* Register this device */
+#ifdef RT_CFG80211_SUPPORT
+{
+/* pAd->pCfgDev = &(usb_dev->dev); */
+/* pAd->CFG80211_Register = CFG80211_Register; */
+/* RTMP_DRIVER_CFG80211_INIT(pAd, usb_dev); */
+
+ /*
+ In 2.6.32, cfg80211 register must be before register_netdevice();
+ We can not put the register in rt28xx_open();
+ Or you will suffer NULL pointer in list_add of
+ cfg80211_netdev_notifier_call().
+ */
+ CFG80211_Register(pAd, &(usb_dev->dev), net_dev);
+}
+#endif /* RT_CFG80211_SUPPORT */
+
+ RTMP_DRIVER_OP_MODE_GET(pAd, &OpMode);
+ status = RtmpOSNetDevAttach(OpMode, net_dev, &netDevHook);
+ if (status != 0)
+ goto err_out_free_netdev;
+
+/*#ifdef KTHREAD_SUPPORT */
+
+ *ppAd = pAd;
+
+#ifdef INF_PPA_SUPPORT
+/* pAd->pDirectpathCb = (PPA_DIRECTPATH_CB *) kmalloc (sizeof(PPA_DIRECTPATH_CB), GFP_ATOMIC); */
+/* os_alloc_mem(NULL, (UCHAR **)&(pAd->pDirectpathCb), sizeof(PPA_DIRECTPATH_CB)); */
+ RTMP_DRIVER_INF_PPA_INIT(pAd);
+#endif /* INF_PPA_SUPPORT */
+
+#ifdef PRE_ASSIGN_MAC_ADDR
+ UCHAR PermanentAddress[MAC_ADDR_LEN];
+ RTMP_DRIVER_MAC_ADDR_GET(pAd, &PermanentAddress[0]);
+ DBGPRINT(RT_DEBUG_TRACE, ("@%s MAC address: %02x:%02x:%02x:%02x:%02x:%02x\n", __FUNCTION__, PermanentAddress[0], PermanentAddress[1],PermanentAddress[2],PermanentAddress[3],PermanentAddress[4],PermanentAddress[5]));
+ /* Set up the Mac address */
+ RtmpOSNetDevAddrSet(OpMode, net_dev, &PermanentAddress[0], NULL);
+#endif /* PRE_ASSIGN_MAC_ADDR */
+
+#ifdef EXT_BUILD_CHANNEL_LIST
+ RTMP_DRIVER_SET_PRECONFIG_VALUE(pAd);
+#endif /* EXT_BUILD_CHANNEL_LIST */
+
+ DBGPRINT(RT_DEBUG_TRACE, ("<===rt2870_probe()!\n"));
+
+ return 0;
+
+ /* --------------------------- ERROR HANDLE --------------------------- */
+err_out_free_netdev:
+ RtmpOSNetDevFree(net_dev);
+
+err_out_free_radev:
+ RTMPFreeAdapter(pAd);
+
+err_out:
+ *ppAd = NULL;
+
+ return -1;
+
+}
+
+
+#ifdef OS_ABL_SUPPORT
+/* USB complete handlers in LINUX */
+RTMP_DRV_USB_COMPLETE_HANDLER RtmpDrvUsbBulkOutDataPacketComplete = NULL;
+RTMP_DRV_USB_COMPLETE_HANDLER RtmpDrvUsbBulkOutMLMEPacketComplete = NULL;
+RTMP_DRV_USB_COMPLETE_HANDLER RtmpDrvUsbBulkOutNullFrameComplete = NULL;
+#ifdef CONFIG_MULTI_CHANNEL
+RTMP_DRV_USB_COMPLETE_HANDLER RtmpDrvUsbBulkOutHCCANullFrameComplete = NULL;
+#endif /* CONFIG_MULTI_CHANNEL */
+RTMP_DRV_USB_COMPLETE_HANDLER RtmpDrvUsbBulkOutRTSFrameComplete = NULL;
+RTMP_DRV_USB_COMPLETE_HANDLER RtmpDrvUsbBulkOutPsPollComplete = NULL;
+RTMP_DRV_USB_COMPLETE_HANDLER RtmpDrvUsbBulkRxComplete = NULL;
+RTMP_DRV_USB_COMPLETE_HANDLER RtmpDrvUsbBulkCmdRspEventComplete = NULL;
+
+USBHST_STATUS RTUSBBulkOutDataPacketComplete(URBCompleteStatus Status, purbb_t pURB, pregs *pt_regs)
+{
+ RtmpDrvUsbBulkOutDataPacketComplete((VOID *)pURB);
+}
+
+USBHST_STATUS RTUSBBulkOutMLMEPacketComplete(URBCompleteStatus Status, purbb_t pURB, pregs *pt_regs)
+{
+ RtmpDrvUsbBulkOutMLMEPacketComplete((VOID *)pURB);
+}
+
+USBHST_STATUS RTUSBBulkOutNullFrameComplete(URBCompleteStatus Status, purbb_t pURB, pregs *pt_regs)
+{
+ RtmpDrvUsbBulkOutNullFrameComplete((VOID *)pURB);
+}
+
+#ifdef CONFIG_MULTI_CHANNEL
+USBHST_STATUS RTUSBBulkOutHCCANullFrameComplete(URBCompleteStatus Status, purbb_t pURB, pregs *pt_regs)
+{
+ RtmpDrvUsbBulkOutHCCANullFrameComplete((VOID *)pURB);
+}
+#endif /* CONFIG_MULTI_CHANNEL */
+
+
+USBHST_STATUS RTUSBBulkOutRTSFrameComplete(URBCompleteStatus Status, purbb_t pURB, pregs *pt_regs)
+{
+ RtmpDrvUsbBulkOutRTSFrameComplete((VOID *)pURB);
+}
+
+USBHST_STATUS RTUSBBulkOutPsPollComplete(URBCompleteStatus Status, purbb_t pURB, pregs *pt_regs)
+{
+ RtmpDrvUsbBulkOutPsPollComplete((VOID *)pURB);
+}
+
+USBHST_STATUS RTUSBBulkRxComplete(URBCompleteStatus Status, purbb_t pURB, pregs *pt_regs)
+{
+ RtmpDrvUsbBulkRxComplete((VOID *)pURB);
+}
+
+USBHST_STATUS RTUSBBulkCmdRspEventComplete(URBCompleteStatus Status, purbb_t pURB, pregs *pt_regs)
+{
+ RtmpDrvUsbBulkCmdRspEventComplete((VOID *)pURB);
+}
+
+VOID RtmpNetOpsInit(
+ IN VOID *pDrvNetOpsSrc)
+{
+ RTMP_NET_ABL_OPS *pDrvNetOps = (RTMP_NET_ABL_OPS *)pDrvNetOpsSrc;
+
+
+ pDrvNetOps->RtmpNetUsbBulkOutDataPacketComplete = (RTMP_DRV_USB_COMPLETE_HANDLER)RTUSBBulkOutDataPacketComplete;
+ pDrvNetOps->RtmpNetUsbBulkOutMLMEPacketComplete = (RTMP_DRV_USB_COMPLETE_HANDLER)RTUSBBulkOutMLMEPacketComplete;
+ pDrvNetOps->RtmpNetUsbBulkOutNullFrameComplete = (RTMP_DRV_USB_COMPLETE_HANDLER)RTUSBBulkOutNullFrameComplete;
+#ifdef CONFIG_MULTI_CHANNEL
+ pDrvNetOps->RtmpNetUsbBulkOutHCCANullFrameComplete = (RTMP_DRV_USB_COMPLETE_HANDLER)RTUSBBulkOutHCCANullFrameComplete;
+#endif /* CONFIG_MULTI_CHANNEL */
+ pDrvNetOps->RtmpNetUsbBulkOutRTSFrameComplete = (RTMP_DRV_USB_COMPLETE_HANDLER)RTUSBBulkOutRTSFrameComplete;
+ pDrvNetOps->RtmpNetUsbBulkOutPsPollComplete = (RTMP_DRV_USB_COMPLETE_HANDLER)RTUSBBulkOutPsPollComplete;
+ pDrvNetOps->RtmpNetUsbBulkRxComplete = (RTMP_DRV_USB_COMPLETE_HANDLER)RTUSBBulkRxComplete;
+ pDrvNetOps->RtmpNetUsbBulkCmdRspEventComplete = (RTMP_DRV_USB_COMPLETE_HANDLER)RTUSBBulkCmdRspEventComplete;
+}
+
+
+VOID RtmpNetOpsSet(
+ IN VOID *pDrvNetOpsSrc)
+{
+ RTMP_NET_ABL_OPS *pDrvNetOps = (RTMP_NET_ABL_OPS *)pDrvNetOpsSrc;
+
+
+ RtmpDrvUsbBulkOutDataPacketComplete = pDrvNetOps->RtmpDrvUsbBulkOutDataPacketComplete;
+ RtmpDrvUsbBulkOutMLMEPacketComplete = pDrvNetOps->RtmpDrvUsbBulkOutMLMEPacketComplete;
+ RtmpDrvUsbBulkOutNullFrameComplete = pDrvNetOps->RtmpDrvUsbBulkOutNullFrameComplete;
+#ifdef CONFIG_MULTI_CHANNEL
+ RtmpDrvUsbBulkOutHCCANullFrameComplete = pDrvNetOps->RtmpDrvUsbBulkOutHCCANullFrameComplete;
+#endif /* CONFIG_MULTI_CHANNEL */
+
+ RtmpDrvUsbBulkOutRTSFrameComplete = pDrvNetOps->RtmpDrvUsbBulkOutRTSFrameComplete;
+ RtmpDrvUsbBulkOutPsPollComplete = pDrvNetOps->RtmpDrvUsbBulkOutPsPollComplete;
+ RtmpDrvUsbBulkRxComplete = pDrvNetOps->RtmpDrvUsbBulkRxComplete;
+ RtmpDrvUsbBulkCmdRspEventComplete = pDrvNetOps->RtmpDrvUsbBulkCmdRspEventComplete;
+}
+#endif /* OS_ABL_SUPPORT */
diff --git a/cleopatre/devkit/mt7601udrv/os/linux/vr_bdlt.c b/cleopatre/devkit/mt7601udrv/os/linux/vr_bdlt.c
new file mode 100644
index 0000000000..f802db09fe
--- /dev/null
+++ b/cleopatre/devkit/mt7601udrv/os/linux/vr_bdlt.c
@@ -0,0 +1,63 @@
+/****************************************************************************
+
+ Module Name:
+ vr_brlt.c
+
+ Abstract:
+ Only for BroadLight 2348 platform.
+
+ Revision History:
+ Who When What
+ --------- ---------- ----------------------------------------------
+ Sample Lin 01-12-2010 Created
+
+***************************************************************************/
+
+#define RTMP_MODULE_OS
+#define RTMP_MODULE_OS_UTIL
+
+#define MODULE_BDLT
+
+/*#include "rt_config.h" */
+#include "rtmp_comm.h"
+#include "rt_os_util.h"
+#include "rtmp_osabl.h"
+
+
+#if defined(PLATFORM_BL2348) || defined(PLATFORM_BL23570)
+
+/* global variables */
+int (*pToUpperLayerPktSent)(struct sk_buff *pSkb) = netif_rx ;
+
+
+
+
+/*
+========================================================================
+Routine Description:
+ Assign the briding function.
+
+Arguments:
+ xi_destination_ptr - bridging function
+
+Return Value:
+ None
+
+Note:
+ The function name must be replace_upper_layer_packet_destination.
+========================================================================
+*/
+VOID replace_upper_layer_packet_destination(VOID *pXiDestination)
+{
+ DBGPRINT(RT_DEBUG_TRACE, ("ralink broad light> replace_upper_layer_packet_destination\n"));
+ pToUpperLayerPktSent = pXiDestination ;
+} /* End of replace_upper_layer_packet_destination */
+
+
+EXPORT_SYMBOL(pToUpperLayerPktSent);
+EXPORT_SYMBOL(replace_upper_layer_packet_destination);
+
+#endif /* PLATFORM_BL2348 */
+
+
+/* End of vr_bdlt.c */
diff --git a/cleopatre/devkit/mt7601udrv/os/linux/vr_ikans.c b/cleopatre/devkit/mt7601udrv/os/linux/vr_ikans.c
new file mode 100644
index 0000000000..bc630ff545
--- /dev/null
+++ b/cleopatre/devkit/mt7601udrv/os/linux/vr_ikans.c
@@ -0,0 +1,363 @@
+/****************************************************************************
+
+ Module Name:
+ vr_ikans.c
+
+ Abstract:
+ Only for IKANOS Vx160 or Vx180 platform.
+
+ Revision History:
+ Who When What
+ --------- ---------- ----------------------------------------------
+ Sample Lin 01-28-2008 Created
+
+***************************************************************************/
+
+#define RTMP_MODULE_OS
+#define RTMP_MODULE_OS_UTIL
+
+#define MODULE_IKANOS
+
+#include "rt_config.h"
+#include <linux/config.h>
+#include <linux/version.h>
+#include <linux/module.h>
+#include <linux/skbuff.h>
+#include <linux/netdevice.h>
+#include <netpro/apprehdr.h>
+
+
+#ifdef IKANOS_VX_1X0
+
+#define IKANOS_PERAP_ID 7 /* IKANOS Fix Peripheral ID */
+#define K0_TO_K1(x) ((unsigned)(x)|0xA0000000) /* kseg0 to kseg1 */
+/*#define IKANOS_DEBUG */
+
+
+extern INT rt28xx_send_packets(
+ IN struct sk_buff *skb_p,
+ IN struct net_device *net_dev);
+
+static INT32 IKANOS_WlanDataFramesTx(
+ IN void *_pAdBuf,
+ IN struct net_device *pNetDev);
+
+static void IKANOS_WlanPktFromAp(
+ IN apPreHeader_t *pFrame);
+
+static INT32 GetSpecInfoIdxFromBssid(
+ IN PRTMP_ADAPTER pAd,
+ IN INT32 FromWhichBSSID);
+
+
+
+
+/* --------------------------------- Public -------------------------------- */
+
+/*
+========================================================================
+Routine Description:
+ Init IKANOS fast path function.
+
+Arguments:
+ pApMac - the MAC of AP
+
+Return Value:
+ None
+
+Note:
+ If you want to enable RX fast path, you must call the function.
+========================================================================
+*/
+void VR_IKANOS_FP_Init(
+ IN UINT8 BssNum,
+ IN UINT8 *pApMac)
+{
+ UINT32 i;
+ UINT8 mac[6];
+
+
+ memcpy(mac, pApMac, 6);
+
+ /* add all MAC of multiple BSS */
+ for(i=0; i<BssNum; i++)
+ {
+ apMacAddrConfig(7, mac, 0xAD);
+ mac[5] ++;
+ } /* End of for */
+} /* End of VR_IKANOS_FP_Init */
+
+
+/*
+========================================================================
+Routine Description:
+ Ikanos LAN --> WLAN transmit fast path function.
+
+Arguments:
+ skb - the transmitted packet (SKB packet format)
+ netdev - our WLAN network device
+
+Return Value:
+
+
+Note:
+========================================================================
+*/
+INT32 IKANOS_DataFramesTx(
+ IN struct sk_buff *pSkb,
+ IN struct net_device *pNetDev)
+{
+ PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pNetDev->priv;
+ IkanosWlanTxCbFuncP *fp = &IKANOS_WlanDataFramesTx;
+
+ pSkb->apFlowData.txDev = pNetDev;
+ pSkb->apFlowData.txApId = IKANOS_PERAP_ID;
+ pAd->IkanosTxInfo.netdev = pNetDev;
+ pAd->IkanosTxInfo.fp = fp;
+ pSkb->apFlowData.txHandle = &(pAd->IkanosTxInfo);
+ ap2apFlowProcess(pSkb, pNetDev);
+
+#ifdef IKANOS_DEBUG
+ printk("ikanos> tx no fp\n"); /* debug use */
+#endif /* IKANOS_DEBUG */
+
+ return rt28xx_send_packets(pSkb, pNetDev);
+} /* End of IKANOS_DataFramesTx */
+
+
+/*
+========================================================================
+Routine Description:
+ Ikanos WLAN --> LAN transmit fast path function.
+
+Arguments:
+ pAd - WLAN control block
+ pRxParam -
+ pSkb - the transmitted packet (SKB packet format)
+ Length - packet length
+
+Return Value:
+ None
+
+Note:
+========================================================================
+*/
+/* Note: because no unsigned long private parameters in apPreHeader_t can be used,
+ we use a global variable to record pAd.
+ So we can not use multiple card function in Ikanos platform. */
+PRTMP_ADAPTER pIkanosAd;
+
+void IKANOS_DataFrameRx(
+ IN PRTMP_ADAPTER pAd,
+ IN struct sk_buff *pSkb)
+{
+ apPreHeader_t *apBuf;
+ void *pRxParam = pSkb->dev;
+ UINT32 Length = pSkb->len;
+
+
+ apBuf = (apPreHeader_t *)(translateMbuf2Apbuf(pSkb, 0));
+
+ apBuf->flags1 = 1 << AP_FLAG1_IS_ETH_BIT;
+ apBuf->specInfoElement = RTMP_GET_PACKET_NET_DEVICE_MBSSID(pSkb); /* MBSS */
+ pIkanosAd = pAd;
+
+/* apBuf->egressList[0].pEgress = NULL; */
+/* apBuf->egressList[0].pFlowID = NULL; */
+ apBuf->flags2 = 0;
+
+ apClassify(IKANOS_PERAP_ID, apBuf, (void *)IKANOS_WlanPktFromAp);
+ dev_kfree_skb(pSkb);
+} /* End of IKANOS_DataFrameRx */
+
+
+
+
+/* --------------------------------- Private -------------------------------- */
+
+/*
+========================================================================
+Routine Description:
+ Ikanos LAN --> WLAN transmit fast path function.
+
+Arguments:
+ _pAdBuf - the transmitted packet (Ikanos packet format)
+ netdev - our WLAN network device
+
+Return Value:
+
+
+Note:
+========================================================================
+*/
+static INT32 IKANOS_WlanDataFramesTx(
+ IN void *_pAdBuf,
+ IN struct net_device *pNetDev)
+{
+ apPreHeader_t *pApBuf = (apPreHeader_t *)_pAdBuf;
+ struct sk_buff *sk = NULL;
+
+ sk = (struct sk_buff *)translateApbuf2Mbuf(pApBuf);
+ if (sk == NULL)
+ {
+ printk("ikanos> translateApbuf2Mbuf returned NULL!\n");
+ return 1;
+ } /* End of if */
+
+ sk->apFlowData.flags2 = 0;
+ sk->apFlowData.wlanFlags = 0;
+ sk->protocol = ETH_P_IP;
+ sk->dev = pNetDev;
+ sk->priority = 0;
+
+ return rt28xx_send_packets(sk, pNetDev);
+} /* End of IKANOS_WlanDataFramesTx */
+
+
+static INT32 GetSpecInfoIdxFromBssid(
+ IN PRTMP_ADAPTER pAd,
+ IN INT32 FromWhichBSSID)
+{
+ INT32 IfIdx = MAIN_MBSSID;
+
+#ifdef CONFIG_AP_SUPPORT
+ IF_DEV_CONFIG_OPMODE_ON_AP(pAd)
+ {
+#ifdef APCLI_SUPPORT
+ if(FromWhichBSSID >= MIN_NET_DEVICE_FOR_APCLI)
+ {
+ IfIdx = MAX_MBSSID_NUM(pAd) + MAX_WDS_ENTRY;
+ }
+ else
+#endif /* APCLI_SUPPORT */
+#ifdef WDS_SUPPORT
+ if(FromWhichBSSID >= MIN_NET_DEVICE_FOR_WDS)
+ {
+ INT WdsIndex = FromWhichBSSID - MIN_NET_DEVICE_FOR_WDS;
+ IfIdx = MAX_MBSSID_NUM(pAd) + WdsIndex;
+ }
+ else
+#endif /* WDS_SUPPORT */
+ {
+ IfIdx = FromWhichBSSID;
+ }
+ }
+#endif /* CONFIG_AP_SUPPORT */
+
+
+ return IfIdx; /* return one of MBSS */
+}
+
+/*
+========================================================================
+Routine Description:
+ Get real interface index, used in get_netdev_from_bssid()
+
+Arguments:
+ pAd -
+ FromWhichBSSID -
+
+Return Value:
+ None
+
+Note:
+========================================================================
+*/
+static INT32 GetSpecInfoIdxFromBssid(
+ IN PRTMP_ADAPTER pAd,
+ IN INT32 FromWhichBSSID)
+{
+ INT32 IfIdx = MAIN_MBSSID;
+
+#ifdef CONFIG_AP_SUPPORT
+ IF_DEV_CONFIG_OPMODE_ON_AP(pAd)
+ {
+#ifdef APCLI_SUPPORT
+ if(FromWhichBSSID >= MIN_NET_DEVICE_FOR_APCLI)
+ {
+ IfIdx = MAX_MBSSID_NUM(pAd) + MAX_WDS_ENTRY;
+ }
+ else
+#endif /* APCLI_SUPPORT */
+#ifdef WDS_SUPPORT
+ if(FromWhichBSSID >= MIN_NET_DEVICE_FOR_WDS)
+ {
+ INT WdsIndex = FromWhichBSSID - MIN_NET_DEVICE_FOR_WDS;
+ IfIdx = MAX_MBSSID_NUM(pAd) + WdsIndex;
+ }
+ else
+#endif /* WDS_SUPPORT */
+ {
+ IfIdx = FromWhichBSSID;
+ }
+ }
+#endif /* CONFIG_AP_SUPPORT */
+
+
+ return IfIdx; /* return one of MBSS */
+} /* End of GetSpecInfoIdxFromBssid */
+
+
+/*
+========================================================================
+Routine Description:
+ Ikanos WLAN --> LAN transmit fast path function.
+
+Arguments:
+ pFrame - the received packet (Ikanos packet format)
+
+Return Value:
+ None
+
+Note:
+ Ikanos platform supports only 8 VAPs
+========================================================================
+*/
+static void IKANOS_WlanPktFromAp(
+ IN apPreHeader_t *pFrame)
+{
+ PRTMP_ADAPTER pAd;
+ struct net_device *dev = NULL;
+ struct sk_buff *skb;
+ INT32 index;
+ apPreHeader_t *apBuf = K0_TO_K1(pFrame);
+
+
+ pAd = pIkanosAd;
+ /*index = apBuf->specInfoElement; */
+ /*dev = pAd->ApCfg.MBSSID[index].MSSIDDev; */
+ index = GetSpecInfoIdxFromBssid(pAd, apBuf->specInfoElement);
+ dev = get_netdev_from_bssid(pAd, apBuf->specInfoElement);
+ if (dev == NULL)
+ {
+ printk("ikanos> %s: ERROR null device ***************\n", __FUNCTION__);
+ return;
+ } /* End of if */
+
+ skb = (struct sk_buff *)translateApbuf2Mbuf(apBuf);
+ if (NULL == skb)
+ {
+ printk("ikanos> %s: skb is null *********************\n", __FUNCTION__);
+ return;
+ } /* End of if */
+
+ pAd->IkanosRxInfo[index].netdev = dev;
+ pAd->IkanosRxInfo[index].fp = &IKANOS_WlanDataFramesTx;
+
+ skb->dev = dev;
+ skb->apFlowData.rxApId = IKANOS_PERAP_ID;
+ /*skb->apFlowData.txHandle = &(txinforx[index]); */
+ skb->apFlowData.rxHandle = &(pAd->IkanosRxInfo[index]);
+ skb->protocol = eth_type_trans(skb, skb->dev);
+
+#ifdef IKANOS_DEBUG
+ printk("ikanos> rx no fp!\n"); /* debug use */
+#endif /* IKANOS_DEBUG */
+
+ netif_rx(skb);
+ return;
+} /* End of IKANOS_WlanPktFromAp */
+
+#endif /* IKANOS_VX_1X0 */
+
+/* End of vr_ikans.c */