summaryrefslogtreecommitdiff
path: root/cleopatre/devkit/rt5572drv/MODULE/os
diff options
context:
space:
mode:
authorFisher Cheng2012-11-30 17:41:08 +0800
committerJulien Lacour2013-10-01 11:30:32 +0200
commit1acf0f895c26837099eeaff6455152dd94fa6d53 (patch)
treef841b2c132fff301ef00d74f1e3dd8ae21341db0 /cleopatre/devkit/rt5572drv/MODULE/os
parentca15306cb8a92c9f2abfc816ef5b69545c838d9f (diff)
cleo/devkit: add Ralink RT5572 driver source code, refs #4213
Diffstat (limited to 'cleopatre/devkit/rt5572drv/MODULE/os')
-rw-r--r--cleopatre/devkit/rt5572drv/MODULE/os/linux/Makefile.4644
-rw-r--r--cleopatre/devkit/rt5572drv/MODULE/os/linux/Makefile.6611
l---------cleopatre/devkit/rt5572drv/MODULE/os/linux/Makefile.clean1
-rw-r--r--cleopatre/devkit/rt5572drv/MODULE/os/linux/Makefile.libautoprovision.69
-rw-r--r--cleopatre/devkit/rt5572drv/MODULE/os/linux/Makefile.libwapi.423
-rw-r--r--cleopatre/devkit/rt5572drv/MODULE/os/linux/Makefile.libwapi.611
-rw-r--r--cleopatre/devkit/rt5572drv/MODULE/os/linux/cfg80211drv.c870
l---------cleopatre/devkit/rt5572drv/MODULE/os/linux/config.mk1
-rw-r--r--cleopatre/devkit/rt5572drv/MODULE/os/linux/inf_ppa.c62
-rw-r--r--cleopatre/devkit/rt5572drv/MODULE/os/linux/load6
-rw-r--r--cleopatre/devkit/rt5572drv/MODULE/os/linux/rt_proc.c539
-rw-r--r--cleopatre/devkit/rt5572drv/MODULE/os/linux/rt_profile.c935
-rw-r--r--cleopatre/devkit/rt5572drv/MODULE/os/linux/rt_rbus_pci_drv.c16
-rw-r--r--cleopatre/devkit/rt5572drv/MODULE/os/linux/rt_symb.c10
-rw-r--r--cleopatre/devkit/rt5572drv/MODULE/os/linux/rt_usb.c1176
-rw-r--r--cleopatre/devkit/rt5572drv/MODULE/os/linux/unload2
-rw-r--r--cleopatre/devkit/rt5572drv/MODULE/os/linux/vr_ikans.c363
17 files changed, 5279 insertions, 0 deletions
diff --git a/cleopatre/devkit/rt5572drv/MODULE/os/linux/Makefile.4 b/cleopatre/devkit/rt5572drv/MODULE/os/linux/Makefile.4
new file mode 100644
index 0000000000..3f0c357f4a
--- /dev/null
+++ b/cleopatre/devkit/rt5572drv/MODULE/os/linux/Makefile.4
@@ -0,0 +1,644 @@
+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 //
+
+
+
+#ifdef RT2870
+ifneq ($(findstring 2870,$(CHIPSET)),)
+RT28XX_AP_OBJ += \
+ $(RT28xx_DIR)/common/cmm_mac_usb.o\
+ $(RT28xx_DIR)/common/rtusb_io.o\
+ $(RT28xx_DIR)/common/rtusb_data.o\
+ $(RT28xx_DIR)/common/cmm_data_usb.o\
+ $(RT28xx_DIR)/common/rtmp_mcu.o\
+ $(RT28xx_DIR)/common/rtusb_bulk.o\
+ $(RT28xx_DIR)/os/linux/rt_usb.o\
+ $(RT28xx_DIR)/common/ee_prom.o\
+ $(RT28xx_DIR)/chips/rt28xx.o
+
+ifeq ($(HAS_ATE),y)
+RT28XX_AP_OBJ += \
+ $(RT28xx_DIR)/ate/chips/rt28xx_ate.o\
+ $(RT28xx_DIR)/ate/common/ate_usb.o
+endif
+
+ifeq ($(OSABL),NO)
+RT28XX_AP_OBJ += \
+ $(RT28xx_DIR)/common/rtusb_dev_id.o\
+ $(RT28xx_DIR)/os/linux/rt_usb_util.o\
+ $(RT28xx_DIR)/os/linux/usb_main_dev.o
+endif
+endif
+#endif // RT2870 //
+
+#ifdef RT3070
+ifneq ($(findstring 2070,$(CHIPSET)),)
+RT28XX_AP_OBJ += \
+ $(RT28xx_DIR)/common/cmm_mac_usb.o\
+ $(RT28xx_DIR)/common/rtusb_io.o\
+ $(RT28xx_DIR)/common/rtusb_data.o\
+ $(RT28xx_DIR)/common/cmm_data_usb.o\
+ $(RT28xx_DIR)/common/rtusb_bulk.o\
+ $(RT28xx_DIR)/common/rtmp_mcu.o\
+ $(RT28xx_DIR)/common/ee_prom.o\
+ $(RT28xx_DIR)/common/ee_efuse.o\
+ $(RT28xx_DIR)/chips/rt30xx.o\
+ $(RT28xx_DIR)/common/rt_rf.o\
+ $(RT28xx_DIR)/os/linux/rt_usb.o\
+ $(RT28xx_DIR)/chips/rt3070.o
+
+ifeq ($(HAS_ATE),y)
+RT28XX_STA_OBJ += \
+ $(RT28xx_DIR)/ate/chips/rt30xx_ate.o\
+ $(RT28xx_DIR)/ate/common/ate_usb.o
+endif
+
+ifeq ($(OSABL),NO)
+RT28XX_AP_OBJ += \
+ $(RT28xx_DIR)/common/rtusb_dev_id.o\
+ $(RT28xx_DIR)/os/linux/rt_usb_util.o\
+ $(RT28xx_DIR)/os/linux/usb_main_dev.o
+endif
+endif
+
+ifneq ($(findstring 3070,$(CHIPSET)),)
+RT28XX_AP_OBJ += \
+ $(RT28xx_DIR)/common/cmm_mac_usb.o\
+ $(RT28xx_DIR)/common/rtusb_io.o\
+ $(RT28xx_DIR)/common/rtusb_data.o\
+ $(RT28xx_DIR)/common/cmm_data_usb.o\
+ $(RT28xx_DIR)/common/rtusb_bulk.o\
+ $(RT28xx_DIR)/common/rtmp_mcu.o\
+ $(RT28xx_DIR)/common/ee_prom.o\
+ $(RT28xx_DIR)/common/ee_efuse.o\
+ $(RT28xx_DIR)/common/rt_rf.o\
+ $(RT28xx_DIR)/os/linux/rt_usb.o\
+ $(RT28xx_DIR)/chips/rt30xx.o\
+ $(RT28xx_DIR)/chips/rt3070.o
+
+ifeq ($(HAS_ATE),y)
+RT28XX_STA_OBJ += \
+ $(RT28xx_DIR)/ate/chips/rt30xx_ate.o\
+ $(RT28xx_DIR)/ate/common/ate_usb.o
+endif
+
+ifeq ($(OSABL),NO)
+RT28XX_AP_OBJ += \
+ $(RT28xx_DIR)/common/rtusb_dev_id.o\
+ $(RT28xx_DIR)/os/linux/rt_usb_util.o\
+ $(RT28xx_DIR)/os/linux/usb_main_dev.o
+endif
+endif
+#endif // RT3070 //
+
+
+#ifdef RT35xx
+ifneq ($(findstring 3572,$(CHIPSET)),)
+RT28XX_AP_OBJ += \
+ $(RT28xx_DIR)/common/cmm_mac_usb.o\
+ $(RT28xx_DIR)/common/rtusb_io.o\
+ $(RT28xx_DIR)/common/rtusb_data.o\
+ $(RT28xx_DIR)/common/cmm_data_usb.o\
+ $(RT28xx_DIR)/common/rtmp_mcu.o\
+ $(RT28xx_DIR)/common/ee_prom.o\
+ $(RT28xx_DIR)/common/ee_efuse.o\
+ $(RT28xx_DIR)/common/rt_rf.o\
+ $(RT28xx_DIR)/common/rtusb_bulk.o\
+ $(RT28xx_DIR)/os/linux/rt_usb.o\
+ $(RT28xx_DIR)/chips/rt28xx.o\
+ $(RT28xx_DIR)/chips/rt30xx.o\
+ $(RT28xx_DIR)/chips/rt35xx.o
+
+ifeq ($(HAS_ATE),y)
+RT28XX_AP_OBJ += \
+ $(RT28xx_DIR)/ate/chips/rt28xx_ate.o\
+ $(RT28xx_DIR)/ate/chips/rt35xx_ate.o\
+ $(RT28xx_DIR)/ate/common/ate_usb.o
+endif
+
+ifeq ($(OSABL),NO)
+RT28XX_AP_OBJ += \
+ $(RT28xx_DIR)/common/rtusb_dev_id.o\
+ $(RT28xx_DIR)/os/linux/rt_usb_util.o\
+ $(RT28xx_DIR)/os/linux/usb_main_dev.o
+endif
+endif
+
+ifneq ($(findstring 3062,$(CHIPSET)),)
+RT28XX_AP_OBJ += \
+ $(RT28xx_DIR)/common/cmm_mac_pci.o\
+ $(RT28xx_DIR)/common/cmm_data_pci.o\
+ $(RT28xx_DIR)/os/linux/rt_rbus_pci_drv.o\
+ $(RT28xx_DIR)/common/rtmp_mcu.o\
+ $(RT28xx_DIR)/common/ee_prom.o\
+ $(RT28xx_DIR)/common/ee_efuse.o\
+ $(RT28xx_DIR)/common/rt_rf.o\
+ $(RT28xx_DIR)/chips/rt30xx.o\
+ $(RT28xx_DIR)/chips/rt35xx.o
+
+ifeq ($(HAS_ATE),y)
+RT28XX_AP_OBJ += \
+ $(RT28xx_DIR)/ate/chips/rt35xx_ate.o\
+ $(RT28xx_DIR)/ate/common/ate_pci.o
+endif
+
+ifeq ($(OSABL),NO)
+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
+endif
+endif
+
+ifneq ($(findstring 3562,$(CHIPSET)),)
+RT28XX_AP_OBJ += \
+ $(RT28xx_DIR)/common/cmm_mac_pci.o\
+ $(RT28xx_DIR)/common/cmm_data_pci.o\
+ $(RT28xx_DIR)/os/linux/rt_rbus_pci_drv.o\
+ $(RT28xx_DIR)/common/rtmp_mcu.o\
+ $(RT28xx_DIR)/common/ee_prom.o\
+ $(RT28xx_DIR)/common/ee_efuse.o\
+ $(RT28xx_DIR)/common/rt_rf.o\
+ $(RT28xx_DIR)/chips/rt28xx.o\
+ $(RT28xx_DIR)/chips/rt30xx.o\
+ $(RT28xx_DIR)/chips/rt35xx.o
+ifeq ($(HAS_DFS_SUPPORT),y)
+RT28XX_AP_OBJ += \
+ $(RT28xx_DIR)/common/dfs_mcu.o
+endif
+
+ifeq ($(HAS_ATE),y)
+RT28XX_AP_OBJ += \
+ $(RT28xx_DIR)/ate/chips/rt28xx_ate.o\
+ $(RT28xx_DIR)/ate/chips/rt35xx_ate.o\
+ $(RT28xx_DIR)/ate/common/ate_pci.o
+endif
+
+ifeq ($(OSABL),NO)
+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
+endif
+endif
+
+ifneq ($(findstring 3573,$(CHIPSET)),)
+RT28XX_AP_OBJ += \
+ $(RT28xx_DIR)/common/cmm_mac_usb.o\
+ $(RT28xx_DIR)/common/rtusb_io.o\
+ $(RT28xx_DIR)/common/rtusb_data.o\
+ $(RT28xx_DIR)/common/cmm_data_usb.o\
+ $(RT28xx_DIR)/common/rtmp_mcu.o\
+ $(RT28xx_DIR)/common/ee_prom.o\
+ $(RT28xx_DIR)/common/ee_efuse.o\
+ $(RT28xx_DIR)/common/rt_rf.o\
+ $(RT28xx_DIR)/common/rtusb_bulk.o\
+ $(RT28xx_DIR)/common/frq_cal.o\
+ $(RT28xx_DIR)/os/linux/rt_usb.o\
+ $(RT28xx_DIR)/chips/rt28xx.o\
+ $(RT28xx_DIR)/chips/rt30xx.o\
+ $(RT28xx_DIR)/chips/rt35xx.o\
+ $(RT28xx_DIR)/chips/rt3593.o
+
+ifeq ($(HAS_ATE),y)
+RT28XX_STA_OBJ += \
+ $(RT28xx_DIR)/ate/chips/rt3593_ate.o\
+ $(RT28xx_DIR)/ate/common/ate_usb.o
+endif
+
+ifeq ($(OSABL),NO)
+RT28XX_AP_OBJ += \
+ $(RT28xx_DIR)/common/rtusb_dev_id.o\
+ $(RT28xx_DIR)/os/linux/rt_usb_util.o\
+ $(RT28xx_DIR)/os/linux/usb_main_dev.o
+endif
+ifeq ($(HAS_DFS_SUPPORT),y)
+RT28XX_AP_OBJ += \
+ $(RT28xx_DIR)/common/dfs_mcu.o
+endif
+endif
+
+ifneq ($(findstring 3593,$(CHIPSET)),)
+RT28XX_AP_OBJ += \
+ $(RT28xx_DIR)/common/cmm_mac_pci.o\
+ $(RT28xx_DIR)/common/cmm_data_pci.o\
+ $(RT28xx_DIR)/os/linux/rt_rbus_pci_drv.o\
+ $(RT28xx_DIR)/common/rtmp_mcu.o\
+ $(RT28xx_DIR)/common/ee_prom.o\
+ $(RT28xx_DIR)/common/ee_efuse.o\
+ $(RT28xx_DIR)/common/rt_rf.o\
+ $(RT28xx_DIR)/common/frq_cal.o\
+ $(RT28xx_DIR)/chips/rt30xx.o\
+ $(RT28xx_DIR)/chips/rt35xx.o\
+ $(RT28xx_DIR)/chips/rt28xx.o\
+ $(RT28xx_DIR)/chips/rt3593.o
+
+ifeq ($(HAS_ATE),y)
+RT28XX_STA_OBJ += \
+ $(RT28xx_DIR)/ate/chips/rt3593_ate.o\
+ $(RT28xx_DIR)/ate/common/ate_pci.o
+endif
+
+ifeq ($(OSABL),NO)
+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
+endif
+ifeq ($(HAS_DFS_SUPPORT),y)
+RT28XX_AP_OBJ += \
+ $(RT28xx_DIR)/common/dfs_mcu.o
+endif
+endif
+
+#endif // RT35xx //
+
+
+#ifdef RT3370
+ifneq ($(findstring 3370,$(CHIPSET)),)
+RT28XX_AP_OBJ += \
+ $(RT28xx_DIR)/common/cmm_mac_usb.o\
+ $(RT28xx_DIR)/common/rtusb_io.o\
+ $(RT28xx_DIR)/common/rtusb_data.o\
+ $(RT28xx_DIR)/common/cmm_data_usb.o\
+ $(RT28xx_DIR)/common/rtmp_mcu.o\
+ $(RT28xx_DIR)/common/ee_prom.o\
+ $(RT28xx_DIR)/common/ee_efuse.o\
+ $(RT28xx_DIR)/common/rt_rf.o\
+ $(RT28xx_DIR)/common/rtusb_bulk.o\
+ $(RT28xx_DIR)/os/linux/rt_usb.o\
+ $(RT28xx_DIR)/chips/rt33xx.o\
+ $(RT28xx_DIR)/chips/rt3370.o\
+ $(RT28xx_DIR)/chips/rt3070.o\
+ $(RT28xx_DIR)/chips/rt30xx.o
+
+ifeq ($(HAS_ATE),y)
+RT28XX_STA_OBJ += \
+ $(RT28xx_DIR)/ate/chips/rt33xx_ate.o\
+ $(RT28xx_DIR)/ate/chips/rt30xx_ate.o\
+ $(RT28xx_DIR)/ate/common/ate_usb.o
+endif
+
+ifeq ($(OSABL),NO)
+RT28XX_AP_OBJ += \
+ $(RT28xx_DIR)/common/rtusb_dev_id.o\
+ $(RT28xx_DIR)/os/linux/rt_usb_util.o\
+ $(RT28xx_DIR)/os/linux/usb_main_dev.o
+endif
+endif
+#endif // RT3370 //
+
+
+#ifdef RT5370
+ifneq ($(findstring 5370,$(CHIPSET)),)
+RT28XX_AP_OBJ += \
+ $(RT28xx_DIR)/common/cmm_mac_usb.o\
+ $(RT28xx_DIR)/common/rtusb_io.o\
+ $(RT28xx_DIR)/common/rtusb_bulk.o\
+ $(RT28xx_DIR)/common/rtusb_data.o\
+ $(RT28xx_DIR)/common/cmm_data_usb.o\
+ $(RT28xx_DIR)/common/rtmp_mcu.o\
+ $(RT28xx_DIR)/common/ee_prom.o\
+ $(RT28xx_DIR)/common/ee_efuse.o\
+ $(RT28xx_DIR)/common/rt_rf.o\
+ $(RT28xx_DIR)/chips/rt30xx.o\
+ $(RT28xx_DIR)/chips/rt3070.o\
+ $(RT28xx_DIR)/chips/rt33xx.o\
+ $(RT28xx_DIR)/chips/rt3370.o\
+ $(RT28xx_DIR)/chips/rt5390.o
+
+ifeq ($(HAS_ATE),y)
+RT28XX_STA_OBJ += \
+ $(RT28xx_DIR)/ate/chips/rt5390_ate.o\
+ $(RT28xx_DIR)/ate/chips/rt33xx_ate.o\
+ $(RT28xx_DIR)/ate/chips/rt30xx_ate.o\
+ $(RT28xx_DIR)/ate/common/ate_usb.o
+endif
+
+ifeq ($(OSABL),NO)
+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
+endif
+endif
+#endif // RT5370 //
+
+#ifdef RT5572
+ifneq ($(findstring 5572,$(CHIPSET)),)
+RT28XX_AP_OBJ += \
+ $(RT28xx_DIR)/common/cmm_mac_usb.o\
+ $(RT28xx_DIR)/common/rtusb_io.o\
+ $(RT28xx_DIR)/common/rtusb_data.o\
+ $(RT28xx_DIR)/common/cmm_data_usb.o\
+ $(RT28xx_DIR)/common/rtusb_bulk.o\
+ $(RT28xx_DIR)/common/ee_prom.o\
+ $(RT28xx_DIR)/common/ee_efuse.o\
+ $(RT28xx_DIR)/common/rtmp_mcu.o\
+ $(RT28xx_DIR)/common/frq_cal.o\
+ $(RT28xx_DIR)/common/rt_rf.o\
+ $(RT28xx_DIR)/os/linux/rt_usb.o\
+ $(RT28xx_DIR)/chips/rt30xx.o\
+ $(RT28xx_DIR)/chips/rt5592.o
+
+ifeq ($(HAS_RTMP_FLASH_SUPPORT),y)
+RT28XX_AP_OBJ += \
+ $(RT28xx_DIR)/common/ee_flash.o
+endif
+
+ifeq ($(HAS_ATE),y)
+RT28XX_AP_OBJ += \
+ $(RT28xx_DIR)/ate/chips/rt5592_ate.o\
+ $(RT28xx_DIR)/ate/common/ate_usb.o
+endif
+
+ifeq ($(OSABL),NO)
+RT28XX_AP_OBJ += \
+ $(RT28xx_DIR)/common/rtusb_dev_id.o\
+ $(RT28xx_DIR)/os/linux/rt_usb_util.o\
+ $(RT28xx_DIR)/os/linux/usb_main_dev.o
+endif
+ifeq ($(HAS_DFS_SUPPORT),y)
+RT28XX_AP_OBJ += \
+ $(RT28xx_DIR)/common/dfs_mcu.o
+endif
+endif
+#endif // RT5572 //
+
+
+
+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/rt5572drv/MODULE/os/linux/Makefile.6 b/cleopatre/devkit/rt5572drv/MODULE/os/linux/Makefile.6
new file mode 100644
index 0000000000..9c9e970ae1
--- /dev/null
+++ b/cleopatre/devkit/rt5572drv/MODULE/os/linux/Makefile.6
@@ -0,0 +1,611 @@
+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$(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 := \
+ ../../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/cmm_cmd.o\
+ ../../common/ps.o\
+ ../../rate_ctrl/ra_ctrl.o\
+ ../../rate_ctrl/alg_legacy.o\
+ ../../rate_ctrl/alg_ags.o\
+ ../../os/linux/rt_profile.o\
+ ../../ap/ap_mbss.o\
+ ../../chips/rtmp_chip.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\
+ ../../common/uapsd.o\
+ ../../ap/ap_autoChSel.o\
+ ../../ap/ap_qload.o\
+ ../../ap/ap_cfg.o
+
+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
+
+
+ifeq ($(HAS_NEW_RATE_ADAPT_SUPPORT),y)
+$(MOD_NAME)-objs += ../../rate_ctrl/alg_grp.o
+endif
+
+#ifdef DOT11_N_SUPPORT
+ifeq ($(HAS_DOT11_N_SUPPORT),y)
+$(MOD_NAME)-objs += \
+ ../../common/ba_action.o
+
+#ifdef TXBF_SUPPORT
+ifeq ($(HAS_TXBF_SUPPORT),y)
+$(MOD_NAME)-objs += \
+ ../../common/cmm_txbf.o\
+ ../../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)
+$(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
+
+#ifdef WSC_INCLUDED
+ifeq ($(HAS_WSC),y)
+$(MOD_NAME)-objs += \
+ ../../common/wsc.o\
+ ../../common/wsc_tlv.o\
+ ../../common/wsc_ufd.o\
+ ../../common/crypt_biginteger.o\
+ ../../common/crypt_dh.o
+endif
+ifeq ($(HAS_WSC_V2),y)
+$(MOD_NAME)-objs += ../../common/wsc_v2.o
+endif
+#endif // WSC_INCLUDED //
+
+
+
+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_BLOCK_NET_IF),y)
+$(MOD_NAME)-objs += ../../common/netif_block.o
+endif
+
+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
+
+ifeq ($(HAS_DFS_SUPPORT),y)
+$(MOD_NAME)-objs += \
+ ../../common/cmm_dfs.o
+endif
+
+ifeq ($(HAS_CS_SUPPORT),y)
+$(MOD_NAME)-objs += \
+ ../../common/cmm_cs.o
+endif
+
+endif
+#endif // CONFIG_AP_SUPPORT //
+
+
+
+
+#chip releated
+
+
+
+#ifdef RT2870
+ifneq ($(findstring 2870,$(CHIPSET)),)
+$(MOD_NAME)-objs += \
+ ../../common/cmm_mac_usb.o\
+ ../../common/rtusb_io.o\
+ ../../common/rtusb_data.o\
+ ../../common/cmm_data_usb.o\
+ ../../common/rtmp_mcu.o\
+ ../../common/rtusb_bulk.o\
+ ../../os/linux/rt_usb.o\
+ ../../common/ee_prom.o\
+ ../../chips/rt28xx.o\
+
+ifeq ($(HAS_ATE),y)
+$(MOD_NAME)-objs += \
+ ../../ate/chips/rt28xx_ate.o\
+ ../../ate/common/ate_usb.o
+endif
+
+ifeq ($(OSABL),NO)
+$(MOD_NAME)-objs += \
+ ../../common/rtusb_dev_id.o\
+ ../../os/linux/rt_usb_util.o\
+ ../../os/linux/usb_main_dev.o
+endif
+endif
+#endif // RT2870 //
+
+#ifdef RT3070
+ifneq ($(findstring 2070,$(CHIPSET)),)
+$(MOD_NAME)-objs += \
+ ../../common/cmm_mac_usb.o\
+ ../../common/rtusb_io.o\
+ ../../common/rtusb_data.o\
+ ../../common/cmm_data_usb.o\
+ ../../common/rtusb_bulk.o\
+ ../../common/rtmp_mcu.o\
+ ../../common/ee_prom.o\
+ ../../common/ee_efuse.o\
+ ../../chips/rt30xx.o\
+ ../../common/rt_rf.o\
+ ../../os/linux/rt_usb.o\
+ ../../chips/rt3070.o
+
+ifeq ($(HAS_ATE),y)
+$(MOD_NAME)-objs += \
+ ../../ate/chips/rt30xx_ate.o\
+ ../../ate/common/ate_usb.o
+endif
+
+ifeq ($(OSABL),NO)
+$(MOD_NAME)-objs += \
+ ../../common/rtusb_dev_id.o\
+ ../../os/linux/rt_usb_util.o\
+ ../../os/linux/usb_main_dev.o
+endif
+endif
+
+ifneq ($(findstring 3070,$(CHIPSET)),)
+$(MOD_NAME)-objs += \
+ ../../common/cmm_mac_usb.o\
+ ../../common/rtusb_io.o\
+ ../../common/rtusb_data.o\
+ ../../common/cmm_data_usb.o\
+ ../../common/rtusb_bulk.o\
+ ../../common/rtmp_mcu.o\
+ ../../common/ee_prom.o\
+ ../../common/ee_efuse.o\
+ ../../common/rt_rf.o\
+ ../../os/linux/rt_usb.o\
+ ../../chips/rt30xx.o\
+ ../../chips/rt3070.o
+
+ifeq ($(HAS_ATE),y)
+$(MOD_NAME)-objs += \
+ ../../ate/chips/rt30xx_ate.o\
+ ../../ate/common/ate_usb.o
+endif
+
+ifeq ($(OSABL),NO)
+$(MOD_NAME)-objs += \
+ ../../common/rtusb_dev_id.o\
+ ../../os/linux/rt_usb_util.o\
+ ../../os/linux/usb_main_dev.o
+endif
+endif
+#endif // RT3070 //
+
+
+
+
+
+
+
+#ifdef RT3572
+ifneq ($(findstring 3572,$(CHIPSET)),)
+$(MOD_NAME)-objs += \
+ ../../common/cmm_mac_usb.o\
+ ../../common/rtusb_io.o\
+ ../../common/rtusb_data.o\
+ ../../common/cmm_data_usb.o\
+ ../../common/rtmp_mcu.o\
+ ../../common/ee_prom.o\
+ ../../common/ee_efuse.o\
+ ../../common/rt_rf.o\
+ ../../common/rtusb_bulk.o\
+ ../../os/linux/rt_usb.o\
+ ../../chips/rt28xx.o\
+ ../../chips/rt30xx.o\
+ ../../chips/rt35xx.o
+
+ifeq ($(HAS_RTMP_FLASH_SUPPORT),y)
+$(MOD_NAME)-objs += \
+ ../../common/ee_flash.o
+endif
+
+ifeq ($(HAS_ATE),y)
+$(MOD_NAME)-objs += \
+ ../../ate/chips/rt28xx_ate.o\
+ ../../ate/chips/rt35xx_ate.o\
+ ../../ate/common/ate_usb.o
+endif
+
+ifeq ($(OSABL),NO)
+$(MOD_NAME)-objs += \
+ ../../common/rtusb_dev_id.o\
+ ../../os/linux/rt_usb_util.o\
+ ../../os/linux/usb_main_dev.o
+endif
+
+endif
+#endif // RT3572 //
+
+
+
+
+
+
+
+#ifdef RT3370
+ifneq ($(findstring 3370,$(CHIPSET)),)
+$(MOD_NAME)-objs += \
+ ../../common/cmm_mac_usb.o\
+ ../../common/rtusb_io.o\
+ ../../common/rtusb_data.o\
+ ../../common/cmm_data_usb.o\
+ ../../common/rtmp_mcu.o\
+ ../../common/ee_prom.o\
+ ../../common/ee_efuse.o\
+ ../../common/rt_rf.o\
+ ../../common/rtusb_bulk.o\
+ ../../os/linux/rt_usb.o\
+ ../../chips/rt33xx.o\
+ ../../chips/rt3370.o\
+ ../../chips/rt3070.o\
+ ../../chips/rt30xx.o
+
+ifeq ($(HAS_ATE),y)
+$(MOD_NAME)-objs += \
+ ../../ate/chips/rt33xx_ate.o\
+ ../../ate/chips/rt30xx_ate.o\
+ ../../ate/common/ate_usb.o
+endif
+
+ifeq ($(OSABL),NO)
+$(MOD_NAME)-objs += \
+ ../../common/rtusb_dev_id.o\
+ ../../os/linux/rt_usb_util.o\
+ ../../os/linux/usb_main_dev.o
+endif
+endif
+#endif // RT3370 //
+
+#ifdef RT5370
+ifneq ($(findstring 5370,$(CHIPSET)),)
+$(MOD_NAME)-objs += \
+ ../../common/cmm_mac_usb.o\
+ ../../common/rtusb_io.o\
+ ../../common/rtusb_data.o\
+ ../../common/cmm_data_usb.o\
+ ../../common/rtmp_mcu.o\
+ ../../common/ee_prom.o\
+ ../../common/ee_efuse.o\
+ ../../common/rt_rf.o\
+ ../../common/rtusb_bulk.o\
+ ../../os/linux/rt_usb.o\
+ ../../chips/rt33xx.o\
+ ../../chips/rt3370.o\
+ ../../chips/rt3070.o\
+ ../../chips/rt30xx.o\
+ ../../chips/rt5390.o
+
+ifeq ($(HAS_ATE),y)
+$(MOD_NAME)-objs += \
+ ../../ate/chips/rt5390_ate.o\
+ ../../ate/chips/rt30xx_ate.o\
+ ../../ate/chips/rt33xx_ate.o\
+ ../../ate/common/ate_usb.o
+endif
+
+ifeq ($(OSABL),NO)
+$(MOD_NAME)-objs += \
+ ../../common/rtusb_dev_id.o\
+ ../../os/linux/rt_usb_util.o\
+ ../../os/linux/usb_main_dev.o
+endif
+
+ifneq ($(findstring $(RT28xx_MODE),STA),)
+$(MOD_NAME)-objs += \
+ ../../common/frq_cal.o
+endif
+
+endif
+#endif // RT5370 //
+
+
+#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),)
+$(MOD_NAME)-objs += \
+ ../../common/frq_cal.o
+endif
+
+endif
+#endif // RT3290 //
+
+#ifdef RT5572
+ifneq ($(findstring 5572,$(CHIPSET)),)
+$(MOD_NAME)-objs += \
+ ../../common/cmm_mac_usb.o\
+ ../../common/rtusb_io.o\
+ ../../common/rtusb_data.o\
+ ../../common/cmm_data_usb.o\
+ ../../common/rtmp_mcu.o\
+ ../../common/ee_prom.o\
+ ../../common/ee_efuse.o\
+ ../../common/rt_rf.o\
+ ../../common/rtusb_bulk.o\
+ ../../os/linux/rt_usb.o\
+ ../../chips/rt30xx.o\
+ ../../chips/rt5592.o
+
+ifeq ($(HAS_RTMP_FLASH_SUPPORT),y)
+$(MOD_NAME)-objs += \
+ ../../common/ee_flash.o
+endif
+
+ifeq ($(HAS_ATE),y)
+$(MOD_NAME)-objs += \
+ ../../ate/chips/rt5592_ate.o\
+ ../../ate/common/ate_usb.o
+endif
+
+ifeq ($(OSABL),NO)
+$(MOD_NAME)-objs += \
+ ../../common/rtusb_dev_id.o\
+ ../../os/linux/rt_usb_util.o\
+ ../../os/linux/usb_main_dev.o
+endif
+
+ifneq ($(findstring $(RT28xx_MODE),STA),)
+$(MOD_NAME)-objs += \
+ ../../common/frq_cal.o
+endif
+
+
+endif
+#endif // RT5572 //
+
+
+
+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/rt5572drv/MODULE/os/linux/Makefile.clean b/cleopatre/devkit/rt5572drv/MODULE/os/linux/Makefile.clean
new file mode 120000
index 0000000000..83990cc68f
--- /dev/null
+++ b/cleopatre/devkit/rt5572drv/MODULE/os/linux/Makefile.clean
@@ -0,0 +1 @@
+../../../Makefile.clean \ No newline at end of file
diff --git a/cleopatre/devkit/rt5572drv/MODULE/os/linux/Makefile.libautoprovision.6 b/cleopatre/devkit/rt5572drv/MODULE/os/linux/Makefile.libautoprovision.6
new file mode 100644
index 0000000000..e285006206
--- /dev/null
+++ b/cleopatre/devkit/rt5572drv/MODULE/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/rt5572drv/MODULE/os/linux/Makefile.libwapi.4 b/cleopatre/devkit/rt5572drv/MODULE/os/linux/Makefile.libwapi.4
new file mode 100644
index 0000000000..51c5f958e0
--- /dev/null
+++ b/cleopatre/devkit/rt5572drv/MODULE/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/rt5572drv/MODULE/os/linux/Makefile.libwapi.6 b/cleopatre/devkit/rt5572drv/MODULE/os/linux/Makefile.libwapi.6
new file mode 100644
index 0000000000..8ce3d92b80
--- /dev/null
+++ b/cleopatre/devkit/rt5572drv/MODULE/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/rt5572drv/MODULE/os/linux/cfg80211drv.c b/cleopatre/devkit/rt5572drv/MODULE/os/linux/cfg80211drv.c
new file mode 100644
index 0000000000..07a9e59fcb
--- /dev/null
+++ b/cleopatre/devkit/rt5572drv/MODULE/os/linux/cfg80211drv.c
@@ -0,0 +1,870 @@
+/****************************************************************************
+ * 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;
+
+ default:
+ return NDIS_STATUS_FAILURE;
+ }
+
+ return NDIS_STATUS_SUCCESS;
+}
+
+
+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;
+}
+
+
+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;
+ } /* End of if */
+
+ if ((pAd->CommonCfg.PhyMode == PHY_11A) ||
+ (pAd->CommonCfg.PhyMode == PHY_11AN_MIXED))
+ {
+ /* 5G-only mode */
+ if (ChanId <= CFG80211_NUM_OF_CHAN_2GHZ)
+ continue; /* check next */
+ /* End of if */
+ } /* End of if */
+
+ if ((pAd->CommonCfg.PhyMode != PHY_11A) &&
+ (pAd->CommonCfg.PhyMode != PHY_11ABG_MIXED) &&
+ (pAd->CommonCfg.PhyMode != PHY_11AN_MIXED) &&
+ (pAd->CommonCfg.PhyMode != PHY_11ABGN_MIXED) &&
+ (pAd->CommonCfg.PhyMode != PHY_11AGN_MIXED))
+ {
+ /* 2.5G-only mode */
+ if (ChanId > CFG80211_NUM_OF_CHAN_2GHZ)
+ continue; /* check next */
+ /* End of if */
+ } /* End of if */
+
+ 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 */
+
+
+#endif /* RT_CFG80211_SUPPORT */
+
+/* End of cfg80211drv.c */
diff --git a/cleopatre/devkit/rt5572drv/MODULE/os/linux/config.mk b/cleopatre/devkit/rt5572drv/MODULE/os/linux/config.mk
new file mode 120000
index 0000000000..cb085a6856
--- /dev/null
+++ b/cleopatre/devkit/rt5572drv/MODULE/os/linux/config.mk
@@ -0,0 +1 @@
+../../../config.mk \ No newline at end of file
diff --git a/cleopatre/devkit/rt5572drv/MODULE/os/linux/inf_ppa.c b/cleopatre/devkit/rt5572drv/MODULE/os/linux/inf_ppa.c
new file mode 100644
index 0000000000..78a9f2b9b1
--- /dev/null
+++ b/cleopatre/devkit/rt5572drv/MODULE/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/rt5572drv/MODULE/os/linux/load b/cleopatre/devkit/rt5572drv/MODULE/os/linux/load
new file mode 100644
index 0000000000..5699ee4876
--- /dev/null
+++ b/cleopatre/devkit/rt5572drv/MODULE/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/rt5572drv/MODULE/os/linux/rt_proc.c b/cleopatre/devkit/rt5572drv/MODULE/os/linux/rt_proc.c
new file mode 100644
index 0000000000..aeebcd1ecf
--- /dev/null
+++ b/cleopatre/devkit/rt5572drv/MODULE/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/rt5572drv/MODULE/os/linux/rt_profile.c b/cleopatre/devkit/rt5572drv/MODULE/os/linux/rt_profile.c
new file mode 100644
index 0000000000..fd1852b8ab
--- /dev/null
+++ b/cleopatre/devkit/rt5572drv/MODULE/os/linux/rt_profile.c
@@ -0,0 +1,935 @@
+/****************************************************************************
+ * 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"
+
+#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
+
+
+#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 */
+
+/* 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 */
+}
+
+
+#ifdef WORKQUEUE_BH
+void tbtt_workq(struct work_struct *work)
+#else
+void tbtt_tasklet(unsigned long data)
+#endif /* WORKQUEUE_BH */
+{
+/*#define MAX_TX_IN_TBTT (16) */
+
+#ifdef CONFIG_AP_SUPPORT
+#ifdef WORKQUEUE_BH
+ POS_COOKIE pObj = container_of(work, struct os_cookie, tbtt_work);
+ PRTMP_ADAPTER pAd = pObj->pAd_va;
+#else
+ PRTMP_ADAPTER pAd = (PRTMP_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);
+ /* End of for */
+ }
+ 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)
+{
+ PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdSrc;
+/* struct sk_buff *pRxPkt; */
+ PNDIS_PACKET pRxPkt;
+#ifdef INF_PPA_SUPPORT
+ int ret = 0;
+ unsigned int ppa_flags = 0; /* reserved for now */
+#endif /* INF_PPA_SUPPORT */
+
+ pAd = pAd; /* avoid compile warning */
+
+ MEM_DBG_PKT_FREE_INC(pPacket);
+
+
+ ASSERT(pPacket);
+
+/* pRxPkt = RTPKT_TO_OSPKT(pPacket); */
+ pRxPkt = 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
+#if defined(PLATFORM_BL2348) || defined(PLATFORM_BL23570)
+
+{
+ extern int (*pToUpperLayerPktSent)(PNDIS_PACKET *pSkb);
+/* pRxPkt->protocol = eth_type_trans(pRxPkt, pRxPkt->dev); */
+ 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 */
+
+
+ /* mark for bridge fast path, 2009/06/22 */
+ /* pRxPkt->protocol = eth_type_trans(pRxPkt, pRxPkt->dev); */
+
+#ifdef INF_PPA_SUPPORT
+ if (ppa_hook_directpath_send_fn && pAd->PPAEnable==TRUE )
+ {
+ RtmpOsPktInfPpaSend(pRxPkt);
+
+ pRxPkt=NULL;
+ return;
+
+ }
+#endif /* INF_PPA_SUPPORT */
+
+ {
+#ifdef CONFIG_RT2880_BRIDGING_ONLY
+/* pRxPkt->cb[22]=0xa8; */
+ PACKET_CB_ASSIGN(pRxPkt, 22) = 0xa8;
+#endif
+
+#if defined(CONFIG_RA_CLASSIFIER)||defined(CONFIG_RA_CLASSIFIER_MODULE)
+ if(ra_classifier_hook_rx!= NULL)
+ {
+ unsigned int flags;
+
+ RTMP_IRQ_LOCK(&pAd->page_lock, flags);
+ ra_classifier_hook_rx(pRxPkt, classifier_cur_cycle);
+ RTMP_IRQ_UNLOCK(&pAd->page_lock, flags);
+ }
+#endif /* CONFIG_RA_CLASSIFIER */
+
+#if !defined(CONFIG_RA_NAT_NONE)
+#if defined (CONFIG_RA_HW_NAT) || defined (CONFIG_RA_HW_NAT_MODULE)
+ RtmpOsPktNatMagicTag(pRxPkt);
+#endif
+
+ /* bruce+
+ * ra_sw_nat_hook_rx return 1 --> continue
+ * ra_sw_nat_hook_rx return 0 --> FWD & without netif_rx
+ */
+ if (ra_sw_nat_hook_rx!= NULL)
+ {
+ unsigned int flags;
+
+ /* pRxPkt->protocol = eth_type_trans(pRxPkt, pRxPkt->dev); */
+ RtmpOsPktProtocolAssign(pRxPkt);
+
+ RTMP_IRQ_LOCK(&pAd->page_lock, flags);
+ if(ra_sw_nat_hook_rx(pRxPkt))
+ {
+ RtmpOsPktRcvHandle(pRxPkt);
+ }
+ RTMP_IRQ_UNLOCK(&pAd->page_lock, flags);
+ }
+#else
+ {
+#if defined (CONFIG_RA_HW_NAT) || defined (CONFIG_RA_HW_NAT_MODULE)
+ RtmpOsPktNatNone(pRxPkt);
+#endif /* CONFIG_RA_HW_NAT */
+ }
+#endif /* CONFIG_RA_NAT_NONE */
+ }
+
+
+#ifdef CONFIG_AP_SUPPORT
+#ifdef BG_FT_SUPPORT
+ if (BG_FTPH_PacketFromApHandle(pRxPkt) == 0)
+ return;
+#endif /* BG_FT_SUPPORT */
+#endif /* CONFIG_AP_SUPPORT */
+
+/* pRxPkt->protocol = eth_type_trans(pRxPkt, pRxPkt->dev); */
+ 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);
+
+
+#ifdef RT3290
+ NdisFreeSpinLock(&pAd->WlanEnLock);
+#endif /* RT3290 */
+
+ 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 SPECIFIC_BCN_BUF_SUPPORT
+ NdisFreeSpinLock(&pAd->ShrMemLock);
+#endif /* SPECIFIC_BCN_BUF_SUPPORT */
+
+#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 MiniportAdapterContext,
+ IN PPNDIS_PACKET ppPacketArray,
+ IN UINT NumberOfPackets,
+ IN UINT32 PktTotalLen,
+ IN RTMP_NET_ETH_CONVERT_DEV_SEARCH Func)
+{
+ PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)MiniportAdapterContext;
+ 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/rt5572drv/MODULE/os/linux/rt_rbus_pci_drv.c b/cleopatre/devkit/rt5572drv/MODULE/os/linux/rt_rbus_pci_drv.c
new file mode 100644
index 0000000000..9b216e3270
--- /dev/null
+++ b/cleopatre/devkit/rt5572drv/MODULE/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/rt5572drv/MODULE/os/linux/rt_symb.c b/cleopatre/devkit/rt5572drv/MODULE/os/linux/rt_symb.c
new file mode 100644
index 0000000000..f2f3fb555f
--- /dev/null
+++ b/cleopatre/devkit/rt5572drv/MODULE/os/linux/rt_symb.c
@@ -0,0 +1,10 @@
+#ifdef OS_ABL_SUPPORT
+
+#include <linux/module.h>
+#include "rt_config.h"
+
+EXPORT_SYMBOL(RTMP_DRV_OPS_FUNCTION);
+
+#endif /* OS_ABL_SUPPORT */
+
+/* End of rt_symb.c */
diff --git a/cleopatre/devkit/rt5572drv/MODULE/os/linux/rt_usb.c b/cleopatre/devkit/rt5572drv/MODULE/os/linux/rt_usb.c
new file mode 100644
index 0000000000..dbe6c9f208
--- /dev/null
+++ b/cleopatre/devkit/rt5572drv/MODULE/os/linux/rt_usb.c
@@ -0,0 +1,1176 @@
+/*
+ ***************************************************************************
+ * 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)); */
+
+ }
+
+ /* */
+ /* 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);
+ 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);
+}
+
+
+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);
+ 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); */
+ 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;
+
+}
+
+
+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)
+ {
+ 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);
+ }
+
+ 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);
+ }
+
+ 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);
+ }
+
+ 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);
+ 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);
+
+ 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);
+ 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);
+ 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/rt5572drv/MODULE/os/linux/unload b/cleopatre/devkit/rt5572drv/MODULE/os/linux/unload
new file mode 100644
index 0000000000..cf698b0cd6
--- /dev/null
+++ b/cleopatre/devkit/rt5572drv/MODULE/os/linux/unload
@@ -0,0 +1,2 @@
+ifconfig ra0 down
+rmmod rt2860ap
diff --git a/cleopatre/devkit/rt5572drv/MODULE/os/linux/vr_ikans.c b/cleopatre/devkit/rt5572drv/MODULE/os/linux/vr_ikans.c
new file mode 100644
index 0000000000..bc630ff545
--- /dev/null
+++ b/cleopatre/devkit/rt5572drv/MODULE/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 */